最近写完了windows上的实时rgbd_slam后,读了些论文,想着怎么改进程序,想在闭环检测的方面尝试一下。最近很火的ORB_SLAM2使用了DBoW2(ORB词袋)的方法,极大的提高了速度和匹配准确度,windows版的orb_slam2还没跑成功(一部分库的编译出现了问题,不过等研究做完了,会继续跑windows版本的),这几天一直在尝试ubuntu版的orb_slam的实时重建,今天终于成功了!~(感谢高博士为我们提供了加了3D建图模块的libORB_SLAM2.so(高博的博客:半闲居士))
首先orb_slam2的话,github下载源码编译很容易,按照官方github下面的教程走就行。晒几张TUM数据集的结果:
desk:
room:
效果很棒,模拟轨迹和groundtruth的绝对误差真的和论文上说的一样小。我觉得ORB_SLAM2真的是现在视觉SLAM里最优秀的一版,考虑的非常全面。
那么如果我们要用到自己的项目中,该怎么调用呢?特别棒的一点是,原作者提供了libORB_SLAM2.so给我们,加上头文件System.h,我们就可以把ORB_SLAM作为一个整体加到我们的项目中。但是源码中并没有3D建图的模块,需要做相应改变,高博士为我们提供了加了3D建图模块的libORB_SLAM2.so,这时我们就可以根据自己的需求(kinect,xtion或其他可以获得点云的sensors)。高博的博客中有一篇是用的kinect2,在ROS运行的orb_slam2,今天我们来试一试不用ROS,通过OpenNI2直接调用xtion获取rgb数据和depth数据来重建环境(之前有windows上运行openni2_xtion的经验)。我的建议,要么xtion要么kinect2, 因为kinect很鸡肋,xtion比它轻巧,kinect2比它分辨率高。(源码下载csdn 源码下载github)(词袋文件太大,各位可以从官方github下载)
扯了这么多,现在拉回主线。在ORB_SLAM2/Examples/RGB-D/中,创建rgbd_xtion_cc.cpp:
#include <iostream>
#include <algorithm>
#include <fstream>
#include <chrono>
#include <OpenNI.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <System.h> // orb_slam2
using namespace std;
using namespace openni;
using namespace cv;
void showdevice(){
// 获取设备信息
Array<DeviceInfo> aDeviceList;
OpenNI::enumerateDevices(&aDeviceList);
cout << "电脑上连接着 " << aDeviceList.getSize() << " 个体感设备." << endl;
for (int i = 0; i < aDeviceList.getSize(); ++i)
{
cout << "设备 " << i << endl;
const DeviceInfo& rDevInfo = aDeviceList[i];
cout << "设备名: " << rDevInfo.getName() << endl;
cout << "设备Id: " << rDevInfo.getUsbProductId() << endl;
cout << "供应商名: " << rDevInfo.getVendor() << e