Vulcan
Aerospace Engineering Utilities Built on Janus
Loading...
Searching...
No Matches
AllanVarianceNoise.hpp
Go to the documentation of this file.
1// Allan Variance Parameterized Noise Model
2// Composite IMU noise model using Allan variance parameters
3#pragma once
4
5#include <Eigen/Core>
11
12namespace vulcan::allan {
13
14// =============================================================================
15// Per-Axis Noise State
16// =============================================================================
17
32
39template <typename Scalar> AxisState<Scalar> init_axis_state() {
40 return AxisState<Scalar>{
43 };
44}
45
46// =============================================================================
47// Per-Axis Coefficients
48// =============================================================================
49
61
69inline AxisCoeffs
71 return AxisCoeffs{
72 .arw_sigma = gaussian::sigma_from_arw(params.N, dt),
73 .bias_coeffs =
75 .rrw_coeffs = random_walk::compute_coeffs(params.K, dt),
76 };
77}
78
79// =============================================================================
80// Per-Axis Step Function
81// =============================================================================
82
101template <typename Scalar>
102Scalar step_axis(AxisState<Scalar> &state, const AxisCoeffs &coeffs,
103 const Scalar &noise_arw, const Scalar &noise_bias,
104 const Scalar &noise_rrw) {
105 // White noise (angle/velocity random walk)
106 Scalar arw = coeffs.arw_sigma * noise_arw;
107
108 // Bias instability (Markov process)
109 Scalar bias = bias_instability::step(state.bias_state, coeffs.bias_coeffs,
110 noise_bias);
111
112 // Rate random walk (integrated white noise)
113 Scalar rrw =
114 random_walk::step(state.rrw_state, coeffs.rrw_coeffs, noise_rrw);
115
116 return arw + bias + rrw;
117}
118
119// =============================================================================
120// 3-Axis IMU Noise State
121// =============================================================================
122
128template <typename Scalar> struct IMUNoiseState {
131};
132
139template <typename Scalar> IMUNoiseState<Scalar> init_state() {
141 for (int i = 0; i < 3; ++i) {
142 state.gyro[i] = init_axis_state<Scalar>();
143 state.accel[i] = init_axis_state<Scalar>();
144 }
145 return state;
146}
147
148// =============================================================================
149// 3-Axis IMU Noise Coefficients
150// =============================================================================
151
162
171inline IMUNoiseCoeffs
173 const sensors::AllanParams<double> &accel_params, double dt) {
174 return IMUNoiseCoeffs{
175 .gyro = compute_axis_coeffs(gyro_params, dt),
176 .accel = compute_axis_coeffs(accel_params, dt),
177 };
178}
179
180// =============================================================================
181// 3-Axis IMU Step Function
182// =============================================================================
183
192template <typename Scalar> struct IMUNoiseInput {
193 Eigen::Vector<Scalar, 3> gyro_arw;
194 Eigen::Vector<Scalar, 3> gyro_bias;
195 Eigen::Vector<Scalar, 3> gyro_rrw;
196 Eigen::Vector<Scalar, 3> accel_arw;
197 Eigen::Vector<Scalar, 3> accel_bias;
198 Eigen::Vector<Scalar, 3> accel_rrw;
199};
200
212template <typename Scalar>
214 const IMUNoiseCoeffs &coeffs,
215 const IMUNoiseInput<Scalar> &input) {
217
218 // Step each gyroscope axis
219 for (int i = 0; i < 3; ++i) {
220 output.gyro(i) =
221 step_axis(state.gyro[i], coeffs.gyro, input.gyro_arw(i),
222 input.gyro_bias(i), input.gyro_rrw(i));
223 }
224
225 // Step each accelerometer axis
226 for (int i = 0; i < 3; ++i) {
227 output.accel(i) =
228 step_axis(state.accel[i], coeffs.accel, input.accel_arw(i),
229 input.accel_bias(i), input.accel_rrw(i));
230 }
231
232 return output;
233}
234
249template <typename Scalar>
252 const Eigen::Vector<Scalar, 3> &gyro_noise,
253 const Eigen::Vector<Scalar, 3> &accel_noise) {
254 // Note: This simplified version uses correlated noise between processes
255 // For proper simulation, use the full IMUNoiseInput version
257 input.gyro_arw = gyro_noise;
258 input.gyro_bias = gyro_noise;
259 input.gyro_rrw = gyro_noise;
260 input.accel_arw = accel_noise;
261 input.accel_bias = accel_noise;
262 input.accel_rrw = accel_noise;
263
264 return step(state, coeffs, input);
265}
266
267// =============================================================================
268// Grade-Based Factory Functions
269// =============================================================================
270
281
292
303
314
315} // namespace vulcan::allan
Definition AllanVarianceNoise.hpp:12
IMUNoiseState< Scalar > init_state()
Initialize IMU noise state.
Definition AllanVarianceNoise.hpp:139
AxisCoeffs compute_axis_coeffs(const sensors::AllanParams< double > &params, double dt)
Compute per-axis coefficients from Allan parameters.
Definition AllanVarianceNoise.hpp:70
AxisState< Scalar > init_axis_state()
Initialize per-axis state to zero.
Definition AllanVarianceNoise.hpp:39
Scalar step_axis(AxisState< Scalar > &state, const AxisCoeffs &coeffs, const Scalar &noise_arw, const Scalar &noise_bias, const Scalar &noise_rrw)
Step single-axis noise model.
Definition AllanVarianceNoise.hpp:102
sensors::IMUNoiseSample< Scalar > step(IMUNoiseState< Scalar > &state, const IMUNoiseCoeffs &coeffs, const IMUNoiseInput< Scalar > &input)
Step the complete IMU noise model.
Definition AllanVarianceNoise.hpp:213
IMUNoiseCoeffs navigation_grade_coeffs(double dt)
Compute coefficients for navigation-grade IMU.
Definition AllanVarianceNoise.hpp:310
IMUNoiseCoeffs tactical_grade_coeffs(double dt)
Compute coefficients for tactical-grade IMU.
Definition AllanVarianceNoise.hpp:299
IMUNoiseCoeffs compute_coeffs(const sensors::AllanParams< double > &gyro_params, const sensors::AllanParams< double > &accel_params, double dt)
Compute IMU coefficients from Allan parameters.
Definition AllanVarianceNoise.hpp:172
sensors::IMUNoiseSample< Scalar > step_simple(IMUNoiseState< Scalar > &state, const IMUNoiseCoeffs &coeffs, const Eigen::Vector< Scalar, 3 > &gyro_noise, const Eigen::Vector< Scalar, 3 > &accel_noise)
Simplified step with single noise vector per sensor.
Definition AllanVarianceNoise.hpp:251
IMUNoiseCoeffs industrial_grade_coeffs(double dt)
Compute coefficients for industrial-grade IMU.
Definition AllanVarianceNoise.hpp:288
IMUNoiseCoeffs consumer_grade_coeffs(double dt)
Compute coefficients for consumer-grade IMU.
Definition AllanVarianceNoise.hpp:277
State< Scalar > init_state()
Initialize state to zero bias.
Definition BiasInstability.hpp:34
Scalar step(State< Scalar > &state, const Coeffs &coeffs, const Scalar &noise_input)
Step the bias instability process.
Definition BiasInstability.hpp:96
Coeffs compute_coeffs(double sigma_b, double tau, double dt)
Compute bias instability coefficients.
Definition BiasInstability.hpp:73
double sigma_from_arw(double N, double dt)
Compute white noise gain from Allan variance N parameter.
Definition GaussianNoise.hpp:96
Scalar step(State< Scalar > &state, const Coeffs &coeffs, const Scalar &noise_input)
Step the random walk process.
Definition RandomWalk.hpp:80
State< Scalar > init_state()
Initialize random walk state to zero.
Definition RandomWalk.hpp:32
Coeffs compute_coeffs(double K, double dt)
Compute random walk coefficients.
Definition RandomWalk.hpp:60
AllanParams< double > industrial_accel()
Industrial-grade MEMS accelerometer.
Definition NoiseTypes.hpp:121
AllanParams< double > consumer_gyro()
Consumer-grade MEMS gyroscope (smartphone-level).
Definition NoiseTypes.hpp:81
AllanParams< double > tactical_accel()
Tactical-grade IMU accelerometer.
Definition NoiseTypes.hpp:149
AllanParams< double > industrial_gyro()
Industrial-grade MEMS gyroscope.
Definition NoiseTypes.hpp:109
AllanParams< double > consumer_accel()
Consumer-grade MEMS accelerometer (smartphone-level).
Definition NoiseTypes.hpp:93
AllanParams< double > tactical_gyro()
Tactical-grade IMU gyroscope.
Definition NoiseTypes.hpp:137
AllanParams< double > navigation_accel()
Navigation-grade IMU accelerometer.
Definition NoiseTypes.hpp:177
AllanParams< double > navigation_gyro()
Navigation-grade IMU gyroscope.
Definition NoiseTypes.hpp:165
Pre-computed coefficients for single axis.
Definition AllanVarianceNoise.hpp:56
double arw_sigma
White noise std dev: N/√(Δt).
Definition AllanVarianceNoise.hpp:57
random_walk::Coeffs rrw_coeffs
Rate random walk coefficients.
Definition AllanVarianceNoise.hpp:59
bias_instability::Coeffs bias_coeffs
Bias instability coefficients.
Definition AllanVarianceNoise.hpp:58
Combined noise state for a single sensor axis.
Definition AllanVarianceNoise.hpp:28
random_walk::State< Scalar > rrw_state
Rate random walk state.
Definition AllanVarianceNoise.hpp:30
bias_instability::State< Scalar > bias_state
Bias instability state.
Definition AllanVarianceNoise.hpp:29
Complete IMU noise coefficients.
Definition AllanVarianceNoise.hpp:158
AxisCoeffs accel
Accelerometer coefficients (same for all axes).
Definition AllanVarianceNoise.hpp:160
AxisCoeffs gyro
Gyroscope coefficients (same for all axes).
Definition AllanVarianceNoise.hpp:159
Noise input structure for IMU step.
Definition AllanVarianceNoise.hpp:192
Eigen::Vector< Scalar, 3 > gyro_rrw
Gyro RRW noise (3 axes).
Definition AllanVarianceNoise.hpp:195
Eigen::Vector< Scalar, 3 > gyro_bias
Gyro bias noise (3 axes).
Definition AllanVarianceNoise.hpp:194
Eigen::Vector< Scalar, 3 > gyro_arw
Gyro ARW noise (3 axes).
Definition AllanVarianceNoise.hpp:193
Eigen::Vector< Scalar, 3 > accel_bias
Accel bias noise (3 axes).
Definition AllanVarianceNoise.hpp:197
Eigen::Vector< Scalar, 3 > accel_rrw
Accel RRW noise (3 axes).
Definition AllanVarianceNoise.hpp:198
Eigen::Vector< Scalar, 3 > accel_arw
Accel ARW noise (3 axes).
Definition AllanVarianceNoise.hpp:196
Complete 3-axis IMU noise state.
Definition AllanVarianceNoise.hpp:128
AxisState< Scalar > accel[3]
Accelerometer noise states (x, y, z).
Definition AllanVarianceNoise.hpp:130
AxisState< Scalar > gyro[3]
Gyroscope noise states (x, y, z).
Definition AllanVarianceNoise.hpp:129
Discretized bias instability coefficients.
Definition BiasInstability.hpp:60
Bias instability state.
Definition BiasInstability.hpp:24
Pre-computed random walk coefficients.
Definition RandomWalk.hpp:49
Random walk process state.
Definition RandomWalk.hpp:22
Allan variance noise parameters for IMU sensors.
Definition NoiseTypes.hpp:25
Scalar K
Rate random walk [rad/s²/√Hz] or [m/s³/√Hz].
Definition NoiseTypes.hpp:28
Scalar B
Bias instability [rad/s] or [m/s²].
Definition NoiseTypes.hpp:27
Scalar N
Angle/velocity random walk [rad/s/√Hz] or [m/s²/√Hz].
Definition NoiseTypes.hpp:26
Scalar tau_bias
Bias instability correlation time [s].
Definition NoiseTypes.hpp:29
3-axis IMU noise sample
Definition NoiseTypes.hpp:61
Eigen::Vector< Scalar, 3 > gyro
Gyroscope noise [rad/s].
Definition NoiseTypes.hpp:62
Eigen::Vector< Scalar, 3 > accel
Accelerometer noise [m/s²].
Definition NoiseTypes.hpp:63