ORB-SLAM2和iai_kinect2中的双重标定问题
根据高翔博士博客1做使用Kinect2跑ORB-SLAM2的过程中,发现了一个关于双重标定的问题。
Kinect2使用iai_kinect22作为驱动接口。kinect2_bridge
提供了以下的Quater
HDTopics:
1 | /kinect2/qhd/camera_info |
而博客3上提供的代码中,订阅的是/kinect2/sd/image_color_rect
和/kinect2/sd/image_depth_rect
两个Topics。因为我使用的是QHD画质,所以我依葫芦画瓢,将订阅的Topics修改为/kinect2/qhd/image_color_rect
和/kinect2/qhd/image_depth_rect
而在运行kinect2_bridge
节点之前,需要在kinect2_bridge/data/<serialnumber>
文件夹下放入Kinect的校正值文件。同时,在建立ORB_SLAM2的实例的时候,也需要提供一个校正参数的yaml文件strSettingsFile
:
1 | System::System(const string &strVocFile, const string &strSettingsFile, const eSensor sensor,const bool bUseViewer) |
那么,会不会发生图片进行了两次校正的情况呢?
根据源代码kinect2_bridge.cpp
中显示,在processColor
的函数中:
1 | if(status[COLOR_QHD_RECT] || status[MONO_QHD_RECT]) |
在image_color_rect
这个Topic中,图片是会使用OpenCV的remap
函数对进行还原,就是说,image_color_rect
这个Topic的图片,是已经经过校正操作了。
而在ORB_SLAM2的源代码Frame.cc
文件中,我们可以找到UndistortKeyPoints
这个函数,它的作用是对每一帧图像中的关键点使用OpenCV提供的undistortPoints
函数,根据校正文件提供的阐述进行修正。
就是说,我在一个已经经过修正的图像中找出关键点,并且再对关键点根据校正值再进行了一次修正,而这是不对的。
所以,应该将订阅的image_color_rect
这个Topic修改为image_color
,读取的是一个未经校正的图片,然后仅在ORB_SLAM2中对图片进行校正操作。