一、畸变镜头模型
在正式使用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的坐标系朝向。
2.进入VINS项目文件目录下/home/ubuntu/l/VINS-Mono-master/config/extrinsic_parameter_example.pdf:
对比可知,我的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系统,并开始温柔移动摄像头以保证良好的初始化,至此,飞漂问题基本解决。
下一步就是去室外采集数据,真真正正地检验效果!