NDEVR
API Documentation
IMUNoiseSimulator.h
1#pragma once
2#include <NDEVR/GenericOption.h>
3#include <NDEVR/BaseValues.h>
4#include <NDEVR/Random.h>
5#include <NDEVR/Time.h>
6#include <NDEVR/TimeSpan.h>
7#include <NDEVR/Angle.h>
8#include <NDEVR/AngleDefinitions.h>
9#include <NDEVR/Translator.h>
10#include "DLLInfo.h"
11namespace NDEVR
12{
18 class HARDWARE_API IMUNoiseSimulator
19 {
20 public:
32
38
45
53
65
68
69
74
75
84
85 public:
87 void reset()
88 {
89 m_last_accelerometer_update_time = Constant<Time>::Invalid;
90 m_last_gyro_update_time = Constant<Time>::Invalid;
91 m_last_magnetometer_update_time = Constant<Time>::Invalid;
92 }
93
97 void addVector(GenericOptionGroup& group, const Vector<3, fltp08>& vector, const StringView name)
98 {
99 for (uint04 i = 0; i < 3; i++)
100 {
101 String axis_name(name);
102 axis_name = axis_name.toLower();
103 axis_name.replaceAll(' ', '_');
104 axis_name.append('_');
105 axis_name.append(cast<char>('x' + i));
106 GenericOption option(axis_name, TranslatedString::DirectString(axis_name.toTitleString()), cast<fltp04>(vector[i]));
107 //option.dec
108 group.addOption(option);
109 }
110 }
111
115 void setVector(const GenericOptionGroup& group, Vector<3, fltp08>& vector, const StringView name)
116 {
117 for (uint04 i = 0; i < 3; i++)
118 {
119 String axis_name(name);
120 axis_name = axis_name.toLower();
121 axis_name.replaceAll(' ', '_');
122 axis_name.append('_');
123 axis_name.append(cast<char>('x' + i));
124 vector[i] = group.getValue<fltp08>(axis_name);
125 }
126 }
127
129 {
130 return m_accel_bias;
131 }
132
135 {
136 m_accel_bias = bias;
137 }
138
140 {
141 return m_gyro_bias_dph;
142 }
143
146 {
147 m_gyro_bias_dph = bias;
148 }
149
152 {
154 //Gyroscope noise and bias parameters
155 GenericOptionGroup gyro(_t("Gyro"));
156 gyro.addOption(GenericOption("gyro_input_range", _t("Input Range"), gyro_input_range));
157 addVector(gyro, gyro_bias_instability_mean_dph, "Bias Instability Mean");
158 addVector(gyro, gyro_bias_instability_std_dph, "Bias Instability Std");
159 addVector(gyro, gyro_bias_offset_mean_dph, "Bias Offset Mean");
160 addVector(gyro, gyro_bias_offset_std_dph, "Bias Offset Std");
161 addVector(gyro, gyro_bias_offset_max_dph, "Bias Offset Max");
162 gyro.addOption(GenericOption("gyro_bias_temperature_mean_error", _t("Bias Temperature Mean"), gyro_bias_temperature_mean_error));
163 gyro.addOption(GenericOption("gyro_bias_temperature_std_error", _t("Bias Temperature Std"), gyro_bias_temperature_std_error));
164 gyro.addOption(GenericOption("gyro_g_sensitivity", _t("Bias G-Sensitivity"), gyro_g_sensitivity));
165 gyro.addOption(GenericOption("gyro_vibration_rectification_mean", _t("Vibration Rect Mean"), gyro_vibration_rectification_mean));
166 gyro.addOption(GenericOption("gyro_vibration_rectification_std", _t("Vibration Rect Std"), gyro_vibration_rectification_std));
167 addVector(gyro, gyro_scale_error_mean_ppm, "Scale Mean");
168 addVector(gyro, gyro_scale_error_std_ppm, "Scale Std");
169 addVector(gyro, gyro_scale_error_max_ppm, "Scale Max");
170 addVector(gyro, gyro_scale_temperature_error_mean_ppm, "Scale Temperature Mean");
171 addVector(gyro, gyro_scale_temperature_error_std_ppm, "Scale Temperature Std");
172 addVector(gyro, gyro_non_linearity_mean_ppm, "Non-Linearity Mean");
173 addVector(gyro, gyro_non_linearity_std_ppm, "Non-Linearity Std");
174 addVector(gyro, gyro_non_linearity_max_ppm, "Non-Linearity Max");
175 addVector(gyro, gyro_random_walk_mean, "Random Walk Mean");
176 addVector(gyro, gyro_random_walk_std, "Random Walk Std");
177 addVector(gyro, gyro_noise_density_mean_dps_rt_hz, "Noise Density Mean");
178 addVector(gyro, gyro_noise_density_std_dps_rt_hz, "Noise Density Std");
179 addVector(gyro, gyro_noise_density_max_dps_rt_hz, "Noise Density Max");
180
181 gyro.addOption(GenericOption("gyro_vibration_noise_coef_mean", _t("Vibration Noise Coef Mean"), gyro_vibration_noise_coef_mean));
182 gyro.addOption(GenericOption("gyro_vibration_noise_coef_std", _t("Vibration Noise Coef Std"), gyro_vibration_noise_coef_std));
183
184
185
186 //addVector(gyro, gyro_bias_dph, "Bias DPH");
187
188 addVector(gyro, gyro_noise_density_max_dps_rt_hz, "Max Noise Density");
189 options.add(gyro);
190 GenericOptionGroup accel(_t("Acceleration"));
191 accel.addOption(GenericOption("accel_dynamic_range", _t("Dynamic Range"), accel_dynamic_range));
192 addVector(accel, accel_bias_instability_mean_ug, "Bias Instability Mean");
193 addVector(accel, accel_bias_instability_std_ug, "Bias Instability Std");
194 addVector(accel, accel_bias_offset_mean_ug, "Bias Offset Mean");
195 addVector(accel, accel_bias_offset_std_ug, "Bias Offset Std");
196 addVector(accel, accel_bias_offset_max_ug, "Bias Offset Max");
197 addVector(accel, accel_bias_temperature_mean_error, "Bias Temperature Mean");
198 addVector(accel, accel_bias_temperature_std_error, "Bias Temperature Std");
199 addVector(accel, acc_scale_error_mean_ppm, "Scale Mean");
200 addVector(accel, acc_scale_error_std_ppm, "Scale Std");
201 addVector(accel, acc_scale_error_std_ppm, "Scale Max");
202 addVector(accel, acc_scale_temperature_error_mean_ppm, "Scale Temperature Mean");
203 addVector(accel, acc_scale_temperature_error_std_ppm, "Scale Temperature Std");
204 addVector(accel, acc_non_linearity_mean_ppm, "Non-Linearity Mean");
205 addVector(accel, acc_non_linearity_std_ppm, "Non-Linearity Std");
206 addVector(accel, accel_velocity_walk_mean, "Velocity Walk Mean");
207 addVector(accel, accel_velocity_walk_std, "Velocity Walk Std");
208 addVector(accel, accel_noise_density_mean_ug_rt_hz, "Noise Density Mean");
209 addVector(accel, accel_noise_density_std_ug_rt_hz, "Noise Density Std");
210 addVector(accel, accel_noise_density_max_ug_rt_hz, "Noise Density Max");
211
212 options.add(accel);
213
214 return options;
215 // Magnetometer noise parameters (WARNING: Datasheet is incomplete for noise density and bias, this is a best guess)
216 /*fltp08 mag_noise_density_mean_ugauss_rt_hz = 80;
217 fltp08 mag_noise_density_std_ugauss_rt_hz = 80;
218 Vector<3, fltp08> mag_bias_gauss = Vector<3, fltp08>(0.0);
219 fltp08 mag_bias_offset_mean_ugauss = 0.0016;
220 fltp08 mag_bias_offset_std_ugauss = 0.0016;
221 fltp08 max_mag_bias_offset_gauss = 0.0085;*/
222 }
223
226 {
227 gyro_input_range = gyro.getValue<fltp08>("gyro_input_range");
228 setVector(gyro, gyro_bias_instability_mean_dph, "Bias Instability Mean");
229 setVector(gyro, gyro_bias_instability_std_dph, "Bias Instability Std");
230 setVector(gyro, gyro_bias_offset_mean_dph, "Bias Offset Mean");
231 setVector(gyro, gyro_bias_offset_std_dph, "Bias Offset Std");
232 setVector(gyro, gyro_bias_offset_max_dph, "Bias Offset Max");
233 gyro_bias_temperature_mean_error = gyro.getValue<fltp08>("gyro_bias_temperature_mean_error");
234 gyro_bias_temperature_std_error = gyro.getValue<fltp08>("gyro_bias_temperature_std_error");
235 gyro_g_sensitivity = gyro.getValue<fltp08>("gyro_g_sensitivity");
236 gyro_vibration_rectification_mean = gyro.getValue<fltp08>("gyro_vibration_rectification_mean");
237 gyro_vibration_rectification_std = gyro.getValue<fltp08>("gyro_vibration_rectification_std");
238 setVector(gyro, gyro_scale_error_mean_ppm, "Scale Mean");
239 setVector(gyro, gyro_scale_error_std_ppm, "Scale Std");
240 setVector(gyro, gyro_scale_error_max_ppm, "Scale Max");
241 setVector(gyro, gyro_scale_temperature_error_mean_ppm, "Scale Temperature Mean");
242 setVector(gyro, gyro_scale_temperature_error_std_ppm, "Scale Temperature Std");
243 setVector(gyro, gyro_non_linearity_mean_ppm, "Non-Linearity Mean");
244 setVector(gyro, gyro_non_linearity_std_ppm, "Non-Linearity Std");
245 setVector(gyro, gyro_non_linearity_max_ppm, "Non-Linearity Max");
246 setVector(gyro, gyro_random_walk_mean, "Random Walk Mean");
247 setVector(gyro, gyro_random_walk_std, "Random Walk Std");
248 setVector(gyro, gyro_noise_density_mean_dps_rt_hz, "Noise Density Mean");
249 setVector(gyro, gyro_noise_density_std_dps_rt_hz, "Noise Density Std");
250 setVector(gyro, gyro_noise_density_max_dps_rt_hz, "Noise Density Max");
251
252 gyro_vibration_noise_coef_mean = gyro.getValue<fltp08>("gyro_vibration_noise_coef_mean");
253 gyro_vibration_noise_coef_std = gyro.getValue<fltp08>("gyro_vibration_noise_coef_std");
254 m_last_gyro_update_time = Constant<Time>::Invalid;
255 }
256
259 {
260 accel_dynamic_range = accel.getValue<fltp08>("accel_dynamic_range");
261 setVector(accel, accel_bias_instability_mean_ug, "Bias Instability Mean");
262 setVector(accel, accel_bias_instability_std_ug, "Bias Instability Std");
263 setVector(accel, accel_bias_offset_mean_ug, "Bias Offset Mean");
264 setVector(accel, accel_bias_offset_std_ug, "Bias Offset Std");
265 setVector(accel, accel_bias_offset_max_ug, "Bias Offset Max");
266 setVector(accel, accel_bias_temperature_mean_error, "Bias Temperature Mean");
267 setVector(accel, accel_bias_temperature_std_error, "Bias Temperature Std");
268 setVector(accel, acc_scale_error_mean_ppm, "Scale Mean");
269 setVector(accel, acc_scale_error_std_ppm, "Scale Std");
270 setVector(accel, acc_scale_error_std_ppm, "Scale Max");
271 setVector(accel, acc_scale_temperature_error_mean_ppm, "Scale Temperature Mean");
272 setVector(accel, acc_scale_temperature_error_std_ppm, "Scale Temperature Std");
273 setVector(accel, acc_non_linearity_mean_ppm, "Non-Linearity Mean");
274 setVector(accel, acc_non_linearity_std_ppm, "Non-Linearity Std");
275 setVector(accel, accel_velocity_walk_mean, "Velocity Walk Mean");
276 setVector(accel, accel_velocity_walk_std, "Velocity Walk Std");
277 setVector(accel, accel_noise_density_mean_ug_rt_hz, "Noise Density Mean");
278 setVector(accel, accel_noise_density_std_ug_rt_hz, "Noise Density Std");
279 setVector(accel, accel_noise_density_max_ug_rt_hz, "Noise Density Max");
280 m_last_accelerometer_update_time = Constant<Time>::Invalid;
281 }
282
285 {
287 INIFactory gyro_factory;
288 gyro_factory.setPreserveOrder(true);
289 settings[0].addOptionsToINI(gyro_factory);
290 gyro_factory.writeToAsciiFile(file);
291 }
292
295 {
297 INIFactory acc_factory;
298 acc_factory.setPreserveOrder(true);
299 settings[1].addOptionsToINI(acc_factory);
300 acc_factory.writeToAsciiFile(file);
301 }
302
305 {
307 INIFactory gyro_factory;
308 gyro_factory.setPreserveOrder(true);
309 settings[0].addOptionsToINI(gyro_factory);
310 gyro_factory.readAsciiFile(file);
311 setGyroOptions(settings[0]);
312 }
313
316 {
318 INIFactory acc_factory;
319 acc_factory.setPreserveOrder(true);
320 settings[1].addOptionsToINI(acc_factory);
321 acc_factory.readAsciiFile(file);
322 setAccelerometerOptions(settings[1]);
323 }
325 : m_random_number_generator(Time::SystemTime().getNanoSeconds() % 100000)//random seed
326 {
327 //initializeAccelBiasesMemsense();
328 //initializeGyroBiasesMemsense();
329 //initializeMagBiasesMemsense();
330 }
333 void setTemperature(fltp08 temperature)
334 {
335 //TODO: Adjust any needed variables
336 m_temperature = temperature;
337 }
338
340 {
341 // Initialize all variables based on Memsense Accel datasheet (+/- 8g accelerometer setting)
363 max_accel_bias_ug[0] = 2000;
364 max_accel_bias_ug[1] = 2000;
365 max_accel_bias_ug[2] = 3000;
366 }
367
369 {
370 // Initialize all variables based on Memsense Gyro datasheet (+/- 960 dps dynamic range setting)
386 gyro_bias_offset_mean_dph[0] = 14.66;
387 gyro_bias_offset_mean_dph[1] = 18.82;
388 gyro_bias_offset_mean_dph[2] = 11.63;
389 gyro_bias_offset_std_dph[0] = 12.14;
390 gyro_bias_offset_std_dph[1] = 15.62;
391 gyro_bias_offset_std_dph[2] = 8.77;
392
393 gyro_bias_offset_max_dph[0] = 100.0;
394 gyro_bias_offset_max_dph[1] = 100.0;
395 gyro_bias_offset_max_dph[2] = 100.0;
396
397 gyro_scale_error_mean_ppm[X] = 1076.0;
398 gyro_scale_error_std_ppm[X] = 508.0;
399 gyro_scale_error_max_ppm[X] = 2600.0;
400
401 gyro_scale_error_mean_ppm[Y] = 894.0;
402 gyro_scale_error_std_ppm[Y] = 463.0;
403 gyro_scale_error_max_ppm[Y] = 2300.0;
404
405 gyro_scale_error_mean_ppm[Z] = 1127.0;
406 gyro_scale_error_std_ppm[Z] = 504.0;
407 gyro_scale_error_max_ppm[Z] = 2900.0;
408 }
409
411 {
412 // Initialize all variables based on Memsense Mag datasheet (WARNING: mag datasheet is vague in comparison to other sensors)
418 }
419
424 void addGyroNoise(Vector<3, fltp08>& angular_rate, const Time& current_time)
425 {
426 if (IsInvalid(m_last_gyro_update_time) || m_last_gyro_update_time - current_time > TimeSpan(0.5))
427 {
428 //Startup initial bias
429 for (uint01 i = 0; i < 3; i++)
430 {
431 m_gyro_bias_dph[i] = 1.25 * gyro_bias_offset_mean_dph[i] * m_random_number_generator.get();
432 m_current_gyro_scale_error[i] = 1e-9 * (1.25 * gyro_scale_error_mean_ppm[i] * m_random_number_generator.get()
433 + m_random_number_generator.get() * gyro_scale_error_std_ppm[i]);
434 m_current_gyro_scale_error[i] = clip(m_current_gyro_scale_error[i], -1e-9 * gyro_scale_error_max_ppm[i], 1e-9 * gyro_scale_error_max_ppm[i]);
435
436 m_gyro_bias_dph[i] += 1.25 * gyro_bias_temperature_mean_error * m_random_number_generator.get()
437 + gyro_bias_temperature_std_error * m_random_number_generator.get();
438 }
439 m_last_gyro_update_time = current_time;
440 return;
441 }
442 fltp08 dt = (current_time - m_last_gyro_update_time).elapsedSeconds();
443 lib_assert(dt >= 0.0, "bad dt?");
444 if (dt <= 0.0f)
445 return;
446
447 const fltp08 dt_sqrt = sqrt(1.0 / dt); // Changed from 1.0/sqrt(dt)
448 const fltp08 dt_hours = dt / 3600.0; // For bias calculation
449
450 for (uint01 i = 0; i < 3; i++)
451 {
452 //Overall drift
453 fltp08 instability = 1.25 * gyro_bias_instability_mean_dph[i] * m_random_number_generator.get();
454 m_gyro_bias_dph[i] += dt_hours * instability;
455 //m_gyro_bias_dph[i] = clip(m_gyro_bias_dph[i], -gyro_bias_max_dph[i], max_gyro_bias_dph);
456
457 //instability per reading
458 fltp08 noise_density_sample = gyro_noise_density_mean_dps_rt_hz[i] +
459 (gyro_noise_density_std_dps_rt_hz[i] * m_random_number_generator.get());
460 fltp08 noise_sample_std = noise_density_sample * dt_sqrt;
461 fltp08 single_axis_noise = m_random_number_generator.get() * noise_sample_std;
462
463 fltp08 rate_error = angular_rate[i] * m_current_gyro_scale_error[i];
464 fltp08 gyro_bias = m_gyro_bias_dph[i] * dt_hours;
465 // error = drift + sample noise
466 angular_rate[i] += gyro_bias + single_axis_noise + rate_error;
467 }
468 m_last_gyro_update_time = current_time;
469 }
470
476 void addAccelerometerNoise(Vector<3, fltp08>& gravity_vector, const Time& current_time)
477 {
478 if (IsInvalid(m_last_accelerometer_update_time) || m_last_accelerometer_update_time - current_time > TimeSpan(0.5))
479 {
480 //Startup initial bias
481 for (uint01 i = 0; i < 3; i++)
482 {
483 //make an average
484 m_accel_bias[i] = (1.25 * accel_bias_offset_mean_ug[i] * m_random_number_generator.get())
485 + accel_bias_offset_std_ug[i] * m_random_number_generator.get();
486
487 m_current_accel_bias_instability[i] = (1.25 * accel_bias_instability_mean_ug[i] * m_random_number_generator.get());
488 m_current_accel_bias_instability[i] += accel_bias_instability_std_ug[i] * m_random_number_generator.get();
489
490 m_accel_scale_error[i] = 1e-9 * (1.25 * acc_scale_temperature_error_mean_ppm[i] * m_random_number_generator.get()
491 + acc_scale_error_std_ppm[i] * m_random_number_generator.get());
492 m_accel_scale_error[i] = clip(m_accel_scale_error[i], -1e-9 * acc_scale_error_max_ppm[i], 1e-9 * acc_scale_error_max_ppm[i]);
493
494 }
495 m_last_accelerometer_update_time = current_time;
496 return;
497 }
498 // Calculate dt in seconds
499 fltp08 dt = (current_time - m_last_accelerometer_update_time).elapsedSeconds();
500 lib_assert(dt >= 0.0, "bad dt?");
501 if (dt <= 0.0f)
502 return;
503 const fltp08 dt_sqrt = sqrt(1.0 / dt);
504 for (uint01 i = 0; i < 3; i++)
505 {
506 //bias offsets
507 m_accel_bias[i] += 1.25 * m_current_accel_bias_instability[i] * m_random_number_generator.get();
508 m_accel_bias[i] = clip(m_accel_bias[i], -max_accel_bias_ug[i], max_accel_bias_ug[i]);
509
510 //Sampling noise
511 fltp08 noise_density_sample_ug = accel_noise_density_mean_ug_rt_hz[i] + (accel_noise_density_std_ug_rt_hz[i] * m_random_number_generator.get());
512 fltp08 noise_sample_std = noise_density_sample_ug * dt_sqrt;
513 fltp08 single_axis_noise_ug = m_random_number_generator.get() * noise_sample_std;
514
515 gravity_vector[i] += (m_accel_bias[i] + single_axis_noise_ug) / 1000000.0;
516 }
517 m_last_accelerometer_update_time = current_time;
518 }
519
524 void addMagnetometerNoise(Vector<3, fltp08>& magnetic_vector, const Time& current_time)
525 {
526 if (IsInvalid(m_last_magnetometer_update_time))
527 {
528 for (uint01 i = 0; i < 3; i++)
529 {
531 }
532 m_last_magnetometer_update_time = current_time;
533 return;
534 }
535 // Calculate dt in seconds
536 const fltp08 dt = (current_time - m_last_magnetometer_update_time).elapsedSeconds();
537 const fltp08 dt_sqrt = sqrt(1.0 / dt);
538 // Add noise and bias to magnetic_vector.
539 for (uint01 i = 0; i < 3; i++)
540 {
541 // Simulate noise from noise density
542 fltp08 noise_density_sample_ugauss = mag_noise_density_mean_ugauss_rt_hz + (mag_noise_density_std_ugauss_rt_hz * m_random_number_generator.get());
543 fltp08 noise_sample_std = noise_density_sample_ugauss * dt_sqrt;
544 fltp08 single_axis_noise_ugauss = m_random_number_generator.get() * noise_sample_std;
545
546 magnetic_vector[i] = magnetic_vector[i] + (mag_bias_gauss[i]) + (single_axis_noise_ugauss / 1000000);
547 }
548 m_last_magnetometer_update_time = current_time;
549 }
550 private:
551 Vector<3, fltp08> m_current_gyro_scale_error = Vector<3, fltp08>(0.0);
552 Vector<3, fltp08> m_current_accel_bias_instability = Vector<3, fltp08>(0.0);
553 Vector<3, fltp08> m_gyro_bias_dph = Vector<3, fltp08>(0.0);
554 Vector<3, fltp08> m_accel_bias = Vector<3, fltp08>(0.0);
555 Vector<3, fltp08> m_accel_scale_error = Vector<3, fltp08>(0.0);
556 GaussianRN<> m_random_number_generator;
557 Time m_last_gyro_update_time = Constant<Time>::Invalid;
558 Time m_last_accelerometer_update_time = Constant<Time>::Invalid;
559 Time m_last_magnetometer_update_time = Constant<Time>::Invalid;
560 fltp08 m_temperature = 30.0;
561 };
562}
The equivelent of std::vector but with a bit more control.
Definition Buffer.hpp:58
void add(t_type &&object)
Adds object to the end of the buffer.
Definition Buffer.hpp:190
Logic for reading or writing to a file as well as navigating filesystems or other common file operati...
Definition File.h:53
Used to generate a random number over a Gaussian distribution with templated setup parameters for ver...
Definition Random.h:124
Stores a groups of GenericOptions that can be used to group them.
t_type getValue(const TranslatedString &name) const
Retrieves the value of an option converted to the requested type, looked up by translated name.
void addOption(const TranslatedString &name, const t_type &value, bool is_editable=true)
Adds a new option to this group with the given name and typed value.
This class generates random bias and noise for modeling a 9-DoF IMU.
Vector< 3, fltp08 > gyro_noise_density_mean_dps_rt_hz
Gyro noise density average in deg/s/sqrt(Hz).
fltp08 gyro_vibration_noise_coef_std
Gyro vibration noise coefficient std dev.
fltp08 gyro_g_sensitivity
Gyro g-sensitivity coefficient.
Vector< 3, fltp08 > acc_scale_error_max_ppm
Accel scale factor error maximum in ppm.
void loadAccelerometerSettings(File file)
Loads accelerometer noise parameters from an INI file.
fltp08 max_mag_bias_offset_gauss
Maximum magnetometer bias offset in gauss.
fltp08 mag_bias_offset_mean_ugauss
Magnetometer turn-on bias offset mean in ugauss.
fltp08 mag_bias_offset_std_ugauss
Magnetometer turn-on bias offset std dev in ugauss.
Vector< 3, fltp08 > acc_scale_temperature_error_std_ppm
Accel scale temperature error std dev in ppm.
Vector< 3, fltp08 > accel_velocity_walk_mean
Accel velocity random walk mean.
fltp08 mag_noise_density_std_ugauss_rt_hz
Magnetometer noise density std dev in ugauss/sqrt(Hz).
Vector< 3, fltp08 > gyro_scale_temperature_error_std_ppm
Gyro scale temperature error std dev in ppm.
void addAccelerometerNoise(Vector< 3, fltp08 > &gravity_vector, const Time &current_time)
Adds noise to gravity_vector and updates bias to simulate a real-world accel using model: vector = ve...
Vector< 3, fltp08 > gyro_scale_error_mean_ppm
Gyro scale factor error mean in ppm.
void setVector(const GenericOptionGroup &group, Vector< 3, fltp08 > &vector, const StringView name)
Reads a 3D vector from three axis options in an option group.
Vector< 3, fltp08 > gyro_random_walk_mean
Gyro angular random walk mean.
Vector< 3, fltp08 > gyro_noise_density_max_dps_rt_hz
Gyro noise density maximum in deg/s/sqrt(Hz).
Vector< 3, fltp08 > gyro_bias_offset_mean_dph
Gyro turn-on bias average in deg/hr.
Vector< 3, fltp08 > acc_scale_error_std_ppm
Accel scale factor error std dev in ppm.
void setGyroBias(const Vector< 3, fltp08 > &bias)
Sets the current gyroscope bias.
Vector< 3, fltp08 > gyro_scale_temperature_error_mean_ppm
Gyro scale temperature error mean in ppm.
Vector< 3, fltp08 > accel_bias_temperature_mean_error
Accel bias temperature sensitivity mean in ug/sqrt(Hz).
Vector< 3, fltp08 > accel_noise_density_std_ug_rt_hz
Accel noise density std dev in ug/sqrt(Hz).
void loadGyroSettings(File file)
Loads gyroscope noise parameters from an INI file.
Vector< 3, fltp08 > accel_bias_temperature_std_error
Accel bias temperature sensitivity std dev in ug/sqrt(Hz).
fltp08 gyro_input_range
Gyroscope input range in degrees per second.
fltp08 gyro_vibration_rectification_mean
Gyro vibration rectification error mean.
Vector< 3, fltp08 > gyro_bias_offset_max_dph
Gyro turn-on bias maximum in deg/hr.
void addGyroNoise(Vector< 3, fltp08 > &angular_rate, const Time &current_time)
Adds noise to angular_rate and updates bias to simulate a real-world gyro using model: angular_rate =...
Vector< 3, fltp08 > acc_scale_temperature_error_mean_ppm
Accel scale temperature error mean in ppm.
Buffer< GenericOptionGroup > groups()
Builds and returns the gyroscope and accelerometer option groups for configuration.
Vector< 3, fltp08 > accel_bias_offset_std_ug
Accel turn-on bias std dev in ug.
Vector< 3, fltp08 > max_accel_noise_density_ug_rt_hz
Maximum accel noise density from OEM datasheet in ug/sqrt(Hz).
fltp08 gyro_vibration_rectification_std
Gyro vibration rectification error std dev.
Vector< 3, fltp08 > gyro_bias_instability_mean_dph
Gyro bias instability average in deg/hr.
fltp08 gyro_vibration_noise_coef_mean
Gyro vibration noise coefficient mean.
Vector< 3, fltp08 > acc_scale_error_mean_ppm
Accel scale factor error mean in ppm.
Vector< 3, fltp08 > accel_noise_density_max_ug_rt_hz
Accel noise density maximum in ug/sqrt(Hz).
Vector< 3, fltp08 > gyro_bias_offset_std_dph
Gyro turn-on bias std dev in deg/hr.
Vector< 3, fltp08 > max_accel_bias_ug
Maximum accel bias offset from OEM datasheet in ug.
Vector< 3, fltp08 > gyro_non_linearity_std_ppm
Gyro non-linearity std dev in ppm.
void saveAccelerometerSettings(File file)
Saves accelerometer noise parameters to an INI file.
fltp08 accel_dynamic_range
Accelerometer dynamic range in g.
Vector< 3, fltp08 > gyro_scale_error_max_ppm
Gyro scale factor error maximum in ppm.
Vector< 3, fltp08 > gyro_noise_density_std_dps_rt_hz
Gyro noise density std dev in deg/s/sqrt(Hz).
void addMagnetometerNoise(Vector< 3, fltp08 > &magnetic_vector, const Time &current_time)
Adds noise to gravity_vector to simulate a real-world magnetometer using model: vector = vector + noi...
void initializeMagBiasesMemsense()
Initializes magnetometer noise parameters based on Memsense datasheet values.
Vector< 3, fltp08 > gyro_bias_instability_std_dph
Gyro bias instability std dev in deg/hr.
void setTemperature(fltp08 temperature)
Sets the simulated temperature in Celsius, affecting temperature-dependent noise parameters.
void addVector(GenericOptionGroup &group, const Vector< 3, fltp08 > &vector, const StringView name)
Adds a 3D vector as three separate axis options to an option group.
Vector< 3, fltp08 > gyro_non_linearity_mean_ppm
Gyro non-linearity mean in ppm.
Vector< 3, fltp08 > gyro_non_linearity_max_ppm
Gyro non-linearity maximum in ppm.
fltp08 gyro_bias_temperature_std_error
Gyro bias temperature sensitivity std dev error.
void setGyroOptions(const GenericOptionGroup &gyro)
Applies gyroscope noise parameters from an option group.
Vector< 3, fltp08 > accel_velocity_walk_std
Accel velocity random walk std dev.
Vector< 3, fltp08 > acc_non_linearity_mean_ppm
Accel non-linearity mean in ppm.
void saveGyroSettings(File file)
Saves gyroscope noise parameters to an INI file.
void reset()
Resets the internal state, invalidating all last-update timestamps.
Vector< 3, fltp08 > acc_non_linearity_std_ppm
Accel non-linearity std dev in ppm.
Vector< 3, fltp08 > accelBias() const
Returns the current accelerometer bias per axis in ug.
Vector< 3, fltp08 > currentGyroBias() const
Returns the current gyroscope bias per axis in deg/hr.
void setAccelBias(const Vector< 3, fltp08 > &bias)
Sets the current accelerometer bias.
Vector< 3, fltp08 > accel_bias_offset_max_ug
Accel turn-on bias maximum in ug.
void initializeAccelBiasesMemsense()
Initializes accelerometer noise parameters based on Memsense datasheet values.
void setAccelerometerOptions(const GenericOptionGroup &accel)
Applies accelerometer noise parameters from an option group.
Vector< 3, fltp08 > accel_noise_density_mean_ug_rt_hz
Accel noise density average in ug/sqrt(Hz).
Vector< 3, fltp08 > accel_bias_instability_std_ug
Accel bias instability std dev in ug.
Vector< 3, fltp08 > mag_bias_gauss
Current magnetometer bias per axis in gauss.
fltp08 gyro_bias_temperature_mean_error
Gyro bias temperature sensitivity mean error.
Vector< 3, fltp08 > accel_bias_offset_mean_ug
Accel turn-on bias average in ug.
fltp08 mag_noise_density_mean_ugauss_rt_hz
Magnetometer noise density mean in ugauss/sqrt(Hz). Best guess from incomplete datasheet.
Vector< 3, fltp08 > gyro_random_walk_std
Gyro angular random walk std dev.
void initializeGyroBiasesMemsense()
Initializes gyroscope noise parameters based on Memsense datasheet values.
Vector< 3, fltp08 > accel_bias_instability_mean_ug
Accel bias instability average in ug.
Vector< 3, fltp08 > gyro_scale_error_std_ppm
Gyro scale factor error std dev in ppm.
Contains methods for easily reading and writing to an INI file including efficient casting,...
Definition INIReader.h:107
void writeToAsciiFile(File &file, bool include_end_comment=false)
Writes all registered options to an ASCII-formatted INI file.
void setPreserveOrder(bool preserve_order)
Sets whether to preserve the order in which options appear in the file.
Definition INIReader.h:260
void readAsciiFile(File &file)
Reads all options from an ASCII-formatted INI file.
The core String View class for the NDEVR API.
Definition StringView.h:58
The core String class for the NDEVR API.
Definition String.h:95
String & append(const StringView &string)
Appends a string to the back of this string.
StringAllocatingView toLower() const
changes all upper case characters into lower case characters.
String toTitleString() const
Formats the string to be a title, capitalizing important characters and replacing underscores with sp...
Stores a time span, or difference between two times, with an optional start time.
Definition TimeSpan.h:46
Represents a timestamp with utilities for manipulation and conversion.
Definition Time.h:62
static TranslatedString DirectString(const StringView &sub_string)
If a string does not have a translation (EG: reading from an already translated string) this operatio...
A fixed-size array with N dimensions used as the basis for geometric and mathematical types.
Definition Vector.hpp:62
The primary namespace for the NDEVR SDK.
uint32_t uint04
-Defines an alias representing a 4 byte, unsigned integer -Can represent exact integer values 0 throu...
double fltp08
Defines an alias representing an 8 byte floating-point number.
uint8_t uint01
-Defines an alias representing a 1 byte, unsigned integer -Can represent exact integer values 0 throu...
static constexpr bool IsInvalid(const Angle< t_type > &value)
Checks whether the given Angle holds an invalid value.
Definition Angle.h:388
@ file
The source file path associated with this object.
@ name
The display name of the object.
t_type sqrt(const t_type &value)
constexpr t_type clip(const t_type &value, const t_type &lower_bound, const t_type &upper_bound)
Clips the value given so that that the returned value falls between upper and lower bound.
constexpr t_to cast(const Angle< t_from > &value)
Casts an Angle from one backing type to another.
Definition Angle.h:408
Stores a generic option of any type as well as some information about how the user might interact wit...