在Apollo自动驾驶系统中,油门标定是纵向控制的关键环节,旨在建立油门踏板开度、车速与加速度之间的映射关系,从而为控制算法提供精准的输入参数。
基础:
横向控制的原理:方向盘----->前轮转角----->车的航向角
纵向控制的原理:油门、刹车—>车速
那么踩油门控制的是什么,怎么控制车速?
当踩油门时,发动机的功率会提高,但发动机的功率的提高与车速有什么关系?
P
=
F
∗
V
=
F
∗
r
∗
V
/
r
=
M
∗
w
P = F*V = F*r* V/r = M*w
P=F∗V=F∗r∗V/r=M∗w
其中:P表示功率,M表示扭矩,W表示角速度。
知识点补充:旋转物体的扭矩计算公式为T=9550P/n,P是功率,单位是KW。n是转速,单位是r/min。扭矩单位为Nm。一般的扭矩就是力*力臂。
扭矩·:扭矩就是圆周运动时的力矩,可以简单理解为作用力迫使物体产生旋转的一种特殊力矩。对应发动机曲轴就是燃料燃烧做功产生的压力驱使曲轴产生旋转,最终将旋转的力矩传递出去。
物理中:力矩=力X力臂(直线)
而在旋转状态下:扭矩(特殊的力矩)=力X旋转半径r,因此要想知道发动机的扭矩那曲轴旋转半径r必须是已知的。
油门控制可以表示为:油门----->功率----->转速/扭矩----->车速/车加速度----->车速度
车辆的纵向控制之标定
一、标定目的与基本原理
- 目标
构建车辆纵向动力学模型,生成标定表(Calibration Table),描述不同车速(v)和加速度(a)下的最优油门开度(Throttle)。 - 核心公式
T h r o t t l e = f ( v , a ) Throttle = f(v, a) Throttle=f(v,a)
通过实验数据拟合该函数关系,形成三维控制曲面,用于实时控制时反向查询所需油门量。
二、标定条件与数据划分
Apollo将标定数据按以下条件分段处理,以覆盖全工况范围:
- 速度条件
- 低速(0~10 m/s)、中速(10~20 m/s)、高速(≥20 m/s)
- 油门条件
- 小油门(死区~25%)、中油门(25%~30%)、大油门(≥30%)
- 刹车条件(联动标定时考虑)
- 小刹车(死区~20%)、中刹车(20%~25%)、急刹车(≥25%)
三、标定方法步骤
1. 数据采集
-
工具与平台
- 使用Carsim搭建车辆动力学模型,通过Matlab/Simulink或Apollo内置脚本(如
data_collector.py
)进行仿真。 - 实车标定时需启动Apollo的
canbus
、localization
等模块,确保GPS信号良好(sol_type=NARROW_INT
)。
- 使用Carsim搭建车辆动力学模型,通过Matlab/Simulink或Apollo内置脚本(如
-
操作流程
# 示例:Apollo脚本采集数据 python data_collector.py 12 1 -15 # 输入油门12%、目标速度1m/s、刹车-15% # 文件位置:modules/tools/vehicle_calibration/data_collector.py # 可视化采集结果 python plot_data.py t10b15r_recorded.csv # 处理指定数据文件 python process_data.py /path/to/raw_data.csv # 输出文件: # - /path/to/raw_data.csv.result (单次结果) # - result.csv (累积结果)
多次执行以覆盖不同油门-速度组合,生成
.csv
格式的原始数据文件。
参数说明:
正数表示油门指令,负数表示刹车指令
目标速度决定标定表的覆盖范围
倒车标定中需要修改data_collector.py
def run(self, cmd):
...
print('Send Default Command.')
self.controlcmd.pad_msg.action = 1
self.controlcmd.throttle = 0
self.controlcmd.brake = 0
self.controlcmd.steering_rate = 100
self.controlcmd.steering_target = 0
self.controlcmd.gear_location = chassis_pb2.Chassis.GEAR_DRIVE # 倒车标定需要更换倒车档:GEAR_REVERSE
...
2. 数据处理与拟合
-
数据清洗
剔除异常值(如车速为0时的无效减速度),填充低车速区间的数据连续性。 -
插值算法
采用scatteredInterpolant
(Matlab)或griddata
(Python)进行三维散点插值,生成平滑的油门控制曲面。F = scatteredInterpolant(v', a', thr'); % 三维插值拟合 vu = 0:0.1:50; au = 0:0.1:5; table = zeros(length(vu), length(au)); for i = 1:length(vu) for j = 1:length(au) table(i,j) = F(vu(i), au(j)); % 生成标定表 end end
3. 生成标定表
- 格式转换
将拟合结果转换为Apollo控制模块所需的Protobuf格式(.pb.txt
),存储于modules/calibration/data
目录。calibration { speed: 4.4 acceleration: 3.19 command: 80.0 # 油门指令 }
- 标定表生成流程
步骤 | 工具 | 输出文件 |
---|---|---|
数据采集 | data_collector.py | *_recorded.csv |
数据处理 | process_data.py | calibration_table.pb.txt |
验证测试 | control_main.py | 实车/仿真验证 |
4. 验证与优化
- 仿真测试
在Simulink中搭建闭环控制系统,验证标定表在速度跟踪、加速度控制等场景下的性能。 - 实车调试
通过rostopic
监控底盘反馈,调整标定表中的死区(throttle_deadzone
)和灵敏度参数。
四、高级标定方法
1. 基于深度学习的标定
- 优势
解决传统方法对实验条件(如路面平整度、载重变化)敏感的问题,支持在线动态更新标定表。 - 实现
将车速(v)、加速度(a)、车辆质量(m)作为输入特征,通过神经网络训练离线模型,并实时更新权重。
2. 云标定与动态更新
- 流程
- 在Dreamview中采集标定数据并上传至BOS云盘。
- 提交标定任务,云端通过机器学习生成高精度标定表。
- 下载标定结果并可视化评估性能。
- 应用场景
适用于车队级标定,减少单车调试成本。
五、标定表的应用
- 控制模块调用
Apollo的Control
模块根据规划轨迹的加速度需求,从标定表中反向查询油门/刹车指令,通过PID或MPC控制器输出控制信号。 - 实时性保障
标定表以查表法(Lookup Table)实现,确保10ms级控制周期内完成指令计算。
六、与传统方法的对比
维度 | 传统标定方法 | 深度学习/云标定 |
---|---|---|
实验条件 | 需严格直线行驶、固定载重 | 支持复杂路况、动态载重 |
数据量 | 依赖大量人工采集 | 少量数据即可启动训练 |
实时性 | 静态表,无法在线更新 | 支持动态参数调整 |
适用场景 | 单一车型、固定配置 | 多车型、跨平台适配 |
维护成本 | 高(需重复标定) | 低(自动化更新) |