i2Nav-WHU / IC-GVINS

A Robust, Real-time, INS-Centric GNSS-Visual-Inertial Navigation System
GNU General Public License v3.0
483 stars 113 forks source link

Coordinate System Definition #39

Closed nikiFoe closed 2 months ago

nikiFoe commented 5 months ago

Hello,

The last couple of days I have been trying to test the IC-GVINS code on my own dataset. However, my Camera-IMU coordinate systems transformation is not working. In the image below I added the setup of my system. My IMU-Coordinate system is not setup as suggested for the IC-GVINS and doesn't conform to Front(x)-Right(y)-Down(z). Because I tested this setup on VINS-Fusion with calibration of camera, and camera-IMU with Kalibr I was hoping that still would work, however it doesn't. To get my system in the Front-Right-Down format I tried:

  1. I rotated my IMU frame +90degree around x. For that the IMU z-axis becomes the negative y-value and the y-axis becomes the z-value. I transformed the values when recording directly and did the Kalibr calibration process again. However the Direction of travel did not fit to the direction of features. Of course, then the calculated extrinsic parameters will be wrong and ad some point the the code fails to run.

    20240423_090324

My question now: How do I properly configure and calibrate the coordinate frames of each system?

thlsealight commented 4 months ago

Hello. The IMU frame should be front-right-down, which is determined by the INS mechanization algorithm. This can be simply achieved by swapping the axis of IMU with correct signs. The camera frame is usually defined as right-down-front. You should just prepare a correct extrinsic parameters.

nikiFoe commented 4 months ago

Hello. The IMU frame should be front-right-down, which is determined by the INS mechanization algorithm. This can be simply achieved by swapping the axis of IMU with correct signs. The camera frame is usually defined as right-down-front. You should just prepare a correct extrinsic parameters.

Thank you for your reply. As far as I understand your suggestion I think I did exactly that. However, my travel direction is not in the direction of the camera. Does that effect the algorithm somehow?

I also tried running the urban Dataset, however there I had the same problem. Could you share how you handle the arriving IMU ros message in the fusion_ros.cc file? I looked up the IMU coordinate system for the urban dataset and it is similar to mine. When looking at the image below, the IMU-x axis faces forward, but the y and z-axis have to be modified.

Screenshot 2024-05-16 133259

To make it a Front-Right-Down system, the y values has to be inverted and the z values as well.

`imu_.dtheta[0] = imumsg->angularvelocity.x * imu.dt; imu_.dtheta[1] = -imumsg->angularvelocity.y * imu.dt; imu_.dtheta[2] = -imumsg->angularvelocity.z * imu.dt;

imu_.dvel[0] = imumsg->linearacceleration.x * imu.dt; imu_.dvel[1] = -imumsg->linearacceleration.y * imu.dt; imu_.dvel[2] = -imumsg->linearacceleration.z * imu.dt;`

However, if I run this modification with the urban config file, the code still fails to run.

thlsealight commented 2 months ago

I think your process (as follows) is correct. I am sorry that I have no idea why you fails. ` imu_.dtheta[0] = imumsg->angularvelocity.x * imu.dt; imu_.dtheta[1] = -imumsg->angularvelocity.y * imu.dt; imu_.dtheta[2] = -imumsg->angularvelocity.z * imu.dt;

imu_.dvel[0] = imumsg->linearacceleration.x * imu.dt; imu_.dvel[1] = -imumsg->linearacceleration.y * imu.dt; imu_.dvel[2] = -imumsg->linearacceleration.z * imu.dt; ` Maybe you can try our new codes LE-VINS.