CogniPilot

MODELICA LIBRARY · ENGINEERING REFERENCE

Estimation/StrapdownINS/ESKF/TickUpdates.mo

Download original .moGitHub source

Documentation: Estimation.StrapdownINS.ESKF.TickUpdates · Estimation.StrapdownINS.ESKF.TickUpdates.ReseedStateTick · Estimation.StrapdownINS.ESKF.TickUpdates.OpticalFlowTick · Estimation.StrapdownINS.ESKF.TickUpdates.BarometerTick · Estimation.StrapdownINS.ESKF.TickUpdates.MagnetometerTick · Estimation.StrapdownINS.ESKF.TickUpdates.StationaryVelocityTick · Estimation.StrapdownINS.ESKF.TickUpdates.FallbackHoldTick

within Estimation.StrapdownINS.ESKF;

package TickUpdates "Bounded gated state updates for the sampled dispatcher"
  function ReseedStateTick
    input State previous;
    input Boolean requested;
    input Integer anchorSource;
    input Avionics.MocapSample mocap;
    input Avionics.GpsSample gps;
    input Estimation.StrapdownINS.InitialVariances variances;
    output State next;
    output Boolean reseeded;
    output Integer source;
  protected
    Real position[3]; Real velocity[3];
  algorithm
    reseeded := requested;
    source := if requested then anchorSource else SourceNone;
    if requested then
      position := if anchorSource == SourceMocap then mocap.positionWorldEnu_m else gps.positionWorldEnu_m;
      velocity := if anchorSource == SourceGps and gps.velocityValid then gps.velocityWorldEnu_m_s else previous.velocityWorldEnu_m_s;
      next := reseed(previous, position, velocity, variances);
    else
      next := copyState(previous);
    end if;
  end ReseedStateTick;

  function OpticalFlowTick
    input State previous;
    input Tuning tuning;
    input Real gravityWorldEnu_m_s2[3];
    input Real imuTime;
    input Real angularVelocity[3];
    input Real specificForce[3];
    input Boolean requested;
    input Avionics.OpticalFlowSample opticalFlow;
    output State next;
    output Boolean accepted;
    output Integer outcome;
    output Real nis;
  algorithm
    accepted := false; outcome := CorrectionNotAttempted; nis := 0.0;
    if requested then
      (next, accepted, outcome, nis) := correctOpticalFlow(previous, opticalFlow,
        tuning.innovationGate, imuTime-opticalFlow.timestamp_s,
        angularVelocity, specificForce, gravityWorldEnu_m_s2,
        tuning.maximumAidingDelay_s, tuning.minimumOpticalFlowQuality,
        tuning.minimumOpticalFlowGroundDistance_m, tuning.useSemiDirectBias);
    else
      next := copyState(previous);
    end if;
  end OpticalFlowTick;

  function BarometerTick
    input State previous;
    input Tuning tuning;
    input Real gravityWorldEnu_m_s2[3];
    input Real imuTime;
    input Real angularVelocity[3];
    input Real specificForce[3];
    input Boolean requested;
    input Avionics.BarometerSample barometer;
    output State next;
    output Boolean accepted;
    output Integer outcome;
    output Real nis;
  algorithm
    accepted := false; outcome := CorrectionNotAttempted; nis := 0.0;
    if requested then
      (next, accepted, outcome, nis) := correctBarometer(previous, barometer,
        tuning.barometerBias_m, tuning.barometerBiasVariance_m2,
        tuning.innovationGate, imuTime-barometer.timestamp_s,
        angularVelocity, specificForce, gravityWorldEnu_m_s2,
        tuning.maximumAidingDelay_s, tuning.useSemiDirectBias,
        tuning.useBarometerBiasConsider, tuning.barometerBiasProcessNoise_m2_s);
    else
      next := copyState(previous);
    end if;
  end BarometerTick;

  function MagnetometerTick
    input State previous;
    input Tuning tuning;
    input Real gravityWorldEnu_m_s2[3];
    input Real imuTime;
    input Real angularVelocity[3];
    input Real specificForce[3];
    input Boolean requested;
    input Avionics.MagnetometerSample magnetometer;
    output State next;
    output Boolean accepted;
    output Integer outcome;
    output Real nis;
  algorithm
    accepted := false; outcome := CorrectionNotAttempted; nis := 0.0;
    if requested then
      (next, accepted, outcome, nis) := correctMagnetometer(previous, magnetometer,
        tuning.localMagneticFieldWorldEnu_T, tuning.innovationGate,
        imuTime-magnetometer.timestamp_s, angularVelocity, specificForce,
        gravityWorldEnu_m_s2, tuning.maximumAidingDelay_s,
        tuning.useEquivariantMagnetometer, tuning.useSemiDirectBias);
    else
      next := copyState(previous);
    end if;
  end MagnetometerTick;

  function StationaryVelocityTick
    input State previous;
    input Tuning tuning;
    input Boolean requested;
    output State next;
    output Boolean accepted;
    output Integer outcome;
    output Real nis;
  algorithm
    accepted := false; outcome := CorrectionNotAttempted; nis := 0.0;
    if requested then
      (next, accepted, outcome, nis) := correctZeroVelocity(previous,
        tuning.stationaryVelocityVariance_m2_s2, 0.0, tuning.useSemiDirectBias);
    else
      next := copyState(previous);
    end if;
  end StationaryVelocityTick;

  function FallbackHoldTick
    input State previous;
    input Tuning tuning;
    input Boolean requested;
    input Boolean imuQuiet;
    input Real positionHold[3];
    output State next;
    output Boolean attempted;
    output Boolean zeroVelocityAccepted;
    output Boolean pseudoPositionAccepted;
    output Integer outcome;
    output Integer source;
    output Real nis;
  protected
    Boolean zeroConfigured; Boolean positionConfigured;
  algorithm
    zeroConfigured := tuning.zeroVelocityVariance_m2_s2 > 0.0
      and tuning.zeroVelocityVariance_m2_s2 < FiniteMagnitudeLimit;
    positionConfigured := tuning.pseudoPositionVariance_m2 > 0.0
      and tuning.pseudoPositionVariance_m2 < FiniteMagnitudeLimit;
    attempted := requested and ((zeroConfigured and imuQuiet) or positionConfigured);
    zeroVelocityAccepted := false; pseudoPositionAccepted := false;
    outcome := CorrectionNotAttempted; source := SourceNone; nis := 0.0;
    if requested and zeroConfigured and imuQuiet then
      (next, zeroVelocityAccepted, outcome, nis) := correctZeroVelocity(previous,
        tuning.zeroVelocityVariance_m2_s2, 0.0, tuning.useSemiDirectBias);
      source := SourceZeroVelocity;
    elseif requested and positionConfigured then
      (next, pseudoPositionAccepted, outcome, nis) := correctPseudoPosition(previous,
        positionHold, tuning.pseudoPositionVariance_m2, 0.0, tuning.useSemiDirectBias);
      source := SourcePseudoPosition;
    else
      next := copyState(previous);
    end if;
  end FallbackHoldTick;
end TickUpdates;