CogniPilot

MODELICA LIBRARY · ENGINEERING REFERENCE

Estimation/StrapdownINS/ESKF/limitStateCovariance.mo

Download original .moGitHub source

Documentation: Estimation.StrapdownINS.ESKF.limitStateCovariance

within Estimation.StrapdownINS.ESKF;

function limitStateCovariance "Bound covariance without changing its representation"
  input State previous;
  input VarianceLimits limits;
  output State limited;
protected
  Real bound[TangentLength];
  Covariance root;
  Real variance;
  Real rescale[TangentLength];
algorithm
  bound := cat(1, limits.position_m2, limits.velocity_m2_s2,
    limits.attitude_rad2, limits.gyroscopeBias_rad2_s2,
    limits.accelerometerBias_m2_s4);
  rescale := ones(TangentLength);
  if previous.useSquareRootCovariance then
    root := previous.covarianceRoot;
    for row in 1:TangentLength loop
      variance := root[row, :] * root[row, :];
      if variance > bound[row] then
        rescale[row] := sqrt(bound[row] / variance);
        root[row, :] := rescale[row] * root[row, :];
      end if;
    end for;
    limited := withCovarianceRoot(previous, root,
      rescale .* previous.barometerBiasCrossCovariance);
  else
    for row in 1:TangentLength loop
      variance := previous.covariance[row, row];
      rescale[row] := if not abs(variance) < FiniteMagnitudeLimit then 0.0
        elseif variance > bound[row] then sqrt(bound[row] / variance) else 1.0;
    end for;
    limited := withDenseCovariance(previous,
      limitCovariance(previous.covariance, limits),
      rescale .* previous.barometerBiasCrossCovariance);
  end if;
end limitStateCovariance;