第一章 课程导论与预备知识:无人车路径跟踪控制概述、坐标系与车辆运动学模型、Python与ROS2环境搭建
1.1 无人车路径跟踪控制——到底在解决什么问题?
各位同学,欢迎来到《无人车路径跟踪控制实战》。我是你们这门课的主讲,一个在自动驾驶领域摸爬滚打了七八年的老工程师。
先聊聊“路径跟踪”到底是个啥。说白了,就是让一辆车,沿着一条事先规划好的路线,稳稳当当地开过去。你想想看,规划层给了你一条“理想轨迹”,但车是物理实体,有惯性、有转向延迟、有轮胎打滑。怎么让车听话?这就是路径跟踪控制要干的事。
我个人习惯把这个问题拆成三块:
- “在哪”——车辆当前的位姿(位置+朝向)
- “要去哪”——参考路径上的目标点
- “怎么去”——计算方向盘转角、油门/刹车指令
我在项目中遇到过最头疼的事,就是路径跟踪算法在仿真里跑得飞起,一上路就“画龙”。后来发现,问题出在坐标系转换上——你用的坐标系和传感器用的坐标系没对齐。嗯,这里要注意,坐标系是基础中的基础。
核心观点:路径跟踪控制的本质,是一个带约束的、时变的、非线性的跟踪问题。别被这些术语吓到,后面我们会一步步拆解。
1.2 坐标系与车辆运动学模型——你得知道车怎么动
搞无人车控制,坐标系就是你的“世界观”。我刚开始学的时候,被各种坐标系绕晕过。后来总结了一个口诀:“全局定位置,车身定朝向,轮胎定速度”。
1.2.1 常用坐标系
| 坐标系 | 原点 | 用途 |
|---|---|---|
| 全局坐标系 (World Frame) | 地图原点(如UTM坐标) | 路径规划、定位 |
| 车身坐标系 (Body Frame) | 车辆后轴中心 | 控制指令、传感器数据 |
| 轮胎坐标系 (Tire Frame) | 轮胎接地点 | 动力学分析 |
实际项目中,我最常用的是车身坐标系。为什么?因为控制指令(比如“打方向盘5度”)天然是在车身坐标系下定义的。你想想看,你不可能对车说“往东北方向打方向盘”,对吧?
1.2.2 自行车模型——最简单的运动学抽象
车辆运动学模型有很多,但入门阶段,自行车模型(Bicycle Model)是绝对的首选。它把四轮车简化成两轮车,假设左右轮转角一致,忽略侧偏。
模型的状态方程长这样:
# 自行车模型运动学方程(Python伪代码)
def update_state(x, y, yaw, v, delta, L, dt):
"""
x, y: 后轴中心位置
yaw: 航向角
v: 纵向速度
delta: 前轮转角
L: 轴距
dt: 时间步长
"""
x_next = x + v * cos(yaw) * dt
y_next = y + v * sin(yaw) * dt
yaw_next = yaw + (v / L) * tan(delta) * dt
return x_next, y_next, yaw_next
这段代码我闭着眼都能写出来。为什么?因为几乎所有路径跟踪算法(Pure Pursuit、Stanley、MPC)的底层,都跑着这个模型。我曾经在一个项目中,因为轴距L参数标定错了5厘米,导致高速跟踪时误差越来越大。避坑指南:轴距一定要实测,别信车辆手册上的标称值。
个人经验:自行车模型在低速(< 10 m/s)场景下精度足够。如果车速超过15 m/s,建议引入动力学模型,考虑轮胎侧偏刚度。我们会在后面的章节专门讲这个。
1.3 Python与ROS2环境搭建——工欲善其事,必先利其器
好了,理论说完了,咱们得动手。这门课的所有代码,我都会用 Python + ROS2 (Humble) 来演示。为什么选这个组合?
- Python:快速原型验证,适合教学。控制算法用Python写,效率足够。
- ROS2:工业级机器人操作系统,消息通信、节点管理、可视化工具一应俱全。
1.3.1 环境要求
| 组件 | 推荐版本 | 备注 |
|---|---|---|
| Ubuntu | 22.04 LTS | ROS2 Humble官方支持 |
| ROS2 | Humble Hawksbill | 长期支持版,稳定 |
| Python | 3.10+ | ROS2 Humble自带 |
| NumPy | ≥1.24 | 矩阵运算必备 |
| Matplotlib | ≥3.7 | 可视化调试 |
1.3.2 安装步骤(浓缩版)
我建议你按这个顺序来,别跳步。我曾经帮一个学员调试环境,他跳过了系统更新,结果编译ROS2包时报了一堆莫名其妙的依赖错误。
# 1. 设置locale(避免中文乱码)
sudo apt update && sudo apt install locales
sudo locale-gen en_US en_US.UTF-8
# 2. 添加ROS2源
sudo apt install software-properties-common
sudo add-apt-repository universe
sudo apt update && sudo apt install curl -y
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
# 3. 安装ROS2 Humble桌面版
sudo apt update
sudo apt install ros-humble-desktop python3-colcon-common-extensions
# 4. 安装Python依赖
pip install numpy matplotlib transforms3d
注意:如果你用的是Windows或macOS,建议用Docker或者WSL2。ROS2在非Linux系统上支持有限,别在这上面浪费时间。我见过太多人在环境搭建上卡了两三天,最后发现是系统不兼容。
1.3.3 验证安装
装完之后,跑一下这个命令,看看小乌龟能不能动:
# 终端1:启动ROS2核心
ros2 run turtlesim turtlesim_node
# 终端2:发送控制指令
ros2 run turtlesim turtle_teleop_key
如果你能看到一个小乌龟窗口,并且能用键盘控制它移动,恭喜你,环境搭好了!
1.4 本章知识体系总览
为了让你对本章内容有个整体印象,我画了一张图。这张图也是后面整个课程的技术路线图。
这张图把本章的三个核心模块串起来了。你会发现,路径跟踪控制不是孤立的知识点,它需要坐标系作为“语言”,运动学模型作为“身体”,ROS2作为“工具”。三者缺一不可。
我的建议:如果你对坐标系变换还不熟,花半小时手推一下自行车模型的雅可比矩阵。别偷懒,这个推导过程会让你对“车到底怎么动”有肌肉记忆。我当年就是这么过来的。
好了,第一章的内容就到这里。环境搭好之后,记得跑一下小乌龟示例,感受一下ROS2的消息通信机制。下一章,我们会正式进入第一个控制算法——Pure Pursuit。到时候见。
公众号:蓝海资料掘金营,微信deep3321