10 std::cout <<
"=== IMU Calibration Test ===" << std::endl;
16 std::random_device rd;
17 std::mt19937 gen(rd());
18 std::normal_distribution<double> noise(0.0, 0.1);
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);
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)};
31 for (
const auto& orient : orientations) {
33 reading.
value = orient * 9.81 + Eigen::Vector3d(noise(gen), noise(gen), noise(gen));
35 reading.
timestamp = std::chrono::steady_clock::now();
36 accel_readings.push_back(reading);
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;
46 reading.
timestamp = std::chrono::steady_clock::now();
47 gyro_readings.push_back(reading);
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);
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);
60 reading.
value = field + Eigen::Vector3d(noise(gen), noise(gen), noise(gen)) * 0.01;
62 reading.
timestamp = std::chrono::steady_clock::now();
63 mag_readings.push_back(reading);
67 std::cout <<
"\nPerforming calibration..." << std::endl;
69 calib_system.
calibrateAll(accel_readings, gyro_readings, mag_readings, reference_field);
72 std::cerr <<
"ā Calibration failed" << std::endl;
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;
84 std::cout <<
"\nTesting calibrated readings..." << std::endl;
86 accel_raw.
value = Eigen::Vector3d(0.1, 0.2, 9.8);
88 accel_raw.
timestamp = std::chrono::steady_clock::now();
90 gyro_raw.
value = Eigen::Vector3d(0.01, 0.02, 0.03);
92 gyro_raw.
timestamp = std::chrono::steady_clock::now();
94 mag_raw.
value = Eigen::Vector3d(0.9, 0.1, 0.0);
96 mag_raw.
timestamp = std::chrono::steady_clock::now();
100 std::cout <<
"Calibrated Accelerometer: [" <<
calibrated.accelerometer.value(0) <<
", "
103 std::cout <<
"Calibrated Gyroscope: [" <<
calibrated.gyroscope.value(0) <<
", "
106 std::cout <<
"Calibrated Magnetometer: [" <<
calibrated.magnetometer.value(0) <<
", "
110 std::cout <<
"\nā
IMU Calibration test completed successfully" << std::endl;