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

459 lines
11 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.
# 固定地图赛道的混合导航说明
## 1. 文档目的
本文档面向后续接手项目的人,说明当前比赛场景下为什么推荐采用一种“混合导航”方案,而不是单纯依赖局部传感器闭环,也不是直接上通用 SLAM / 全局路径规划。
这里的“混合导航”特指:
- 上层使用固定地图和拓扑状态机
- 中层使用段落动作与事件切换
- 下层使用局部传感器闭环稳定控制
这套思路适用于当前这类:
- 场地结构固定
- 任务流程固定
- 局部几何约束很强
- 但局部传感器看不到全局目标
的比赛型机器人系统。
## 2. 场地与任务本质
根据比赛规则与 `HANDOFF.md`
- 场地大小为 `390cm x 300cm`
- 内部有 `5` 条田垄
- 实际需要遍历的是 `6` 条垄沟
- 每条垄沟宽 `40cm`
- 每条田垄长 `220cm`
- 只有 `1` 个出入口
- 出入口外有启动区
从导航角度,这不是自由环境中的随机移动问题,而是一个非常明确的固定任务:
1. 从启动区进入场地
2. 进入某一条垄沟
3. 沿垄沟稳定前进并作业
4. 到达端部后完成转向与换沟
5. 依次遍历全部 `6` 条垄沟
6. 最终从唯一出口驶离场地
7. 自主停回启动区
如果把整个任务抽象出来,本质上就是一个 **S 形遍历任务**
示意如下:
```text
入口 -> 沟1 ↑
↓ 沟2
↑ 沟3
↓ 沟4
↑ 沟5
↓ 沟6 -> 出口
```
这类问题最重要的不是“任意时刻知道自己在全局坐标中的绝对位置”,而是:
- 知道自己当前在第几条沟
- 知道下一条目标沟是哪一条
- 知道当前处于入沟、走沟、到端、换沟、出场还是回停阶段
- 在每个阶段里,用合适的传感器和控制策略去完成当前动作
## 3. 为什么不能只靠局部导航
当前项目已经具备很强的局部导航能力,尤其是在单条垄沟内:
- 侧向测距可以支撑居中或偏置行驶
- IMU 可以提供航向与转角信息
- 前向测距可以做端部触发
- 里程计可以做短时推进量估计
但只靠局部导航会遇到明显边界:
### 3.1 局部导航能解决什么
局部导航适合解决:
- 在窄沟内居中
- 在窄沟内保持姿态稳定
- 接近端部时减速或停车
- 在局部可观测条件下闭环修正误差
### 3.2 局部导航解决不了什么
局部导航不擅长解决:
- 我现在完成了第几条沟
- 下一条目标沟应该是左边还是右边
- 转完向后该走多远才能接近下一条沟入口
- 什么时候该结束整场遍历并朝唯一出口离场
这些问题需要:
- 全局任务记忆
- 地图拓扑信息
- 阶段状态机
- 跨局部观测空窗的动作脚本
所以,仅靠“看到什么就跟什么”的局部反应式导航,不足以稳定跑完整场比赛。
## 4. 为什么也不建议直接上通用 SLAM
有些人看到“局部导航不够”,第一反应会是“那就做全局 SLAM”。
但当前赛题并不适合直接走这条路线。
### 4.1 地图不是未知的
赛场结构高度固定:
- 垄沟数固定
- 相对排列固定
- 出入口固定
- 启动区固定
这意味着没有必要像服务机器人那样,在未知环境中一边探索一边建图。
### 4.2 场地高度对称
`6` 条垄沟在局部上非常相似。
这会让很多通用全局定位方法遇到典型问题:
- 局部观测相似
- 重定位歧义大
- 小误差可能让系统把“第 2 沟”认成“第 3 沟”附近
### 4.3 比赛更看重稳定完赛,而不是地图美观
比赛规则更关心:
- 能不能完整遍历
- 能不能不撞边
- 能不能顺利出场
- 能不能停回启动区
不是在考察一套通用 SLAM 系统的建图效果。
### 4.4 通用 SLAM 工程负担大
如果直接上完整 SLAM通常还要处理
- 更复杂的状态与数据关联
- 更高的开发和调参成本
- 更重的算力与调度开销
- 更难解释的失败模式
这和当前项目追求的工程目标并不匹配。
## 5. 什么是“混合导航”
当前场景下推荐的“混合导航”,可以概括成一句话:
**用固定地图决定去哪,用状态机决定现在该做什么,用局部传感器闭环决定这一小段怎么稳稳地过去。**
它不是纯局部,也不是纯全局,而是分层协作。
## 6. 混合导航的三层结构
## 6.1 上层:固定地图与拓扑状态机
上层负责的是“全局任务理解”。
它需要维护的信息包括:
- 当前所在赛道段编号
- 当前已经完成了第几条垄沟
- 下一条目标垄沟是哪一条
- 当前应该左换沟还是右换沟
- 当前处于:启动、入场、走沟、到端、换沟、再入沟、出场、回停 的哪一阶段
这一层不一定关心厘米级位置,而更关心:
- 拓扑顺序
- 阶段推进
- 事件触发
可以把整场任务拆成固定段落,例如:
1. 启动区准备
2. 入口对准
3. 垄沟 1 前进
4. 端部换沟 1
5. 垄沟 2 返回
6. 端部换沟 2
7. 垄沟 3 前进
8. ...
9. 最后一沟结束
10. 出场
11. 回停启动区
这就是“固定地图导航”的核心,不是基于任意坐标规划,而是基于已知赛道结构推进任务。
## 6.2 中层:段落动作与事件切换
中层负责把“上层目标”翻译成可执行动作。
例如在某个阶段,机器人可能执行:
- 入口慢速直行,直到捕获双侧结构
- 沿当前垄沟闭环跟踪
- 到端后原地转 `90°``180°`
- 保持某个航向横向推进一段距离
- 在接近预计位置后减速,并等待重新捕获新垄沟
- 切回垄沟跟踪模式
这一层的本质是“段脚本 + 事件触发”。
它依赖:
- IMU 姿态
- 里程计推进量
- 前向/后向安全距离
- 局部结构重新捕获结果
这层很重要,因为许多时候机器人会暂时处于“看不到完整走廊结构”的状态,比如端部换沟阶段。
## 6.3 下层:局部传感器闭环
下层负责在小范围内把车稳稳控制住。
典型任务:
- 在垄沟内居中
- 在垄沟内偏向 1/4 宽度行驶
- 根据 IMU 保持航向
- 根据前向测距做减速与停车
这一层应当追求:
- 高频
- 稳定
- 可降级
- 不依赖复杂全局推理
你现在已有的大部分控制能力,都属于这一层。
## 7. 各类传感器在混合导航中的角色
## 7.1 左右 VL53L0X
推荐职责:
- 走廊内横向定位
- 居中/偏置行驶
- 近场重捕获新垄沟
不推荐职责:
- 远距离识别下一条垄沟入口
- 独立承担换沟全流程导航
原因很简单:
- 它们是近场侧向传感器
- 强项是局部几何闭环
- 弱项是远距离赛道级感知
## 7.2 IMU
推荐职责:
- 航向估计主来源
- 转向角度判定
- 无侧墙约束阶段的短时姿态保持
- 换沟阶段的朝向控制
IMU 在混合导航里非常关键,因为它能帮助机器人跨过“局部结构暂时缺失”的区间。
## 7.3 编码器 / 里程计
推荐职责:
- 估算走过了多长距离
- 在换沟动作中提供推进量
- 与状态机结合做段落退出条件
限制:
- 遇到地毯、打滑、轮胎差异时会有误差
因此它适合作为“推进量参考”,但不适合作为唯一定位真值。
## 7.4 前后长距测距
推荐职责:
- 到端检测
- 防撞保护
- 开阔区事件辅助
- 出场或接近边界时的安全约束
这类传感器不一定直接告诉你“下一沟入口就在前方”,但能帮助你判断:
- 是否接近端部
- 是否接近围栏
- 是否该切换动作阶段
## 8. 为什么这种方案适合当前比赛
## 8.1 它符合固定地图的特点
比赛地图结构是已知的。
这意味着:
- 目标垄沟不是未知搜索对象
- 换沟不必靠“发现远处入口”
- 可以由状态机根据当前进度直接推导“下一步该去哪”
## 8.2 它承认局部传感器的边界
混合导航没有让 VL53 去做它不擅长的事情。
它承认:
- VL53 负责局部
- IMU 负责短时姿态保持
- 里程计负责推进量
- 上层状态机负责“全局流程”
这是符合传感器物理特性的分工。
## 8.3 它能兼容尺寸误差与地毯
规则里有两个现实问题:
- 场地尺寸允许 `+-5%`
-`2` 条垄沟会随机铺地毯
这意味着:
- 不能死信地图上的绝对尺寸
- 不能死信纯里程推进
混合导航的好处是:
- 上层地图只给出大方向和段结构
- 局部闭环用实时传感器做最终修正
这样既利用了先验地图,又不会被固定脚本锁死。
## 9. 一个典型的工作流程
下面给出一个典型流程,帮助理解这套导航在比赛中的运行方式。
### 9.1 启动与入场
- 上层状态机进入“入口对准”阶段
- 机器人从启动区朝入口前进
- 一旦左右侧传感器稳定捕获到垄沟结构,切换为垄沟跟踪模式
### 9.2 垄沟内前进
- 下层局部控制根据左右侧测距维持横向位置
- IMU 维持航向
- 前向测距用于到端检测
- 状态机记录当前垄沟编号与方向
### 9.3 到端
- 前向距离达到阈值
- 状态机判定当前垄沟已到端
- 进入转向阶段
### 9.4 换沟
- IMU 控制转向到目标朝向
- 编码器推进预定距离
- 长距测距做安全约束
- 接近预期位置后减速
- 直到左右 VL53 再次捕获新垄沟结构
### 9.5 再入沟
- 一旦检测到新的局部走廊结构
- 状态机确认已进入下一条垄沟
- 切换回局部走廊跟踪
### 9.6 重复直到遍历完成
- 状态机更新“当前第几沟”
- 按 S 形顺序重复以上过程
### 9.7 最终离场与回停
- 当最后一条垄沟完成后
- 状态机切换到出场段
- 利用固定地图与局部感知朝唯一出口离开
- 出场后再执行停回启动区动作
## 10. 与当前项目的关系
当前项目已经具备混合导航中的一部分基础:
- 局部走廊控制
- IMU 航向处理
- 到端检测
- 原地转向
- 段脚本雏形
但当前仍偏向:
- 单垄沟验证
- 局部闭环主导
- 缺少完整的赛道级段落管理
所以后续真正需要补的,并不是完全推翻现有控制,而是:
- 把“局部走廊能力”封装成底层能力
- 在其上补一个完整的固定地图状态机
- 把换沟和出场逻辑系统化
## 11. 一个容易犯的错误
在这类项目里,最容易犯的错误是两种极端:
### 11.1 极端一:把所有问题都交给局部传感器
这会导致:
- 换沟阶段无从判断全局目标
- 容易在端部迷失
- 难以稳定完成多垄沟遍历
### 11.2 极端二:把所有问题都交给“全局定位”
这会导致:
- 系统复杂度暴涨
- 对称环境下定位歧义严重
- 与比赛需求不匹配
混合导航的价值就在于避开这两个极端。
## 12. 推荐结论
对于当前比赛场景,推荐的总体思路是:
1. 用固定地图描述整条 S 形任务路线
2. 用拓扑状态机管理“当前在哪一段、下一步去哪一段”
3. 用 IMU 和里程计支撑跨局部观测空窗的动作执行
4. 用左右 VL53 负责局部垄沟内的高精度横向闭环与重捕获
5. 用前后长距测距做端部识别与安全保护
这就是当前场景最合适的混合导航方案。
## 13. 一句话总结
这类比赛不是“靠一套万能定位算法解决全部问题”,而是“让合适的层做合适的事”:
- 地图负责全局流程
- 状态机负责阶段切换
- 传感器负责局部闭环
- 控制器负责把每一小段稳稳跑完
这就是混合导航的核心价值。