186 lines
10 KiB
Markdown
186 lines
10 KiB
Markdown
# CoarsePath README 结构化重构 Implementation Plan
|
||
|
||
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||
|
||
**Goal:** 将 CoarsePath README 重构为与 Map README 相同的“结构—数据流—契约—最小示例—分步指南—常见错误”说明方式,同时保留准确的 P0/P1 边界。
|
||
|
||
**Architecture:** 保持所有生产代码不变。先为 README 的结构性事实增加稳定的 ASCII 文本断言,再将现有 README 的正确内容重组为面向调用者的模块说明,最后运行文档、构建与集成回归,证明这只是文档交付。
|
||
|
||
**Tech Stack:** Markdown、PowerShell、.NET `netstandard2.0` Debug 构建、现有 CoarsePath 验证脚本。
|
||
|
||
## Global Constraints
|
||
|
||
- 只修改 `CoarsePath/README.md` 与其文档断言;不得改动 Map、CoarsePath、P1 UI 或测试场景的运行行为。
|
||
- README 只陈述当前已实现并经自动化验证的 P0/P1 能力;实际 Clumsy 的人工视觉验收仍要明确为待执行。
|
||
- 业务调用示例固定使用 `CoarsePathPlanningService.Plan(job, cancellationToken)`;不得鼓励 UI 或调用方直接拼接搜索组件。
|
||
- Map 障碍物投影、栅格化和缓存细节只链接到 `../Map/README.md`,不复制为 CoarsePath 实现说明。
|
||
- 坐标说明必须保持:Map 输入为 mm,核心位姿/路径为 m,核心航向为 rad;P1 UI 的 AMR 输入航向为 deg 并在边界转换。
|
||
- 显式空图只能描述为 P1 单位/可视化演示,不能描述为真实作业地图。
|
||
- 不恢复、清理或迁移 TrapMap 文件或旧 TrapMap 验证脚本;不执行 Git 状态、差异、提交或重置操作。
|
||
|
||
---
|
||
|
||
## 文件结构
|
||
|
||
| 文件 | 修改职责 |
|
||
| --- | --- |
|
||
| `ClumsyPilot/ParkrobTrajplanner/CoarsePath/README.md` | 重组现有 P0/P1 内容,加入实际目录树、规划数据流、分步指南与常见错误。 |
|
||
| `ClumsyPilot/tests/verify_coarse_path_ui.ps1` | 用 ASCII 关键字保护 README 的结构、核心边界和 P1 说明。 |
|
||
|
||
### Task 1: 为 README 重构建立失败的结构断言
|
||
|
||
**Files:**
|
||
|
||
- Modify: `ClumsyPilot/tests/verify_coarse_path_ui.ps1`
|
||
- Verify later: `ClumsyPilot/ParkrobTrajplanner/CoarsePath/README.md`
|
||
|
||
**Consumes:** 现有 `$readmePath`、`$readme`、`Assert-True` 及 P1 UI 源码检查。
|
||
|
||
**Produces:** 文档结构保护;README 缺少新的 Map 风格章节或 P1 边界时脚本失败。
|
||
|
||
- [ ] **Step 1: 在现有 README 断言后加入目标结构的失败检查**
|
||
|
||
在当前 `$requiredText` 循环之后插入以下 PowerShell。所有匹配项保持 ASCII,避免 Windows PowerShell 无 BOM 脚本中的中文编码差异:
|
||
|
||
```powershell
|
||
$readmeStructure = @(
|
||
'File Structure',
|
||
'Planning Data Flow',
|
||
'Build Status and Stop',
|
||
'Coordinates and Units',
|
||
'Minimal Call Example',
|
||
'Cache and SourceVersion',
|
||
'Detailed Usage Guide',
|
||
'P1 Manual Tests and Visualization',
|
||
'Common Errors',
|
||
'First-Version Limits',
|
||
'CoarsePathPlanningService.Plan(job, cancellationToken)',
|
||
'CoarsePathPlanningJob',
|
||
'PlanningGridMap',
|
||
'SourceVersion',
|
||
'CoarsePathPlanningV1',
|
||
'CancellationTokenSource',
|
||
'NoFeasiblePath',
|
||
'IsGearSwitchPoint',
|
||
'../Map/README.md'
|
||
)
|
||
foreach ($requiredText in $readmeStructure) {
|
||
Assert-True ($readme.Contains($requiredText)) "Restructured CoarsePath README must document $requiredText."
|
||
}
|
||
```
|
||
|
||
- [ ] **Step 2: 运行脚本确认 README 仍缺少新结构**
|
||
|
||
Run:
|
||
|
||
```powershell
|
||
powershell -NoProfile -ExecutionPolicy Bypass -File .\ClumsyPilot\tests\verify_coarse_path_ui.ps1
|
||
```
|
||
|
||
Expected: `Restructured CoarsePath README must document File Structure.`;源码 UI 断言仍通过。
|
||
|
||
### Task 2: 重构 CoarsePath README 的模块说明与调用文档
|
||
|
||
**Files:**
|
||
|
||
- Modify: `ClumsyPilot/ParkrobTrajplanner/CoarsePath/README.md`
|
||
- Test: `ClumsyPilot/tests/verify_coarse_path_ui.ps1`
|
||
|
||
**Consumes:** Map README 的组织方式;现有 CoarsePath README 的真实 P0/P1 契约;`CoarsePathPlanningService.Plan(job, cancellationToken)`。
|
||
|
||
**Produces:** 一份可从零开始阅读的 CoarsePath 模块说明,内容与当前实现一致。
|
||
|
||
- [ ] **Step 1: 用 Map 风格的顶层章节替换现有 README 的章节顺序**
|
||
|
||
保留 README 标题 `# CoarsePath 粗路径规划(P0/P1)`,然后按以下顺序重新组织内容;将每个二级标题同时写为中文说明和括号中的 ASCII 稳定标识,例如 `## 文件结构(File Structure)`,使人类读者与 Task 1 断言都能使用:
|
||
|
||
1. `## 模块说明(Module Overview)`:说明 Map 提供只读快照,CoarsePath 输出已复核的粗路径;唯一业务入口是 `CoarsePathPlanningService.Plan(job, cancellationToken)`;列出不负责的控制、速度、实时重规划等职责。
|
||
2. `## 文件结构(File Structure)`:使用 `text` 目录树列出实际 `Contracts/`、`Vehicle/`、`Search/`、`Output/`、`Facade/` 与 `Test/` 文件,逐项写出与当前目录对应的职责。
|
||
3. `## 规划数据流(Planning Data Flow)`:画出 `CoarsePathPlanningJob -> CoarsePathPlanningService -> PlanningMapFactory.Create -> PlanningGridMap -> HybridAStarPlanner -> PlanningResult -> CoarsePathPlanningJobResult`;在失败分支注明地图失败不启动搜索。
|
||
4. `## 构建状态与停止(Build Status and Stop)`:说明 `MapResult` 和 `PlanningResult` 必须一起处理,解释 `Success`、`Cancelled`、`SearchTimeout`、`NoFeasiblePath` 与空路径规则。
|
||
5. `## 坐标与单位(Coordinates and Units)`:用表格列出地图 mm、`Pose2D`/路径 m、核心航向 rad、P1 AMR 输入 deg;明确起点为车身几何中心和安全余量由 `VehicleParameters.SafetyMarginMeters` 表达。
|
||
6. `## 最小调用示例(Minimal Call Example)`:保留并精简当前服务调用示例;包含 `PlanningMapRequest`、`Pose2D`、`VehicleParameters`、`HybridAStarConfiguration`、`MapResult` 与 `PlanningResult` 的失败处理。
|
||
7. `## 缓存与 SourceVersion(Cache and SourceVersion)`:说明服务长期存活、`Input`/`Occupancy`/`None` 缓存层级,及来源内容变更必须递增 `SourceVersion`。
|
||
8. `## 详细使用指南(Detailed Usage Guide)`:用六步小节解释长期服务、准备地图请求、填写起终点、填写车辆、调整搜索配置、调用及消费路径/方向段;链接 `../Map/README.md` 说明障碍物来源和栅格化。
|
||
9. `## P1 手动测试与可视化(P1 Manual Tests and Visualization)`:包含七个 MovementTest 的场景表、`CoarsePathPlanningTest` 的 `getCartLocation`/手动目标转换、`CancellationTokenSource`/`Task.Run`/`TestStop` 停止语义、`CoarsePathPlanningV1` 图层及颜色图例。明确人工视觉验收尚待在实际 Clumsy 中执行。
|
||
10. `## 常见错误(Common Errors)`:以“现象 / 原因 / 处理”表格写入:mm 当作 m、deg 当作 rad、`SourceVersion` 未递增、隐式空图、未处理非成功结果、把粗路径当作底盘可执行轨迹。
|
||
11. `## 第一版限制(First-Version Limits)`:保留并归并路径平滑、速度/时间轨迹、底盘控制、实时重规划、真实作业地图、Release 基准等明确非目标。
|
||
|
||
- [ ] **Step 2: 对照实际目录和 P1 实现,校验每个文件树项与说明的真实性**
|
||
|
||
确认目录树只引用下列已存在组件:
|
||
|
||
```text
|
||
Contracts/: Pose2D, PlanningRequest, PlanningResult, PlanningStatus,
|
||
CoarsePathPoint, PathSegment, VehicleParameters, HybridAStarConfiguration
|
||
Vehicle/: VehicleKinematics, VehicleFootprint, FootprintCollisionChecker,
|
||
OrientedRectangleCellIntersection
|
||
Search/: BinaryMinHeap, GridDijkstraHeuristic, GoalToleranceChecker,
|
||
MotionPrimitive, MotionPrimitiveGenerator, SearchCostCalculator,
|
||
HybridAStarNode, HybridAStarNodeKey, HybridAStarSearch
|
||
Output/: PathBacktracker, CoarsePathAssembler, CoarsePathValidator
|
||
Facade/: CoarsePathPlanningJob, CoarsePathPlanningJobResult,
|
||
CoarsePathPlanningService, PlanningDebugOptions, IPlanningDebugSink
|
||
Test/: CoarsePathScenarioFactory, MovementTest.CoarsePathTest
|
||
```
|
||
|
||
不要在 README 中承诺不存在的平滑器、控制器、实时数据源或 Release 基准。
|
||
|
||
- [ ] **Step 3: 运行文档结构检查确认通过**
|
||
|
||
Run:
|
||
|
||
```powershell
|
||
powershell -NoProfile -ExecutionPolicy Bypass -File .\ClumsyPilot\tests\verify_coarse_path_ui.ps1
|
||
```
|
||
|
||
Expected: `Coarse path P1 UI source checks passed.`
|
||
|
||
### Task 3: 验证文档重构没有影响 P0/P1 行为
|
||
|
||
**Files:**
|
||
|
||
- Verify: `ClumsyPilot/ParkrobTrajplanner/CoarsePath/README.md`
|
||
- Verify: `ClumsyPilot/tests/verify_coarse_path_ui.ps1`
|
||
- Verify: `ClumsyPilot/tests/verify_coarse_path_integration.ps1`
|
||
|
||
**Consumes:** Tasks 1–2 的 README 与断言。
|
||
|
||
**Produces:** 从最终工作区获得的文档、构建和集成验证证据。
|
||
|
||
- [ ] **Step 1: 构建项目**
|
||
|
||
Run:
|
||
|
||
```powershell
|
||
dotnet build .\ClumsyPilot\ClumsyPilot.csproj --no-restore
|
||
```
|
||
|
||
Expected: `0 个错误`;允许项目已有的两条过时 API 警告。
|
||
|
||
- [ ] **Step 2: 运行 P1 文档/UI 结构检查**
|
||
|
||
Run:
|
||
|
||
```powershell
|
||
powershell -NoProfile -ExecutionPolicy Bypass -File .\ClumsyPilot\tests\verify_coarse_path_ui.ps1
|
||
```
|
||
|
||
Expected: `Coarse path P1 UI source checks passed.`
|
||
|
||
- [ ] **Step 3: 运行粗路径集成回归**
|
||
|
||
Run:
|
||
|
||
```powershell
|
||
powershell -NoProfile -ExecutionPolicy Bypass -File .\ClumsyPilot\tests\verify_coarse_path_integration.ps1
|
||
```
|
||
|
||
Expected: 依次输出 `Coarse path integration checks passed.`、`Coarse path facade checks passed.` 与 `Coarse path P1 scenario checks passed.`。
|
||
|
||
## 自检
|
||
|
||
- **规格覆盖:** Task 2 覆盖设计中的十个 README 章节、P0/P1 已完成边界、Map 链接、单位、空图限制与人工验收状态;Task 1 保护可自动检查的结构事实;Task 3 给出最终证据。
|
||
- **完整性检查:** 本计划不含未决实现、泛化错误处理或未命名的验证步骤;每项改动均有文件路径、具体内容与命令。
|
||
- **一致性:** 所有调用名、状态名、场景工厂、P1 图层和坐标单位均与现有 CoarsePath 代码一致;计划不引入新 C# 接口或依赖。
|