1、课程导论与预备知识:为什么需要车道保持?
大家好,我是你们这门课的主讲。在自动驾驶这个圈子里摸爬滚打了快十年,说实话,每次带新人入门,我第一个让他们搞明白的,就是车道保持。
你想想看,一辆车在高速上跑,最基础、最核心的能力是什么?不是变道超车,不是自动泊车,而是——老老实实待在车道里。车道保持,说白了就是自动驾驶的「基本功」。如果这个基本功都打不牢,后面那些花里胡哨的功能,全是空中楼阁。
1.1 为什么需要车道保持?
我在项目里遇到过不少这样的场景:仿真里跑得飞起的算法,一上实车就开始画龙。为什么?因为仿真环境太「干净」了,没有真实道路上的那些不确定性。
车道保持解决的核心问题,其实就一个:让车辆始终沿着车道中心线行驶。听起来简单吧?但这里面涉及到的技术栈,从感知到决策再到控制,几乎贯穿了整个自动驾驶系统。
核心价值:车道保持是L2级辅助驾驶的基石,也是迈向更高级别自动驾驶的必经之路。没有稳定的车道保持,ACC(自适应巡航)、LCC(车道居中控制)都是空谈。
1.2 课程目标与学习路径
这门课的目标很明确:带你从零搭建一套能跑在实车上的车道保持系统。不是那种只会在仿真里画曲线的玩具,而是真正能应对真实路况的工程方案。
我个人习惯把学习路径分成三个阶段:
- 仿真阶段:在Carla/Simulink里搭建环境,验证控制算法。这个阶段成本最低,摔倒了也不疼。
- 硬件在环阶段:把算法部署到嵌入式平台,接入真实传感器数据。嗯,这里要注意,很多坑都是在这个阶段冒出来的。
- 实车调试阶段:上路跑,调参数,处理各种边缘场景。我曾经在这个阶段连续熬了三个通宵,就为了搞定一个方向盘抖动的问题。
我的建议:别急着上实车。在仿真里把PID和MPC的差异吃透,能省下你后面80%的调试时间。
1.3 所需软硬件环境
工欲善其事,必先利其器。咱们这门课需要准备的东西,我列个清单:
| 类别 | 工具/平台 | 说明 |
|---|---|---|
| 操作系统 | Ubuntu 20.04/22.04 | ROS2目前对Ubuntu支持最好 |
| 中间件 | ROS2 Humble/Foxy | 推荐Humble,生态更成熟 |
| 仿真环境 | Carla 0.9.14+ / Simulink | Carla适合感知+控制联调,Simulink适合纯控制算法验证 |
| 实车平台 | 线控底盘(如Autoware.auto) | 建议用改装好的线控车,别自己改,安全第一 |
| 编程语言 | C++ / Python | 控制模块用C++,原型验证用Python |
这里我要多说一句:ROS2不是必须的,但强烈建议用。为什么?因为它的分布式架构和丰富的工具链,能让你在调试时省下大量时间。我之前带过一个团队,坚持用自研通信框架,结果光是调试数据回放就折腾了两周。
1.4 基础概念:PID、MPC与横向控制
好,接下来咱们聊聊最核心的理论基础。这部分内容,说白了就是控制算法的「三驾马车」。
1.4.1 PID控制
PID,比例-积分-微分控制。这是最经典、最直观的控制算法。你想想看,开车时发现车偏左了,你往右打方向盘——这就是P(比例)控制。发现偏得越来越厉害,你加大打方向盘的力度——这就是I(积分)控制。发现车正在快速往左偏,你提前回正——这就是D(微分)控制。
代码实现其实很简单:
class PIDController {
public:
double compute(double error, double dt) {
integral_ += error * dt;
double derivative = (error - prev_error_) / dt;
prev_error_ = error;
return Kp_ * error + Ki_ * integral_ + Kd_ * derivative;
}
private:
double Kp_, Ki_, Kd_;
double integral_ = 0.0;
double prev_error_ = 0.0;
};
避坑指南:我曾经在实车上只用PID做车道保持,结果遇到连续弯道时,车辆开始剧烈振荡。后来发现是积分项饱和了。记住:PID适合直线和缓弯,遇到急弯,你得考虑更高级的控制策略。
1.4.2 MPC控制
MPC,模型预测控制。这玩意儿比PID复杂得多,但效果也更好。它的核心思想是:预测未来N步的状态,然后优化当前的控制量。
你想想看,PID是「看到偏差才反应」,MPC是「预见到偏差提前反应」。这就是为什么MPC在高速弯道中表现远优于PID。
一个简化的MPC公式长这样:
minimize: Σ (y_pred - y_ref)^2 + λ * u^2
subject to: x(k+1) = A*x(k) + B*u(k)
u_min ≤ u ≤ u_max
嗯,这里要注意,MPC的计算量比较大。我在嵌入式平台上部署时,曾经因为优化求解器选得不对,导致控制周期从50ms拖到了200ms。后来换了OSQP求解器,才把时间压下来。
1.4.3 横向控制
横向控制,说白了就是控制方向盘。它和纵向控制(油门刹车)是两套独立的系统,但需要协同工作。
横向控制的核心指标有三个:
- 横向偏差:车辆中心到车道中心线的距离
- 航向偏差:车辆朝向与车道切线方向的夹角
- 曲率:当前道路的弯曲程度
我个人习惯用预瞄-跟随模型来做横向控制。简单说就是:不看当前的位置,而是看前方一段距离(预瞄距离)的位置,然后控制车辆去跟随那个点。这样做的好处是,能提前响应弯道变化。
一个小技巧:预瞄距离不是固定的。车速越快,预瞄距离应该越长。我一般用 v * 1.5 秒作为预瞄距离,效果还不错。
1.5 本章小结
这一章咱们把车道保持的「为什么」和「是什么」讲清楚了。下一章,我会带你搭建完整的仿真环境,手把手写第一个车道保持节点。
记住:控制算法的核心不是数学公式,而是你对车辆动态的理解。公式可以查书,但感觉只能靠实践积累。
好了,咱们下一章见。
公众号:蓝海资料掘金营,微信deep3321