# 粗路径固定案例使用实时 AMR 位姿设计 ## 背景 当前 `粗路径规划-显式空图`、`粗路径规划-单矩形绕行`、`粗路径规划-多来源障碍`、`粗路径规划-缓存命中`、`粗路径规划-倒车换向` 和 `粗路径规划-无解` 使用工厂中写死的起点、终点、地图边界和障碍物坐标。只有手动的 `粗路径规划` 测试读取当前 AMR 位姿。 这使固定案例无法从当前机器人位置和朝向验证规划,且 AMR 位于固定地图范围外时会直接得到无意义的越界失败。 ## 目标 所有 `粗路径规划-*` 固定案例都以一次冻结的当前 AMR 位姿为起点。每个案例保留原有的相对地图、目标、障碍和方向约束,从而在现场位置验证相同的规划问题。 ## 范围 本变更只调整 Clumsy MovementTest 中固定场景的输入创建方式、诊断显示、测试和文档。 不修改 Hybrid A* 搜索算法、车辆参数、碰撞模型、地图缓存实现或手动 `粗路径规划` 的交互流程。 ## 方案选择 采用“固定案例模板化并整体平移”的方案。 不采用只替换起终点的方案,因为地图和障碍仍停留在原始世界坐标,AMR 可能位于地图外。 不为每个案例分别编写实时构造逻辑,避免重复坐标换算、地图边界和障碍创建代码。 ## 工厂接口与坐标规则 保留现有的 `Create(CoarsePathTestScenario scenario)`,使离线和自动化测试仍可创建可重复的基准案例。 新增接受 AMR 世界位姿的工厂入口: ```csharp Create(CoarsePathTestScenario scenario, double amrXMillimeters, double amrYMillimeters, double amrHeadingDegrees) ``` 工厂将基准案例的起点映射到传入 AMR 位姿: - `deltaX = amrX - baselineStartX` - `deltaY = amrY - baselineStartY` - 起点位置为 `amrX/amrY`,起点航向为 `amrHeading`。 - 目标位置、地图边界、圆形障碍、轴对齐矩形障碍和 TwoLeg 位置均加上 `deltaX/deltaY`。 - 目标航向为 `amrHeading + (baselineGoalHeading - baselineStartHeading)`,再规范化到规划器采用的标准角度范围。 - TwoLeg 障碍自身的朝向保持基准值,只移动其位置;本变更是平移而非旋转场景几何。 所有固定案例都使用该规则,包含预期无解的障碍带案例。无解案例移动后仍必须保持无解。 ## UI 运行流程与错误处理 `CoarsePathPlanningTestRunner.RunScenario` 在开始时从 `DetourInterface` 读取一次 AMR 位姿,并将这份快照传给工厂。后续后台规划只使用冻结后的请求,定位更新不会改变正在执行的规划输入。 读取失败、空位姿或任一 X/Y/航向值为 NaN 或无穷值时,不提交规划请求。测试通过 Toast 和画布状态区显示 `AMR 位姿不可用` 及具体原因。 成功创建请求时,状态区额外显示冻结的 AMR 起点(世界 mm 和 deg),以便现场核对。既有的规划状态、路径搜索耗时、节点统计和失败原因显示继续保留。 手动 `粗路径规划` 测试不改变:它继续读取一次 AMR 起点,并要求用户输入终点、障碍和总超时。 ## 缓存语义 缓存键继续由完整的地图输入决定。由于地图边界和障碍随 AMR 坐标平移,只有两次固定案例使用完全相同的 AMR 位姿时,`粗路径规划-缓存命中` 才会命中现有输入缓存。 AMR 已移动时显示缓存未命中是正确结果,而不是规划失败。UI 继续显示实际的缓存状态。 ## 验证 自动化测试应验证: 1. 新工厂入口将基准起点映射到实时 AMR 位姿,并正确保留目标相对位置与起终点航向差。 2. 单矩形、多来源和无解案例的地图边界、目标及障碍按相同 `deltaX/deltaY` 移动。 3. TwoLeg 的位置移动而朝向不变。 4. 既有 `Create(scenario)` 的基准案例及其成功/无解预期继续通过。 5. UI 运行器读取并冻结一次 AMR 位姿;无效位姿产生明确的未启动诊断。 6. 文档准确说明实时 AMR 锚点、缓存命中条件和无解场景预期。 ## 验收标准 - 任一固定 MovementTest 从当前 AMR 坐标和航向开始规划,而不是从写死起点开始。 - 目标、地图和障碍在当前 AMR 附近平移,起终点的相对方向要求保持不变。 - 现场定位异常时用户可直接看到原因,且不会错误进入规划后台任务。 - 离线固定案例和现有规划诊断能力不回归。