7.1 KiB
New Window Prompt: EM Longitudinal Rolling Planning — Phase 2
Work in D:\Users\Desktop\项目\prakrobot\ParkingRobot. This is an implementation task, not a design discussion. Read these files completely before editing:
docs/superpowers/specs/2026-08-05-em-longitudinal-rolling-planning-design.mddocs/superpowers/plans/2026-08-05-em-longitudinal-rolling-planning.mddocs/superpowers/plans/2026-08-05-em-longitudinal-rolling-four-phase-roadmap.mddocs/superpowers/handoffs/2026-08-05-em-longitudinal-rolling-phase-1.md
Phase 1 ended at 21b20d0 and consists of e56220f and 21b20d0. Preserve their actual interfaces: JerkLimitedStoppingMath, JerkLimitedStoppingProfile, EmLongitudinalMode, LongitudinalTerminalSchedule, PlanningHorizonSelection.WindowEndReferenceS, WindowEndBoundaryType, LongitudinalMode, StopBoundaryReferenceS, HasStopBoundary, and the mode-explicit LongitudinalPlanningInput constructor/properties. TerminalPathS is only a temporary compatibility alias; use PathUpperBoundS for path bounds and StopBoundaryPathS for real stops.
Execute only original-plan Tasks 3, 4, and 5. Do not begin Task 6 or later. Use executing-plans, test-driven development for every behavior change, systematic debugging for every unexpected test/build failure, and verification-before-completion before each commit and before phase handoff. No new brainstorming is needed.
Start by recording:
git branch --show-current
git status --short
git log -8 --oneline
git show --stat --oneline e56220f
git show --stat --oneline 21b20d0
The branch must be trajplanner; the worktree has substantial unrelated user changes. Never use reset, checkout, clean, git add ., or git add -A. Inspect any target file that is already dirty and preserve its user content. Explicitly stage only the current task files and run git diff --cached --name-only before every commit.
Task 3 — mode-conditioned PathS speed envelope
Files: ClumsyPilot/ParkrobTrajplanner/EMPlanner/Longitudinal/PathSpeedLimit.cs, ClumsyPilot/ParkrobTrajplanner/EMPlanner/Longitudinal/PathSpeedLimitBuilder.cs, and ClumsyPilot/tests/EMPlannerVerificationHost/LongitudinalModelChecks.cs.
Write and observe a failing longitudinal-model test first. Rolling must keep a nonzero speed allowance at PathUpperBoundS and report no stop boundary. For Approach and Exact modes, compute each stopping-speed limit by inverting JerkLimitedStoppingMath.MaximumInitialSpeedForDistance(remaining, maximumAcceleration, maximumDeceleration, maximumJerk, directionMaximum) against StopBoundaryPathS; only the real stop-boundary sample is exactly zero. Replace the old square-root and discrete-tail approximations. Add PathSpeedLimit.HasStopBoundary and retain any necessary compatibility alias without introducing warnings. Then run:
dotnet run --project ClumsyPilot/tests/EMPlannerVerificationHost/EMPlannerVerificationHost.csproj -- longitudinal-model
Commit only these Task 3 files:
git add -- ClumsyPilot/ParkrobTrajplanner/EMPlanner/Longitudinal/PathSpeedLimit.cs ClumsyPilot/ParkrobTrajplanner/EMPlanner/Longitudinal/PathSpeedLimitBuilder.cs ClumsyPilot/tests/EMPlannerVerificationHost/LongitudinalModelChecks.cs
git diff --cached --name-only
git commit -m "feat: keep rolling speed envelopes open"
Task 4 — conditional QP terminals and independent validation
Files: ClumsyPilot/ParkrobTrajplanner/EMPlanner/Longitudinal/LongitudinalConstraintBuilder.cs, ClumsyPilot/ParkrobTrajplanner/EMPlanner/Longitudinal/LongitudinalSolutionValidator.cs, and ClumsyPilot/tests/EMPlannerVerificationHost/LongitudinalModelChecks.cs.
TDD requirements: Rolling and Approach have no terminal S/U/A equalities. Exact mode must use LongitudinalTerminalSchedule.GetStabilizationStartIndex and enforce S=StopBoundaryPathS, U=0, A=0 at every knot in the internal stabilization tail. The exact mode row count is 8*K-2+3*M; non-exact modes remain 8*K-2. The validator always checks finite values, time layout, monotone PathS, bounds, jerk, and exact constant-jerk dynamics. For Approach and Exact, independently recompute every knot's complete jerk-limited stopping profile and reject if S + stoppingDistance > StopBoundaryPathS + tolerance; exact mode must also canonicalize its full stabilization tail. Run longitudinal-model red then green and commit only Task 4 files:
git add -- ClumsyPilot/ParkrobTrajplanner/EMPlanner/Longitudinal/LongitudinalConstraintBuilder.cs ClumsyPilot/ParkrobTrajplanner/EMPlanner/Longitudinal/LongitudinalSolutionValidator.cs ClumsyPilot/tests/EMPlannerVerificationHost/LongitudinalModelChecks.cs
git diff --cached --name-only
git commit -m "feat: apply ST stop constraints only at real boundaries"
Task 5 — mode-specific seeds and outer iteration
Files: ClumsyPilot/ParkrobTrajplanner/EMPlanner/Longitudinal/SequentialLongitudinalOptimizer.cs, ClumsyPilot/ParkrobTrajplanner/EMPlanner/Longitudinal/LongitudinalObjectiveBuilder.cs, and ClumsyPilot/tests/EMPlannerVerificationHost/LongitudinalIntegrationChecks.cs.
Write failing longitudinal-integration tests first. A rolling two-second ST solve with a five-metre LS window must end before PathUpperBoundS at nonzero speed. Exact mode must have S=StopBoundaryPathS, U=0, A=0 at every stabilization-tail knot. Dispatch seed creation by mode: rolling forward integration without a forced endpoint; approach as a cruise plus complete jerk-limited stop prefix limited to this ST horizon; exact stop reaches rest at the schedule anchor then fills the internal tail. In outer iterations, only Exact mode pins tail progress. Replace upper-bound uses with PathUpperBoundS; only real-stop endpoint uses may use StopBoundaryPathS. Keep terminal-acceleration soft objective only for non-exact modes. Verify both commands and commit only Task 5 files:
dotnet run --project ClumsyPilot/tests/EMPlannerVerificationHost/EMPlannerVerificationHost.csproj -- longitudinal-model
dotnet run --project ClumsyPilot/tests/EMPlannerVerificationHost/EMPlannerVerificationHost.csproj -- longitudinal-integration
git add -- ClumsyPilot/ParkrobTrajplanner/EMPlanner/Longitudinal/SequentialLongitudinalOptimizer.cs ClumsyPilot/ParkrobTrajplanner/EMPlanner/Longitudinal/LongitudinalObjectiveBuilder.cs ClumsyPilot/tests/EMPlannerVerificationHost/LongitudinalIntegrationChecks.cs
git diff --cached --name-only
git commit -m "feat: seed rolling and exact-stop ST profiles"
Global semantics are non-negotiable: DistanceHorizonMeters is LS look-ahead only; TimeHorizonSeconds is one ST horizon only; only Goal/GearSwitchApproach can request an exact zero-speed terminal; ZeroSpeedHoldSeconds is outside the QP horizon; do not loosen jerk/acceleration/solver/validation tolerances; and retain OBSERVE_ONLY with no chassis command.
At phase-2 end, rerun fresh longitudinal-model and longitudinal-integration, run git diff --check, inspect git log -5 --oneline and git status --short, then use writing-plans to create the phase-2 handoff and a phase-3 prompt. Commit only those two handoff documents and stop; do not implement phase 3.