feat: observe one full EM direction segment
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using MultiWheelC.TrajectoryPlanning.EMPlanner;
|
||||
using MultiWheelC.TrajectoryPlanning.TrajectoryObservation;
|
||||
|
||||
namespace EMPlannerVerificationHost;
|
||||
@@ -13,6 +14,7 @@ internal static class TrajectoryObservationSettingsChecks
|
||||
VerifiesValidatedSnapshotFreezesVisualizationSettings();
|
||||
RejectsInvalidVisualizationSettings();
|
||||
VerifiesMovementTestMapsEveryFrozenSetting();
|
||||
VerifiesMovementTestFullDirectionScopeMapping();
|
||||
}
|
||||
|
||||
private static void VerifiesDefaults()
|
||||
@@ -22,7 +24,9 @@ internal static class TrajectoryObservationSettingsChecks
|
||||
Verification.NearlyEqual(5d, defaults.SolverTimeoutSeconds, "observer solver timeout default");
|
||||
Verification.Equal(100000, defaults.MaximumOsqpIterations, "observer OSQP default");
|
||||
Verification.NearlyEqual(2d, defaults.TimeHorizonSeconds, "observer ST horizon default");
|
||||
Verification.True(!defaults.EnableWebVisualization, "web defaults off");
|
||||
Verification.Equal(EmPlanningScope.FullDirectionSegment, defaults.PlanningScope,
|
||||
"observer full-direction-segment scope default");
|
||||
Verification.True(defaults.EnableWebVisualization, "web defaults on");
|
||||
Verification.True(defaults.AutoOpenWebVisualization, "web auto-open defaults on");
|
||||
Verification.True(!defaults.EnableNativePainterVisualization, "Painter defaults off");
|
||||
Verification.Equal(0, defaults.WebVisualizationPort, "dynamic port default");
|
||||
@@ -40,6 +44,7 @@ internal static class TrajectoryObservationSettingsChecks
|
||||
{
|
||||
var source = new TrajectoryObservationSettings
|
||||
{
|
||||
PlanningScope = EmPlanningScope.FullDirectionSegment,
|
||||
EnableWebVisualization = true,
|
||||
AutoOpenWebVisualization = false,
|
||||
WebVisualizationPort = 2048,
|
||||
@@ -54,6 +59,7 @@ internal static class TrajectoryObservationSettingsChecks
|
||||
TrajectoryObservationSettings snapshot = source.CreateValidatedSnapshot();
|
||||
|
||||
source.EnableWebVisualization = false;
|
||||
source.PlanningScope = EmPlanningScope.RollingHorizon;
|
||||
source.AutoOpenWebVisualization = true;
|
||||
source.WebVisualizationPort = 0;
|
||||
source.WebRefreshRateHz = 12d;
|
||||
@@ -64,6 +70,8 @@ internal static class TrajectoryObservationSettingsChecks
|
||||
source.GearSwitchProjectionToleranceMeters = 0.7d;
|
||||
source.GearSwitchStopHoldSeconds = 0.4d;
|
||||
|
||||
Verification.Equal(EmPlanningScope.FullDirectionSegment, snapshot.PlanningScope,
|
||||
"snapshot freezes planning scope");
|
||||
Verification.True(snapshot.EnableWebVisualization, "snapshot freezes web switch");
|
||||
Verification.True(!snapshot.AutoOpenWebVisualization, "snapshot freezes web auto-open switch");
|
||||
Verification.Equal(2048, snapshot.WebVisualizationPort, "snapshot freezes web port");
|
||||
@@ -84,6 +92,7 @@ internal static class TrajectoryObservationSettingsChecks
|
||||
AssertInvalid(settings => settings.WebVisualizationPort = 1, "low reserved web port");
|
||||
AssertInvalid(settings => settings.WebVisualizationPort = 1023, "last reserved web port");
|
||||
AssertInvalid(settings => settings.WebVisualizationPort = 65536, "overflow web port");
|
||||
AssertInvalid(settings => settings.PlanningScope = (EmPlanningScope)999, "undefined planning scope");
|
||||
AssertInvalid(settings => settings.WebRefreshRateHz = 0d, "zero web refresh");
|
||||
AssertInvalid(settings => settings.VisualizationHistoryCycleLimit = 0, "zero history limit");
|
||||
AssertInvalid(settings => settings.DirectionConfirmationSpeedMetersPerSecond = 0d,
|
||||
@@ -114,6 +123,21 @@ internal static class TrajectoryObservationSettingsChecks
|
||||
}
|
||||
}
|
||||
|
||||
private static void VerifiesMovementTestFullDirectionScopeMapping()
|
||||
{
|
||||
string path = Path.Combine(Directory.GetCurrentDirectory(), "ClumsyPilot", "ParkrobTrajplanner",
|
||||
"tarjplanner_movementtest", "MovementTest.TrajectoryObservationTest.cs");
|
||||
string source = new UTF8Encoding(false, true).GetString(File.ReadAllBytes(path));
|
||||
|
||||
Verification.True(source.Contains("public bool UseFullDirectionSegmentPlanning = true;"),
|
||||
"MovementTest exposes the full-direction-segment switch on by default");
|
||||
Verification.True(source.Contains(
|
||||
"PlanningScope = UseFullDirectionSegmentPlanning ? EmPlanningScope.FullDirectionSegment : EmPlanningScope.RollingHorizon,"),
|
||||
"MovementTest maps the full-direction-segment switch into settings");
|
||||
Verification.True(source.Contains("滚动兼容"),
|
||||
"MovementTest labels TimeHorizonSeconds as rolling-compatible");
|
||||
}
|
||||
|
||||
private static void AssertInvalid(Action<TrajectoryObservationSettings> mutate, string name)
|
||||
{
|
||||
var settings = new TrajectoryObservationSettings();
|
||||
|
||||
Reference in New Issue
Block a user