CARLA 轨道跟踪

在这里插入图片描述

轨道形状
在这里插入图片描述
每个轨道点的巡航速度要求
在这里插入图片描述
longitudinal controller 控制油门和刹车,用了 PI 控制器
lateral controller 控制方向盘,用了 PD 控制器

#!/usr/bin/env python3

"""
2D Controller Class to be used for the CARLA waypoint follower demo.
"""

import cutils
import numpy as np
from math import *

class Controller2D(object):
    def __init__(self, waypoints):
        self.vars                = cutils.CUtils()
        self._current_x          = 0
        self._current_y          = 0
        self._current_yaw        = 0
        self._current_speed      = 0
        self._desired_speed      = 0
        self._current_frame      = 0
        self._current_timestamp  = 0
        self._start_control_loop = False
        self._set_throttle       = 0
        self._set_brake          = 0
        self._set_steer          = 0
        self._waypoints          = waypoints
        self._next_point         = 1
        self._conv_rad_to_steer  = 180.0 / 70.0 / np.pi
        self._pi                 = np.pi
        self._2pi                = 2.0 * np.pi

    def update_values(self, x, y, yaw, speed, timestamp, frame):
        self._current_x         = x
        self._current_y         = y
        self._current_yaw       = yaw
        self._current_speed     = speed
        self._current_timestamp = timestamp
        self._current_frame     = frame
        if self._current_frame:
            self._start_control_loop = True

    def update_next_point(self):
        min_idx       = 0
        min_dist      = float("inf")

        for i in range(len(self._waypoints)):
            dist = np.linalg.norm(np.array([
                    self._waypoints[i][0] - self._current_x,
                    self._waypoints[i][1] - self._current_y]))
            if dist < min_dist:
                min_dist = dist
                min_idx = i

        index = min_idx  # closest point
        x     = self._current_x
        y     = self._current_y
        waypoints = self._waypoints

        R_x, R_y = x - waypoints[index][0], y - waypoints[index][1]
        delta_x, delta_y = waypoints[index+1][0] - waypoints[index][0],  waypoints[index+1][1] - waypoints[index][1]
        u = (R_x * delta_x + R_y * delta_y)/np.sqrt((R_x**2 + R_y**2)*(delta_x**2 + delta_y**2))
        
        if u > 0 and index < len(self._waypoints)-1:
            index += 1
        self._next_point = index


    def update_desired_speed(self):
        desired_speed = 0.0
        self.update_next_point()
        self._desired_speed = self._waypoints[self._next_point][2]

    def update_waypoints(self, new_waypoints):
        self._waypoints = new_waypoints

    def get_commands(self):
        return self._set_throttle, self._set_steer, self._set_brake

    def set_throttle(self, input_throttle):
        # Clamp the throttle command to valid bounds
        throttle           = np.fmax(np.fmin(input_throttle, 1.0), 0.0)
        self._set_throttle = throttle

    def set_steer(self, input_steer_in_rad):
        # Covnert radians to [-1, 1]
        input_steer = self._conv_rad_to_steer * input_steer_in_rad

        # Clamp the steering command to valid bounds
        steer           = np.fmax(np.fmin(input_steer, 1.0), -1.0)
        self._set_steer = steer

    def set_brake(self, input_brake):
        # Clamp the steering command to valid bounds
        brake           = np.fmax(np.fmin(input_brake, 1.0), 0.0)
        self._set_brake = brake

    def update_controls(self):
        ######################################################
        # RETRIEVE SIMULATOR FEEDBACK
        ######################################################
        x               = self._current_x
        y               = self._current_y
        yaw             = self._current_yaw
        v               = self._current_speed
        self.update_desired_speed()
        v_desired       = self._desired_speed
        t               = self._current_timestamp
        waypoints       = self._waypoints
        throttle_output = 0
        steer_output    = 0
        brake_output    = 0


        ######################################################
        ######################################################
        # MODULE 7: DECLARE USAGE VARIABLES HERE
        ######################################################
        ######################################################
        """
            Use 'self.vars.create_var(<variable name>, <default value>)'
            to create a persistent variable (not destroyed at each iteration).
            This means that the value can be stored for use in the next
            iteration of the control loop.

            Example: Creation of 'v_previous', default value to be 0
            self.vars.create_var('v_previous', 0.0)

            Example: Setting 'v_previous' to be 1.0
            self.vars.v_previous = 1.0

            Example: Accessing the value from 'v_previous' to be used
            throttle_output = 0.5 * self.vars.v_previous
        """
        self.vars.create_var('sum_err_v', 0.0)
        self.vars.create_var('cte', 0.0)

        # Skip the first frame to store previous values properly
        if self._start_control_loop:
            """
                Controller iteration code block.

                Controller Feedback Variables:
                    x               : Current X position (meters)
                    y               : Current Y position (meters)
                    yaw             : Current yaw pose (radians)
                    v               : Current forward speed (meters per second)
                    t               : Current time (seconds)
                    v_desired       : Current desired speed (meters per second)
                                      (Computed as the speed to track at the
                                      closest waypoint to the vehicle.)
                    waypoints       : Current waypoints to track
                                      (Includes speed to track at each x,y
                                      location.)
                                      Format: [[x0, y0, v0],
                                               [x1, y1, v1],
                                               ...
                                               [xn, yn, vn]]
                                      Example:
                                          waypoints[2][1]: 
                                          Returns the 3rd waypoint's y position

                                          waypoints[5]:
                                          Returns [x5, y5, v5] (6th waypoint)
                
                Controller Output Variables:
                    throttle_output : Throttle output (0 to 1)
                    steer_output    : Steer output (-1.22 rad to 1.22 rad)
                    brake_output    : Brake output (0 to 1)
            """

            ######################################################
            ######################################################
            # MODULE 7: IMPLEMENTATION OF LONGITUDINAL CONTROLLER HERE
            ######################################################
            ######################################################
            """
                Implement a longitudinal controller here. Remember that you can
                access the persistent variables declared above here. For
                example, can treat self.vars.v_previous like a "global variable".
            """
            
            # Change these outputs with the longitudinal controller. Note that
            # brake_output is optional and is not required to pass the
            # assignment, as the car will naturally slow down over time.
            sum_err_v = self.vars.sum_err_v
            brake_output    = 0

            # diff_err_v = -self.vars.err_v
            err_v = v_desired - v
            sum_err_v += err_v


            throttle_output = err_v + 0.01*sum_err_v


            if throttle_output < 0:
                throttle_output, brake_output = 0, 0

            self.vars.sum_err_v = sum_err_v

            ######################################################
            ######################################################
            # MODULE 7: IMPLEMENTATION OF LATERAL CONTROLLER HERE
            ######################################################
            ######################################################
            """
                Implement a lateral controller here. Remember that you can
                access the persistent variables declared above here. For
                example, can treat self.vars.v_previous like a "global variable".
            """
            
            # Change the steer output with the lateral controller. 
            steer_output    = 0

            cte = self.vars.cte

            diff_cte = - cte

            # ----------------------------------------
            # compute the CTE

            index = self._next_point - 1
            R_x, R_y = x - waypoints[index][0], y - waypoints[index][1]
            delta_x, delta_y = waypoints[index+1][0] - waypoints[index][0],  waypoints[index+1][1] - waypoints[index][1]
            u = (R_x * delta_x + R_y * delta_y)/np.sqrt((R_x**2 + R_y**2)*(delta_x**2 + delta_y**2))
            
            cte = (R_y * delta_x - R_x * delta_y)/np.sqrt(delta_x**2 + delta_y**2)
            self.vars.cte = cte
            # ----------------------------------------
            print('x: {:.2f} y: {:.2f} idx: {} u: {:.2f} yaw: {:.2f} delta: {}'.format(x,y,index,u, yaw, atan2(delta_y, delta_x)))

            diff_cte += cte

            K_p = 2
            K_d = 6
            K_yaw = 10

            steer_output = - K_p * cte - K_d * diff_cte - K_yaw * (yaw-atan2(delta_y, delta_x))

            ######################################################
            # SET CONTROLS OUTPUT
            ######################################################
            self.set_throttle(throttle_output)  # in percent (0 to 1)
            self.set_steer(steer_output)        # in rad (-1.22 to 1.22)
            self.set_brake(brake_output)        # in percent (0 to 1)

        ######################################################
        ######################################################
        # MODULE 7: STORE OLD VALUES HERE (ADD MORE IF NECESSARY)
        ######################################################
        ######################################################
        """
            Use this block to store old values (for example, we can store the
            current x, y, and yaw values here using persistent variables for use
            in the next iteration)
        """
        self.vars.v_previous = v  # Store forward speed to be used in next step

### 基于CARLA模拟器的Pure Pursuit轨迹跟踪算法 在自动驾驶领域,Pure Pursuit是一种常用的低层次控制策略,用于使车辆沿预定路径行驶。当应用于CARLA模拟器时,该算法通过计算当前车辆位置到期望路径上的某一点(称为前瞻点)的方向偏差来调整转向角度。 下面是一个Python代码片段,在CARLA环境中实现了基本的Pure Pursuit控制器: ```python import carla from math import sqrt, atan2, degrees class PurePursuitController: def __init__(self, vehicle_actor, lookahead_distance=5.0): self.vehicle = vehicle_actor self.lookahead_dist = lookahead_distance def get_steering_angle(self, waypoints): """ 计算并返回所需的转向角 参数: waypoints (list): [(x,y)] 形式的路径坐标列表 返回: float: 所需的转向角度(度) """ # 获取当前位置和方向 current_location = self.vehicle.get_location() current_rotation = self.vehicle.get_transform().rotation.yaw * 3.14 / 180 min_index = None min_distance_squared = float('inf') for i, wp in enumerate(waypoints[:-1]): dx = wp[0] - current_location.x dy = wp[1] - current_location.y dist_sqrd = dx*dx + dy*dy if dist_sqrd >= self.lookahead_dist ** 2 and dist_sqrd < min_distance_squared: min_distance_squared = dist_sqrd min_index = i target_wp = waypoints[min_index] alpha = atan2(target_wp[1]-current_location.y, target_wp[0]-current_location.x) - current_rotation steering_angle = degrees(alpha) return max(-90,min(steering_angle, 90)) # 防止过度转动 controller = PurePursuitController(vehicle_actor=some_vehicle_object) target_steer_angle = controller.get_steering_angle(path_points_list) print(f'Target Steering Angle: {target_steer_angle:.2f}') ``` 此代码定义了一个`PurePursuitController`类,它接收一个CARLA Actor对象作为参数,并提供了一种方法来获取给定一系列航路点下的理想转向角度[^1]。需要注意的是,这段代码仅展示了如何根据几何关系计算理想的前轮转角;实际应用中还需要考虑更多因素如车速、轮胎抓地力等影响最终控制效果的因素。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

颹蕭蕭

白嫖?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值