feat: configure MovementTest solver timeout
This commit is contained in:
+2
@@ -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,
|
||||||
|
|||||||
+3
@@ -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));
|
||||||
|
|||||||
+1
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user