CogniPilot

MODELICA LIBRARY · ENGINEERING REFERENCE

Estimation/StrapdownINS/ESKF/limitCovariance.mo

Download original .moGitHub source

Documentation: Estimation.StrapdownINS.ESKF.limitCovariance

within Estimation.StrapdownINS.ESKF;

function limitCovariance
  "Bound diagonal covariance growth to mission-envelope variance limits"
  input Covariance covariance;
  input VarianceLimits limits;
  output Covariance limited;
protected
  Real bound[TangentLength];
  Real rescale[TangentLength];
  Real scaledRow[TangentLength];
algorithm
  bound := cat(1,
    limits.position_m2,
    limits.velocity_m2_s2,
    limits.attitude_rad2,
    limits.gyroscopeBias_rad2_s2,
    limits.accelerometerBias_m2_s4);
  for row in 1:TangentLength loop
    rescale[row] := if not abs(covariance[row, row]) < FiniteMagnitudeLimit then 0.0
      elseif covariance[row, row] > bound[row]
      then sqrt(bound[row] / covariance[row, row]) else 1.0;
  end for;
  for row in 1:TangentLength loop
    scaledRow := rescale[row] * covariance[row, :];
    limited[row, :] := scaledRow .* rescale;
  end for;
  for row in 1:TangentLength loop
    limited[row, :] := if rescale[row] <= 0.0 then zeros(TangentLength)
      else limited[row, :];
    limited[:, row] := if rescale[row] <= 0.0 then zeros(TangentLength)
      else limited[:, row];
    limited[row, row] := if rescale[row] <= 0.0 then bound[row] else limited[row, row];
  end for;
end limitCovariance;