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

322 lines
8.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# IMU 主导航向需求说明
## 1. 背景
当前项目运行场景是小车在走廊/垄沟内行驶,依赖以下传感器进行状态估计与控制:
- HWT101 IMU提供 `yaw``yaw_continuous``wz`
- 左右侧 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`
2. EKF 中的相对航向误差 `e_th`
- 文件:`App/est/corridor_filter.c`
- 文件:`App/est/corridor_ekf.c`
- `e_th` 表示小车相对当前走廊方向的航向误差,而不是全局绝对航向角
### 2.2 当前 EKF 中航向的计算方式
当前滤波流程如下:
1. 预测步
- 使用 `odom_vx``imu_wz` 做预测
- 对应代码:`CorridorEKF_Predict(odom_vx, imu_wz, dt)`
2. 侧墙观测更新
- 使用左右侧测距更新横向误差 `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`
3. 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. 走廊内横向控制
- 左右激光用于判断小车在走廊中的横向位置
- 支持居中行驶
- 支持偏向左/右四分之一位置行驶等策略
2. 走廊内航向控制
- 航向估计应主要依赖 IMU
- 侧墙测距不应继续作为航向主观测来源
3. 转向阶段
- 继续使用 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
- 该需求与当前实现存在结构性差异
- 从传感器误差特性看,这一需求是合理的
- 后续建议将“位置”和“航向”两个估计任务明确拆分,各自交给更适合的传感器主导