STAR
Cal STAR — firmware, DAQ server, and engine design
Loading...
Searching...
No Matches
test_imu_calibration.cpp
Go to the documentation of this file.
1#include <iostream>
2#include <random>
3#include <vector>
4
6
7using namespace fsw::calibration;
8
9int main() {
10 std::cout << "=== IMU Calibration Test ===" << std::endl;
11
12 // Create calibration system
13 IMUCalibrationSystem calib_system;
14
15 // Generate synthetic calibration data
16 std::random_device rd;
17 std::mt19937 gen(rd());
18 std::normal_distribution<double> noise(0.0, 0.1);
19
20 // Accelerometer calibration data (6 positions)
21 std::cout << "Generating accelerometer calibration data..." << std::endl;
22 std::vector<IMUCalibration::RawReading> accel_readings;
23 Eigen::Vector3d gravity(0.0, 0.0, 9.81);
24
25 // 6 orientations: +X, -X, +Y, -Y, +Z, -Z
26 std::vector<Eigen::Vector3d> orientations = {
27 Eigen::Vector3d(1.0, 0.0, 0.0), Eigen::Vector3d(-1.0, 0.0, 0.0),
28 Eigen::Vector3d(0.0, 1.0, 0.0), Eigen::Vector3d(0.0, -1.0, 0.0),
29 Eigen::Vector3d(0.0, 0.0, 1.0), Eigen::Vector3d(0.0, 0.0, -1.0)};
30
31 for (const auto& orient : orientations) {
33 reading.value = orient * 9.81 + Eigen::Vector3d(noise(gen), noise(gen), noise(gen));
34 reading.temperature = 25.0;
35 reading.timestamp = std::chrono::steady_clock::now();
36 accel_readings.push_back(reading);
37 }
38
39 // Gyroscope calibration data (zero velocity)
40 std::cout << "Generating gyroscope calibration data..." << std::endl;
41 std::vector<IMUCalibration::RawReading> gyro_readings;
42 for (int i = 0; i < 100; ++i) {
44 reading.value = Eigen::Vector3d(noise(gen), noise(gen), noise(gen)) * 0.01; // Small bias
45 reading.temperature = 25.0;
46 reading.timestamp = std::chrono::steady_clock::now();
47 gyro_readings.push_back(reading);
48 }
49
50 // Magnetometer calibration data (multiple orientations)
51 std::cout << "Generating magnetometer calibration data..." << std::endl;
52 std::vector<IMUCalibration::RawReading> mag_readings;
53 Eigen::Vector3d reference_field(1.0, 0.0, 0.0); // North
54
55 for (int i = 0; i < 12; ++i) {
56 double angle = i * M_PI / 6.0;
57 Eigen::Vector3d field(std::cos(angle), std::sin(angle), 0.0);
58
60 reading.value = field + Eigen::Vector3d(noise(gen), noise(gen), noise(gen)) * 0.01;
61 reading.temperature = 25.0;
62 reading.timestamp = std::chrono::steady_clock::now();
63 mag_readings.push_back(reading);
64 }
65
66 // Perform calibration
67 std::cout << "\nPerforming calibration..." << std::endl;
68 bool success =
69 calib_system.calibrateAll(accel_readings, gyro_readings, mag_readings, reference_field);
70
71 if (!success) {
72 std::cerr << "āŒ Calibration failed" << std::endl;
73 return 1;
74 }
75
76 // Check calibration status
77 auto status = calib_system.getStatus();
78 std::cout << "Calibration Status:" << std::endl;
79 std::cout << " Accelerometer: " << static_cast<int>(status.accel) << std::endl;
80 std::cout << " Gyroscope: " << static_cast<int>(status.gyro) << std::endl;
81 std::cout << " Magnetometer: " << static_cast<int>(status.mag) << std::endl;
82
83 // Test calibrated readings
84 std::cout << "\nTesting calibrated readings..." << std::endl;
85 IMUCalibration::RawReading accel_raw, gyro_raw, mag_raw;
86 accel_raw.value = Eigen::Vector3d(0.1, 0.2, 9.8);
87 accel_raw.temperature = 25.0;
88 accel_raw.timestamp = std::chrono::steady_clock::now();
89
90 gyro_raw.value = Eigen::Vector3d(0.01, 0.02, 0.03);
91 gyro_raw.temperature = 25.0;
92 gyro_raw.timestamp = std::chrono::steady_clock::now();
93
94 mag_raw.value = Eigen::Vector3d(0.9, 0.1, 0.0);
95 mag_raw.temperature = 25.0;
96 mag_raw.timestamp = std::chrono::steady_clock::now();
97
98 auto calibrated = calib_system.calibrateIMU(accel_raw, gyro_raw, mag_raw);
99
100 std::cout << "Calibrated Accelerometer: [" << calibrated.accelerometer.value(0) << ", "
101 << calibrated.accelerometer.value(1) << ", " << calibrated.accelerometer.value(2)
102 << "]" << std::endl;
103 std::cout << "Calibrated Gyroscope: [" << calibrated.gyroscope.value(0) << ", "
104 << calibrated.gyroscope.value(1) << ", " << calibrated.gyroscope.value(2) << "]"
105 << std::endl;
106 std::cout << "Calibrated Magnetometer: [" << calibrated.magnetometer.value(0) << ", "
107 << calibrated.magnetometer.value(1) << ", " << calibrated.magnetometer.value(2) << "]"
108 << std::endl;
109
110 std::cout << "\nāœ… IMU Calibration test completed successfully" << std::endl;
111 return 0;
112}
static bool calibrated
Definition board_adc.c:17
Complete IMU Calibration System.
bool calibrateAll(const std::vector< IMUCalibration::RawReading > &accel_readings, const std::vector< IMUCalibration::RawReading > &gyro_readings, const std::vector< IMUCalibration::RawReading > &mag_readings, const Eigen::Vector3d &reference_magnetic_field)
Calibrate all sensors.
CalibratedIMU calibrateIMU(const IMUCalibration::RawReading &accel, const IMUCalibration::RawReading &gyro, const IMUCalibration::RawReading &mag) const
Output smoothing for calibrated PT pressure, per sensor uid (ESP32 and LabJack T7 alike).
bool success
std::chrono::steady_clock::time_point timestamp
int main()