第十三讲:L1 控制器

第十三讲:L1 控制器 🎮

授课内容:L1 路径跟踪算法原理与应用
适用场景:阿克曼结构小车导航

📋 本节目录

  1. 什么是 L1 控制器
  2. 核心算法原理
  3. 代码逻辑解析
  4. 与 move_base 的协作
  5. 参数配置与调试

1️⃣ 什么是 L1 控制器 🤔

L1 控制器定义

L1 控制器是一种高效的路径跟踪算法

它主要用于阿克曼转向结构(类似汽车)的小车,帮助小车精准地沿着既定路线行驶。

比喻👨‍🦯
就像一个老司机在开车:

  • 眼睛盯着前方 3 米远的一个路牌(目标点) 🎯
  • 转动方向盘让车头对准那个路牌
  • 随着车往前开,路牌也沿着路不断往前移

为什么要用 L1?

✅ 稳定性高:比简单的 PID 转向更平滑
✅ 计算快:算法逻辑简单,对硬件要求低
✅ 抗干扰:路面的一点小坑洼不会导致由于剧烈转向而翻车

2️⃣ 核心算法原理 📐

2.1 几个重要概念

  1. L1 距离:小车中心到目标点的距离 📏
  2. 前瞻角 (Eta):车头朝向与目标点连线的夹角
  3. 前瞻点:路径上距离小车恰好 L1 距离的那一点

2.2 如何寻找前瞻点?

算法会不断扫描 move_base 给出的全局路径:

  • 找到小车前方最近的点
  • 沿着路径往下找,直到距离大于 L1
  • 这点就是我们要瞄准的目标点

3️⃣ 代码逻辑解析 💻

3.1 转向角计算

这是 L1_controller_v2.cpp 中的核心公式:

double L1Controller::getSteeringAngle(double eta)
{
    // L 是轴距,Lfw 是前瞻距离
    // 基于几何关系计算舵机转向角
    double steering_angle = -atan2((L*sin(eta)),(Lfw/2+lfw*cos(eta)))*(180.0/PI);
    return steering_angle;
}

提示💡

  • eta 是我们瞄准的角度
  • 结果会被转换为角度值发给舵机

3.2 速度自适应 L1 距离

为了在高速下更稳,L1 距离会随着车速变化:

double L1Controller::getL1Distance(const double& _Vcmd)
{
    double L1 = 0;
    if(_Vcmd < 1.34)
        L1 = 1.0; // 低速时前瞻 1 米
    else if(_Vcmd > 1.34 && _Vcmd < 5.36)
        L1 = _Vcmd * 2.24 / 3.0; // 中速随速度增加
    else
        L1 = 4.0; // 高速封顶 4 米
    return L1;
}

4️⃣ 与 move_base 的协作 🤝

协作机制

L1 控制器并不是独立工作的,它需要规划师提供地图。

  1. 规划师 (move_base):负责在大地图上画出一条通往终点的折线 🗺️
  2. 执行者 (L1 Controller):负责盯着这条线,控制舵机和马达跑起来

接口连接图

  • 输入/move_base/NavfnROS/plan (全局路径)
  • 输入/odometry/filtered (小车当前位置)
  • 输出/ackermann_cmd (控制命令)

流程
路径输入 ➡️ 计算前瞻点 ➡️ 计算 Eta 角 ➡️ 输出转向 ➡️ 小车移动

5️⃣ 启动与调试 🚀

5.1 如何启动?

# 1. 确保底盘和雷达已连接
# 2. 启动 L1 导航脚本
roslaunch tianracer_navigation tianracer_l1_nav.launch

操作步骤

  1. 打开 Rviz 观察小车位置
  2. 点击上方工具栏的 2D Nav Goal
  3. 在地图上点一个目的地,小车即刻出发!

5.2 参数微调 ⚙️

如果车开得不好,可以尝试修改 tianracer_move_base.launch.xml

参数 作用 调试建议
Vcmd 期望车速 先从 0.5 开始,稳了再加
angle_gain 转向倍率 车拐弯不够快就调大(注意正负)
base_speed 基础转速 建议与 Vcmd 保持一致

⚠️ 常见问题排查

  • Q: 小车画 S 弯反向跑?
    • A: 检查 angle_gain 的正负号是否正确。
  • Q: 小车在原地转圈圈?
    • A: 检查雷达定位(AMCL)是否已经对齐。
  • Q: 到了终点不停车?
    • A: 观察 goal_radius 判断是否进入了终点圈。

感谢学习! 🏁

课后练习

  • 尝试更换不同的 Vcmd,观察 L1 距离的变化
  • 调整 angle_gain 让小车转弯更丝滑
■ tianbot