Skip to content

This issue was moved to a discussion.

You can continue the conversation there. Go to discussion →

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

IMU Kalibr parameters for AirSim #3293

Closed
alberto1995 opened this issue Jan 11, 2021 · 3 comments
Closed

IMU Kalibr parameters for AirSim #3293

alberto1995 opened this issue Jan 11, 2021 · 3 comments

Comments

@alberto1995
Copy link

Question

What's your question?

Hi everyone,
I'm trying to run some VIO algorithms (Open-VINS and VINS-Mono) using a rosbag recorded with the drone of AirSim. I'm here to ask if someone knows, and can share, IMU noise parameters in Kalibr format.

Include context on what you are trying to achieve

I would like to run VIO algorithms with the exact IMU noise parameters needed by Open-VINS and VINS-Mono (Gyroscope "white noise" - Accelerometer "white noise" - Gyroscope "random walk" - Accelerometer "random walk").

Context details

Include details of what you already did to find answers

First of all, I have seen that In the SimpleIMU code there are four parameters setted to emulate the MPU-6000, but them don't match with the Kalibr format. Also a Datasheet of the IMU is given, but again I can't find IMU noise parameters in Kalibr format. Secondly, I have seen that other issues #2369 #3269 #2836 have been opened and are still pending, so the pubblication of those parameters can help a lot.

Thank you for your support,
sincerely,

Alberto

@jonyMarino
Copy link
Collaborator

Hi @alberto1995! And welcome! I think you are asking for a feature request to add IMU noise parameters in Kalibr format, that we do not have.

@karnikram
Copy link

karnikram commented Feb 4, 2021

Hi @alberto1995, I had the same issue.

I was able to infer the noise model parameters from these two scripts - ImuSimpleParams, ImuSimple

gyro.arw is the gyroscope_noise_density, and is equal to 8.7266462e-5
gyro_bias_stability_norm is the gyroscope_random_walk, and is equal to 9.9735023e-7
accel.vrw is the accelerometer_noise_density, and is equal to 0.002353596
accel_bias_stability_norm is the accelerometer_random_walk, and is equal to 1.2481827e-5

I also verified these values using kalibr_allan after recording a four hour static sequence, and the values are very similar:

gyro
accel

I'm not sure about Open-VINS, but VINS-Mono expects these parameters in discrete-time form. Meaning, the noise density parameters need to be divided by the square root of your sampling time, and random walk parameters need to be multiplied with the square root of your sampling time. Note that the airsim sampling time has an upper limit of 0.001 secs. More over in my case I also noticed a time offset between camera and IMU which I had to separately calibrate using Kalibr.

Hope this helps

@GimpelZhang
Copy link
Contributor

GimpelZhang commented Feb 5, 2021

The two VIO, open_vins and vins_mono, expect different forms of IMU parameters.

  • open_vins: continuous time noise parameters

evidence:

    // Construct our discrete noise covariance matrix
    // Note that we need to convert our continuous time noises to discrete
    // Equations (129) amd (130) of Trawny tech report
    Eigen::Matrix<double,12,12> Qc = Eigen::Matrix<double,12,12>::Zero();
    Qc.block(0,0,3,3) = _noises.sigma_w_2/dt*Eigen::Matrix<double,3,3>::Identity();
    Qc.block(3,3,3,3) = _noises.sigma_a_2/dt*Eigen::Matrix<double,3,3>::Identity();
    Qc.block(6,6,3,3) = _noises.sigma_wb_2*dt*Eigen::Matrix<double,3,3>::Identity();
    Qc.block(9,9,3,3) = _noises.sigma_ab_2*dt*Eigen::Matrix<double,3,3>::Identity();

    // Compute the noise injected into the state over the interval
    Qd = G*Qc*G.transpose();
    Qd = 0.5*(Qd+Qd.transpose());

where sigma_w_2/sigma_a_2/sigma_wb_2/sigma_ab_2 are the squares of the IMU param inputs: from ros

  • vins_mono: as @karnikram pointed out, discrete time noise parameters

evidence:
construct noise matrix:

    noise = Eigen::Matrix<double, 18, 18>::Zero();
    noise.block<3, 3>(0, 0) =  (ACC_N * ACC_N) * Eigen::Matrix3d::Identity();
    noise.block<3, 3>(3, 3) =  (GYR_N * GYR_N) * Eigen::Matrix3d::Identity();
    noise.block<3, 3>(6, 6) =  (ACC_N * ACC_N) * Eigen::Matrix3d::Identity();
    noise.block<3, 3>(9, 9) =  (GYR_N * GYR_N) * Eigen::Matrix3d::Identity();
    noise.block<3, 3>(12, 12) =  (ACC_W * ACC_W) * Eigen::Matrix3d::Identity();
    noise.block<3, 3>(15, 15) =  (GYR_W * GYR_W) * Eigen::Matrix3d::Identity();

use the noise in the covariance prediction:

    covariance = F * covariance * F.transpose() + V * noise * V.transpose();

where ACC_N/GYR_N/ACC_W/GYR_W are the IMU param inputs: read settings

We can see in vins_mono, there is no division or multiplication of dt.

This issue was moved to a discussion.

You can continue the conversation there. Go to discussion →

Projects
None yet
Development

No branches or pull requests

4 participants