Noise and Approximate-Bias Estimators

This documentation was generated with the assistance of AI. Please report any inaccuracies.

Classes: com.irurueta.navigation.inertial.calibration.noise (37 classes), com.irurueta.navigation.inertial.calibration.bias (5 classes), plus the root-level interfaces AccelerometerNoiseRootPsdSource, GyroscopeNoiseRootPsdSource, AccelerometerBiasUncertaintySource, GyroscopeBiasUncertaintySource, AccelerometerCalibrationSource, GyroscopeCalibrationSource (see the Class Reference table at the end of this page for Javadoc and source links).

These classes don’t perform full calibration — they estimate simpler statistics (noise level, or an approximate bias) that either feed into static-interval detection, seed a non-linear calibrator’s initial guess, or configure a Kalman filter’s initial uncertainty.

Noise estimators: PSD and root-PSD

All noise estimators reduce to two orthogonal choices — what statistic, and how much history:

Family Behavior

Accumulated*NoiseEstimator

A single running (recursive) mean/variance over all samples seen so far, using a biased (divide-by-N) variance estimator that converges to the unbiased one for large . Intended for use when the device is static for the entire capture.

Windowed*NoiseEstimator

Recomputes mean/variance over only the most recent windowSize samples (default 101) each time a new sample arrives, using the unbiased (divide-by- ) estimator. Intended for tracking noise that changes over time — e.g. inside TriadStaticIntervalDetector, which needs to notice when motion starts.

Each of those two comes in a single-axis form (*MeasurementNoiseEstimator, for a plain Acceleration/AngularSpeed/MagneticFluxDensity value) and a 3-axis form (*TriadNoiseEstimator), and both single-axis and triad forms are further specialized per sensor (Acceleration, AngularSpeed, MagneticFluxDensity) — that specialization only binds generic types and adds no new algorithm, which is why 4 conceptual families expand into most of the package’s 37 classes. AccumulatedBodyKinematicsNoiseEstimator / WindowedBodyKinematicsNoiseEstimator run the accelerometer and gyroscope triad versions together for a combined BodyKinematics stream.

The recursive (online) update, common to every Accumulated* estimator:


and the PSD / root-PSD relation used throughout (both families, all sensors):

where is the sample time interval (see TimeIntervalEstimator in Static/Dynamic Interval Detection and Measurement Generation). For a triad, the norm of the per-axis root-PSDs ( ) is also exposed, since this is exactly what AccelerometerNoiseRootPsdSource / GyroscopeNoiseRootPsdSource (below) report.

AccumulatedAccelerationTriadNoiseEstimator noiseEstimator =
        new AccumulatedAccelerationTriadNoiseEstimator();

// feed samples while the device is known to be static
for (double[] fxyz : staticSpecificForceSamples) {
    noiseEstimator.addTriad(fxyz[0], fxyz[1], fxyz[2]);
}

double stdNorm = noiseEstimator.getStandardDeviationNorm(); // m/s^2
double rootPsdNorm = noiseEstimator.getAccelerometerBaseNoiseLevelRootPsd(); // m/s^1.5 (AccelerometerNoiseRootPsdSource)

Approximate bias estimators

Unlike the full calibrators in Accelerometer Calibration, Gyroscope Calibration, and Magnetometer Calibration, the bias package’s two estimators assume the device is static at a single known position/orientation and neglect cross-coupling entirely — they only average measurements to get a quick bias (and noise PSD) estimate, good enough to seed a non-linear calibrator’s initial guess, or to use directly when cross-coupling errors are known to be negligible:

Class Purpose

BodyKinematicsBiasEstimator

Averages BodyKinematics samples at a known static NED/ECEF frame to estimate accelerometer and gyroscope bias plus noise PSD.

BodyMagneticFluxDensityBiasEstimator

Averages magnetic flux density samples at a known static position/orientation/instant (using the WMM for the expected field) to estimate hard-iron bias plus noise PSD.

Both classes' Javadoc explicitly point back to the noise estimators above for the case where only PSD (not bias) is needed and no known frame is available.

double latitude = Math.toRadians(41.3851);
double longitude = Math.toRadians(2.1734);
double height = 0.0;

BodyKinematicsBiasEstimator biasEstimator =
        new BodyKinematicsBiasEstimator(latitude, longitude, height);

// feed samples while the device is known to be static at this position
for (BodyKinematics sample : staticKinematicsSamples) {
    biasEstimator.addBodyKinematics(sample);
}

Matrix accelerometerBias = biasEstimator.getAccelerometerBias(); // 3x1, m/s^2
Matrix gyroBias = biasEstimator.getGyroBias();                   // 3x1, rad/s

Root-level interfaces: how components exchange calibration results

These small interfaces are how IMUErrorsCreator and Kalman-filter configuration classes stay decoupled from which specific calibrator/estimator produced a value:

Interface Purpose

AccelerometerNoiseRootPsdSource / GyroscopeNoiseRootPsdSource

Exposes a single double getXxxBaseNoiseLevelRootPsd() — implemented by the noise estimators above and by the static-interval detectors/generators in Static/Dynamic Interval Detection and Measurement Generation, any of which can supply IMUErrorsCreator with a noise root-PSD.

AccelerometerBiasUncertaintySource / GyroscopeBiasUncertaintySource

Exposes the norm of the estimated bias’s standard deviation, used to seed a Kalman filter’s initial uncertainty configuration (INSLooselyCoupledKalmanInitializerConfig / INSTightlyCoupledKalmanInitializerConfig).

AccelerometerCalibrationSource / GyroscopeCalibrationSource

Exposes the estimated bias vector plus (or and ) — implemented by every calibrator in Accelerometer Calibration / Gyroscope Calibration, and consumed by IMUErrorsCreator.

Class Reference

Javadoc and source links for the classes used in the examples above:

Class Javadoc Source

com.irurueta.navigation.inertial.calibration.noise (37 classes)

Javadoc

Source

com.irurueta.navigation.inertial.calibration.bias (5 classes)

Javadoc

Source

AccelerometerNoiseRootPsdSource

Javadoc

Source

GyroscopeNoiseRootPsdSource

Javadoc

Source

AccelerometerBiasUncertaintySource

Javadoc

Source

GyroscopeBiasUncertaintySource

Javadoc

Source

AccelerometerCalibrationSource

Javadoc

Source

GyroscopeCalibrationSource

Javadoc

Source

AccumulatedAccelerationTriadNoiseEstimator

Javadoc

Source

BodyKinematicsBiasEstimator

Javadoc

Source

BodyKinematics

Javadoc

Source

Where to go next