feat: configure observation visualization
This commit is contained in:
+24
-4
@@ -31,16 +31,26 @@ 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 int MaximumOsqpIterations = 12000;
|
||||
/// <summary>单次 ST 轨迹覆盖的未来时长,单位 s;默认 6s,不等于观察循环周期。</summary>
|
||||
public double TimeHorizonSeconds = 6d;
|
||||
public double SolverTimeoutSeconds = 5.0d;
|
||||
public int MaximumOsqpIterations = 100000;
|
||||
/// <summary>单次 ST 轨迹覆盖的未来时长,单位 s;默认 2s,不等于观察循环周期。</summary>
|
||||
public double TimeHorizonSeconds = 2d;
|
||||
/// <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;
|
||||
public double MaximumCurvaturePerMeter = 1d / 1.20d;
|
||||
public bool EnableWebVisualization = false;
|
||||
public bool AutoOpenWebVisualization = true;
|
||||
public int WebVisualizationPort = 0;
|
||||
public double WebRefreshRateHz = 10d;
|
||||
public int VisualizationHistoryCycleLimit = 60;
|
||||
public bool EnableNativePainterVisualization = false;
|
||||
public double DirectionConfirmationSpeedMetersPerSecond = 0.02d;
|
||||
public int DirectionConfirmationSamples = 3;
|
||||
public double GearSwitchProjectionToleranceMeters = 0.50d;
|
||||
public double GearSwitchStopHoldSeconds = 0.20d;
|
||||
|
||||
public override void Test()
|
||||
{
|
||||
@@ -73,6 +83,16 @@ public sealed class TrajectoryObservationMovementTest : MovementTest
|
||||
VehicleWidthMeters = VehicleWidthMeters,
|
||||
SafetyMarginMeters = SafetyMarginMeters,
|
||||
MaximumCurvaturePerMeter = MaximumCurvaturePerMeter,
|
||||
EnableWebVisualization = EnableWebVisualization,
|
||||
AutoOpenWebVisualization = AutoOpenWebVisualization,
|
||||
WebVisualizationPort = WebVisualizationPort,
|
||||
WebRefreshRateHz = WebRefreshRateHz,
|
||||
VisualizationHistoryCycleLimit = VisualizationHistoryCycleLimit,
|
||||
EnableNativePainterVisualization = EnableNativePainterVisualization,
|
||||
DirectionConfirmationSpeedMetersPerSecond = DirectionConfirmationSpeedMetersPerSecond,
|
||||
DirectionConfirmationSamples = DirectionConfirmationSamples,
|
||||
GearSwitchProjectionToleranceMeters = GearSwitchProjectionToleranceMeters,
|
||||
GearSwitchStopHoldSeconds = GearSwitchStopHoldSeconds,
|
||||
};
|
||||
settings = settings.CreateValidatedSnapshot();
|
||||
TimeSpan observerPeriod = TimeSpan.FromSeconds(settings.ObserverPeriodSeconds);
|
||||
|
||||
@@ -27,10 +27,24 @@ single S-T output duration. Only a real Goal or gear-switch boundary may publish
|
||||
| `MapResolutionMm` | mm | `50` | Local occupancy-grid resolution. |
|
||||
| `ReplanPeriodSeconds` | s | `0.20` | Minimum interval between EM planning cycles. |
|
||||
| `ObserverPeriodSeconds` | s | `0.05` | Live-state sampling and redraw interval. |
|
||||
| `SolverTimeoutSeconds` | s | `5.0` | EM solver timeout frozen for the session. |
|
||||
| `MaximumOsqpIterations` | iterations | `100000` | OSQP iteration limit frozen for the session. |
|
||||
| `TimeHorizonSeconds` | s | `2.0` | Single ST trajectory horizon, not the observer period. |
|
||||
| `OutputTimeStepSeconds` | s | `0.10` | Published trajectory timestamp spacing. |
|
||||
| `VehicleLengthMeters` | m | `0.80` | Vehicle envelope length supplied to coarse, smoothing, and EM planning. |
|
||||
| `VehicleWidthMeters` | m | `0.60` | Vehicle envelope width supplied to planning. |
|
||||
| `SafetyMarginMeters` | m | `0.05` | Additional planning clearance outside the vehicle envelope. |
|
||||
| `MaximumCurvaturePerMeter` | 1/m | `1 / 1.20` | Maximum allowed vehicle curvature (about `0.8333 1/m`). |
|
||||
| `EnableWebVisualization` | bool | `false` | Enables the local web dashboard session. |
|
||||
| `AutoOpenWebVisualization` | bool | `true` | Opens the tokenized local dashboard URI when web output is enabled. |
|
||||
| `WebVisualizationPort` | port | `0` | `0` selects an ephemeral port; otherwise use `1024` through `65535`. |
|
||||
| `WebRefreshRateHz` | Hz | `10` | Maximum dynamic web snapshot publication rate. |
|
||||
| `VisualizationHistoryCycleLimit` | cycles | `60` | Bounded web history length. |
|
||||
| `EnableNativePainterVisualization` | bool | `false` | Enables the optional native Painter fallback. |
|
||||
| `DirectionConfirmationSpeedMetersPerSecond` | m/s | `0.02` | Minimum signed-speed magnitude used to confirm the next direction. |
|
||||
| `DirectionConfirmationSamples` | samples | `3` | Strictly increasing matching-direction samples required after the stop hold. |
|
||||
| `GearSwitchProjectionToleranceMeters` | m | `0.50` | Maximum switch-point projection distance for both adjacent segments. |
|
||||
| `GearSwitchStopHoldSeconds` | s | `0.20` | Continuous real-stop duration required before direction samples count. |
|
||||
|
||||
The four vehicle fields are public editable MovementTest inputs. They, the map/timing fields, goal, and manual obstacles
|
||||
are validated and copied into a frozen input snapshot before the background session starts. Later edits cannot change an
|
||||
|
||||
+36
-4
@@ -12,16 +12,26 @@ 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 int MaximumOsqpIterations { get; set; } = 12000;
|
||||
/// <summary>单次 ST 轨迹覆盖的未来时长,单位 s;不等于观察循环周期。</summary>
|
||||
public double TimeHorizonSeconds { get; set; } = 6d;
|
||||
public double SolverTimeoutSeconds { get; set; } = 5d;
|
||||
public int MaximumOsqpIterations { get; set; } = 100000;
|
||||
/// <summary>单次 ST 轨迹覆盖的未来时长,单位 s;默认 2 s,不等于观察循环周期。</summary>
|
||||
public double TimeHorizonSeconds { get; set; } = 2d;
|
||||
/// <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;
|
||||
public double MaximumCurvaturePerMeter { get; set; } = 1d / 1.20d;
|
||||
public bool EnableWebVisualization { get; set; } = false;
|
||||
public bool AutoOpenWebVisualization { get; set; } = true;
|
||||
public int WebVisualizationPort { get; set; } = 0;
|
||||
public double WebRefreshRateHz { get; set; } = 10d;
|
||||
public int VisualizationHistoryCycleLimit { get; set; } = 60;
|
||||
public bool EnableNativePainterVisualization { get; set; } = false;
|
||||
public double DirectionConfirmationSpeedMetersPerSecond { get; set; } = 0.02d;
|
||||
public int DirectionConfirmationSamples { get; set; } = 3;
|
||||
public double GearSwitchProjectionToleranceMeters { get; set; } = 0.50d;
|
||||
public double GearSwitchStopHoldSeconds { get; set; } = 0.20d;
|
||||
|
||||
public TrajectoryObservationSettings CreateValidatedSnapshot()
|
||||
{
|
||||
@@ -39,6 +49,16 @@ public sealed class TrajectoryObservationSettings
|
||||
VehicleWidthMeters = VehicleWidthMeters,
|
||||
SafetyMarginMeters = SafetyMarginMeters,
|
||||
MaximumCurvaturePerMeter = MaximumCurvaturePerMeter,
|
||||
EnableWebVisualization = EnableWebVisualization,
|
||||
AutoOpenWebVisualization = AutoOpenWebVisualization,
|
||||
WebVisualizationPort = WebVisualizationPort,
|
||||
WebRefreshRateHz = WebRefreshRateHz,
|
||||
VisualizationHistoryCycleLimit = VisualizationHistoryCycleLimit,
|
||||
EnableNativePainterVisualization = EnableNativePainterVisualization,
|
||||
DirectionConfirmationSpeedMetersPerSecond = DirectionConfirmationSpeedMetersPerSecond,
|
||||
DirectionConfirmationSamples = DirectionConfirmationSamples,
|
||||
GearSwitchProjectionToleranceMeters = GearSwitchProjectionToleranceMeters,
|
||||
GearSwitchStopHoldSeconds = GearSwitchStopHoldSeconds,
|
||||
};
|
||||
snapshot.Validate();
|
||||
return snapshot;
|
||||
@@ -62,6 +82,18 @@ public sealed class TrajectoryObservationSettings
|
||||
EnsurePositiveFinite(VehicleWidthMeters, nameof(VehicleWidthMeters));
|
||||
EnsurePositiveFinite(SafetyMarginMeters, nameof(SafetyMarginMeters));
|
||||
EnsurePositiveFinite(MaximumCurvaturePerMeter, nameof(MaximumCurvaturePerMeter));
|
||||
if (WebVisualizationPort != 0 && (WebVisualizationPort < 1024 || WebVisualizationPort > 65535))
|
||||
throw new ArgumentOutOfRangeException(nameof(WebVisualizationPort),
|
||||
"Port must be zero or in the inclusive range 1024 through 65535.");
|
||||
EnsurePositiveFinite(WebRefreshRateHz, nameof(WebRefreshRateHz));
|
||||
if (VisualizationHistoryCycleLimit <= 0)
|
||||
throw new ArgumentOutOfRangeException(nameof(VisualizationHistoryCycleLimit), "Value must be positive.");
|
||||
EnsurePositiveFinite(DirectionConfirmationSpeedMetersPerSecond,
|
||||
nameof(DirectionConfirmationSpeedMetersPerSecond));
|
||||
if (DirectionConfirmationSamples <= 0)
|
||||
throw new ArgumentOutOfRangeException(nameof(DirectionConfirmationSamples), "Value must be positive.");
|
||||
EnsurePositiveFinite(GearSwitchProjectionToleranceMeters, nameof(GearSwitchProjectionToleranceMeters));
|
||||
EnsurePositiveFinite(GearSwitchStopHoldSeconds, nameof(GearSwitchStopHoldSeconds));
|
||||
}
|
||||
|
||||
public VehicleParameters CreateVehicle()
|
||||
|
||||
Reference in New Issue
Block a user