fix: reject overflowing curvature transitions

This commit is contained in:
梁薄云
2026-07-30 16:56:22 +08:00
parent 0fc64f7693
commit 1e307bc89f
3 changed files with 48 additions and 1 deletions
@@ -26,6 +26,10 @@ internal sealed class CurvatureTransition
throw new ArgumentOutOfRangeException(nameof(localArcLengthMeters));
}
double curvatureJumpPerMeter = Math.Abs(rightVehicleCurvaturePerMeter - leftVehicleCurvaturePerMeter);
if (!NumericGuard.IsFinite(curvatureJumpPerMeter))
throw new ArgumentOutOfRangeException(nameof(rightVehicleCurvaturePerMeter));
SegmentIndex = segmentIndex;
LeftCoarsePathIndex = leftCoarsePathIndex;
RightCoarsePathIndex = rightCoarsePathIndex;
@@ -35,7 +39,7 @@ internal sealed class CurvatureTransition
VehicleHeadingRadians = vehicleHeadingRadians;
LeftVehicleCurvaturePerMeter = leftVehicleCurvaturePerMeter;
RightVehicleCurvaturePerMeter = rightVehicleCurvaturePerMeter;
CurvatureJumpPerMeter = Math.Abs(rightVehicleCurvaturePerMeter - leftVehicleCurvaturePerMeter);
CurvatureJumpPerMeter = curvatureJumpPerMeter;
}
internal int SegmentIndex { get; }
@@ -46,6 +46,11 @@ internal sealed class CurvatureTransitionDetector
CoarsePathPoint left = request.CoarsePath[leftIndex];
CoarsePathPoint right = request.CoarsePath[leftIndex + 1];
double delta = right.VehicleCurvature - left.VehicleCurvature;
if (!NumericGuard.IsFinite(delta))
{
reason = "局部 G2 曲率事件跳变溢出。";
return false;
}
if (Math.Abs(delta) >= threshold)
{
detected.Add(new CurvatureTransition(