前言:前几篇把感知、定位、预测都拆完了,按理说无人车应该已经能"看见"周围、能知道自己在哪、能猜到别车下一步动作——剩下的最后一公里,是把这一切决策变成油门、刹车、方向盘的实际输出。这一步看起来"不起眼",但它是安全行驶的最后一道关卡:稍微抖一下、转向多一点,乘坐体感就崩了。本篇就来拆解自动驾驶里的"控制理论"——从控制模块在整车架构里的位置出发,到最基础的控制系统三域,到最经典的 PID 控制器,再到更进阶的 LQR 和 MPC,最后看看百度 Apollo 和 MATLAB 工具箱是怎么落地的。欢迎大家一起探讨~
一、控制模块在自动驾驶体系中的位置
在自动驾驶的整套架构里,控制模块(Control)扮演的是"翻译官"的角色——把上游 Planning 模块给出的轨迹"翻译"成油门、刹车、方向盘三个具体的执行动作。
1.1 Control 模块是什么
先看 Control 模块在自动驾驶体系里的上下游关系:
输入侧包含 4 类信息:
- Reference:Planning 给出的目标轨迹,告诉车"接下来要走哪条线"
- 定位信息:Localization 模块输出的车辆当前位置和姿态
- 车辆反馈信号:底盘 Canbus 上报的速度、转角、报错等
输出侧只有 3 个量——油门、刹车、方向盘。这 3 个量最终通过 Canbus 协议下发到底盘执行机构。
定位模块(Localization)、感知模块(Perception)、预测模块(Prediction)都会输出到 Planning 模块,而 Planning 的输出再传给 Control,最终 Control 通过 Canbus 控制车辆。Simulated Model 是仿真环境里的"假车",用于在仿真阶段验证控制算法。
1.2 CANBUS 与执行机构
Control 模块下达的油门/刹车/方向盘命令,要通过CANBUS(Controller Area Network,控制器局域网总线,车辆底盘交互协议,由车厂决定)才能真正落到执行机构上。CANBUS 的上下游关系分两块:
Chassis(底盘),负责真实车辆的底层信号:
仿真环境,模拟真实车辆的动力学行为:
- 运动学模型:忽略轮胎力,按几何关系描述车辆运动(适合低速、稳态场景)
- 动力学模型:考虑轮胎力、惯性等力学因素(适合高速、极限工况)
这两个模型在 Control 算法开发阶段用于离线仿真验证(Simulated Model),等算法调好后才会部署到真车底盘。
1.3 控制模块的内部处理流程
一个完整的 Control 模块内部,还细分为预处理 → 控制器 → 后处理三段流水线:
Planning、Localization、Canbus → 预处理 → 控制器 → 后处理 → 车辆
预处理(Preprocessing),负责把输入信号"洗干净":
| |
|---|
| |
| |
| 前方突然出现障碍物时触发 Emergency Stop(紧急停车) |
| 去除信号噪声,做 Lag Compensation(延迟补偿) |
控制器设计(Controller),是整个模块的核心,设计流程分四步:
- 参数 Fine Tuning:对控制参数做精细调优
后处理(Postprocessing),负责把控制器输出"打磨"后再下发:
二、控制任务与"为什么重要"
2.1 控制任务的三大类
控制模块的职责,一句话概括就是:让车辆在既定轨迹上平稳运行的学问。Control 模块要做的"翻译"工作,远不止"按一下油门"这么简单。从 Planning 给的轨迹信息,到最终输出执行命令,至少要同时满足三件事:
| | |
|---|
| | |
| 控制输出不能超过车辆物理极限(如方向盘转角、油门开度) | |
| 加速度、jerk(加加速度)不能太大,避免乘客不适 | |
此外,实时性要求也很高——一般要求100Hz(每秒 100 次)的控制频率,否则在高速场景下"反应慢半拍"就可能出问题。
2.2 为什么控制很重要
用一个类比:自动驾驶的感知/定位/预测模块相当于"驾驶员的眼睛和大脑",而 Control 模块才是"驾驶员的手脚"——它直接决定了乘客的乘坐体验。
具体来看,控制有三个不可替代的职责:
- 精细执行:对油门、刹车、方向盘的精细控制——不是简单的"开/关",而是连续可调
- 安全底线:是安全行驶的最后一道关卡——前面任何模块出错,最终都要靠控制来"兜底"
- 抗不确定性:克服外界各种不确定性环境因素(风速、湿滑路面、坡度变化等)
而且,控制问题很复杂,是一套严格的数学分支。
三、控制理论基础
3.1 为什么需要控制
控制系统本质上是一个"消除数学模型和物理模型差异"的过程——因为任何模型都不能 100% 精确描述真实物理系统,控制就是要让实际输出尽可能贴近期望输出。
对于无人车来说,控制要满足三个核心指标:
| | |
|---|
| | |
| | 保证能执行上层命令(如匀速巡航时不能一直慢 5%) |
| | |
一个反问:如果控制系统设计得不好,会出现什么现象?答案就是常见的"过冲"、"震荡"、"稳态偏移"——比如定速巡航时车速来回波动,方向盘修来修去修不到正中央。
3.2 控制系统的三个域
控制系统的分析方法有三种"语言",分别对应不同的视角:
| | |
|---|
| | |
| 通过频率(Pass Band)、停止频率(Stop Band)、带宽、截止频率 | |
| | |
时间域 vs 频率域:时间域是"看波形怎么随时间变化",频率域是"看系统对不同频率的输入有多敏感"。两者可以通过傅立叶变换(FT/FFT)相互转换——把一个时域信号拆成不同频率的正弦波叠加,反之亦然。
工程上常用的工具是拉普拉斯变换:
拉普拉斯变换是控制理论入门书必讲的内容——它把微分方程转化为代数方程,让复杂系统分析变得可能。傅立叶变换(FT/FFT)则把任意信号拆成一系列正弦波的叠加:
三域之间是相互变换的:
用互联网黑话说,控制理论的"三域"其实就是"同一件事的三种翻译"——就像英文、中文、日文都能描述同一件事,工程师根据场景选最方便的"语言"。
不同领域对特定的需求有不同的解法,控制算法也针对不同域有不同的优势。把信号在三域之间来回切换,本质上扩展了人对物理系统的深刻理解。
四、PID 控制器
4.1 最简单但最有效的控制器
PID(Proportional-Integral-Derivative)是工程上应用最广泛、最有效的控制器,没有之一。
PID 的核心特点:
- Model Free:通用性极强,任何模型都可以用——不管系统是机械、电气、化工,还是无人车
- 反馈控制:输入可以只是当前状态和目标状态(如速度、位置)
- 设计简单:三个参数 K_p、K_i、K_d,调一调就能用
一句话总结:PID 控制器的精髓就是"误差说了算"——但误差有三种"看法",所以才有了 P/I/D 三个维度。
4.2 比例 P
P:proportional(比例)
核心特性:输出与误差成正比,误差越大,作用越强。
特性拆解:
- 跟误差成正比,误差越大,作用越强——直觉上"越偏得远,越用力修"
- 容易出现震荡,无法收敛——力气用过头了,会来回拉锯
- 越靠近目标,应该作用越小,才能稳定——这正是 P 控制器需要 K_p 调小的原因
- 注意误差为 0 时,控制器输出也是 0——纯 P 控制器有稳态误差问题(见 4.4 节)
类比:你开车时偏离了车道,方向盘打的幅度和偏离距离成正比——P 项就是这种"线性反应"。
4.3 微分 D
D:derivative(微分)
核心特性:阻尼项,减少控制器输出的变化率。
特性拆解:
- 阻尼项,减少控制器输出的变化率——P 项容易"冲过头",D 项是"提前刹车"
- 考虑将来误差:计算误差的一阶导(变化趋势),和一个正值的常数相乘
- 微分控制可以提升整定时间及系统稳定性——让响应更快更稳
类比:你看到前方 5 米突然有行人,单纯靠 P(按当前距离反应)来不及。还要靠"提前感知"——D 项就是这个"预判能力"。
4.4 积分 I
I:integral(积分)
核心特性:纠正系统累计偏差,缩小稳态误差。
特性拆解:
- 无法解决系统误差导致的稳定 Error 和震荡现象——纯 P 或 PD 控制都会有"稳态误差"(系统差一点点但始终修不到位)
- 纠正系统累计偏差——把过去一段时间的误差累加起来,乘以一个正值常数
- 缩小稳态误差——只要有误差,积分项就一直累积,迟早会把误差"压下去"
- 积分控制会加速系统趋近设定值的过程,并且消除纯比例控制器会出现的稳态误差
一个反问:为什么纯 P 控制器修不到精确目标?答案是 P 项的输出与误差成正比——当误差很小时,输出也很小,但摩擦力等"阻力"可能抵消了这个小输出,所以车总是比目标慢一点点。I 项把"过去所有的小误差"累计起来,慢慢地就能克服这个阻力。
4.5 三个参数怎么调
一句话总结:P 管"快不快",I 管"准不准",D 管"稳不稳"。
4.6 频率域表达(传递函数)
PID 控制器也可以写成频率域的传递函数形式:
传递函数的优点是:直接看出系统的零极点,便于分析稳定性。在工程实践中,PID 既可以用时域实现(直接积分微分),也可以用频率域工具设计。
4.7 PID 是线性控制器
PID 控制器是线性控制器——这既是它的优点(简单、好分析),也是它的局限。
不够用的场景:
- 四轴飞行器:是多变量耦合系统(4 个电机互相影响)
- 多自由度机器人:每个关节都是一个独立的 PID,但耦合严重
所以在自动驾驶里,PID 一般只用于:
更复杂的横向控制场景,需要用到后面介绍的LQR或MPC。
4.8 位置式 vs 增量式
PID 控制器按"输出形式"还可分为两种:
无人车的控制主要用位置式——因为执行机构接收的是"目标值"而不是"增量"。
4.9 串联 PID
单个 PID 控制器对单一变量的控制是非常有效的——无人车里可以独立控制量:速度、加速度、位置、Heading。
但很多场景需要同时控制多个变量,并且存在相互干扰(比如方向盘转角会影响车速),这时候就要用串联 PID。
串联控制(Cascade Control)是改善控制质量的有效方法,能应对多变量控制和多干扰项。
核心思想:
类比:你想把车从 60 km/h 加速到 80 km/h。外环 PID 比较"目标速度 80"和"实际速度 60",输出一个"目标加速度 2 m/s²"。内环 PID 比较"目标加速度 2"和"实际加速度 1.5",输出"油门开度 +5%"。这样即使有风、有坡,内环也能很快修正。
典型的无人车串联 PID 结构:
五、复杂控制器设计
PID 控制器简单高效,但在自动驾驶的实际场景里往往不够用——尤其是横向控制,要求"又快又稳又准"。于是就有了"复杂控制器":设计思路分三步:
| |
|---|
| 按照 Planning 要求到达目标,适应不同路况,适配不同车型 |
| |
| |
这一节先讲第一步:动力学建模——只有先有了一个靠谱的"车辆模型",才能设计出"靠谱的控制器"。
5.1 车辆模型
车辆模型的作用是表征一个车辆的物理特性,核心是单车模型(Bicycle Model)。
单车模型的关键功能:
- 给出未来 N 秒车辆的状态预测(位置、速度、姿态等)
输入:当前 Vehicle State + Control inputs → 输出:未来 Vehicle Trajectory
5.2 单车模型的主要物理定律
单车模型的核心是4 条物理定律(推导基于刚体牛顿第二定律和刚体力矩分析):
这套模型也叫"简易自行车模型"(Simple Bicycle Model)——把左右轮合并成一个虚拟的轮子,建模复杂度从 4 轮减到 2 轮,计算量大幅下降,精度损失很小。
5.3 横向动力学(线性化后)
线性化的好处:把非线性微分方程变成线性时变(LTV)系统,可以套用 LQR、MPC 等成熟的线性控制理论。
5.4 小误差模型
实际工程里还常用小误差模型——只关心车和目标轨迹的偏差,而不是车的绝对运动。
模型推导过程不详细展开,完整推导可参考:http://intheworld.win/2018/11/24/lqr与汽车横向动力学/
[1] Rajamani, Vehicle dynamics and control, 2011
5.5 系统辨识模型
车辆模型里有些参数是不知道的(比如轮胎侧偏刚度 c_f、c_r,质心位置等)——这些参数需要通过实验采集。
系统辨识(System Identification)就是通过实验方法采集模型参数。常见方法有三类:
Learning-Based 方法:
工程上,汽车动力学模型大多用白箱辨识——物理结构清晰,可解释性强,便于控制器设计。
六、LQR(线性二次调节器)
6.1 最优控制理论
LQR 是最优控制理论(Optimal Control)的代表方法。
最优控制的核心思想:
控制理论的"复杂度和精准度"演进路径:
复杂度从左往右递增,精准度也从左往右递增。
6.2 LQR 是什么
LQR(Linear Quadratic Regulator,线性二次调节器)是一种基于模型的控制器:
状态 X(设计 LQR 需要哪些状态量):
控制量 U(LQR 的输出):
6.3 LQR 状态方程
LQR 假设系统是线性等式(L):
设计目标是尽可能减少误差,同时使用最小的输入量 U:
Cost 函数:
其中 和 为正定矩阵(设计参数):
6.4 LQR 的最优解
这里给的是连续空间的求解方法,还有离散空间的表达式——工程实现通常用离散版本。
6.5 LQR 的工程优势
LQR 之所以成为横向控制的主流方案:
- 实时性好:u = -Kx 只需矩阵乘法,CPU 占用极低
- 参数调节直观:调整 Q 和 R 就能在"精度"和"省油/舒适"之间取舍
- 稳定性有保证:LQR 设计出来的控制器天然稳定(闭环稳定)
七、MPC(模型预测控制)
7.1 为什么需要 MPC
LQR 已经很好了,但在自动驾驶里仍然不够用——原因是LQR 无法处理约束。
比如车辆有以下物理约束:
- 加速度有上下限(a_min ≤ a ≤ a_max)
LQR 把这些约束当"软约束"(超一点没关系),但 MPC 可以把约束当"硬约束"(绝对不能超)。
7.2 MPC 的核心思想
MPC(Model Predictive Control,模型预测控制)是更为复杂的控制器,也是当前自动驾驶横向控制的主流方案——百度 Apollo 的横向控制就采用了 MPC。
MPC 的基本步骤:
- 计算有限时间范围内的最优控制输入:在预测窗口里求解最优控制序列
- 执行第一组控制输入:只执行第一步控制,下一时刻重新计算
迭代优化的思想:
类比:你在高速上开车,眼睛不断看前方 100 米的路况(建立模型 + 预测),大脑每秒算出未来 3 秒的转向和刹车序列(优化),但只执行第一步(方向盘打 2°),下一秒重新算。这就是 MPC 的"滚动优化"。
7.3 LQR vs MPC
7.4 MPC 的关键挑战
时效性 vs 准确性:
MPC 的优化窗口(time horizon)越长,理论上越能找到全局最优解;但计算量也越大,实时性变差。
搜索问题:通过车辆动力学模型来减少解空间——MPC 不是"穷举所有可能的转向角",而是基于动力学模型预测"合理的转向角范围",在这个范围内搜索最优解。
模型、约束、优化结合:
MPC 的核心是同时优化三个目标:
- Discomfort(舒适性):jerk 加速度不能太大
- Cross Track Error(横向偏差):跟规划线的横向距离最小
无人车做 MPC 控制时,CPU 负载通常会比 LQR 高一个数量级——这就是为什么有些量产车只敢用 LQR,而研究/高端车型才上 MPC。
7.5 MPC 控制流程图
MPC 的标准控制流程:
y_k → [比较器] → MPC controller → u_k → 真实系统 G → y_k ↑ └─ 预测系统 G* ← 反馈校正 ← y_k(实际输出)
核心组件:
- 反馈校正:用实际输出修正模型预测的偏差(应对模型不精确)
7.6 MPC 状态方程
车辆误差跟踪状态方程:
状态 X:
控制量 U:
扰动 C:
连续形式:
离散形式(工程实现):
7.7 MPC 优化问题
未来 N 个周期的状态方程预测:
目标函数(二次规划形式):
约束:
改写为标准二次规划形式:
八、Apollo 控制算法与 MATLAB 工具箱
8.1 Apollo 的控制器组合
百度 Apollo 是国内自动驾驶的代表性开源项目,其横向控制器的设计很有代表性:
Apollo 的设计思路:纵向用 PID(简单成熟),横向用 LQR + MPC(精度+约束)——把最合适的控制器放在最合适的位置。
8.2 MATLAB 控制算法工具箱
工程上做控制算法仿真和验证,主要用 MATLAB + Simulink 生态:
MATLAB 平台工具:
控制算法工具箱:
| |
|---|
| |
| |
| Automated Driving Toolbox | |
| Model Predictive Control Toolbox | |
官方学习资源:
- MATLAB 中国官网:https://ww2.mathworks.cn/?s_tid=gn_logo
- MPC 自动驾驶教程:https://ww2.mathworks.cn/help/mpc/ug/automated-driving-using-model-predictive-control.html
谢谢观看,码字不易。如果觉得文章对您有帮助,感谢您点个在看,转发分享!