Apollo学习——油门标定方法

在Apollo自动驾驶系统中,油门标定是纵向控制的关键环节,旨在建立油门踏板开度、车速与加速度之间的映射关系,从而为控制算法提供精准的输入参数。


基础:
横向控制的原理:方向盘----->前轮转角----->车的航向角
纵向控制的原理:油门、刹车—>车速
那么踩油门控制的是什么,怎么控制车速?
当踩油门时,发动机的功率会提高,但发动机的功率的提高与车速有什么关系?
P = F ∗ V = F ∗ r ∗ V / r = M ∗ w P = F*V = F*r* V/r = M*w P=FV=FrV/r=Mw
其中:P表示功率,M表示扭矩,W表示角速度。
知识点补充:旋转物体的扭矩计算公式为T=9550P/n,P是功率,单位是KW。n是转速,单位是r/min。扭矩单位为Nm。一般的扭矩就是力*力臂。
扭矩·:扭矩就是圆周运动时的力矩,可以简单理解为作用力迫使物体产生旋转的一种特殊力矩。对应发动机曲轴就是燃料燃烧做功产生的压力驱使曲轴产生旋转,最终将旋转的力矩传递出去。
物理中:力矩=力X力臂(直线)
而在旋转状态下:扭矩(特殊的力矩)=力X旋转半径r,因此要想知道发动机的扭矩那曲轴旋转半径r必须是已知的。
油门控制可以表示为:油门----->功率----->转速/扭矩----->车速/车加速度----->车速度
车辆的纵向控制之标定

一、标定目的与基本原理

  1. 目标
    构建车辆纵向动力学模型,生成标定表(Calibration Table),描述不同车速(v)和加速度(a)下的最优油门开度(Throttle)。
  2. 核心公式
    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的canbuslocalization等模块,确保GPS信号良好(sol_type=NARROW_INT)。
  • 操作流程

    # 示例: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. 云标定与动态更新
  • 流程
    1. 在Dreamview中采集标定数据并上传至BOS云盘。
    2. 提交标定任务,云端通过机器学习生成高精度标定表。
    3. 下载标定结果并可视化评估性能。
  • 应用场景
    适用于车队级标定,减少单车调试成本。

五、标定表的应用

  • 控制模块调用
    Apollo的Control模块根据规划轨迹的加速度需求,从标定表中反向查询油门/刹车指令,通过PID或MPC控制器输出控制信号。
  • 实时性保障
    标定表以查表法(Lookup Table)实现,确保10ms级控制周期内完成指令计算。

六、与传统方法的对比

维度 传统标定方法 深度学习/云标定
实验条件 需严格直线行驶、固定载重 支持复杂路况、动态载重
数据量 依赖大量人工采集 少量数据即可启动训练
实时性 静态表,无法在线更新 支持动态参数调整
适用场景 单一车型、固定配置 多车型、跨平台适配
维护成本 高(需重复标定) 低(自动化更新)

参考资料

  1. Apollo油门标定原理与仿真实现
  2. 实车标定操作指南
  3. 云标定系统设计
  4. 深度学习标定方法
  5. 控制模块实现

你可能感兴趣的:(Apollo,学习,自动驾驶,linux,开发语言)