-
Notifications
You must be signed in to change notification settings - Fork 480
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
Doubt regarding unit of IMU noise params #36
Comments
I have the same question. |
I also have the same question. I am trying to calibrate my IMU to use it with ORB-SLAM3. IMU gyro noise: rad/s/sqrt(Hz) --> Do I need to divide by sqrt(Hz)? or is the output of imu_utils doing it already? |
@gaowenliang hasn't been active in this repo for over 3 years, so I'll try to answer. You're right, the units were wrong. Check out my fork of this repo where I fixed this and many other problems: https://github.com/mintar/imu_utils @gaowenliang : Feel free to merge my changes into your repo, or contact me if you want me to send a pull request. |
Hi,I don't know much about IMU. I want to use this repo to get bias and noise for LIO-SAM, so this repo's bias Instability is not what I think but a random work? |
You can get the bias and noise using one of these repos: |
The 'white noise' values from your repo are the same as 'noise density', right? i.e. the noise standard deviation divided by the square root of the sampling rate of the signal. Is this the value required by VIO packages? I'll ask this over at VINS also. |
Yes, correct. And the "random walk" values from my repo are the continuous-time angle rate random walk (for gyros) and acceleration random walk (for accelerometers) values, also called bias random walk, i.e. the random walk standard deviation multiplied by the square root of the sampling rate of the signal.
I think so. These should be exactly the In fact, I've been doing all this work to figure out the correct parameters for VINS. However, something I noted is that after carefully calibrating my IMU, I still had to multiply the parameters with a factor of 10-15x to make it work in VINS fusion. I think there are multiple explanations for this:
Here are some plots of the estimated models when only using the N and K components for just the Y axis gyro + accelerometer and of the values I ended up using in my VINS config. You can see that the values of the estimated models are clearly too low; the estimated model should overbound the measured values. Still, the values I ended up using are ridiculously high, so there's still a chance I'm missing something.
Good idea! Perhaps I missed something, and the parameters are not correct, so better ask. |
@mintar Thank you for your sharing. IMU.NoiseGyro: |
Yes, the parameters from my fork can be used directly in kalibr and probably also ORBSLAM3. Also see this wiki page: https://github.com/ethz-asl/kalibr/wiki/IMU-Noise-Model You definitely shouldn't multiply by sqrt(Hz) or something. But you probably have to increase the values by 10x to 15x to account for more noise during realistic conditions compared to the static calibration scenario. |
Martin @mintar , Thank you for this great discussion! I was looking at VINS-fusion params for a while now, for different integrated and custom cam+imu sensors.
for example here for EUROC: but when I calibrate, say Realsense D455, I get something like this:
the problem is accelerometer params - they seem to be way too narrower than example VINS-fusion parameters, for pretty much all sensors I tried. If I try to use parameters as calibrated I always get VINS-fusion drift into infinity straight after initialisation. But if I use the example parameters as mentioned in VINS-fusion repo, then odometry works nicely after initialisation is done. At least for stereo sensors. Did you observe something like this? |
Interesting, thanks for sharing. Just a random thought about the Realsense IMU. Not sure about the D455, but at least for the T265 the accelerometer has a lower sampling rate than the gyro and there is a mode where values are interpolated or duplicated internally to output accelerometer data at the same rate as gyro. Maybe that messes with the noise calibration. |
FWIW, here are the calibration values I obtained for my Realsense D455. First, the %YAML:1.0
---
type: IMU
name: d455
Gyr:
unit: "gyr_n: rad / sqrt(s), gyr_w: rad / s^2 / sqrt(Hz)"
avg-axis:
gyr_n: 1.1247817539293294e-04
gyr_w: 6.8560096244238481e-07
x-axis:
gyr_n: 9.9526574733667635e-05
gyr_w: 1.9686824895632978e-10
y-axis:
gyr_n: 1.3819925830281483e-04
gyr_w: 1.4313630360580132e-06
z-axis:
gyr_n: 9.9708693142316399e-05
gyr_w: 6.2524298302018503e-07
Acc:
unit: "acc_n: m / s^2 / sqrt(Hz), acc_w: m / s^3 / sqrt(Hz)"
avg-axis:
acc_n: 1.2284895136765762e-03
acc_w: 9.9082719328218624e-05
x-axis:
acc_n: 1.1235279258458876e-03
acc_w: 1.0251140823532781e-04
y-axis:
acc_n: 1.0885250751070067e-03
acc_w: 1.1355246318501114e-04
z-axis:
acc_n: 1.4734155400768347e-03
acc_w: 8.1184286564316914e-05 Next, the #Accelerometer
accelerometer_noise_density: 0.001409773432203808
accelerometer_random_walk: 0.0001329062251978931
#Gyroscope
gyroscope_noise_density: 0.0001133526607488234
gyroscope_random_walk: 2.3196512261002865e-06 In summary:
Did you perhaps mix up some of those values? Or weren't you using my fork? That being said, my values in the table above are also 10x - 150x smaller than the VINS defaults, and with these values, VINS won't work. I haven't used VINS with the D455, but with a different camera + IMU setup, and I had the same effect there. I ended up reducing the VINS defaults by factors between 2 and 6, because if you diverge further from the VINS defaults, VINS stops working. My calibrated values were actually about 15x lower than that. At this point, I wonder if calibrating your IMU is actually worth the effort if you're going to manually fiddle with the parameters anyway. |
Hii, @mintar @NikolausDemmel |
I think there's multiple reasons for this:
|
yes, that's the mode I use - interpolate accelerometer values. may be this is the reason... |
@mintar has all very good points. One additional factor---related to what was mentioned about calibrating in static vs running in dynamic conditions---might be that the IMU model used in all these VO / SLAM algorithms is practical, but still simplistic. I.e. it simply doesn't model many of the effects on the physical device. I'm thinking of temperature-dependent bias, cross-axis sensitivity, etc. All this means that the errors in your model aren't actually independent and bias-free and one way to deal with it is by increasing the measurement uncertainty to "mask" out the un-modelled behaviour. But yes, it's a valid question what's the point of calibrating the IMU when you just hand-tune the values anyway. I think hand-tuning will always be needed. Calibration can still inform you about the relative quality of different IMUs and thus help when tuning the parameters (e.g. tell you if your values for a new IMU should be higher or lower than for some reference IMU that you know works well). |
@mintar hi, martin following tools to calculate the imu noise results and used them for Kalibr, but the acc convergence effect and reprojection error were not good in Kalibr I tried to get better acc convergence results (reprojection error still high) when multiply factor with x10 for accelerometer_noise_density and accelerometer_random_walk https://github.com/mintar/imu_utils kalibr_result only vo report-cam-our_nascar_datasetp50_imei7289calibr_728920220523_calibration20220523_calibration.pdf allan_variance_ros result : report-imucam-our_nascar_datasetp50_imei728920220523_calibration20220523_calibration.pdf imu_utils results : |
We have to keep in mind that vins-mono imu parameters are in discrete domain and while output of allan-variance ros and datasheets are in continuous domain. Orbslam3 on the other hands, takes in the continuous form and does the discretization under the hood. That could explain why vins mono imu params are way different from continuous form params. |
Hi @mintar, thanks for sharing all the insights. I am also trying to get the parameters for my Realsense D435i, however, I am really new to the ros thing. I tried to use the record program from ORB-SLAM3, to record the gyro.txt, and acceleration.txt but I don't know what should be the right file structure to convert it into a rosbag. Currently I am using the Kalibr_bagcreater, not sure if that's the right way. I couldn't extract the example rosbag from the allan_variance_ros using the kalibr_bagextracter as well. Could you share some advice on how you record the rosbag with your Realsense D455? Thanks in advance. |
Hi @FANFANFAN2506, I'm not sure whether it is too late now, maybe you can run the default |
I am using the package to find the IMU noise parameters. The units mentioned in the README and the output file after the execution seems to be conflicting.
README:
O/P YAML file:
Comparing units of gyr_n in the above two pics suggest some conflicts. Former suggests "Noise density" while the other suggests "Noise standard deviation". @gaowenliang, can you please clarify the doubt?
The text was updated successfully, but these errors were encountered: