Files
ASER-NAV/Doc/turning_imu_risk_analysis.md

213 lines
6.5 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.
# Turning IMU Risk Analysis
## Background
项目当前的转向完成判定,核心依赖 IMU 的 `yaw_continuous` 相对变化量:
- 单沟模式:`nav_script.c` 中的 `TURN_AT_END` 使用 `imu_yaw_continuous - turn_start_yaw` 判断是否转满 `180°`
- 赛道模式:`global_nav.c` 中的 `execute_turn()` 使用同样方式判断是否转满 `90°`
这种设计的优点是:
- 不依赖绝对 `yaw == 90°/180°`
- 可以消掉启动零点偏置
- 逻辑简单,状态机清晰
但它有一个前提IMU 在这一次转向过程中的相对角度估计必须足够准确。
## Confirmed Issue In Single-Corridor Mode
单沟测试模式已经确认存在一类风险:
1. 车辆到端后原地转 `180°`
2. 状态机仅依据 IMU 判断“已经转满”
3. 如果 IMU 认为已转满,但车体物理上没有真正与沟道重新平行
4. 返程恢复走廊闭环后,车辆会长期贴一侧墙运行,甚至进一步放大偏差
这个问题在单沟模式中更明显,因为它原本是“转完后立即回到走廊闭环”,中间缓冲很少。
## Why Relative Yaw Is Still Used
虽然有上述风险,转向完成判定仍然不能简单改成“看绝对 `yaw` 是否等于 `90°``180°`”。
原因是:
1. 绝对 `yaw` 容易带启动零点偏差
2. 不同位置的目标朝向不同,不能用一个固定绝对角统一判定
3. 实际需要的是“从当前姿态再转多少度”,而不是“全局朝向是不是某个固定值”
因此,`delta_yaw = current_yaw - start_yaw` 的设计本身是合理的。
真正的风险不在“用差值”,而在“只用 IMU 差值”。
## Root Cause
当以下任一情况存在时IMU 相对转角可能与真实车体转角不完全一致:
1. 角速度零偏漂移
2. 转向时的振动或动态加速度影响姿态解算
3. IMU 安装方向存在小角度误差
4. 轮胎打滑,导致“轮子转了/IMU变了”但车体未完全对正目标方向
5. IMU 本身在特定工况下相对角度估计偏快或偏慢
此时状态机会提前结束转向,后续闭环就会在错误初始姿态上接管。
## Single-Corridor Mode Risk
风险等级High
原因:
1. 转向完成后会很快回到走廊闭环
2. 同一条沟道原地 `180°` 掉头,对“是否真正与墙平行”要求很高
3. 若掉头结束时姿态仍有偏差,返程会直接带偏
典型表现:
1. 去程居中正常
2. 第一次 `180°` 后开始贴右墙或贴左墙
3. 后续每次掉头都重复同一侧贴边行为
## Global Track Mode Risk
风险等级Medium
赛道模式比单沟模式更安全,因为它在转向后:
1. 不会立刻进入 `corridor_ctrl`
2. 会先进入 `GNAV_REACQUIRE`
3. 会执行 `CorridorFilter_Reset()` 重新建立沟道状态
因此它不太容易复现单沟模式那种“旧状态直接继承导致返程贴边”的故障。
但是,赛道模式仍然存在同类根因风险:
1. `execute_turn()` 的转向完成判定仍主要依赖 IMU 相对转角
2. `GNAV_REACQUIRE` 当前主要验证:
- 侧墙数量是否足够
- 左右距离和是否接近走廊宽度
- EKF `conf` 是否足够
3. `GNAV_REACQUIRE` 当前没有显式验证“车身是否已经与侧墙平行”
这意味着:
1. 如果 IMU 认为已经转完 `90°`
2. 但车体仍略微斜着进入新沟
3. 只要宽度条件和侧墙可见条件满足,仍可能通过 `REACQUIRE`
4. 后续以带姿态误差的方式进入沟内闭环
它通常不会像单沟模式那样一下子表现得很剧烈,但可能导致:
1. 进沟后偏一侧
2. 重捕获不稳
3. 连接段航向保持偏差累计
## Recommended Strategy
推荐策略是:`IMU coarse turn + wall-based fine alignment`
### Step 1: IMU Coarse Turn
仍然使用 IMU 相对转角做粗转:
- 180° 掉头先转到接近 `180°`
- 90° 转向先转到接近 `90°`
这样可以快速把姿态大致转到目标方向附近。
### Step 2: Wall-Based Fine Alignment
粗转完成后,不立即恢复直行或闭环,而是利用侧墙前后差做精调。
例如:
- 左侧墙航向误差:`atan2(d_lr - d_lf, Ls)`
- 右侧墙航向误差:`atan2(d_rf - d_rr, Ls)`
将左右两侧可用观测融合后,得到一个“与墙是否平行”的航向误差。
只有当该误差足够小,才判定“转向真正完成”。
### Why This Works
这样做可以把两类问题拆开:
1. IMU 负责把车快速转到目标附近
2. 侧墙负责把车最终摆正到与走廊几何一致
即使 IMU 少转几度或多转几度,只要侧墙观测正常,最终仍可以把姿态纠正到可接受范围。
## Recommended Changes
### For Single-Corridor Mode
建议必须具备:
1. IMU 粗转后加入侧墙精调
2. 精调完成前不恢复走廊直行
3. 掉头后重建走廊参考:
- 重绑 IMU yaw 参考
- 清零 `e_th`
- 按需要处理 `e_y` 的方向变换
### For Global Track Mode
建议至少做下面其中一项:
1.`TURN_INTO_CORRIDOR` / `TURN_INTO_NEXT` 后加入短暂侧墙精调阶段
2. 或者在 `GNAV_REACQUIRE` 中增加“墙面航向误差阈值”检查
建议新增的判定条件:
- 若左右侧墙可用,则 `wall_heading_error` 必须小于阈值
- 否则不允许从 `REACQUIRE` 进入 `CORRIDOR_TRACK`
## Recommended Debug Signals
建议在调试时重点观察这些量:
1. `imu_yaw_continuous`
2. `turn_start_yaw`
3. `delta_turned`
4. `corridor_state.e_y`
5. `corridor_state.e_th`
6. `wall_heading_error`
7. `raw_cmd.w`
8. `safe_w`
通过这些量可以快速区分:
1. 是 IMU 相对转角本身不准
2. 还是掉头后状态变换不正确
3. 还是侧墙几何观测本身有偏差
## Verification Plan
### Single-Corridor Mode
1. 原地转 `180°`,确认 IMU 报告与真实车头角度是否一致
2. 粗转完成后检查 `wall_heading_error` 是否接近 0
3. 确认返程起步前车身已基本与沟道平行
4. 验证返程是否还会长期贴一侧墙
### Global Track Mode
1. 原地/实车执行 `90°` 转向
2. 检查 `REACQUIRE` 进入条件是否会放过明显姿态误差
3. 验证进沟后是否存在稳定偏一侧的现象
4. 验证连接段和下一沟转入时是否存在累计偏航
## Summary
结论不是“不能信 IMU”而是
1. IMU 相对转角适合做转向粗判定
2. 但不能单独作为最终完成条件
3. 对走廊类任务,最终是否转正应由侧墙几何关系来兜底确认
因此,推荐统一采用:
`IMU coarse turn + wall-based fine alignment`
这套策略对单沟模式是强需求,对赛道模式是推荐增强项。