feat: configure MovementTest solver timeout

This commit is contained in:
梁薄云
2026-08-05 11:39:45 +08:00
parent 6cc24735ba
commit 685d9cc636
4 changed files with 20 additions and 0 deletions
@@ -31,6 +31,7 @@ public sealed class TrajectoryObservationMovementTest : MovementTest
public float MapResolutionMm = 50f; public float MapResolutionMm = 50f;
public double ReplanPeriodSeconds = 0.20d; public double ReplanPeriodSeconds = 0.20d;
public double ObserverPeriodSeconds = 0.05d; public double ObserverPeriodSeconds = 0.05d;
public double SolverTimeoutSeconds = 0.50d;
public double VehicleLengthMeters = 0.80d; public double VehicleLengthMeters = 0.80d;
public double VehicleWidthMeters = 0.60d; public double VehicleWidthMeters = 0.60d;
public double SafetyMarginMeters = 0.05d; public double SafetyMarginMeters = 0.05d;
@@ -59,6 +60,7 @@ public sealed class TrajectoryObservationMovementTest : MovementTest
MapResolutionMillimeters = MapResolutionMm, MapResolutionMillimeters = MapResolutionMm,
ReplanPeriodSeconds = ReplanPeriodSeconds, ReplanPeriodSeconds = ReplanPeriodSeconds,
ObserverPeriodSeconds = ObserverPeriodSeconds, ObserverPeriodSeconds = ObserverPeriodSeconds,
SolverTimeoutSeconds = SolverTimeoutSeconds,
VehicleLengthMeters = VehicleLengthMeters, VehicleLengthMeters = VehicleLengthMeters,
VehicleWidthMeters = VehicleWidthMeters, VehicleWidthMeters = VehicleWidthMeters,
SafetyMarginMeters = SafetyMarginMeters, SafetyMarginMeters = SafetyMarginMeters,
@@ -12,6 +12,7 @@ public sealed class TrajectoryObservationSettings
public float MapResolutionMillimeters { get; set; } = 50f; public float MapResolutionMillimeters { get; set; } = 50f;
public double ReplanPeriodSeconds { get; set; } = 0.20d; public double ReplanPeriodSeconds { get; set; } = 0.20d;
public double ObserverPeriodSeconds { get; set; } = 0.05d; public double ObserverPeriodSeconds { get; set; } = 0.05d;
public double SolverTimeoutSeconds { get; set; } = 0.50d;
public double VehicleLengthMeters { get; set; } = 0.80d; public double VehicleLengthMeters { get; set; } = 0.80d;
public double VehicleWidthMeters { get; set; } = 0.60d; public double VehicleWidthMeters { get; set; } = 0.60d;
public double SafetyMarginMeters { get; set; } = 0.05d; public double SafetyMarginMeters { get; set; } = 0.05d;
@@ -25,6 +26,7 @@ public sealed class TrajectoryObservationSettings
MapResolutionMillimeters = MapResolutionMillimeters, MapResolutionMillimeters = MapResolutionMillimeters,
ReplanPeriodSeconds = ReplanPeriodSeconds, ReplanPeriodSeconds = ReplanPeriodSeconds,
ObserverPeriodSeconds = ObserverPeriodSeconds, ObserverPeriodSeconds = ObserverPeriodSeconds,
SolverTimeoutSeconds = SolverTimeoutSeconds,
VehicleLengthMeters = VehicleLengthMeters, VehicleLengthMeters = VehicleLengthMeters,
VehicleWidthMeters = VehicleWidthMeters, VehicleWidthMeters = VehicleWidthMeters,
SafetyMarginMeters = SafetyMarginMeters, SafetyMarginMeters = SafetyMarginMeters,
@@ -40,6 +42,7 @@ public sealed class TrajectoryObservationSettings
EnsurePositiveFinite(MapResolutionMillimeters, nameof(MapResolutionMillimeters)); EnsurePositiveFinite(MapResolutionMillimeters, nameof(MapResolutionMillimeters));
EnsurePositiveFinite(ReplanPeriodSeconds, nameof(ReplanPeriodSeconds)); EnsurePositiveFinite(ReplanPeriodSeconds, nameof(ReplanPeriodSeconds));
EnsurePositiveFinite(ObserverPeriodSeconds, nameof(ObserverPeriodSeconds)); EnsurePositiveFinite(ObserverPeriodSeconds, nameof(ObserverPeriodSeconds));
EnsurePositiveFinite(SolverTimeoutSeconds, nameof(SolverTimeoutSeconds));
EnsurePositiveFinite(VehicleLengthMeters, nameof(VehicleLengthMeters)); EnsurePositiveFinite(VehicleLengthMeters, nameof(VehicleLengthMeters));
EnsurePositiveFinite(VehicleWidthMeters, nameof(VehicleWidthMeters)); EnsurePositiveFinite(VehicleWidthMeters, nameof(VehicleWidthMeters));
EnsurePositiveFinite(SafetyMarginMeters, nameof(SafetyMarginMeters)); EnsurePositiveFinite(SafetyMarginMeters, nameof(SafetyMarginMeters));
@@ -207,6 +207,7 @@ public sealed class TrajectoryObservationController
settings.Validate(); settings.Validate();
configuration = EmPlannerConfiguration.CreateDefault(); configuration = EmPlannerConfiguration.CreateDefault();
configuration.Scheduling.ReplanPeriodSeconds = settings.ReplanPeriodSeconds; configuration.Scheduling.ReplanPeriodSeconds = settings.ReplanPeriodSeconds;
configuration.Scheduling.SolverTimeoutSeconds = settings.SolverTimeoutSeconds;
coordinator = new EmPlanningCoordinator(planningService); coordinator = new EmPlanningCoordinator(planningService);
executor = new TrajectoryExecutor(configuration); executor = new TrajectoryExecutor(configuration);
this.sessionId = sessionId; this.sessionId = sessionId;
@@ -106,6 +106,8 @@ internal static class TrajectoryObservationChecks
"observer MovementTest exposes safety margin with Task-1 default"); "observer MovementTest exposes safety margin with Task-1 default");
Verification.True(source.Contains("public double MaximumCurvaturePerMeter = 1d / 1.20d;"), Verification.True(source.Contains("public double MaximumCurvaturePerMeter = 1d / 1.20d;"),
"observer MovementTest exposes maximum curvature with Task-1 default"); "observer MovementTest exposes maximum curvature with Task-1 default");
Verification.True(source.Contains("public double SolverTimeoutSeconds = 0.50d;"),
"observer MovementTest exposes the test solver timeout default");
Verification.True(source.Contains("VehicleLengthMeters = VehicleLengthMeters,"), Verification.True(source.Contains("VehicleLengthMeters = VehicleLengthMeters,"),
"observer MovementTest copies vehicle length into settings"); "observer MovementTest copies vehicle length into settings");
Verification.True(source.Contains("VehicleWidthMeters = VehicleWidthMeters,"), Verification.True(source.Contains("VehicleWidthMeters = VehicleWidthMeters,"),
@@ -114,10 +116,14 @@ internal static class TrajectoryObservationChecks
"observer MovementTest copies safety margin into settings"); "observer MovementTest copies safety margin into settings");
Verification.True(source.Contains("MaximumCurvaturePerMeter = MaximumCurvaturePerMeter,"), Verification.True(source.Contains("MaximumCurvaturePerMeter = MaximumCurvaturePerMeter,"),
"observer MovementTest copies maximum curvature into settings"); "observer MovementTest copies maximum curvature into settings");
Verification.True(source.Contains("SolverTimeoutSeconds = SolverTimeoutSeconds,"),
"observer MovementTest copies solver timeout into settings");
string normalizedSource = source.Replace("\r\n", "\n"); string normalizedSource = source.Replace("\r\n", "\n");
Verification.True(normalizedSource.Contains( Verification.True(normalizedSource.Contains(
"VehicleMotionState state = ReadVehicleState();\n DateTimeOffset now = state.CapturedAtUtc;"), "VehicleMotionState state = ReadVehicleState();\n DateTimeOffset now = state.CapturedAtUtc;"),
"observer host uses the fresh state snapshot time for each observation tick"); "observer host uses the fresh state snapshot time for each observation tick");
Verification.NearlyEqual(0.50d, new TrajectoryObservationSettings().SolverTimeoutSeconds,
"observer settings use the test solver timeout default");
var configured = new TrajectoryObservationSettings var configured = new TrajectoryObservationSettings
{ {
@@ -125,12 +131,14 @@ internal static class TrajectoryObservationChecks
VehicleWidthMeters = 0.70d, VehicleWidthMeters = 0.70d,
SafetyMarginMeters = 0.08d, SafetyMarginMeters = 0.08d,
MaximumCurvaturePerMeter = 0.55d, MaximumCurvaturePerMeter = 0.55d,
SolverTimeoutSeconds = 0.42d,
}; };
TrajectoryObservationSettings snapshot = configured.CreateValidatedSnapshot(); TrajectoryObservationSettings snapshot = configured.CreateValidatedSnapshot();
configured.VehicleLengthMeters = 9.10d; configured.VehicleLengthMeters = 9.10d;
configured.VehicleWidthMeters = 9.20d; configured.VehicleWidthMeters = 9.20d;
configured.SafetyMarginMeters = 9.30d; configured.SafetyMarginMeters = 9.30d;
configured.MaximumCurvaturePerMeter = 9.40d; configured.MaximumCurvaturePerMeter = 9.40d;
configured.SolverTimeoutSeconds = 9.50d;
Verification.NearlyEqual(1.10d, snapshot.VehicleLengthMeters, Verification.NearlyEqual(1.10d, snapshot.VehicleLengthMeters,
"observer settings snapshot freezes vehicle length"); "observer settings snapshot freezes vehicle length");
@@ -140,6 +148,8 @@ internal static class TrajectoryObservationChecks
"observer settings snapshot freezes safety margin"); "observer settings snapshot freezes safety margin");
Verification.NearlyEqual(0.55d, snapshot.MaximumCurvaturePerMeter, Verification.NearlyEqual(0.55d, snapshot.MaximumCurvaturePerMeter,
"observer settings snapshot freezes maximum curvature"); "observer settings snapshot freezes maximum curvature");
Verification.NearlyEqual(0.42d, snapshot.SolverTimeoutSeconds,
"observer settings snapshot freezes solver timeout");
CoarsePathPlanningJob job = TrajectoryObservationSetupFactory.CreateBootstrapJob( CoarsePathPlanningJob job = TrajectoryObservationSetupFactory.CreateBootstrapJob(
new Pose2D(0d, 0d, 0d), new Pose2D(1d, 0d, 0d), snapshot, new Pose2D(0d, 0d, 0d), new Pose2D(1d, 0d, 0d), snapshot,
@@ -160,6 +170,7 @@ internal static class TrajectoryObservationChecks
AssertInvalidSetting(settings => settings.SafetyMarginMeters = 0d, "safety margin"); AssertInvalidSetting(settings => settings.SafetyMarginMeters = 0d, "safety margin");
AssertInvalidSetting(settings => settings.MaximumCurvaturePerMeter = double.PositiveInfinity, AssertInvalidSetting(settings => settings.MaximumCurvaturePerMeter = double.PositiveInfinity,
"maximum curvature"); "maximum curvature");
AssertInvalidSetting(settings => settings.SolverTimeoutSeconds = 0d, "solver timeout");
} }
private static void AssertInvalidSetting(Action<TrajectoryObservationSettings> mutate, string name) private static void AssertInvalidSetting(Action<TrajectoryObservationSettings> mutate, string name)
@@ -402,6 +413,9 @@ internal static class TrajectoryObservationChecks
Verification.NearlyEqual(settings.ReplanPeriodSeconds, Verification.NearlyEqual(settings.ReplanPeriodSeconds,
planningService.Requests[0].Configuration.Scheduling.ReplanPeriodSeconds, planningService.Requests[0].Configuration.Scheduling.ReplanPeriodSeconds,
"observer configured replan period"); "observer configured replan period");
Verification.NearlyEqual(settings.SolverTimeoutSeconds,
planningService.Requests[0].Configuration.Scheduling.SolverTimeoutSeconds,
"observer configured solver timeout");
TrajectoryObservationObservation observation = controller.Observe(effectiveAt.AddSeconds(0.5d), state); TrajectoryObservationObservation observation = controller.Observe(effectiveAt.AddSeconds(0.5d), state);
Verification.NearlyEqual(0.5d, observation.SelectedPoint.TimeFromStart, Verification.NearlyEqual(0.5d, observation.SelectedPoint.TimeFromStart,