轮速里程计编码器测程原理及其在PoseExtrapolator中的预测融合机制

📅 2026/6/27 3:12:28
轮速里程计编码器测程原理及其在PoseExtrapolator中的预测融合机制
下面按差速轮式底盘讲内容压缩成几段。Odom轮速里程计的两帧位移并不是 Cartographer 从编码器 tick 直接计算而是底盘驱动节点先完成“编码器 → 车轮位移 → 底盘位姿”的积分再发布/odomCartographer 接收两帧已经算好的odom → base_link位姿用它们估计短时间速度辅助预测 LiDAR 当前时刻位姿。假设左右轮编码器在时刻k-1、k的累计计数分别为n_L_prev、n_R_prev和n_L_curr、n_R_curr。先计算当前周期新增 tickΔn_L n_L_curr - n_L_prev Δn_R n_R_curr - n_R_prev若编码器每转一圈有N个有效 tick减速比为G电机转 G 圈轮子转 1 圈则左右轮实际转角为Δφ_L 2π × Δn_L ÷ (N × G) Δφ_R 2π × Δn_R ÷ (N × G)若底盘驱动已经给的是轮子累计角度left_wheel_position、right_wheel_position单位 rad就不需要从 tick 换算直接做Δφ_L φ_L_curr - φ_L_prev Δφ_R φ_R_curr - φ_R_prev接着轮子转角乘有效轮半径就得到当前周期左右轮分别滚过的距离。这里的r_L、r_R左右轮有效半径不一定等于物理量尺测得的半径它通常需要通过直线行驶标定因为轮胎磨损、载重、打滑都会影响实际有效半径。Δs_L r_L × Δφ_L Δs_R r_R × Δφ_R差速运动学随后把左右轮位移转换成底盘中心的相对运动。设bwheel_separation左右轮中心距离则底盘沿自身前向移动的距离与绕 Z 轴转角为Δs (Δs_R Δs_L) ÷ 2 Δyaw (Δs_R - Δs_L) ÷ bΔs是车体中心在本周期内前进或后退的距离Δyaw是机器人转过的角度。右轮比左轮走得远时Δyaw 0按 ROS 标准坐标系表示左转左右轮距离相等时Δyaw 0机器人直行左右轮一正一负且大小接近时Δs ≈ 0机器人接近原地旋转。已知上一帧 Odom 位姿x_prev、y_prev、yaw_prev后底盘驱动通常使用中间朝向积分将车体坐标系中的前进量转换到odom frame轮速累计坐标系yaw_mid yaw_prev Δyaw ÷ 2 x_curr x_prev Δs × cos(yaw_mid) y_curr y_prev Δs × sin(yaw_mid) yaw_curr yaw_prev Δyaw这样就得到当前时刻base_link机器人底盘坐标系在odom轮速里程计坐标系下的新位姿也就是 ROS 通常发布的odom → base_link核心实现代码一般就是下面这种形式void UpdateWheelOdometry( double left_pos_curr, // 当前左轮累计角度rad double right_pos_curr, // 当前右轮累计角度rad double last_left_pos, double last_right_pos, double left_radius, double right_radius, double wheel_separation, double x, double y, double yaw) { // 1. 当前周期左右轮新增转角。 const double delta_left_rad left_pos_curr - last_left_pos; const double delta_right_rad right_pos_curr - last_right_pos; // 2. 轮子转角转为左右轮滚动距离。 const double delta_s_left left_radius * delta_left_rad; const double delta_s_right right_radius * delta_right_rad; // 3. 差速运动学求底盘中心前进距离与转角。 const double delta_s 0.5 * (delta_s_left delta_s_right); const double delta_yaw (delta_s_right - delta_s_left) / wheel_separation; // 4. 用中间朝向把车体前进量积到 odom 坐标系。 const double yaw_mid yaw 0.5 * delta_yaw; x delta_s * std::cos(yaw_mid); y delta_s * std::sin(yaw_mid); yaw delta_yaw; // 5. 保存当前轮角作为下一帧相减基准。 last_left_pos left_pos_curr; last_right_pos right_pos_curr; }例如左轮当前周期走0.08 m右轮走0.12 m轮距b 0.36 m则Δs (0.08 0.12) ÷ 2 0.10 m Δyaw (0.12 - 0.08) ÷ 0.36 0.111 rad ≈ 6.37°也就是说小车在这一帧 Odom 周期内大约前进 10 cm同时左转约 6.37°。底盘驱动将这个累计结果发布到/odom后Cartographer 接收连续两帧T_odom_base(t_prev) T_odom_base(t_curr)再求两帧相对运动得到短时间线速度和角速度。PoseExtrapolator 会优先利用这段 Odom 速度预测 LiDAR 当前点或当前扫描时刻的平移LiDAR 扫描匹配随后修正轮速里程计长期累计的误差。轮速 Odom 的弱点是打滑、轮径误差、轮距配置错误、转弯侧滑和履带拖拽。因此它适合提供短时间连续预测不适合单独作为最终位姿。Cartographer 的分工就是轮速 Odom 负责“短时间大概走了多少”IMU 负责“短时间转了多少、重力方向如何”LiDAR 扫描匹配负责“根据环境结构把位置拉回正确地方”。