CogniPilot

MODELICA LIBRARY · ENGINEERING REFERENCE

block

Vehicles.Rdd2.NavigationEstimator

RDD2 eFMU implementation of the stable navigation estimator boundary

Export this block as the default RDD2 estimator eFMU. Alternate filter blocks extend Avionics.PartialNavigationEstimator and therefore replace this artifact without changing any sensor input, navigation output, status field, or controller wiring.

The process-noise and initial-variance modifiers, the enabled automatic re-seed window, the 0.3-second quasi-static alignment window, and the synthetic hold-position (10 m sigma) and zero-velocity (0.3 m/s sigma) updates that keep an unaided indoor filter bounded are RDD2 flight-log tuning of the generic strapdown defaults. The calibrated magnetic-vector update observes tilt as well as heading, and geometric alignment conditions startup uncertainty on the measured vectors; the defaults in Estimation.StrapdownINS.PartialEstimator are unchanged, so every other consumer of the filter keeps them.

Base classes

Estimation.StrapdownINS.ESKF.Estimator

Follow base classes for inherited declarations; this page lists explicit declarations only.

Modelica declarations and implementation

Show parameters, interfaces and source

Parameters, inputs, outputs, defaults and equations from the source file.

block NavigationEstimator
  "RDD2 eFMU implementation of the stable navigation estimator boundary"
  extends Estimation.StrapdownINS.ESKF.Estimator(
    samplePeriod = 0.01,
    // RDD2 supplies a calibrated local field and its body-frame covariance.
    // Keep its tilt information as well as heading; heading-only corrections
    // cannot arrest roll/pitch drift driven by gyroscope noise during hover.
    useEquivariantMagnetometer = true,
    // Condition startup uncertainty on the vectors used to align the attitude.
    useGeometricAlignment = true,
    // Flight-log tuning of the generic strapdown defaults, applied only to
    // the RDD2 deployment through these extends modifiers. The values come
    // from replaying a recorded RDD2 flight through the exported estimator
    // and scoring the aided solution against the GPS fixes.
    processNoise = Estimation.StrapdownINS.ProcessNoise(
      // Gyroscope angular-random-walk density. Raised from the generic
      // 1e-5 because the flight's turn dynamics needed more attitude
      // process noise than the bench default carried for the fixes to keep
      // yaw locked to the ground course.
      gyroscope_rad2_s = identity(3) * 1.0e-4,
      // Accelerometer velocity-random-walk density. The generic 1e-3 left
      // the velocity sigma near 0.05 m/s against a GPS velocity floor of
      // about 0.1 m/s, so each fix was applied with an effective gain near
      // 0.19 and the solution stayed overconfident; 3e-2 opens the gain so
      // the fixes actually move the state, cutting aided horizontal error.
      accelerometer_m2_s3 = identity(3) * 3.0e-2,
      // Gyroscope-bias random-walk density. Lowered from the generic 1e-8
      // to 1e-10 so the gyroscope-bias state cannot chase the per-fix yaw
      // innovations; holding the bias steady kept yaw within about 14
      // degrees of the flown course.
      gyroscopeBias_rad2_s3 = identity(3) * 1.0e-10,
      // Accelerometer-bias random-walk density held at the generic default.
      accelerometerBias_m2_s5 = identity(3) * 1.0e-6),
    initialVariances = Estimation.StrapdownINS.InitialVariances(
      // Position, velocity, attitude, and accelerometer-bias initial
      // variances held at the generic defaults.
      position_m2 = fill(1.0, 3),
      velocity_m2_s2 = fill(1.0, 3),
      attitude_rad2 = fill(0.25, 3),
      // Initial gyroscope-bias variance tightened from the generic 1e-4 to
      // 1e-6 so the filter starts from the well-characterized turn-on bias
      // of the flight IMU rather than admitting a wide early bias swing
      // that the flight data showed disturbing the initial heading.
      gyroscopeBias_rad2_s2 = fill(1.0e-6, 3),
      accelerometerBias_m2_s4 = fill(1.0e-2, 3)),
    // Automatic recovery re-seed enabled for this deployment. On the flight
    // log a 60 s GNSS outage while moving left the solution hundreds of
    // metres off, and every returning fix was gate-rejected, so the ladder
    // stalled at the divergent stage and never recovered. Six seconds is one
    // second beyond the five-second divergent window, so the covariance
    // inflation is given its full span to readmit a good fix on its own
    // before the estimator re-seeds position and velocity from the first
    // fresh fix; on the log this re-anchored within about ten seconds of
    // each outage.
    aidingReseedWindow_s = 6.0,
    initialAlignmentWindow_s = 0.3,
    initialAlignmentTimeout_s = 5.0,
    pseudoPositionVariance_m2 = 100.0,
    zeroVelocityVariance_m2_s2 = 9.0e-2);

  annotation(Documentation(info = "<html>
    <p>Export this block as the default RDD2 estimator eFMU. Alternate filter
    blocks extend <code>Avionics.PartialNavigationEstimator</code>
    and therefore replace this artifact without changing any sensor input,
    navigation output, status field, or controller wiring.</p>
    <p>The process-noise and initial-variance modifiers, the enabled
    automatic re-seed window, the 0.3-second quasi-static alignment window,
    and the synthetic hold-position (10 m sigma) and zero-velocity (0.3 m/s
    sigma) updates that keep an unaided indoor filter bounded are RDD2
    flight-log tuning of the generic strapdown defaults. The calibrated
    magnetic-vector update observes tilt as well as heading, and geometric
    alignment conditions startup uncertainty on the measured vectors; the defaults in
    <code>Estimation.StrapdownINS.PartialEstimator</code> are unchanged, so
    every other consumer of the filter keeps them.</p>
  </html>"));
end NavigationEstimator;