无人驾驶算法-使用Stanley method进行路径跟踪

 

一、基于几何追踪的方法

关于无人车追踪轨迹,目前的主流方法分为两类:基于几何追踪的方法和基于模型预测的方法,其中几何追踪方法主要包含纯跟踪和Stanley两种方法,纯跟踪方法已经广泛应用于移动机器人的路径跟踪中,网上也有很多详细的介绍,本文主要介绍斯坦福大学无人车使用的Stanley方法。

stanley  method  几何模型图

上面的state.yaw根据当前车辆方向盘转角控制量delta跟速度v、半径长度L得到当前车辆在dt时间转过的角度,即,新增的航向角。

def PControl(target, current):
    a = Kp * (target - current)
    return a


def stanley_control(state, cx, cy, ch, pind):
    ind = calc_target_index(state, cx, cy)

    if pind >= ind:
        ind = pind

    if ind < len(cx):
        tx = cx[ind]
        ty = cy[ind]
        th = ch[ind]
    else:
        tx = cx[-1]
        ty = cy[-1]
        th = ch[-1]
        ind = len(cx) - 1

    # 计算横向误差
    if ((state.x - tx) * th - (state.y - ty)) > 0:
        error = abs(math.sqrt((state.x - tx) ** 2 + (state.y - ty) ** 2))
    else:
        error = -abs(math.sqrt((state.x - tx) ** 2 + (state.y - ty) ** 2))
    #此路线节点期望的航向角减去当前车辆航向角(航向偏差),然后再加上横向偏差角即match.atan()得到的值
    #得到的delta即为控制车辆方向盘的控制量
    delta = ch[ind] - state.yaw + math.atan2(k * error, state.v)

    #  限制车轮转角 [-30, 30]
    if delta > np.pi / 6.0:
        delta = np.pi / 6.0
    elif delta < - np.pi / 6.0:
        delta = - np.pi / 6.0
    return delta, ind

定义函数用于搜索最临近的路点:

def calc_target_index(state, cx, cy):
    # 搜索最临近的路点
    dx = [state.x - icx for icx in cx]
    dy = [state.y - icy for icy in cy]
    d = [abs(math.sqrt(idx ** 2 + idy ** 2)) for (idx, idy) in zip(dx, dy)]
    ind = d.index(min(d))

    return ind

主函数:


def main():
    #  设置目标路点
    cx = np.arange(0, 50, 1)
    cy = [0 * ix for ix in cx]
    #路径的结点处的航向角,指的是车身整体
    ch = [0 * ix for ix in cx]  
    target_speed = 5.0 / 3.6  # [m/s]
    T = 200.0  # 最大模拟时间
    # 设置车辆的初始状态
    state = VehicleState(x=-0.0, y=-3.0, yaw=-0.0, v=0.0)
    lastIndex = len(cx) - 1
    time = 0.0
    x = [state.x]
    y = [state.y]
    #当前车身的航向角
    yaw = [state.yaw]
    v = [state.v]
    t = [0.0]
    target_ind = calc_target_index(state, cx, cy)

    while T >= time and lastIndex > target_ind:
        ai = PControl(target_speed, state.v)
        di, target_ind = stanley_control(state, cx, cy, ch, target_ind)
        state = update(state, ai, di)
        time = time + dt

        x.append(state.x)
        y.append(state.y)
        yaw.append(state.yaw)
        v.append(state.v)
        t.append(time)

        plt.cla()
        plt.plot(cx, cy, ".r", label="course")
        plt.plot(x, y, "-b", label="trajectory")
        plt.plot(cx[target_ind], cy[target_ind], "go", label="target")
        plt.axis("equal")
        plt.grid(True)
        plt.title("Speed[km/h]:" + str(state.v * 3.6)[:4])
        plt.pause(0.001)


if __name__ == '__main__':
    main()

仿真结果:

在这里插入图片描述

通过仿真结果图,我们看到红点表示实现规划好的直线路径,蓝线则表示我们的车辆实际运行的轨迹,绿点表示距离当前位置最近路径点,在这段代码中,我们设置了增益参数kkk为0.3,通过进一步去改变kkk的大小对比结果,可以减小kkk值得到更平滑的跟踪轨迹,但是更加平滑的结果会引起某些急剧的转角处会存在转向不足的情况。

参考

  1. Automatic Steering Methods for Autonomous Automobile Path Tracking
  2. Stanley_ The robot that won the DARPA grand challenge
  3. 无人驾驶汽车系统入门(十八)——使用pure pursuit实现无人车轨迹追踪(https://blog.youkuaiyun.com/adamshan/article/details/80555174)
  4. 无人驾驶算法——使用Stanley method实现无人车轨迹追踪
     
### Stanley 轨迹跟踪算法概述 Stanley 方法是一种用于无人驾驶车辆路径跟随的有效控制器,特别适用于处理横向偏差和航向角误差。该方法通过计算前轴中心到规划轨迹最短距离来定义横向位置误差,并利用此误差调整转向角度以使车辆沿期望路径行驶[^1]。 ### 数学模型描述 假设给定一条由一系列离散点组成的理想行车路线\( (x_d, y_d) \),对于任意时刻t下的实际车头坐标\((x,y)\), 前轮朝向θ以及速度v,则可以得到如下关系: \[ e_y = -(y-y_{d})cos(\theta)+(x-x_{d})sin(\theta) \] 其中 \(e_y\) 表示当前位姿相对于目标路径的垂直偏移量;而横摆角误差δ则可通过下述公式求得: \[ δ=atan2(e_y,v*\psi_e) \] 这里ψ_e代表的是当前位置处的理想航向与真实航向之间的差异值 atan2 函数返回 [-π,+π]范围内的弧度值[^4]。 ### 控制器设计原理 为了确保良好的动态响应特性并抑制外界干扰因素的影响,在实际控制过程中通常会引入比例积分微分(PID)调节机制作为辅助手段之一。具体来说就是将上述提到的位置偏差项同时间累积起来形成积分部分I,同时考虑其变化率构成微分校正D,最终叠加在一起共同作用于输入信号u(t): \[ u(t)=K_pe_y+K_i∫e_ydt+K_dde_y/dt \] 此处 K_p,K_i 和 K_d 分别对应着三个增益系数的选择取决于具体的硬件平台参数设定情况。 ### MATLAB/Simulink仿真案例分享 在MATLAB环境中可以通过编写脚本文件或者构建Simulink模块化结构来进行仿真实验验证所提出的方案效果如何。下面给出一段简单的Python代码片段展示如何模拟这一过程: ```python import numpy as np from math import pi, sin, cos, atan2 def stanley_control(x, y, yaw, v, cte, psi_error, k): """ Parameters: x : float - Current vehicle's X position. y : float - Current vehicle's Y position. yaw : float - Vehicle heading angle in radians. v : float - Speed of the vehicle. cte : float - Cross track error from reference path. psi_error : float - Heading error relative to reference path. k : float - Gain parameter. Returns: steer_angle : float - Calculated steering command based on Stanley method. """ # Calculate desired cross-track velocity y_speed = v * psi_error # Compute front wheel steering angle using arctangent function delta = atan2(cte*v + y_speed*k, abs(v)) return delta ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值