fix: treat near-zero start as stopped in full-direction schedule

This commit is contained in:
梁薄云
2026-08-07 16:51:11 +08:00
parent 2d406359d0
commit 0d4e1aeb47
2 changed files with 32 additions and 3 deletions
@@ -46,7 +46,11 @@ public sealed class FullDirectionSegmentScheduleBuilder
int stationCount = speedLimit.PathS.Count;
var speeds = new double[stationCount];
double desired = Math.Min(desiredSpeedMetersPerSecond, speedLimit.DirectionMaximumSpeedMetersPerSecond);
speeds[0] = Math.Min(initialProgressSpeedMetersPerSecond, Math.Min(desired,
double effectiveInitialSpeed = initialProgressSpeedMetersPerSecond <=
longitudinal.StopSpeedToleranceMetersPerSecond
? 0d
: initialProgressSpeedMetersPerSecond;
speeds[0] = Math.Min(effectiveInitialSpeed, Math.Min(desired,
speedLimit.MaximumSpeedMetersPerSecond[0]));
for (int index = 1; index < stationCount; index++)
{
@@ -100,7 +104,7 @@ public sealed class FullDirectionSegmentScheduleBuilder
referenceSpeeds[referenceSpeeds.Count - 1] = 0d;
pathS[pathS.Count - 1] = speedLimit.PathUpperBoundS;
EnsureJerkReachableReferenceTimes(times, referenceSpeeds, longitudinal);
EnsureMinimumExactStopDuration(times, speedLimit.PathUpperBoundS, initialProgressSpeedMetersPerSecond,
EnsureMinimumExactStopDuration(times, speedLimit.PathUpperBoundS, effectiveInitialSpeed,
initialAccelerationMetersPerSecondSquared, longitudinal);
if (!IsFinite(longitudinal.ZeroSpeedHoldSeconds) || longitudinal.ZeroSpeedHoldSeconds < 0d)
{
@@ -139,7 +143,8 @@ public sealed class FullDirectionSegmentScheduleBuilder
private static void EnsureMinimumExactStopDuration(IList<double> times, double stopBoundaryPathS,
double initialSpeed, double initialAcceleration, LongitudinalConfiguration configuration)
{
if (initialSpeed <= Tolerance || !JerkLimitedStoppingMath.TryCalculate(initialSpeed, initialAcceleration,
if (initialSpeed <= configuration.StopSpeedToleranceMetersPerSecond ||
!JerkLimitedStoppingMath.TryCalculate(initialSpeed, initialAcceleration,
configuration.MaximumDecelerationMetersPerSecondSquared,
configuration.MaximumJerkMetersPerSecondCubed, out JerkLimitedStoppingProfile stop, out _))
{