第二章:车辆平台基础——线控底盘技术、车辆动力学模型、转向/制动/驱动系统的控制接口
各位同学,欢迎来到第二章。这一章我们聊点实在的——车辆平台基础。说白了,就是你的自动驾驶算法要指挥的那台机器,到底长什么样、听什么话、怎么跟它沟通。
我见过不少做算法的朋友,上来就调PID、跑规划,结果车一动就翻车。为什么?因为根本不了解底盘的脾气。你想想看,一个连方向盘死区都不知道的人,怎么写出好的控制代码?
2.1 线控底盘技术:从机械到电子的跨越
传统汽车怎么开?你踩油门,拉线拉节气门;你打方向,转向机通过液压助力。但自动驾驶不行——电脑没有脚,也没有手。所以我们需要线控(X-by-Wire)技术。
线控的核心就一句话:用电子信号代替机械连接。具体来说,包括三个子系统:
- 线控转向(Steer-by-Wire):方向盘和转向机之间没有物理轴,全靠电机执行转角指令。
- 线控制动(Brake-by-Wire):刹车踏板和制动主缸解耦,ECU直接控制制动压力。
- 线控驱动(Drive-by-Wire):油门踏板信号变成CAN总线上的扭矩请求。
重要概念:线控底盘不是简单的「把开关换成CAN信号」。真正的线控系统必须满足ISO 26262功能安全等级,通常要求ASIL-D。我在项目中遇到过供应商号称「线控」,结果一测,转向延迟200ms——这种车你敢让它上路?
嗯,这里要注意:线控底盘的冗余设计是硬门槛。转向电机至少双绕组,制动系统必须有两路独立液压回路。别问我为什么,问就是「安全第一」。
2.2 车辆动力学模型:控制算法的数学基础
控制算法要算出来「打多少方向、踩多少刹车」,但车不是一根棍子——它有惯性、有轮胎侧偏、有横摆运动。所以我们需要一个数学模型来描述它。
最常用的两个模型:
2.2.1 自行车模型(Bicycle Model)
这个模型把四个轮子简化成前后两个轮子,假设左右对称。虽然简单,但80%的横向控制场景够用了。
// 自行车模型状态方程(离散化)
// 状态量: [x, y, yaw, v]
// 控制量: [steering_angle, acceleration]
x(k+1) = x(k) + v(k) * cos(yaw(k)) * dt
y(k+1) = y(k) + v(k) * sin(yaw(k)) * dt
yaw(k+1) = yaw(k) + v(k) / L * tan(steering_angle) * dt
v(k+1) = v(k) + acceleration * dt
其中L是轴距。你看,公式里没有轮胎侧偏角——这就是简化之处。低速场景(比如泊车)完全够用,但高速过弯时误差会变大。
2.2.2 二自由度动力学模型
这个模型考虑了轮胎侧偏刚度。说白了,就是轮胎在转弯时不是纯滚动,而是会「滑」一点。公式稍微复杂些:
// 二自由度模型(连续时间)
// 状态量: [v_y, yaw_rate]
// 输入: steering_angle
m * (v_y_dot + v_x * yaw_rate) = F_yf + F_yr
I_z * yaw_rate_dot = l_f * F_yf - l_r * F_yr
// 其中轮胎力:
F_yf = -C_f * (v_y + l_f * yaw_rate) / v_x - steering_angle
F_yr = -C_r * (v_y - l_r * yaw_rate) / v_x
我曾经在标定一个MPC控制器时,发现自行车模型在60km/h以上就发散。换成二自由度模型后,收敛到100km/h都没问题。所以,选模型要看你的最高车速。
我的建议:刚开始做原型验证,用自行车模型就够了。等你要做高速LKA(车道保持)时,再换成二自由度模型。别一上来就搞复杂模型,调试起来你会哭的。
2.3 转向系统控制接口
转向接口,说白了就是告诉底盘「给我转到这个角度」。但实际没那么简单。
常见的转向控制接口有两种:
| 接口类型 | 信号内容 | 典型CAN ID | 注意事项 |
|---|---|---|---|
| 角度控制 | 目标方向盘转角(deg) | 0x123 | 需考虑死区、最大转速限制 |
| 扭矩控制 | 目标转向扭矩(Nm) | 0x124 | 需配合EPS扭矩传感器闭环 |
我个人习惯用角度控制接口。为什么?因为上层规划器输出的是路径曲率,转换成角度更直观。扭矩控制虽然响应快,但需要额外做扭矩-角度映射,麻烦。
避坑指南:我曾经遇到过一台车,发送转角指令后,实际转角要等150ms才到位。查了半天,发现是EPS内部做了低通滤波。解决办法:要么在控制周期里加前馈补偿,要么让供应商关掉滤波。记住,延迟是控制的大敌。
2.4 制动系统控制接口
制动接口比转向更敏感——毕竟刹车失灵是要出人命的。
主流线控制动接口:
- 减速度请求:直接发目标减速度(m/s²),由ESP/ESC内部计算制动压力。
- 制动压力请求:发目标主缸压力(bar),适合有iBooster的车型。
- 制动灯控制:别忘了这个!很多新手会漏掉,结果刹车时后车看不到灯亮。
我建议优先使用减速度请求接口。因为不同车速下,同样的制动压力产生的减速度不一样。你让底盘自己去算压力,比你在上层算要准得多。
// 制动控制示例(CAN报文封装)
// 信号:目标减速度,范围-8~0 m/s²,分辨率0.01
uint16_t decel_raw = (uint16_t)((-target_deceleration) / 0.01);
// 注意:负值表示减速,但CAN信号通常用无符号数
// 所以需要做偏移处理:0对应0m/s²,800对应-8m/s²
小技巧:制动指令最好带超时检测。如果底盘连续500ms没收到制动指令,应该自动进入安全制动模式。这个逻辑要在你的控制节点里实现,别指望底盘自己会做。
2.5 驱动系统控制接口
驱动接口相对简单,但有个坑——不同车型的「油门」含义完全不同。
| 驱动类型 | 控制信号 | 典型范围 | 说明 |
|---|---|---|---|
| 燃油车 | 节气门开度(%) | 0~100% | 非线性严重,需标定 |
| 电动车 | 电机扭矩请求(Nm) | 0~峰值扭矩 | 响应快,线性度好 |
| 混合动力 | 驱动功率请求(kW) | 0~最大功率 | 需协调发动机和电机 |
我在做Autoware适配时,最头疼的就是燃油车的节气门标定。同样的20%开度,冷车和热车能差出30%的加速度。后来我改用加速度请求接口(如果底盘支持的话),让VCU自己去算节气门开度,省心多了。
2.6 知识体系总览
下面这张图总结了本章的核心逻辑。你把它打印出来贴在工位上,写代码时瞄一眼,思路会清晰很多。
这张图你看懂了吗?从上往下看:算法层发指令,接口层做转换,线控子系统执行,动力学模型做预测,最后物理车辆动起来。每一层都有坑,每一层都需要你亲手去调。
核心总结:
- 线控底盘是自动驾驶的「手脚」,必须理解它的延迟、死区、冗余要求
- 动力学模型是控制算法的「大脑」,低速用自行车,高速用二自由度
- 控制接口要选对类型(角度vs扭矩、减速度vs压力),并且做好超时保护
- 每个子系统都要单独标定,别指望一次搞定
好了,这一章就到这里。记住我一句话:不懂底盘的控制工程师,写出来的代码只能在仿真里跑。下一章我们聊传感器标定,那又是另一番天地了。
可可精品资料库