feat: summarize published EM observation trajectories

This commit is contained in:
梁薄云
2026-08-05 15:34:31 +08:00
parent 9b59ce4a71
commit e11397aa03
2 changed files with 71 additions and 2 deletions
@@ -32,6 +32,7 @@ internal static class TrajectoryObservationChecks
VerifiesLsAndStUsePublishedTrajectoryData();
VerifiesPresentationTextDescribesObservationWithoutSendingCommand();
VerifiesPlanningDiagnosticsKeepRawFailureReason();
VerifiesPublishedPlanningDiagnosticsIncludeTrajectorySummary();
VerifiesEmptyChartsReceivePersistentPlanningDiagnostic();
VerifiesLsPresentationUsesPathSOnHorizontalAxis();
VerifiesRollingRequestUsesOnePublishedTrajectorySnapshot();
@@ -595,12 +596,34 @@ internal static class TrajectoryObservationChecks
Verification.True(diagnostic.Text.Contains("elapsed=18ms"), "diagnostic preserves elapsed time");
Verification.True(diagnostic.Text.Contains("reason=map=3;reference=diagnostic-reference"),
"diagnostic preserves planner failure reason");
Verification.True(!diagnostic.Text.Contains("trajectory summary:"),
"failed diagnostic has no stale trajectory summary");
TrajectoryObservationDiagnostic pending = TrajectoryObservationDiagnostics.Create(
null, TimeSpan.Zero, true, null);
Verification.Equal("planning status=pending", pending.Text, "diagnostic reports pending before completion");
}
private static void VerifiesPublishedPlanningDiagnosticsIncludeTrajectorySummary()
{
DateTimeOffset effectiveAt = new DateTimeOffset(2026, 8, 5, 0, 0, 0, TimeSpan.Zero);
EmTrajectory trajectory = CreatePublishedTrajectory(effectiveAt);
var succeeded = new PlanningCycleResult(9L,
new PlanningCycleIdentity(1L, "summary-reference", 2L, string.Empty, 0),
new EmPlanningResult(EmPlanningStatus.Success, trajectory, string.Empty), true, string.Empty);
string text = TrajectoryObservationDiagnostics.Create(
succeeded, TimeSpan.FromMilliseconds(12d), false, trajectory).Text;
foreach (string expected in new[]
{
"trajectory summary:", "trajectoryId=observer-published", "points=2", "duration=1.000s",
"pathLength=1.000m", "maxSpeed=0.400m/s", "maxAcceleration=0.200m/s2", "maxJerk=0.000m/s3",
})
{
Verification.True(text.Contains(expected), "published diagnostic includes " + expected);
}
}
private static void VerifiesEmptyChartsReceivePersistentPlanningDiagnostic()
{
string presentationPath = Path.Combine(Directory.GetCurrentDirectory(), "ClumsyPilot",