CogniPilot

MODELICA LIBRARY · ENGINEERING REFERENCE

Tests/BarometerConsiderReplay.mo

Download original .moGitHub source

Documentation: Tests.BarometerConsiderReplay

within Tests;

block BarometerConsiderReplay
  "Deployment probe for a pressure datum retained as a consider state"
  input Real priorState[16];
  input Real priorCovariance[15, 15];
  input Real priorRoot[15, 15];
  input Real priorCrossCovariance[15];
  input Real measurementResidual[3];
  input Real observationMatrix[3, 15];
  input Real measurementCovariance[3, 3];
  input Real measurementStateCrossCovariance[15, 3];
  input Real measurementBarometerCrossCovariance[3];
  input Real attitudeAxis[3];
  input Real innovationGate;
  input Real biasVariance;
  input Real biasMean;
  input Real biasProcessNoise;
  input Real pressureAltitude;
  input Real pressureVariance;
  input Real measurementAge;
  input Real transition[15, 15];
  input Real varianceBounds[15];
  input Integer operation;
  input Boolean useSquareRoot;
  input Boolean useSemiDirectBias;
  input Boolean headingOnly;
  input Boolean useJointBarometerBias;
  output Real correctedState[16];
  output Real posteriorCovariance[15, 15];
  output Real posteriorCrossCovariance[15];
  output Real posteriorBiasMean;
  output Real posteriorBiasVariance;
  output Boolean accepted;
  output Integer reason;
  output Real nis;
protected
  Estimation.StrapdownINS.ESKF.State prior(
    positionWorldEnu_m=priorState[1:3], velocityWorldEnu_m_s=priorState[4:6],
    quaternionWorldBody=priorState[7:10], gyroscopeBiasBodyFlu_rad_s=priorState[11:13],
    accelerometerBiasBodyFlu_m_s2=priorState[14:16], covariance=priorCovariance,
    covarianceRoot=priorRoot, useSquareRootCovariance=useSquareRoot,
    barometerBiasCrossCovariance=priorCrossCovariance,
    barometerBias_m=biasMean, barometerBiasVariance_m2=biasVariance,
    useJointBarometerBias=useJointBarometerBias);
  Estimation.StrapdownINS.ESKF.State posterior;
  Estimation.StrapdownINS.ProcessNoise processNoise(
    gyroscope_rad2_s=0.01 * identity(3),
    accelerometer_m2_s3=0.02 * identity(3),
    gyroscopeBias_rad2_s3=0.03 * identity(3),
    accelerometerBias_m2_s5=0.04 * identity(3));
algorithm
  when sample(0.0, 0.01) then
    accepted := false;
    reason := 0;
    nis := 0.0;
    if operation == 0 then
      (posterior, accepted, reason, nis) := Estimation.StrapdownINS.ESKF.correctLinear(
        prior, measurementResidual, observationMatrix, measurementCovariance,
        innovationGate, attitudeAxis, measurementStateCrossCovariance,
        headingOnly, useSemiDirectBias, measurementBarometerCrossCovariance);
    elseif operation == 1 then
      (posterior, accepted, reason, nis) := Estimation.StrapdownINS.ESKF.correctBarometer(
        prior, Avionics.BarometerSample(valid=true, fresh=true, timestamp_s=0.0,
          altitudeWorldEnu_m=pressureAltitude, variance_m2=pressureVariance),
        0.0, biasVariance, innovationGate, measurementAge, zeros(3), zeros(3),
        zeros(3), 0.25, useSemiDirectBias, true, biasProcessNoise);
    elseif operation == 2 then
      posterior := Estimation.StrapdownINS.ESKF.predictCovariance(
        prior, transition, zeros(15, 15), processNoise, 0.02);
    elseif operation == 3 then
      posterior := Estimation.StrapdownINS.ESKF.predictStationary(prior, 0.02, processNoise);
    elseif operation == 4 then
      posterior := Estimation.StrapdownINS.ESKF.limitStateCovariance(prior,
        Estimation.StrapdownINS.ESKF.VarianceLimits(
          position_m2=varianceBounds[1:3], velocity_m2_s2=varianceBounds[4:6],
          attitude_rad2=varianceBounds[7:9], gyroscopeBias_rad2_s2=varianceBounds[10:12],
          accelerometerBias_m2_s4=varianceBounds[13:15]));
    else
      posterior := Estimation.StrapdownINS.ESKF.reseed(prior, zeros(3), zeros(3),
        Estimation.StrapdownINS.InitialVariances(
          position_m2=varianceBounds[1:3], velocity_m2_s2=varianceBounds[4:6],
          attitude_rad2=varianceBounds[7:9], gyroscopeBias_rad2_s2=varianceBounds[10:12],
          accelerometerBias_m2_s4=varianceBounds[13:15]));
    end if;
    correctedState := cat(1, posterior.positionWorldEnu_m,
      posterior.velocityWorldEnu_m_s, posterior.quaternionWorldBody,
      posterior.gyroscopeBiasBodyFlu_rad_s, posterior.accelerometerBiasBodyFlu_m_s2);
    posteriorCovariance := posterior.covariance;
    posteriorCrossCovariance := posterior.barometerBiasCrossCovariance;
    posteriorBiasMean := posterior.barometerBias_m;
    posteriorBiasVariance := posterior.barometerBiasVariance_m2;
  end when;
end BarometerConsiderReplay;