pub struct Initialization {
pub min_duration: Seconds,
pub max_gyro_rate: RadiansPerSecond,
pub max_accel_deviation: MetersPerSecond2,
pub sigma_position: Meters,
pub sigma_velocity: MetersPerSecond,
pub sigma_tilt: Radians,
pub sigma_yaw: Radians,
pub sigma_accel_bias: MetersPerSecond2,
pub sigma_gyro_bias: RadiansPerSecond,
}Expand description
Quasi-static initialization, equations (5)–(8).
Fields§
§min_duration: SecondsHow long the vehicle must have been still.
A duration rather than a sample count, because the same count means very different things
across IMU rates: 100 samples is 2 s at 50 Hz and 0.25 s at 400 Hz, and a quarter second is
too short to average sensor noise down or to tell stillness from a slow drift. The logs in
data/manifest.txt alone span 50 Hz to 250 Hz.
max_gyro_rate: RadiansPerSecondLargest angular rate magnitude still considered stationary.
Compared against the peak over the window, not a filtered value, so at the same number this is the stricter test: one vibration spike is enough to fail it.
max_accel_deviation: MetersPerSecond2Largest departure of the specific-force magnitude from gravity still considered
stationary. Peak over the window, as with
max_gyro_rate.
sigma_position: MetersInitial position standard deviation.
sigma_velocity: MetersPerSecondInitial velocity standard deviation.
sigma_tilt: RadiansInitial roll and pitch standard deviation. Gravity determines these well.
The whole tilt uncertainty of a leveled start, including the share an accelerometer
bias explains: that share, σ_βa / γ, is carried as the tilt’s correlation with the
bias rather than added to it, and where it exceeds this figure it is the prior, with
the window’s own scatter across gravity added as the share the bias does not explain
(equation (8)). At the defaults it does, 0.0204 rad against 0.02.
sigma_yaw: RadiansInitial yaw standard deviation. Much larger than
sigma_tilt: yaw inherits the magnetometer’s calibration error.
sigma_accel_bias: MetersPerSecond2Initial accelerometer bias standard deviation.
0.2 m/s², the switch-on bias both production estimators assume: PX4’s
EKF2_ABIAS_INIT (src/modules/ekf2/EKF/common.h:340, c4e4ef98), and ArduPilot’s
0.2 · EK3_ACC_BIAS_LIM at its default of 1.0
(libraries/AP_NavEKF3/AP_NavEKF3_core.cpp:616, AP_NavEKF3_core.h:52,
AP_NavEKF3.cpp:567, 368dc0c4). A static window cannot measure it, since (5) reads a
horizontal bias as tilt, which is why the tilt carries its correlation with it.
At 0.1, harsh_imu’s 0.186 m/s² bias sat at 1.86σ and its attitude was overconfident on 50
seeds (evidence).
sigma_gyro_bias: RadiansPerSecondInitial gyroscope bias standard deviation, before the window’s mean rate is weighed.
A window at rest weighs its own mean rate against this, (7), and a still window measures
the bias far better (evidence); so this is the prior of a start in motion, where the
bias starts at zero, and no start at rest ends wider than it but for the Earth’s
rotation, which (8) adds. PX4 starts every bias at zero under 0.1 rad/s
(EKF2_GBIAS_INIT, src/modules/ekf2/params_gyro_bias.yaml:5-14, c4e4ef98), and
ArduPilot’s fallback is 2.5°/s (libraries/AP_InertialSensor/AP_InertialSensor.cpp:1536-1542,
368dc0c4).
0.01 rad/s against both, because the corpus’s biases are smaller than either assumes
(EKF2’s per-log medians 1.2 × 10⁻³ rad/s RMS, none past 4.5 × 10⁻³), and a wider prior
lets a coarse start explain its attitude error as bias: at PX4’s 0.1, 7ce66f0d, the hand
launch, rejects 58157 measurements against 4877 (evidence).
Trait Implementations§
Source§impl Clone for Initialization
impl Clone for Initialization
impl Copy for Initialization
Source§impl Debug for Initialization
impl Debug for Initialization
Source§impl Default for Initialization
impl Default for Initialization
Source§impl PartialEq for Initialization
impl PartialEq for Initialization
impl StructuralPartialEq for Initialization
Auto Trait Implementations§
impl Freeze for Initialization
impl RefUnwindSafe for Initialization
impl Send for Initialization
impl Sync for Initialization
impl Unpin for Initialization
impl UnsafeUnpin for Initialization
impl UnwindSafe for Initialization
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> Scalar for T
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.