feat: select complete EM direction segments
This commit is contained in:
@@ -40,7 +40,8 @@ public sealed class PlanningHorizonSelector
|
||||
|
||||
public EmPlanningStatus Select(DirectionSegmentView segment, double currentSegmentReferenceS,
|
||||
double initialProgressSpeedMetersPerSecond, double initialAccelerationMetersPerSecondSquared,
|
||||
EmPlannerConfiguration configuration, out PlanningHorizonSelection selection, out string failureReason)
|
||||
EmPlanningScope planningScope, EmPlannerConfiguration configuration, out PlanningHorizonSelection selection,
|
||||
out string failureReason)
|
||||
{
|
||||
selection = null;
|
||||
failureReason = string.Empty;
|
||||
@@ -48,7 +49,8 @@ public sealed class PlanningHorizonSelector
|
||||
!IsFinite(currentSegmentReferenceS) || currentSegmentReferenceS < 0d ||
|
||||
currentSegmentReferenceS > segment.LengthMeters + BoundaryTolerance ||
|
||||
!IsFinite(initialProgressSpeedMetersPerSecond) || initialProgressSpeedMetersPerSecond < 0d ||
|
||||
!IsFinite(initialAccelerationMetersPerSecondSquared))
|
||||
!IsFinite(initialAccelerationMetersPerSecondSquared) ||
|
||||
!Enum.IsDefined(typeof(EmPlanningScope), planningScope))
|
||||
{
|
||||
failureReason = "Planning horizon inputs are invalid.";
|
||||
return EmPlanningStatus.InvalidInput;
|
||||
@@ -90,6 +92,20 @@ public sealed class PlanningHorizonSelector
|
||||
return EmPlanningStatus.StoppingDistanceInsufficient;
|
||||
}
|
||||
|
||||
if (planningScope == EmPlanningScope.FullDirectionSegment)
|
||||
{
|
||||
EmBoundaryType boundary = segment.EndBoundary.BoundaryType;
|
||||
if (!IsStopBoundary(boundary))
|
||||
{
|
||||
failureReason = "A full direction segment must end at Goal or GearSwitch.";
|
||||
return EmPlanningStatus.InvalidReferencePath;
|
||||
}
|
||||
selection = new PlanningHorizonSelection(segment.LengthMeters, boundary,
|
||||
ToTerminalType(boundary), EmLongitudinalMode.ExactStopAtBoundary,
|
||||
segment.LengthMeters, true);
|
||||
return EmPlanningStatus.Success;
|
||||
}
|
||||
|
||||
double windowEnd = Math.Min(currentSegmentReferenceS + scheduling.DistanceHorizonMeters, segment.LengthMeters);
|
||||
bool windowReachesSegmentEnd = windowEnd >= segment.LengthMeters - BoundaryTolerance;
|
||||
bool hasStopBoundary = windowReachesSegmentEnd && IsStopBoundary(segment.EndBoundary.BoundaryType);
|
||||
|
||||
Reference in New Issue
Block a user