pub struct ImuNoise {
pub gyro_white: f32,
pub accel_white: f32,
pub gyro_bias_walk: f32,
pub accel_bias_walk: f32,
}Expand description
IMU noise, as the continuous-time densities of equations (16)–(21).
Fields§
§gyro_white: f32Gyroscope white noise, rad s⁻¹ / √Hz.
accel_white: f32Accelerometer white noise, m s⁻² / √Hz.
gyro_bias_walk: f32Gyroscope bias random walk, rad s⁻² / √Hz.
accel_bias_walk: f32Accelerometer bias random walk, m s⁻³ / √Hz.
Trait Implementations§
impl Copy for ImuNoise
Source§impl Default for ImuNoise
impl Default for ImuNoise
Source§fn default() -> Self
fn default() -> Self
White noise at ten times PX4 EKF2’s density, measured to be what this filter needs; bias walks at ArduPilot EK3’s density.
These are deliberately far above what an IMU datasheet or an Allan variance plot gives for the sensor alone, because the process noise of a real airframe absorbs what the model leaves out: vibration, scale-factor and cross-axis error, timing jitter, and the coning and sculling a first-order propagation does not capture. Datasheet-grade figures would make the covariance claim a precision the estimate does not have, and an overconfident covariance gates out measurements that were fine.
Both estimators add a bias walk as (σ Δt)² per prediction step, so their σ is
per-step at their own rate and the density it implies is σ √Δt: PX4 at
src/modules/ekf2/EKF/covariance.cpp:152-153,166-167 with a 10 ms step
(module.yaml:22, EKF2_PREDICT_US), at c4e4ef98e9; ArduPilot at
libraries/AP_NavEKF3/AP_NavEKF3_core.cpp:1065,1071 with a 12 ms step
(AP_NavEKF3_core.cpp:36, EKF_TARGET_DT), at 368dc0c428, its bias states being
b Δt. PX4’s 1.0e-3 rad s⁻² and 3.0e-3 m s⁻³ (params_gyro_bias.yaml:19,
params_accel_bias.yaml:19) come to 1.0e-4 and 3.0e-4; ArduPilot’s copter 1.0e-3 and
2.0e-2 (AP_NavEKF3.cpp:30-31) to 1.1e-4 and 2.2e-3. These are ArduPilot’s, the
larger pair.
The conversion is worth most where only tilt · g + b_a is observed: read unconverted, the
walk drags a grounded vehicle’s tilt to a 5.2° peak against EKF2’s 1.08° (2c42096b), and
converted it peaks at 2.5°.
The white noise is PX4’s per-step σ taken as a density, which is ten times the density PX4’s
1.5e-2 rad s⁻¹ and 0.35 m s⁻² stand for at its 10 ms step (module.yaml:118-131). The
factor stands for two things this filter does not model: the floors both estimators put
under a receiver’s reported accuracy, and vibration, which PX4 meets only by
inflating accelerometer noise on clipping (covariance.cpp:125-133). Replay measured both
spending it: at 0.3× accel_white, 2c42096b vibrating on the ground peaks at 4.6° of tilt
against 2.5°, and a299e722’s raw R rejects 493 velocity solutions against 283. A change
that models either is the moment to measure this again.
The floor the sensors themselves measure,
StaticWindow::noise, sits 9 to 180 times below the
gyroscope’s and 6 to 230 times below the accelerometer’s on the corpus, so the factor is
measured from below too
(evidence).
impl StructuralPartialEq for ImuNoise
Auto Trait Implementations§
impl Freeze for ImuNoise
impl RefUnwindSafe for ImuNoise
impl Send for ImuNoise
impl Sync for ImuNoise
impl Unpin for ImuNoise
impl UnsafeUnpin for ImuNoise
impl UnwindSafe for ImuNoise
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.