diff --git a/ClumsyPilot/ParkrobTrajplanner/tarjplanner_movementtest/MovementTest.TrajectoryObservationTest.cs b/ClumsyPilot/ParkrobTrajplanner/tarjplanner_movementtest/MovementTest.TrajectoryObservationTest.cs index 2e0e498..ccef5d2 100644 --- a/ClumsyPilot/ParkrobTrajplanner/tarjplanner_movementtest/MovementTest.TrajectoryObservationTest.cs +++ b/ClumsyPilot/ParkrobTrajplanner/tarjplanner_movementtest/MovementTest.TrajectoryObservationTest.cs @@ -31,6 +31,7 @@ public sealed class TrajectoryObservationMovementTest : MovementTest public float MapResolutionMm = 50f; public double ReplanPeriodSeconds = 0.20d; public double ObserverPeriodSeconds = 0.05d; + public double SolverTimeoutSeconds = 0.50d; public double VehicleLengthMeters = 0.80d; public double VehicleWidthMeters = 0.60d; public double SafetyMarginMeters = 0.05d; @@ -59,6 +60,7 @@ public sealed class TrajectoryObservationMovementTest : MovementTest MapResolutionMillimeters = MapResolutionMm, ReplanPeriodSeconds = ReplanPeriodSeconds, ObserverPeriodSeconds = ObserverPeriodSeconds, + SolverTimeoutSeconds = SolverTimeoutSeconds, VehicleLengthMeters = VehicleLengthMeters, VehicleWidthMeters = VehicleWidthMeters, SafetyMarginMeters = SafetyMarginMeters, diff --git a/ClumsyPilot/ParkrobTrajplanner/tarjplanner_movementtest/TrajectoryObservationContracts.cs b/ClumsyPilot/ParkrobTrajplanner/tarjplanner_movementtest/TrajectoryObservationContracts.cs index 2e43ced..a82038f 100644 --- a/ClumsyPilot/ParkrobTrajplanner/tarjplanner_movementtest/TrajectoryObservationContracts.cs +++ b/ClumsyPilot/ParkrobTrajplanner/tarjplanner_movementtest/TrajectoryObservationContracts.cs @@ -12,6 +12,7 @@ public sealed class TrajectoryObservationSettings public float MapResolutionMillimeters { get; set; } = 50f; public double ReplanPeriodSeconds { get; set; } = 0.20d; public double ObserverPeriodSeconds { get; set; } = 0.05d; + public double SolverTimeoutSeconds { get; set; } = 0.50d; public double VehicleLengthMeters { get; set; } = 0.80d; public double VehicleWidthMeters { get; set; } = 0.60d; public double SafetyMarginMeters { get; set; } = 0.05d; @@ -25,6 +26,7 @@ public sealed class TrajectoryObservationSettings MapResolutionMillimeters = MapResolutionMillimeters, ReplanPeriodSeconds = ReplanPeriodSeconds, ObserverPeriodSeconds = ObserverPeriodSeconds, + SolverTimeoutSeconds = SolverTimeoutSeconds, VehicleLengthMeters = VehicleLengthMeters, VehicleWidthMeters = VehicleWidthMeters, SafetyMarginMeters = SafetyMarginMeters, @@ -40,6 +42,7 @@ public sealed class TrajectoryObservationSettings EnsurePositiveFinite(MapResolutionMillimeters, nameof(MapResolutionMillimeters)); EnsurePositiveFinite(ReplanPeriodSeconds, nameof(ReplanPeriodSeconds)); EnsurePositiveFinite(ObserverPeriodSeconds, nameof(ObserverPeriodSeconds)); + EnsurePositiveFinite(SolverTimeoutSeconds, nameof(SolverTimeoutSeconds)); EnsurePositiveFinite(VehicleLengthMeters, nameof(VehicleLengthMeters)); EnsurePositiveFinite(VehicleWidthMeters, nameof(VehicleWidthMeters)); EnsurePositiveFinite(SafetyMarginMeters, nameof(SafetyMarginMeters)); diff --git a/ClumsyPilot/ParkrobTrajplanner/tarjplanner_movementtest/TrajectoryObservationPipeline.cs b/ClumsyPilot/ParkrobTrajplanner/tarjplanner_movementtest/TrajectoryObservationPipeline.cs index 019e6df..78c3540 100644 --- a/ClumsyPilot/ParkrobTrajplanner/tarjplanner_movementtest/TrajectoryObservationPipeline.cs +++ b/ClumsyPilot/ParkrobTrajplanner/tarjplanner_movementtest/TrajectoryObservationPipeline.cs @@ -207,6 +207,7 @@ public sealed class TrajectoryObservationController settings.Validate(); configuration = EmPlannerConfiguration.CreateDefault(); configuration.Scheduling.ReplanPeriodSeconds = settings.ReplanPeriodSeconds; + configuration.Scheduling.SolverTimeoutSeconds = settings.SolverTimeoutSeconds; coordinator = new EmPlanningCoordinator(planningService); executor = new TrajectoryExecutor(configuration); this.sessionId = sessionId; diff --git a/ClumsyPilot/tests/EMPlannerVerificationHost/TrajectoryObservationChecks.cs b/ClumsyPilot/tests/EMPlannerVerificationHost/TrajectoryObservationChecks.cs index 27123e4..239a28d 100644 --- a/ClumsyPilot/tests/EMPlannerVerificationHost/TrajectoryObservationChecks.cs +++ b/ClumsyPilot/tests/EMPlannerVerificationHost/TrajectoryObservationChecks.cs @@ -106,6 +106,8 @@ internal static class TrajectoryObservationChecks "observer MovementTest exposes safety margin with Task-1 default"); Verification.True(source.Contains("public double MaximumCurvaturePerMeter = 1d / 1.20d;"), "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,"), "observer MovementTest copies vehicle length into settings"); Verification.True(source.Contains("VehicleWidthMeters = VehicleWidthMeters,"), @@ -114,10 +116,14 @@ internal static class TrajectoryObservationChecks "observer MovementTest copies safety margin into settings"); Verification.True(source.Contains("MaximumCurvaturePerMeter = MaximumCurvaturePerMeter,"), "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"); Verification.True(normalizedSource.Contains( "VehicleMotionState state = ReadVehicleState();\n DateTimeOffset now = state.CapturedAtUtc;"), "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 { @@ -125,12 +131,14 @@ internal static class TrajectoryObservationChecks VehicleWidthMeters = 0.70d, SafetyMarginMeters = 0.08d, MaximumCurvaturePerMeter = 0.55d, + SolverTimeoutSeconds = 0.42d, }; TrajectoryObservationSettings snapshot = configured.CreateValidatedSnapshot(); configured.VehicleLengthMeters = 9.10d; configured.VehicleWidthMeters = 9.20d; configured.SafetyMarginMeters = 9.30d; configured.MaximumCurvaturePerMeter = 9.40d; + configured.SolverTimeoutSeconds = 9.50d; Verification.NearlyEqual(1.10d, snapshot.VehicleLengthMeters, "observer settings snapshot freezes vehicle length"); @@ -140,6 +148,8 @@ internal static class TrajectoryObservationChecks "observer settings snapshot freezes safety margin"); Verification.NearlyEqual(0.55d, snapshot.MaximumCurvaturePerMeter, "observer settings snapshot freezes maximum curvature"); + Verification.NearlyEqual(0.42d, snapshot.SolverTimeoutSeconds, + "observer settings snapshot freezes solver timeout"); CoarsePathPlanningJob job = TrajectoryObservationSetupFactory.CreateBootstrapJob( 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.MaximumCurvaturePerMeter = double.PositiveInfinity, "maximum curvature"); + AssertInvalidSetting(settings => settings.SolverTimeoutSeconds = 0d, "solver timeout"); } private static void AssertInvalidSetting(Action mutate, string name) @@ -402,6 +413,9 @@ internal static class TrajectoryObservationChecks Verification.NearlyEqual(settings.ReplanPeriodSeconds, planningService.Requests[0].Configuration.Scheduling.ReplanPeriodSeconds, "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); Verification.NearlyEqual(0.5d, observation.SelectedPoint.TimeFromStart,