当前位置:首页>自动驾驶>自动驾驶之控制篇

自动驾驶之控制篇

  • 2026-09-07 04:49:53
自动驾驶之控制篇

前言:前几篇把感知、定位、预测都拆完了,按理说无人车应该已经能"看见"周围、能知道自己在哪、能猜到别车下一步动作——剩下的最后一公里,是把这一切决策变成油门、刹车、方向盘的实际输出。这一步看起来"不起眼",但它是安全行驶的最后一道关卡:稍微抖一下、转向多一点,乘坐体感就崩了。本篇就来拆解自动驾驶里的"控制理论"——从控制模块在整车架构里的位置出发,到最基础的控制系统三域,到最经典的 PID 控制器,再到更进阶的 LQR 和 MPC,最后看看百度 Apollo 和 MATLAB 工具箱是怎么落地的。欢迎大家一起探讨~


一、控制模块在自动驾驶体系中的位置

在自动驾驶的整套架构里,控制模块(Control)扮演的是"翻译官"的角色——把上游 Planning 模块给出的轨迹"翻译"成油门、刹车、方向盘三个具体的执行动作。

1.1 Control 模块是什么

先看 Control 模块在自动驾驶体系里的上下游关系:

输入
输出
轨迹线 Reference
油门
定位信息(Localization 输出)
刹车
地图信息(HD-Map)
方向盘
车辆反馈信号(Canbus 反馈)

输入侧包含 4 类信息:

  • Reference:Planning 给出的目标轨迹,告诉车"接下来要走哪条线"
  • 定位信息:Localization 模块输出的车辆当前位置和姿态
  • 地图信息:HD-Map 提供的高精度地图信息
  • 车辆反馈信号:底盘 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),负责把输入信号"洗干净":

处理
说明
数据清洗
剔除不正常信号、Planning 异常值
合理性检查
校验定位信息、车辆底盘信号是否合理
紧急处理
前方突然出现障碍物时触发 Emergency Stop(紧急停车)
信号 Smooth
去除信号噪声,做 Lag Compensation(延迟补偿)

控制器设计(Controller),是整个模块的核心,设计流程分四步:

  • 建模:建立车辆/系统的数学模型
  • 系统参数辨识:标定模型参数
  • 控制观测器设计:设计观测器估计系统状态
  • 参数 Fine Tuning:对控制参数做精细调优

后处理(Postprocessing),负责把控制器输出"打磨"后再下发:

处理
说明
Saturation/Limitation 处理
对执行器的固有缺陷做补偿(如限幅、死区补偿)
信号 Smoothing
简单的平滑处理和异常检查

二、控制任务与"为什么重要"

2.1 控制任务的三大类

控制模块的职责,一句话概括就是:让车辆在既定轨迹上平稳运行的学问。Control 模块要做的"翻译"工作,远不止"按一下油门"这么简单。从 Planning 给的轨迹信息,到最终输出执行命令,至少要同时满足三件事:

任务
含义
难度
不同环境下的轨迹跟踪
雨雪、陡坡、石头路等不同工况下都能跟随规划线
保证车辆可行性
控制输出不能超过车辆物理极限(如方向盘转角、油门开度)
保证车辆舒适性
加速度、jerk(加加速度)不能太大,避免乘客不适

此外,实时性要求也很高——一般要求100Hz(每秒 100 次)的控制频率,否则在高速场景下"反应慢半拍"就可能出问题。

2.2 为什么控制很重要

用一个类比:自动驾驶的感知/定位/预测模块相当于"驾驶员的眼睛和大脑",而 Control 模块才是"驾驶员的手脚"——它直接决定了乘客的乘坐体验。

具体来看,控制有三个不可替代的职责:

  • 精细执行:对油门、刹车、方向盘的精细控制——不是简单的"开/关",而是连续可调
  • 安全底线:是安全行驶的最后一道关卡——前面任何模块出错,最终都要靠控制来"兜底"
  • 抗不确定性:克服外界各种不确定性环境因素(风速、湿滑路面、坡度变化等)

而且,控制问题很复杂,是一套严格的数学分支。


三、控制理论基础

3.1 为什么需要控制

控制系统本质上是一个"消除数学模型和物理模型差异"的过程——因为任何模型都不能 100% 精确描述真实物理系统,控制就是要让实际输出尽可能贴近期望输出。

对于无人车来说,控制要满足三个核心指标:

指标
含义
工程意义
Stability(稳定性)
对于任何环境都需要稳定
安全——稳定压倒一切
稳态误差
尽可能小
保证能执行上层命令(如匀速巡航时不能一直慢 5%)
动态误差
动态过程中需要保证很多性能
转向、加速、减速过程中不偏离、不超调

一个反问:如果控制系统设计得不好,会出现什么现象?答案就是常见的"过冲"、"震荡"、"稳态偏移"——比如定速巡航时车速来回波动,方向盘修来修去修不到正中央。

3.2 控制系统的三个域

控制系统的分析方法有三种"语言",分别对应不同的视角:

关注指标
用途
时间域(Time Domain)
超调量、超调时间、稳态调整时间、上升时间
看波形随时间的演化
频率域(Frequency Domain)
通过频率(Pass Band)、停止频率(Stop Band)、带宽、截止频率
看系统对不同频率输入的响应
离散域(z 变换)
离散时间序列的稳定性分析
数字控制器、嵌入式实现

时间域 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

Pproportional(比例)

核心特性:输出与误差成正比,误差越大,作用越强。

特性拆解

  • 跟误差成正比,误差越大,作用越强——直觉上"越偏得远,越用力修"
  • 容易出现震荡,无法收敛——力气用过头了,会来回拉锯
  • 越靠近目标,应该作用越小,才能稳定——这正是 P 控制器需要 K_p 调小的原因
  • 注意误差为 0 时,控制器输出也是 0——纯 P 控制器有稳态误差问题(见 4.4 节)

类比:你开车时偏离了车道,方向盘打的幅度和偏离距离成正比——P 项就是这种"线性反应"。

4.3 微分 D

Dderivative(微分)

核心特性阻尼项,减少控制器输出的变化率。

特性拆解

  • 阻尼项,减少控制器输出的变化率——P 项容易"冲过头",D 项是"提前刹车"
  • 考虑将来误差:计算误差的一阶导(变化趋势),和一个正值的常数相乘
  • 微分控制可以提升整定时间及系统稳定性——让响应更快更稳

类比:你看到前方 5 米突然有行人,单纯靠 P(按当前距离反应)来不及。还要靠"提前感知"——D 项就是这个"预判能力"。

4.4 积分 I

Iintegral(积分)

核心特性纠正系统累计偏差,缩小稳态误差。

特性拆解

  • 无法解决系统误差导致的稳定 Error 和震荡现象——纯 P 或 PD 控制都会有"稳态误差"(系统差一点点但始终修不到位)
  • 纠正系统累计偏差——把过去一段时间的误差累加起来,乘以一个正值常数
  • 缩小稳态误差——只要有误差,积分项就一直累积,迟早会把误差"压下去"
  • 积分控制会加速系统趋近设定值的过程,并且消除纯比例控制器会出现的稳态误差

一个反问:为什么纯 P 控制器修不到精确目标?答案是 P 项的输出与误差成正比——当误差很小时,输出也很小,但摩擦力等"阻力"可能抵消了这个小输出,所以车总是比目标慢一点点。I 项把"过去所有的小误差"累计起来,慢慢地就能克服这个阻力。

4.5 三个参数怎么调

一句话总结:P 管"快不快",I 管"准不准",D 管"稳不稳"

4.6 频率域表达(传递函数)

PID 控制器也可以写成频率域的传递函数形式:

传递函数的优点是:直接看出系统的零极点,便于分析稳定性。在工程实践中,PID 既可以用时域实现(直接积分微分),也可以用频率域工具设计。

4.7 PID 是线性控制器

PID 控制器是线性控制器——这既是它的优点(简单、好分析),也是它的局限。

不够用的场景

  • 四轴飞行器:是多变量耦合系统(4 个电机互相影响)
  • 多自由度机器人:每个关节都是一个独立的 PID,但耦合严重
  • 复杂无人车系统:横向+纵向+加减速同时控制

所以在自动驾驶里,PID 一般只用于:

  • 纵向 PID 控制器(速度控制)
  • 横向 PID 控制器(简单的车道保持)

更复杂的横向控制场景,需要用到后面介绍的LQRMPC

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)就是通过实验方法采集模型参数。常见方法有三类:

方法
思路
适用场景
白箱辨识(White Box)
基于物理定律推导出模型结构,通过实验测参数
汽车动力学(大多用白箱)
黑箱辨识(Black Box)
不关心物理过程,直接用数据拟合输入-输出关系
有点像神经网络
灰箱辨识(Grey Box)
部分基于物理定律,部分用数据拟合
物理模型+数据修正

Learning-Based 方法

  • 机器学习:用数据驱动方法直接学习控制器(端到端)

工程上,汽车动力学模型大多用白箱辨识——物理结构清晰,可解释性强,便于控制器设计。


六、LQR(线性二次调节器)

6.1 最优控制理论

LQR 是最优控制理论(Optimal Control)的代表方法。

最优控制的核心思想

  • 给定一个系统和环境扰动
  • 根据需求条件(Objective)
  • 实现最优的控制量决策

控制理论的"复杂度和精准度"演进路径:

复杂度从左往右递增,精准度也从左往右递增

6.2 LQR 是什么

LQR(Linear Quadratic Regulator,线性二次调节器)是一种基于模型的控制器

  • 通过车辆状态和模型推理,使得误差最小
  • 常用于设计横向控制器

状态 X(设计 LQR 需要哪些状态量):

状态
说明
横向误差 及其变化率
车当前位置和目标轨迹的横向偏差
Heading 误差 及其变化率
车头方向与目标方向的偏差

控制量 U(LQR 的输出):

控制量
说明
方向盘
转角
油门
加速
刹车
减速

6.3 LQR 状态方程

LQR 假设系统是线性等式(L)

设计目标是尽可能减少误差,同时使用最小的输入量 U

  • 误差小 → 系统跟随目标好
  • 输入小 → 省油、平滑

Cost 函数

其中  和  为正定矩阵(设计参数):

  • Q 大 → 更看重误差(精度优先)
  • R 大 → 更看重输入小(省油/舒适优先)

6.4 LQR 的最优解

这里给的是连续空间的求解方法,还有离散空间的表达式——工程实现通常用离散版本。

6.5 LQR 的工程优势

LQR 之所以成为横向控制的主流方案:

  • 设计成熟:有标准 Riccati 方程求解工具
  • 实时性好:u = -Kx 只需矩阵乘法,CPU 占用极低
  • 参数调节直观:调整 Q 和 R 就能在"精度"和"省油/舒适"之间取舍
  • 稳定性有保证:LQR 设计出来的控制器天然稳定(闭环稳定)

七、MPC(模型预测控制)

7.1 为什么需要 MPC

LQR 已经很好了,但在自动驾驶里仍然不够用——原因是LQR 无法处理约束

比如车辆有以下物理约束:

  • 方向盘转角不能超过正负35度
  • 方向盘转速不能超过一定限值
  • 加速度有上下限(a_min  ≤  a  ≤   a_max)
  • 横向加速度不能太大(乘客会晕)

LQR 把这些约束当"软约束"(超一点没关系),但 MPC 可以把约束当"硬约束"(绝对不能超)。

7.2 MPC 的核心思想

MPC(Model Predictive Control,模型预测控制)是更为复杂的控制器,也是当前自动驾驶横向控制的主流方案——百度 Apollo 的横向控制就采用了 MPC。

MPC 的基本步骤

  1. 建立模型:用车辆动力学模型预测未来 N 步的状态
  2. 计算有限时间范围内的最优控制输入:在预测窗口里求解最优控制序列
  3. 执行第一组控制输入:只执行第一步控制,下一时刻重新计算

迭代优化的思想

  • 先计算一系列的控制输入并优化该序列输入
  • 执行第一组控制输入
  • 循环执行上面两步

类比:你在高速上开车,眼睛不断看前方 100 米的路况(建立模型 + 预测),大脑每秒算出未来 3 秒的转向和刹车序列(优化),但只执行第一步(方向盘打 2°),下一秒重新算。这就是 MPC 的"滚动优化"。

7.3 LQR vs MPC

维度
LQR
MPC
优化区间
固定的时间区间(一般为无限时间)
不同的时间区间分别进行最佳化
约束处理
软约束
硬约束
计算量
极小(u = -Kx)
较大(每步求解二次规划)
精度
更高
适用场景
简单横向控制
复杂工况、需考虑约束

7.4 MPC 的关键挑战

时效性 vs 准确性

MPC 的优化窗口(time horizon)越长,理论上越能找到全局最优解;但计算量也越大,实时性变差。

窗口
优点
缺点
Short Time Horizon
实时性好
只关注当前修正,容易陷入局部最优
Long Time Horizon
全局优化
计算量大,可能算不过来

搜索问题:通过车辆动力学模型来减少解空间——MPC 不是"穷举所有可能的转向角",而是基于动力学模型预测"合理的转向角范围",在这个范围内搜索最优解。

模型、约束、优化结合

MPC 的核心是同时优化三个目标:

  • Discomfort(舒适性):jerk 加速度不能太大
  • Jerking(顿挫):加速度变化率不能太大
  • Cross Track Error(横向偏差):跟规划线的横向距离最小

无人车做 MPC 控制时,CPU 负载通常会比 LQR 高一个数量级——这就是为什么有些量产车只敢用 LQR,而研究/高端车型才上 MPC。

7.5 MPC 控制流程图

MPC 的标准控制流程:

y_k → [比较器] → MPC controller → u_k → 真实系统 G → y_k              ↑              └─ 预测系统 G* ← 反馈校正 ← y_k(实际输出)

核心组件

  • 预测系统:用车辆动力学模型预测未来 N 步的状态
  • 滚动优化:在预测窗口里求解最优控制序列
  • 反馈校正:用实际输出修正模型预测的偏差(应对模型不精确)

7.6 MPC 状态方程

车辆误差跟踪状态方程

状态 X

状态
说明
横向误差 e_d
车当前位置和目标轨迹的横向偏差
Heading 误差 e_θ
车头方向与目标方向的偏差
位置误差 e_s
沿路径方向的偏差
速度误差 e_v
当前速度与目标速度的偏差

控制量 U

控制量
说明
转向角δ
方向盘转角
加速度α
油门/刹车

扰动 C

扰动
说明
横向角变化率
路径曲率扰动
加速度参考值
期望加速度

连续形式

离散形式(工程实现):

7.7 MPC 优化问题

未来 N 个周期的状态方程预测

目标函数(二次规划形式):

约束

改写为标准二次规划形式


八、Apollo 控制算法与 MATLAB 工具箱

8.1 Apollo 的控制器组合

百度 Apollo 是国内自动驾驶的代表性开源项目,其横向控制器的设计很有代表性:

控制器
用途
纵向 PID 控制器
控制车速、油门、刹车
横向 LQR 控制器
简单场景下的横向控制(车道保持)
MPC 控制器
复杂场景下的横向控制(弯道、变道、避障)

Apollo 的设计思路:纵向用 PID(简单成熟),横向用 LQR + MPC(精度+约束)——把最合适的控制器放在最合适的位置。

8.2 MATLAB 控制算法工具箱

工程上做控制算法仿真和验证,主要用 MATLAB + Simulink 生态:

MATLAB 平台工具

工具
用途
Matlab
基础计算平台
Simulink
图形化建模与仿真(控制系统最常用)
Carsim
车辆动力学仿真(业内标准)

控制算法工具箱

工具箱
用途
Control System Toolbox
经典控制系统设计(LQR、PID、根轨迹)
Robust Control Toolbox
鲁棒控制(H∞、μ 分析)
Automated Driving Toolbox
自动驾驶专用(场景搭建、传感器仿真)
Model Predictive Control Toolbox
MPC 设计、仿真、代码生成

官方学习资源

  • MATLAB 中国官网:https://ww2.mathworks.cn/?s_tid=gn_logo
  • MPC 自动驾驶教程:https://ww2.mathworks.cn/help/mpc/ug/automated-driving-using-model-predictive-control.html

谢谢观看,码字不易。如果觉得文章对您有帮助,感谢您点个在看,转发分享!

最新文章

随机文章