feat: configure MovementTest ST time controls

This commit is contained in:
梁薄云
2026-08-05 13:39:18 +08:00
parent 308c8bb587
commit ddea58a139
4 changed files with 60 additions and 1 deletions
@@ -33,6 +33,10 @@ public sealed class TrajectoryObservationMovementTest : MovementTest
public double ObserverPeriodSeconds = 0.05d;
public double SolverTimeoutSeconds = 0.50d;
public int MaximumOsqpIterations = 12000;
/// <summary>单次 ST 轨迹覆盖的未来时长,单位 s;默认 6s,不等于观察循环周期。</summary>
public double TimeHorizonSeconds = 6d;
/// <summary>Trajectory 相邻 TimeFromStart 时间戳的间隔,单位 s;默认 0.10s,不等于观察循环周期。</summary>
public double OutputTimeStepSeconds = 0.10d;
public double VehicleLengthMeters = 0.80d;
public double VehicleWidthMeters = 0.60d;
public double SafetyMarginMeters = 0.05d;
@@ -63,6 +67,8 @@ public sealed class TrajectoryObservationMovementTest : MovementTest
ObserverPeriodSeconds = ObserverPeriodSeconds,
SolverTimeoutSeconds = SolverTimeoutSeconds,
MaximumOsqpIterations = MaximumOsqpIterations,
TimeHorizonSeconds = TimeHorizonSeconds,
OutputTimeStepSeconds = OutputTimeStepSeconds,
VehicleLengthMeters = VehicleLengthMeters,
VehicleWidthMeters = VehicleWidthMeters,
SafetyMarginMeters = SafetyMarginMeters,
@@ -14,6 +14,10 @@ public sealed class TrajectoryObservationSettings
public double ObserverPeriodSeconds { get; set; } = 0.05d;
public double SolverTimeoutSeconds { get; set; } = 0.50d;
public int MaximumOsqpIterations { get; set; } = 12000;
/// <summary>单次 ST 轨迹覆盖的未来时长,单位 s;不等于观察循环周期。</summary>
public double TimeHorizonSeconds { get; set; } = 6d;
/// <summary>发布 Trajectory 相邻 TimeFromStart 时间戳的间隔,单位 s;不等于观察循环周期。</summary>
public double OutputTimeStepSeconds { get; set; } = 0.10d;
public double VehicleLengthMeters { get; set; } = 0.80d;
public double VehicleWidthMeters { get; set; } = 0.60d;
public double SafetyMarginMeters { get; set; } = 0.05d;
@@ -29,6 +33,8 @@ public sealed class TrajectoryObservationSettings
ObserverPeriodSeconds = ObserverPeriodSeconds,
SolverTimeoutSeconds = SolverTimeoutSeconds,
MaximumOsqpIterations = MaximumOsqpIterations,
TimeHorizonSeconds = TimeHorizonSeconds,
OutputTimeStepSeconds = OutputTimeStepSeconds,
VehicleLengthMeters = VehicleLengthMeters,
VehicleWidthMeters = VehicleWidthMeters,
SafetyMarginMeters = SafetyMarginMeters,
@@ -47,6 +53,11 @@ public sealed class TrajectoryObservationSettings
EnsurePositiveFinite(SolverTimeoutSeconds, nameof(SolverTimeoutSeconds));
if (MaximumOsqpIterations <= 0)
throw new ArgumentOutOfRangeException(nameof(MaximumOsqpIterations), "Value must be positive.");
EnsurePositiveFinite(TimeHorizonSeconds, nameof(TimeHorizonSeconds));
EnsurePositiveFinite(OutputTimeStepSeconds, nameof(OutputTimeStepSeconds));
if (OutputTimeStepSeconds > TimeHorizonSeconds)
throw new ArgumentOutOfRangeException(nameof(OutputTimeStepSeconds),
"The trajectory timestamp spacing cannot exceed the ST time horizon.");
EnsurePositiveFinite(VehicleLengthMeters, nameof(VehicleLengthMeters));
EnsurePositiveFinite(VehicleWidthMeters, nameof(VehicleWidthMeters));
EnsurePositiveFinite(SafetyMarginMeters, nameof(SafetyMarginMeters));
@@ -209,6 +209,8 @@ public sealed class TrajectoryObservationController
configuration.Scheduling.ReplanPeriodSeconds = settings.ReplanPeriodSeconds;
configuration.Scheduling.SolverTimeoutSeconds = settings.SolverTimeoutSeconds;
configuration.Solver.MaximumOsqpIterations = settings.MaximumOsqpIterations;
configuration.Scheduling.TimeHorizonSeconds = settings.TimeHorizonSeconds;
configuration.Scheduling.OutputTimeStepSeconds = settings.OutputTimeStepSeconds;
coordinator = new EmPlanningCoordinator(planningService);
executor = new TrajectoryExecutor(configuration);
this.sessionId = sessionId;