CogniPilot

MODELICA LIBRARY · ENGINEERING REFERENCE

Planning/DubinsPolynomial/junctionContinuityResidual.mo

Download original .moGitHub source

Documentation: Planning.DubinsPolynomial.junctionContinuityResidual

within Planning.DubinsPolynomial;
function junctionContinuityResidual
  "Maximum mismatch in position and true metric derivatives through third order"
  input Planning.Dubins.Path path;
  input Real offsetCoefficient[3, :];
  output Real residual;
protected
  Planning.DubinsPolynomial.State leftState;
  Planning.DubinsPolynomial.State rightState;
  Real segmentLength;
  Real previousSegmentLength;
  Integer previousSegment;
algorithm
  residual := 0.0;
  previousSegment := 0;
  for segmentIndex in 1:3 loop
    segmentLength := path.turnRadius
      * path.normalizedSegmentLength[segmentIndex];
    if segmentLength > 1.0e-10 then
      if previousSegment > 0 then
        previousSegmentLength := path.turnRadius
          * path.normalizedSegmentLength[previousSegment];
        leftState := Planning.DubinsPolynomial.evaluateSegment(
          path.startPosition, path.startHeading, path.turnRadius, path.pathType,
          path.normalizedSegmentLength, offsetCoefficient[previousSegment, :],
          previousSegment, previousSegmentLength);
        rightState := Planning.DubinsPolynomial.evaluateSegment(
          path.startPosition, path.startHeading, path.turnRadius, path.pathType,
          path.normalizedSegmentLength, offsetCoefficient[segmentIndex, :],
          segmentIndex, 0.0);
        residual := max(residual,
          max(abs(leftState.position - rightState.position)));
        residual := max(residual,
          max(abs(leftState.firstDerivative - rightState.firstDerivative)));
        residual := max(residual,
          max(abs(leftState.secondDerivative - rightState.secondDerivative)));
        residual := max(residual,
          max(abs(leftState.thirdDerivative - rightState.thirdDerivative)));
      end if;
      previousSegment := segmentIndex;
    end if;
  end for;
end junctionContinuityResidual;