Files
ASER/Doc/IMU_YAW_REQUIREMENT.md
2026-04-03 07:57:57 +08:00

8.9 KiB
Raw Blame History

IMU 主导航向需求说明

1. 背景

当前项目运行场景是小车在走廊/垄沟内行驶,依赖以下传感器进行状态估计与控制:

  • HWT101 IMU提供 yawyaw_continuouswz
  • 左右侧 VL53 测距:提供左右前后 4 个侧向距离
  • 编码器里程计:提供线速度 odom_vx,并参与运动预测

目前系统在 navTask 中每 20ms 执行一次状态估计与控制,整体链路见 HANDOFF.md

本说明文档用于明确一个新的需求方向:

  • 左右激光测距主要用于横向位置参考
  • 航向角估计希望主要依赖 IMU而不是依赖左右激光前后差分计算得到的航向角

本文档只描述需求、现状和建议,不修改现有代码。

2. 当前实现现状

2.1 当前 yaw / 航向相关的数据来源

当前系统中的“航向”并不是单一量,而是分成两类:

  1. IMU 原始航向信息
  • 文件:App/IMU/hwt101.c
  • IMU 输出:
    • yaw:原始偏航角,范围 [-180, 180)
    • yaw_continuous:对原始 yaw 做 unwrap 后得到的连续角度
    • wz:角速度,单位 deg/s
  1. EKF 中的相对航向误差 e_th
  • 文件:App/est/corridor_filter.c
  • 文件:App/est/corridor_ekf.c
  • e_th 表示小车相对当前走廊方向的航向误差,而不是全局绝对航向角

2.2 当前 EKF 中航向的计算方式

当前滤波流程如下:

  1. 预测步
  • 使用 odom_vximu_wz 做预测
  • 对应代码:CorridorEKF_Predict(odom_vx, imu_wz, dt)
  1. 侧墙观测更新
  • 使用左右侧测距更新横向误差 e_y
  • 同时也使用左右同侧前后测距差来估计航向 e_th

对应观测形式:

  • 左侧航向观测:z_eth_L = atan2(d_lr - d_lf, Ls)
  • 右侧航向观测:z_eth_R = atan2(d_rf - d_rr, Ls)

相关代码位置:App/est/corridor_ekf.c

  1. IMU yaw 观测更新
  • 在侧墙更新之后,再用 imu_yaw_continuous 做一个独立 1DOF 的航向观测更新
  • 该观测形式为:

z_eth_imu = imu_yaw_rad - imu_yaw_ref_rad

其中 imu_yaw_ref_rad 是在侧墙观测可信时锁定的参考值

相关代码位置:

  • App/est/corridor_filter.c
  • App/est/corridor_ekf.c

2.3 当前系统对传感器的信任关系

从参数和注释来看,当前系统默认策略是:

  • 侧墙激光是走廊内姿态估计的主观测来源
  • IMU yaw 是辅助观测,用于长时约束和侧墙观测缺失时兜底

相关参数位于:App/robot_params.h

当前默认值:

  • PARAM_EKF_R_EY = 0.002f
  • PARAM_EKF_R_ETH = 0.001f
  • PARAM_EKF_R_ETH_IMU = 0.01f

含义:

  • 侧墙航向观测噪声更小,表示当前更信任侧墙推导出的航向角
  • IMU yaw 观测噪声更大,表示当前 IMU 在 EKF 中主要是弱约束

2.4 当前导航脚本对 IMU yaw 的使用

虽然走廊跟踪阶段的 e_th 主要是由 EKF 输出,但 180 度原地转向判定已经直接使用了 IMU 的 yaw_continuous

相关代码位置:App/nav/nav_script.c

这说明项目里已经承认一个事实:

  • 在“累计转角判定”这类任务上IMU 连续 yaw 比 EKF 的 e_th 更适合做主依据

3. 当前方案存在的问题

3.1 左右激光更适合测位置,不适合主导航向

用户当前判断是:

  • 左右激光测距误差大约在 +-2cm
  • 这个误差水平对于横向位置参考仍然有价值
  • 但对于航向角计算不够稳定,难以直接采纳为主观测

这是一个合理判断。

原因在于,侧墙航向观测本质上来自“同侧前后两个距离的差分”:

  • 左侧:d_lr - d_lf
  • 右侧:d_rf - d_rr

差分量本身会放大噪声影响,尤其是在以下条件下:

  • 单个传感器误差较大
  • 前后基线长度有限
  • 墙面不完全平整
  • 传感器安装误差存在偏角或偏移

因此,虽然左右激光仍然适合估计:

  • 小车是否居中
  • 小车偏左还是偏右
  • 小车是否位于沟宽的四分之一等目标横向位置

但未必适合继续承担“主航向来源”的角色。

3.2 当前结构下,侧墙观测对 e_th 的影响仍然偏强

当前 EKF 的侧墙更新同时包含:

  • e_y 观测
  • e_th_L / e_th_R 观测

所以只要侧墙数据有效,系统就会直接利用左右前后差分结果去修正航向。

如果侧墙前后差分噪声较大,就可能带来以下问题:

  • e_th 抖动
  • 控制输出 w 抖动
  • 走廊直行时出现不必要的左右摆动
  • IMU 已经给出较平滑航向,但被激光差分估计不断拉扯

4. 目标需求

4.1 总体需求

希望重新明确传感器分工:

  • IMU 主要负责航向角估计
  • 左右激光主要负责横向位置参考

更具体地说:

  1. 走廊内横向控制
  • 左右激光用于判断小车在走廊中的横向位置
  • 支持居中行驶
  • 支持偏向左/右四分之一位置行驶等策略
  1. 走廊内航向控制
  • 航向估计应主要依赖 IMU
  • 侧墙测距不应继续作为航向主观测来源
  1. 转向阶段
  • 继续使用 IMU 连续 yaw 作为转角判定主依据

4.2 需求表达上的准确表述

如果用更工程化的语言描述该需求,可以表述为:

  • “侧墙激光参与横向位置估计,不参与或仅弱参与航向角估计。”
  • “航向角 e_th 的主来源改为 IMU wz + yaw_continuous。”
  • “侧墙前后差分得到的航向观测仅作为弱约束、校验项,或直接关闭。”

5. 对现有系统的理解结论

基于当前代码实现,可以得出以下判断:

5.1 用户的想法与当前实现不一致

当前实现里:

  • 左右激光不仅参与横向位置 e_y
  • 还直接参与航向 e_th

而用户期望的是:

  • 左右激光只负责横向位置参考
  • 航向主要信任 IMU

因此,这不是简单调一个小参数就完全等价的需求,而是状态估计设计思路上的调整。

5.2 用户的想法在当前场景下是成立的

若侧墙测距误差确实约为 +-2cm,则:

  • 用其估计横向偏移仍有意义
  • 用其做前后差分计算航向角则很容易噪声偏大

从传感器特性匹配上看,更合理的做法就是:

  • 激光负责位置
  • IMU 负责航向

5.3 需要区分“横向位置”和“航向角”两个子问题

本需求的关键不是“全面抛弃激光”,而是要区分:

  • e_y:仍可继续信任侧墙测距
  • e_th:应改为主要信任 IMU

这是本需求最核心的设计点。

6. 后续可选改造方向

本节只记录可能的改造方向,不在本次工作中实施。

6.1 方向 A仅通过参数调权弱化侧墙航向观测

思路:

  • 保留现有 EKF 结构不变
  • 仅通过增大 PARAM_EKF_R_ETH、减小 PARAM_EKF_R_ETH_IMU 来让航向估计更偏向 IMU

优点:

  • 修改最小
  • 风险相对可控
  • 可以快速实车验证

缺点:

  • 侧墙航向观测仍然存在于主更新流程中
  • 只是“变弱”,不是“彻底不参与”

6.2 方向 B结构性调整侧墙只更新 e_y

思路:

  • 修改 EKF 观测模型
  • 侧墙测距只用于更新 e_y
  • e_th 仅由 imu_wz 预测和 imu_yaw 观测约束

优点:

  • 最符合本需求原意
  • 传感器职责边界清晰

缺点:

  • 改动比参数调权大
  • 需要重新验证滤波稳定性和控制效果

6.3 方向 C侧墙航向只做低频校验或异常检测

思路:

  • 不再把 z_eth_L/z_eth_R 作为主 EKF 观测
  • 改成仅在长直段、双侧稳定、连续多帧一致时,低频微量校正 IMU 航向
  • 或只用于诊断告警,不直接参与状态更新

优点:

  • 兼顾 IMU 主导与环境约束
  • 有助于抑制纯 IMU 长时漂移

缺点:

  • 逻辑更复杂
  • 需要额外设计稳定判据

7. 推荐结论

如果以当前用户需求为准,推荐设计原则如下:

  1. 左右激光负责横向位置,不再主导航向
  2. IMU 负责航向主估计
  3. 转弯角度继续使用 IMU 连续 yaw 判定
  4. 如需保留侧墙航向,也应降为弱约束或校验项,而不是主观测

换句话说,后续如果要正式调整系统,应优先朝这个方向收敛:

  • e_y 由侧墙激光主导
  • e_th 由 IMU 主导

8. 涉及模块清单

本需求后续若要实施,主要会影响以下模块:

  • App/IMU/hwt101.c
    • IMU yaw / yaw_continuous / wz 来源
  • App/est/corridor_filter.c
    • IMU yaw 参考值与更新调用逻辑
  • App/est/corridor_ekf.c
    • 侧墙航向观测 z_eth_L/z_eth_R 的使用方式
  • App/robot_params.h
    • 观测噪声参数调权
  • App/nav/nav_script.c
    • 转弯阶段的 IMU yaw 使用逻辑

9. 本文档结论摘要

本文档确认以下几点:

  • 当前系统现状:侧墙激光不仅用于横向位置,也参与航向角估计
  • 用户需求:侧墙激光只作为位置参考,航向主要信任 IMU
  • 该需求与当前实现存在结构性差异
  • 从传感器误差特性看,这一需求是合理的
  • 后续建议将“位置”和“航向”两个估计任务明确拆分,各自交给更适合的传感器主导