风丶信子 2026-01-04 17:57 采纳率: 0%
浏览 4

纯追踪法横向误差收敛

我下载了你的纯追踪法的代码,我发现你的代码结果图中圆圈的追踪轨迹的横向误差以及逆时针圆圈的追踪轨迹的横向误差在收敛的时候有着高频低幅震荡现象,还有就是S型轨迹的横向误差无法收敛。我是初学者,我想问一下这个这种现象是正常的吗?出现这种现象的原因是什么?能不能通过pid调参做到完美收敛?

img

img

img

  • 写回答

2条回答 默认 最新

  • 檀越@新空间 2026-01-04 17:58
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    你的问题非常有代表性,涉及到纯追踪法(Pure Pursuit)在路径跟踪中的横向误差收敛性轨迹形状对控制效果的影响。我们来逐步分析你提到的现象,并给出详细的解释与解决方案。


    一、什么是“纯追踪法”?

    纯追踪法是一种经典的路径跟踪算法,其核心思想是:

    • 车辆以当前速度向前行驶
    • 目标点是距离车辆一定距离的路径上的点(通常为前方某个固定距离,如5米);
    • 车辆不断调整方向,使车头指向目标点

    它简单、易于实现,但也有明显的局限性,尤其是在复杂轨迹(如S型、圆圈)中容易出现横向误差无法收敛高频震荡的问题。


    二、你观察到的现象是否正常?

    1. 圆圈轨迹的横向误差高频低幅震荡

    这是正常的现象,原因如下:

    • 纯追踪法本身是基于几何的控制器,不考虑动力学模型(如加速度、惯性等),因此在曲线路径上会出现持续的轻微偏差
    • 圆形轨迹中,车辆会不断向内偏转,导致横向误差周期性波动,形成高频低幅震荡
    • 这种震荡在理论上是无法完全消除的,因为车辆始终在“追赶”目标点,而目标点也在不断变化。

    重点:纯追踪法在圆弧路径中无法实现完美收敛,只能做到近似跟踪。


    2. S型轨迹的横向误差无法收敛

    这个现象不正常,说明你的代码可能存在以下问题:

    常见原因包括:

    1. 目标点选择不当

      • 纯追踪法依赖于“前方目标点”的选择,如果目标点选择错误(如过远或过近),会导致控制失效。
      • 特别是在S型轨迹中,目标点可能落在“拐弯”处,导致控制信号不稳定。
    2. 参数设置不合理

      • 如果**前视距离(lookahead distance)**设置太小,车辆会频繁改变方向,导致误差大;
      • 如果设置太大,则可能导致“超调”,无法及时响应路径变化。
    3. 没有加入PID控制

      • 纯追踪法本身是开环控制,若想提高精度,需要配合PID控制器进行闭环调节。
    4. 路径点密度不足

      • 如果路径点过于稀疏,车辆可能会错过关键转折点,导致误差累积。

    三、能否通过PID调参做到“完美收敛”?

    可以,但不能“完美”收敛

    • PID控制器可以显著改善横向误差的收敛性稳定性
    • 无法彻底消除所有误差,尤其是对于非平滑路径(如S型、圆圈);
    • 通过合理调参,可以降低误差幅度减少震荡频率,从而实现更平稳的跟踪

    四、解决方案与优化建议

    1. 优化目标点选择策略

    • 使用动态目标点选择,而不是固定的前视距离;
    • 根据当前路径曲率动态调整前视距离,例如:
      lookahead_distance = max(5, curvature * 10)  # 根据曲率自适应调整
      

    2. 引入PID控制器

    • 在纯追踪法基础上,加入横向误差的PID控制,用于修正方向角;
    • 示例代码片段(Python):
    # 定义PID参数
    Kp = 0.8
    Ki = 0.01
    Kd = 0.1
    
    # 计算横向误差
    error = cross_track_error  # 横向误差
    
    # PID控制
    control_output = Kp * error + Ki * integral_error + Kd * derivative_error
    
    # 调整转向角度
    steering_angle = pure_pursuit_angle + control_output
    

    重点:PID控制能有效抑制高频震荡,提升系统稳定性。

    3. 调整前视距离(Lookahead Distance)

    • 尝试不同的前视距离值,观察对误差的影响;
    • 一般推荐范围:3m ~ 10m,根据实际速度和路径复杂度调整。

    4. 增加路径点密度

    • 对于S型等复杂轨迹,确保路径点足够密集,避免车辆“跳过”关键点;
    • 可使用插值方法(如线性插值)生成更多路径点。

    5. 使用改进的追踪算法(可选)

    • 若纯追踪法仍无法满足需求,可尝试:
      • Stanley控制器
      • Model Predictive Control (MPC)
      • LQR控制器

    五、总结

    | 问题 | 是否正常 | 原因 | 解决方案 | |------|----------|------|----------| | 圆圈轨迹横向误差高频震荡 | ✅ 正常 | 纯追踪法特性 | 不可完全消除,可通过PID优化 | | S型轨迹横向误差不收敛 | ❌ 不正常 | 目标点选择/参数/路径点密度 | 优化目标点、PID控制、增加路径点 | | 能否PID调参实现完美收敛? | ❌ 不能 | 系统固有特性 | 可显著改善,但不能完全消除 |


    六、示例修改后的代码(Python)

    import math
    
    def pure_pursuit(current_pos, target_path, lookahead_distance):
        # 找到最近的路径点
        nearest_index = find_nearest_point(current_pos, target_path)
        
        # 选择目标点
        if nearest_index + 1 < len(target_path):
            target_point = target_path[nearest_index + 1]
        else:
            target_point = target_path[-1]
    
        # 计算目标点与车辆的相对位置
        dx = target_point[0] - current_pos[0]
        dy = target_point[1] - current_pos[1]
        angle_to_target = math.atan2(dy, dx)
    
        # 计算横向误差
        cross_track_error = math.sqrt(dx**2 + dy**2) * math.sin(angle_to_target - current_heading)
    
        # PID 控制器
        Kp = 0.8
        Ki = 0.01
        Kd = 0.1
        control_output = Kp * cross_track_error + Ki * integral_error + Kd * (cross_track_error - last_error)
        last_error = cross_track_error
    
        # 计算最终转向角
        steering_angle = angle_to_target + control_output
    
        return steering_angle
    

    如果你愿意,我可以进一步帮你调试你的代码,或者提供一个完整的仿真环境(如ROS、Gazebo、Python模拟器)来验证这些优化效果。欢迎继续提问!

    评论

报告相同问题?

问题事件

  • 创建了问题 1月4日