154 lines
11 KiB
Markdown
154 lines
11 KiB
Markdown
# EM 完整方向段可视化修复 — Phase 03 交接
|
||
|
||
## 状态
|
||
|
||
完成,2026-08-07。
|
||
|
||
启动分支为 `trajplanner`,启动 HEAD 为 `162f1a2`(Phase 02 handoff)。已确认 `3269d55` 与 `162f1a2` 均为本阶段提交的祖先。
|
||
|
||
本阶段实现提交:
|
||
|
||
- `0bba8d7` — `fix: accelerate EM trajectories from rest`
|
||
- `e844fe0` — `feat: validate EM terminal world pose`
|
||
|
||
本交接文件单独提交;其真实提交哈希应由提交后的 Phase 03 最终答复提供给 Phase 04。
|
||
|
||
## 目标与非目标
|
||
|
||
完成主计划 Task 4–5:完整方向段可从静止起步,非终端全零候选被精确拒绝,并且在发布前验证真实终端位姿和样本数量上限。
|
||
|
||
未进入 MovementTest、UI、Web、Native Painter、跨段衔接或任何后续阶段;未新增执行器或硬件写输出。
|
||
|
||
## Task 4:静止起步与 NoProgress
|
||
|
||
- 完整方向段的纵向目标跟踪自适应 knot schedule 的参考速度,而不是在每个结点只追踪当前速度上限;滚动窗口保持原有速度上限目标。
|
||
- 静止、零加速度的完整段优先构造并严格验证可达的 S/U/A/J 精确停车种子,因此清晰 5 m 段能够起步、加速、推进并在边界停车。
|
||
- 停车包络使用实际初始加速度。此前预计算阶段按最大正加速度计算,过早将可用速度压为零;现在服务层的预计算和纵向输入使用同一实际状态。
|
||
- 自适应 schedule 在加速→巡航、巡航→减速和换向的转折点保留站点;时间可达性计算保持原始请求时间,不会因原地改写时间而产生非递增结点。
|
||
- `LongitudinalSolutionValidator` 对路径长度超过终端位置容差的 `FullDirectionSegment` 检查实际推进量。若不超过空间容差,返回精确的 `EmPlanningStatus.NoProgress` 与诊断;合法的终端容差内保持不误判。
|
||
- 初始可行投影把 `NoProgress` 直接传回服务层;服务结果不包含 trajectory。
|
||
|
||
Task 4 修改:
|
||
|
||
- `ClumsyPilot/ParkrobTrajplanner/EMPlanner/Longitudinal/SequentialLongitudinalOptimizer.cs`
|
||
- `ClumsyPilot/ParkrobTrajplanner/EMPlanner/Longitudinal/LongitudinalObjectiveBuilder.cs`
|
||
- `ClumsyPilot/ParkrobTrajplanner/EMPlanner/Longitudinal/LongitudinalSolutionValidator.cs`
|
||
- `ClumsyPilot/ParkrobTrajplanner/EMPlanner/Longitudinal/PathSpeedLimitBuilder.cs`
|
||
- `ClumsyPilot/ParkrobTrajplanner/EMPlanner/Longitudinal/FullDirectionSegmentScheduleBuilder.cs`
|
||
- `ClumsyPilot/ParkrobTrajplanner/EMPlanner/Facade/EmPlanningService.cs`
|
||
- `ClumsyPilot/tests/EMPlannerVerificationHost/LongitudinalModelChecks.cs`
|
||
- `ClumsyPilot/tests/EMPlannerVerificationHost/LongitudinalIntegrationChecks.cs`
|
||
- `ClumsyPilot/tests/EMPlannerVerificationHost/EmPlanningServiceChecks.cs`
|
||
|
||
`PathSpeedLimitBuilder.cs` 和 `FullDirectionSegmentScheduleBuilder.cs` 是为复现并修复静止起步包络/结点前提而获用户明确授权纳入的最小附加范围;`EmPlannerConfiguration.cs` 未修改。
|
||
|
||
## Task 5:终端位姿、样本上限与发布门禁
|
||
|
||
- `EmTrajectoryValidator` 新增接收 `Pose2D terminalPose` 的验证重载。只有真正的 `Goal` 与 `GearSwitchApproach` 精确终端锚点才检查世界位置和航向;滚动安全窗终点不进入此门禁。
|
||
- 位置误差使用欧氏距离并受 `TerminalPositionToleranceMeters`(3 cm)约束;航向误差归一化到 `[-π, π]`,再受 `TerminalYawToleranceRadians`(5°)约束。失败码为 `EmTrajectoryValidationFailure.TerminalPoseMismatch`。
|
||
- 服务层把 Local G2 的最后一个 `LateralPathPoint` 作为期望终端世界位姿,并把该验证失败映射为 `EmPlanningStatus.TerminalPoseMismatch`;失败不发布 trajectory。
|
||
- `TrajectorySampleSchedule.ExceedsMaximumSampleCount` 在组装点列表前按实际采样规则预检:包含终端锚点与停止保持样本。超过 `MaximumPublishedSampleCount` 时 `EmTrajectoryAssembler.TryAssemble` 返回 `FullSegmentResourceLimitExceeded`,trajectory 为 `null`,不会截断、放宽采样周期或返回半成品。
|
||
- 原有时间严格递增、终端锚点、N-1 jerk、S/U/A/J 停止尾和世界碰撞验证保持不变。
|
||
|
||
Task 5 修改:
|
||
|
||
- `ClumsyPilot/ParkrobTrajplanner/EMPlanner/Validation/EmTrajectoryValidator.cs`
|
||
- `ClumsyPilot/ParkrobTrajplanner/EMPlanner/Facade/EmPlanningService.cs`
|
||
- `ClumsyPilot/ParkrobTrajplanner/EMPlanner/Trajectory/TrajectorySampleSchedule.cs`
|
||
- `ClumsyPilot/ParkrobTrajplanner/EMPlanner/Trajectory/EmTrajectoryAssembler.cs`
|
||
- `ClumsyPilot/tests/EMPlannerVerificationHost/TrajectoryChecks.cs`
|
||
- `ClumsyPilot/tests/EMPlannerVerificationHost/EmPlanningServiceChecks.cs`
|
||
|
||
新增测试覆盖 2.9 cm/3.1 cm、4.9°/5.1°、179°/-179° yaw 绕回、滚动安全窗豁免、恰好多一个发布样本、组装拒绝无部分 trajectory,以及服务状态映射。
|
||
|
||
## RED / GREEN / 回归证据
|
||
|
||
Task 4 的静止起步集成测试先暴露了全零参考/不可行的停止包络;修复后以下命令均以退出码 0 通过:
|
||
|
||
```powershell
|
||
dotnet run --project ClumsyPilot/tests/EMPlannerVerificationHost/EMPlannerVerificationHost.csproj -- longitudinal-model
|
||
dotnet run --project ClumsyPilot/tests/EMPlannerVerificationHost/EMPlannerVerificationHost.csproj -- longitudinal-integration
|
||
dotnet run --project ClumsyPilot/tests/EMPlannerVerificationHost/EMPlannerVerificationHost.csproj -- em-planning-service
|
||
```
|
||
|
||
Task 5 的 RED 是新增测试后编译失败,原因精确为缺少带终端 `Pose2D` 的验证重载、`TerminalPoseMismatch` 失败码和拒绝式 `TryAssemble` 接口。实现后以下命令均以退出码 0 通过:
|
||
|
||
```powershell
|
||
dotnet run --project ClumsyPilot/tests/EMPlannerVerificationHost/EMPlannerVerificationHost.csproj -- trajectory
|
||
dotnet run --project ClumsyPilot/tests/EMPlannerVerificationHost/EMPlannerVerificationHost.csproj -- em-planning-service
|
||
```
|
||
|
||
最终新鲜回归:
|
||
|
||
```powershell
|
||
dotnet run --project ClumsyPilot/tests/EMPlannerVerificationHost/EMPlannerVerificationHost.csproj -- em-core-all
|
||
git diff --check
|
||
```
|
||
|
||
`em-core-all` 退出码为 0,输出依次为 `PASS longitudinal-model`、`PASS longitudinal-integration`、`PASS trajectory`、`PASS em-planning-service`。`git diff --check` 通过。
|
||
|
||
已知且保留的两条编译 warning:过时的 `Lidar2dDetect2LegTray.LegWidth` 与 `MultiWheelChassis.GetSteerWheels()`。
|
||
|
||
## 工作区保护
|
||
|
||
保留并未编辑/暂存用户原有的脏工作区内容,包括 `ClumsyPilot/ParkrobTrajplanner/EMPlanner/Configuration/EmPlannerConfiguration.cs`、`ClumsyPilot/ParkrobTrajplanner/tarjplanner_movementtest/MovementTest.TrajectoryObservationTest.cs`、PathSmoothing、CoarsePath、Map、文档和未跟踪报告等改动。未使用 `git reset --hard`、`git checkout --`、`git clean`、`git add .` 或 `git add -A`。
|
||
|
||
## Phase 04 完整启动提示词
|
||
|
||
```text
|
||
执行 EM 全方向段可视化修复的 Phase 04:MovementTest 每个方向段仅规划一次。
|
||
|
||
仓库:D:\Users\Desktop\项目\prakrobot\ParkingRobot
|
||
预期分支:trajplanner
|
||
Phase 03 实现提交必须可达:0bba8d7、e844fe0。
|
||
Phase 03 handoff:docs/superpowers/handoffs/em-full-direction-visualization/phase-03.md;同时要求调用方提供并验证该 handoff 的提交哈希可达。
|
||
|
||
只执行主计划 Task 6;不得进入 Task 7+、Web、Painter、跨段规划扩展或实车操作。MovementTest 必须保持 OBSERVE_ONLY,严禁新增底盘、转向、制动、电机或换挡写输出。不得派生子智能体,也不要重新 brainstorming 或重设计已批准行为。
|
||
|
||
开始时必须:
|
||
1. 读取 executing-plans、test-driven-development、verification-before-completion;仅在真实失败或意外行为后读取 systematic-debugging。
|
||
2. 完整阅读功能设计、主计划 Task 6、分阶段执行计划 Phase 04、阶段执行设计及本 Phase 03 handoff;发生矛盾则停止并写阻塞交接,请求用户裁决。
|
||
3. 运行并记录:
|
||
git branch --show-current
|
||
git rev-parse HEAD
|
||
git log -5 --oneline
|
||
git status --short
|
||
git diff --cached --name-only
|
||
git merge-base --is-ancestor 3269d55 HEAD
|
||
git merge-base --is-ancestor 162f1a2 HEAD
|
||
git merge-base --is-ancestor 0bba8d7 HEAD
|
||
git merge-base --is-ancestor e844fe0 HEAD
|
||
以及调用方提供的 Phase 03 handoff 哈希。
|
||
4. 保留所有既有脏文件;修改已脏目标前先记录 diff 并逐 hunk 保留用户改动。严禁 git reset --hard、git checkout --、git clean、git add .、git add -A。
|
||
|
||
本阶段唯一允许修改/新增:
|
||
- ClumsyPilot/ParkrobTrajplanner/tarjplanner_movementtest/TrajectoryObservationContracts.cs
|
||
- ClumsyPilot/ParkrobTrajplanner/tarjplanner_movementtest/TrajectoryObservationPipeline.cs
|
||
- ClumsyPilot/ParkrobTrajplanner/tarjplanner_movementtest/MovementTest.TrajectoryObservationTest.cs
|
||
- ClumsyPilot/ParkrobTrajplanner/tarjplanner_movementtest/TrajectoryObservationStaticSnapshotBuilder.cs
|
||
- ClumsyPilot/tests/EMPlannerVerificationHost/TrajectoryObservationSettingsChecks.cs
|
||
- ClumsyPilot/tests/EMPlannerVerificationHost/TrajectoryObservationChecks.cs
|
||
- ClumsyPilot/tests/EMPlannerVerificationHost/TrajectoryObservationSegmentChecks.cs
|
||
- docs/superpowers/handoffs/em-full-direction-visualization/phase-04.md
|
||
|
||
按 TDD 先编写 Task 6 指定的失败测试,然后运行:
|
||
dotnet run --project ClumsyPilot/tests/EMPlannerVerificationHost/EMPlannerVerificationHost.csproj -- trajectory-observation
|
||
确认首个有效 RED 是完整方向段仍按协调器节拍重复开始计划周期。
|
||
|
||
实现且仅实现:TrajectoryObservationSettings.PlanningScope(默认 FullDirectionSegment)、经过验证快照/请求的 scope 传播、批准的观察默认值,以及每个活动方向段最多一次计划尝试。尝试标志必须在启动异步计划前置位;只有 TryAdvanceSegment 确认 N→N+1 后才复位。失败的完整段计划保持可见但不自动滚动重试。保留已有停车保持和三条带符号速度样本握手、显式等待文案及 active segment 高亮。
|
||
|
||
GREEN 后运行:
|
||
dotnet run --project ClumsyPilot/tests/EMPlannerVerificationHost/EMPlannerVerificationHost.csproj -- trajectory-observation
|
||
rg -n "SendXYThSpeed|SendMotion|DriveStop|PredefinedDriveStop|AccumulateSpeed|SetGear|SetBrake" ClumsyPilot/ParkrobTrajplanner/tarjplanner_movementtest
|
||
git diff --check
|
||
期望 trajectory-observation PASS,且观察运行时源中没有执行器调用。
|
||
|
||
只显式暂存本阶段白名单实现/测试文件,并提交:
|
||
git commit -m "feat: observe one full EM direction segment"
|
||
|
||
随后仅用 apply_patch 创建 phase-04.md,记录入口 HEAD、实现提交、RED/GREEN、执行器审计、保留脏工作区、warning、未运行项及 Phase 05 事实;只提交该 handoff:
|
||
git commit -m "docs: record EM full-direction phase 04 handoff"
|
||
|
||
成功门禁:完整范围由显式设置启用;每个方向段仅计划一次;观察继续、停车/换向握手保持;无硬件写输出。若被阻塞,创建阻塞 handoff 和同阶段恢复提示词,不得进入 Phase 05。
|
||
```
|