将摄像头和IMU接入VINS-Mono遇到的一些问题汇总

时间:2024-04-14 16:07:01

一、畸变镜头模型

在正式使用VINS-Mono之前需要把自己的摄像头进行标定,测出内参和畸变参数,opencv官方的标定demo中sample文件夹里的图片是用古老的镜头拍摄的,畸变程度高,需要用到高次项,而我所使用的镜头畸变程度小,应该关闭高次项。

即,在stereoCalibrate中注释掉CALIB_RATIONAL_MODEL。

CALIB_FIX_ASPECT_RATIO +
                    CALIB_ZERO_TANGENT_DIST +
                    CALIB_USE_INTRINSIC_GUESS +
                    CALIB_SAME_FOCAL_LENGTH +
                    //CALIB_RATIONAL_MODEL +

                    CALIB_FIX_K3 + CALIB_FIX_K4 + CALIB_FIX_K5,

二、照相机延迟积累问题

待。


三、坐标轴没有对准

        我使用我自己的摄像头和IMU读取节点代替运行着数据包的rosbag以后,VINS顺利启动了,从终端中ROS报出的信息来看,ROS总是难以初始化,而且即便初始化成功开始正式运行了也会立马“飞漂”——从可视化窗口rviz中可以看到,摄像头毫无根据地高速飞离坐标中心,显然这是错误的。师兄说应该是因为我没有对准我的IMU读取节点中的和VINS中的IMU坐标系的缘故,我照此思路修改了一下我所写的IMU读取节点代码,问题得到大致解决。具体步骤如下:

1.在camera-IMU的body的三个轴向依次加速运动和绕其旋转,由此得到我使用的这个IMU的坐标系朝向。

将摄像头和IMU接入VINS-Mono遇到的一些问题汇总

2.进入VINS项目文件目录下/home/ubuntu/l/VINS-Mono-master/config/extrinsic_parameter_example.pdf:       将摄像头和IMU接入VINS-Mono遇到的一些问题汇总

        对比可知,我的IMU坐标系与VINS所运行的EuRoc数据包所发布的img_msg的坐标系的朝向的不同,按此进行修改即可。

        不过这里有一个疑问,众所周知,一个左手系和一个右手系是无法通过纯粹的旋转就完成转换的,还需进行镜像变换;但1和2中的两个坐标系都是左手系,是可以通过旋转变换得到的。相机初始化时需要标定的camera-IMU外参时是完全可以将这个旋转包含其中的,可事实并非如此,还需要我手动修改代码,这是为什么?

四、恶劣初始化造成实际运行时极易“飞漂”

        注意,我上文中所提到的是飞漂问题“大致解决”,而不是解决。在IMU坐标系朝向对准以后,初始化都可以顺利的完成,但是在进入到VINS正式运行阶段以后,大致能够正常工作——从rviz窗口中可以看出其基本的位姿估计功能,但还是时不时地出现飞漂问题。我以为是我的某些参数没调整,在仔细地阅读了参数文件euroc_config_no_extrinsic.yaml以后,我认为我是没有标定好IMU的四个内参,即参数文件中的:

            #imu parameters       The more accurate parameters you provide, the better performance
            acc_n: 0.2          # accelerometer measurement noise standard deviation. #0.2
            gyr_n: 0.02         # gyroscope measurement noise standard deviation.     #0.05
            acc_w: 0.0002         # accelerometer bias random work noise standard deviation.  #0.02

            gyr_w: 2.0e-5       # gyroscope bias random work noise standard deviation.     #4.0e-5

        由此入手,开启了我一周的噩梦。。。。。。IMU真是一个大坑,至少对我这种渣渣来说是如此。。。

        某次机缘巧合下我发现了,原来是我初始化太恶劣导致的。。。。,具体情况是这样的:

        在这之前我每次调试VINS是按照这样的步骤的:开启VINS系统——打开可视化窗口rviz——拿起摄像头对着特征点比较多的那个方向开始为初始化采集数据。可事实上,初始化在开启VINS系统的时候就开始了,我们实验室的天花板特征点比较少,而且我刚拿起的那一下又比较粗暴,所以这种恶劣的初始化就带来了恶劣的初始化参数,就产生了飞漂问题。而后我将调试步骤改成:先拿起摄像头对准特征点良好的那一个方向——开启可视化窗口——开启VINS系统,并开始温柔移动摄像头以保证良好的初始化,至此,飞漂问题基本解决。

        下一步就是去室外采集数据,真真正正地检验效果!