213 lines
6.5 KiB
Markdown
213 lines
6.5 KiB
Markdown
# 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`
|
||
|
||
这套策略对单沟模式是强需求,对赛道模式是推荐增强项。
|