ethz-asl / rovio

Other
1.12k stars 504 forks source link

extrinsics parameters from euroc dataset and rovio.info are different #228

Open SiyuanHuang95 opened 4 years ago

SiyuanHuang95 commented 4 years ago

Hi,

I noticed that extrinsic parameters from euroc dataset and rovio.info are different, of course, I have transferred the rotation matrix into the quaternion format before the comparison,

quaternion drawn from rovio.info \[0.00666398307551 -0.0079168224269 -0.701985972528 0.712115587266\]
quaternion from euroc dataset converted from rotation matrix is 0.712 -0.008i +0.010j +0.702k

Are the differences above are acceptable?

And in my view, the translation vector should be kind of same, since they are independent of the expression format of the rotation, however, the vector in euroc:

[-0.021640145497, -0.064676986768, 0.009810730590\]

the vecor in rovio.info:

 -0.011167419918 -0.0574640920022 0.0207586947896

of course, these two set of parameters could get some kind of odometry results when online-calibration is on, but could you share some hints w.r.t these parameters?

smauq commented 4 years ago

Did you take into account that in the camera yaml it's T_BS (sensor to base) while in rovio.info it's qCM (imu to camera) which is the inverse. This also accounts for why the translation is different since it's expressed in a different frame.

SiyuanHuang95 commented 4 years ago

Hi, thanks for your reply and helpful information.

I did not notice that that should be T_BS, since I have assumed that they all follow the ASL Kalibr format, where they only use T_cam_imu to transform from IMU to camera coordinates as link.

Based on your information, I created one python file, which trys to turn the T_BS to qCM, as follows:

from pyquaternion import Quaternion
import numpy as np
T_bs = np.matrix([[0.0148655429818, -0.999880929698, 0.00414029679422, -0.0216401454975],
         [0.999557249008, 0.0149672133247, 0.025715529948, -0.064676986768],
        [-0.0257744366974, 0.00375618835797, 0.999660727178, 0.00981073058949],
         [0.0, 0.0, 0.0, 1.0]])
T_sb = np.linalg.inv(T_bs)
quat_euro_ = Quaternion(matrix=T_sb[0:3, 0:3])

it turns out to be better result than before, since qCM from ROVIO config is 0.712 + 0.0067i - 0.008j -0.702k, and my calculation result is 0.712 + 0.0077i -0.010j -0.702k, the slight difference here I guess is acceptable now.

However, I am not quite sure about the translation vector, if I directly taken the first three elements of the last column from the inversed transformation matrix, it should be [0.065, -0.207, -0.008], which is not quite exactly as described in ROVIO.info.

Thx in advence! :)