INDEMIND双目视觉惯性模组上线开售至今受到了众多开发者、学生的青睐,INDEMIND感激的同时决定为不同学习阶段的用户开设一系列技术公开课,解答用户最为关注的问题及疑惑。今天,INDEMIND将为大家带来ORB-SLAM2的演算法示例。

一.ORB-SLAM

1. ORB-SLAM简介

ORB-SLAM是一个基于ORB特征点的实时SLAM系统,由Raul Mur-Arta、J. M. M. Montiel和Juan D. Tardos于2015年发表在IEEE Transactions on Robotics。ORB-SLAM基于PTAM架构,增加了地图初始化和闭环检测的功能,优化了关键帧选取和地图构建的方法,在处理速度、追踪效果和地图精度上都取得了不错的效果,十分适用于室内外大小规模的环境场景应用[1]。

ORB-SLAM2则是在ORB-SLAM的基础上添加了对双目相机、RGBD相机的支持,同样包含跟踪(Tracking)、建图(Mapping)、重定位(Relocalization)、闭环检测(Loop closing)等模块。

2. 系统架构

ORB-SLAM主要分为追踪、地图构建和闭环检测三个线程,具体系统架构如下:

1) 追踪

ORB特征提取初始姿态估计(速度估计)姿态优化(Track local map,利用邻近的地图点寻找更多的特征匹配,优化姿态)选取关键帧2) 地图构建加入关键帧(更新各种图)验证最近加入的地图点(去除Outlier)

生成新的地图点(三角法)

局部Bundle adjustment(该关键帧和邻近关键帧,去除Outlier)验证关键帧(去除重复帧)3) 闭环检测 选取相似帧(bag of words)检测闭环(计算相似变换(3D<->3D,存在尺度漂移,因此是相似变换),RANSAC计算内点数)融合三维点,更新各种图图优化(传导变换矩阵),更新地图所有点[2]

ORB-SLAM关键点如下:

3. 特性分析

1) ORB-SLAM所有步骤统一使用图像的ORB特征。ORB特征是一种非常快速的特征提取方法,具有旋转不变性,并可以利用金字塔构建出尺度不变性。使用统一的ORB特征有助于SLAM演算法在特征提取与追踪、关键帧选取、三维重建、闭环检测等步骤具有内生的一致性。

2) 为了消除累计误差,ORB-SLAM演算法加入了循环检测和闭合机制。

3) ORB-SLAM 采用一种更鲁棒的关键帧和三维点的选择机制——先用宽松的判断条件尽可能及时地加入新的关键帧和三维点, 以保证后续帧的鲁棒跟踪; 再用严格的判断条件删除冗余的关键帧和不稳定的三维点,以保证 BA 的效率和精度。

4) ORB-SLAM系统代码结构十分清晰,非常适用于适配到实际场景中。

虽然ORB-SLAM是一个非常工程化的系统,但其同样存在很多劣势。

1) ORB-SLAM对高速机动场景支持不足,旋转时比较容易丢帧。

2) 构建的场景点云地图非常稀疏,只保留了图像中特征的一部分作为关键点,无法通过密集点云地图描述物体结构属性,因此无法满足障碍物识别需求。

3) 初始化时最好保持低速运动,对准纹理丰富的场景。

4) ORB-SLAM为了兼容性牺牲了部分载入速度,因此在载入地图时比较缓慢。

简而言之,对于地图密度要求不高的定位和追踪问题,ORB-SLAM是一个不错的选择。

二.安装及调用

INDEMIND双目视觉惯性模组采用视觉+IMU的多感测器融合架构,可获取精准的图像及IMU数据,并依赖于微秒级时间同步机制与高精度的感测器标定方法,可为多种开源演算法提供精准稳定的前端数据获取能力。

说明:本次ORB-SLAM Demo是基于INDEMIND双目视觉惯性模组采集的数据,离线运行而来。安装及调试教程基于Ubuntu 16,各位老兵可略过。

1. 下载ORB-SLAM

下载地址:

raulmur/ORB_SLAM2?

github.com
图标

2. 下载INDEMIND双目视觉惯性模组SDK

INDEMIND双目视觉惯性模组的SDK为开发者提供了丰富的开发工具与辅助,省去了开发者对相机的标定、数据同步等开发工作,加速开发进程。因此,我们直接根据自身操作系统直接下载INDEMIND双目视觉惯性模组的SDK即可。

下载地址:

INDEMIND | SDK下载?

indemind.cn

3. 使用SDK

创建SDK对象

CIMRSDK* pSDK = new CIMRSDK();

设置使用的 SLAM

MRCONFIG config = { 0 };
config.bSlam = true; //true 开启 SLAM,false 不开启 SLAM

//获取模组标定信息

CameraCalibrationParameter param;

获取模组图像数据

pSDK->RegistModuleCameraCallback(SdkCameraCallBack,NULL);

获取 SLAM 结果

pSDK->RegistModulePoseCallback(sdkSLAMResult,NULL);

将param的参数写入文件中

ofstream out("./datafile.txt");

释放资源

pSDK->Release();
delete pSDK;

编译

安装 cmake

sudo apt-get install cmake

安装 google-glog + gflags

sudo apt-get install libgoogle-glog-dev

安装 BLAS & LAPACK

sudo apt-get install libatlas-base-dev

安装 SuiteSparse and CXSparse

sudo apt-get install libsuitesparse-dev

编译器

使用 Ubuntu 16.04 编译 demo 程序需要使用 GCC5.4 版本,否则可能链接失败。

使用 Ubuntu 18.04 编译 demo 程序需要使用 GCC7.3 版本,否则可能链接失败。

编译

cd build
cmake ..
make

执行

把刚才编译的可执行文件 TestIndem 拷贝到刚才解压 SDK 的 lib 目录下的 1604 目录下,在 lib/1604 目录下使用 sudo ./TestIndem.sh 命令启动程序。

TestIndem 和 TestIndem.sh 需要可执行许可权。 使用命令 chmod 777 TestIndem 和 chmod777 TestIndem.sh 进行修改。

为了提高系统稳定性,请运行时使用超级用户(root 许可权)运行,或者使用 「sudo ./程序名」 运行,例如 DEMO 运行「sudo ./TestIndem.sh」。

*注意:在 Ubuntu 18.04 上使用 GCC7.3 编译 demo 的时候,需要把 demo 里的 CMakeLists.txt 的1604 改成 1804 才能编译成功,编译成功后把 TestIndem 拷贝到 lib/1804 下运行。

4. ORB-SLAM2参数设置及矫正

需要更改的相机参数:

//双目摄像头之间的相对关系
cv::Mat R = cv::Mat(3,3,CV_64FC1,R_matrix);
cv::Mat t = cv::Mat(3,1,CV_64FC1,t_matrix);
//3X3 左相机内参矩阵
cv::Mat K_l = cv::Mat(3,3,CV_64FC1,_Kl);
//3X3 右相机内参矩阵
cv::Mat K_r = cv::Mat(3,3,CV_64FC1,_Kr);
//4X1 左相机畸变差校正参数,鱼眼畸变
cv::Mat D_l = cv::Mat(4,1,CV_64FC1,_Dl);
//4X1 右相机畸变差校正参数,鱼眼畸变
cv::Mat D_r = cv::Mat(4,1,CV_64FC1,_Dr);
//3X3 基线校正后左相机旋转矩阵
cv::Mat R_l = cv::Mat(3,3,CV_64FC1,_Rl);
//3X3 基线校正后左相机旋转矩阵
cv::Mat R_r = cv::Mat(3,3,CV_64FC1,_Rr);
//3X4 基线校正后左相机投影矩阵
cv::Mat P_l = cv::Mat(3,4,CV_64FC1,_Pl);
//3X4 基线校正后右相机投影矩阵
cv::Mat P_r = cv::Mat(3,4,CV_64FC1,_Pr);
//矫正
cv::stereoRectify(K_l,D_l,K_r,D_r,cv::Size(cols_l,rows_l),R,t,R_l,R_r,P_l,P_r,Q,cv::CALIB_ZERO_DISPARITY,0);
//左相机去鱼眼畸变
cv::fisheye::initUndistortRectifyMap(K_l,D_l,R_l,P_l.rowRange(0,3).colRange(0,3),cv::Size(cols_l,rows_l),CV_32FC1,M1l,M2l);
//右相机去鱼眼畸变
cv::fisheye::initUndistortRectifyMap(K_r,D_r,R_r,P_r.rowRange(0,3).colRange(0,3),cv::Size(cols_r,rows_r),CV_32FC1,M1r,M2r);

编译

cd ORB_SLAM2
chmod +x build.sh
./build.sh

执行

基于双目的执行

./Examples/Stereo/stereo_euroc Vocabulary/ORBvoc.txt Examples/Stereo/EuRoC.yaml PATH_TO_SEQUENCE/mav0/cam0/data PATH_TO_SEQUENCE/mav0/cam1/data Examples/Stereo/EuRoC_TimeStamps/SEQUENCE.txt

至此,INDEMIND双目视觉惯性模组运行ORB-SLAM工程全部部署完毕,实际表现如下:

三.Demo演示

ORB-SLAM2 Demo https://www.zhihu.com/video/1059408815304347648

INDEMIND双目视觉惯性模组是专为计算机视觉技术研发应用而研发的双目惯性相机,模组采用「双目+IMU」多感测器融合架构,拥有微秒级时间同步机制,减少了感测器数据同步误差,可提供精准实时的1280*800@50FPS图像源与高频率IMU数据,为SLAM研发奠定了良好的前端数据基础。

在出厂时,INDEMIND还对双目视觉惯性模组进行了高精度的专业标定,减少了感测器装配误差,提升精度。并且,INDEMIND双目视觉惯性模组拥有完备的SDK开发工具及丰富的开发文档,无缝支持多种开源项目,节省开发者开发工作,详细SDK信息,请参考:indemind.cn/sdk.html

未完待续……接下来我们将为大家带来INDEMIND双目惯性模组实时运行ORB-SLAM DEMO

福利时间:

活动1:【双目惯性模组免费试用】,开发者可获得15天双目惯性模组免费试用期,反馈精彩内容(包括并不限于模组性能、项目体验、项目效果等),可将免费试用期延长至30天。更多活动信息关注INDEMIND微信公众号或戳:u.eqxiu.com/s/GIfts1hn

活动2:【在校开发者优惠活动】,关注INDEMIND公众号提交相关信息即可领取模组100元优惠券。券后900的价格,用户即可拥有一台包含多种技术支持及丰富SDK和高精度Vi-SLAM演算法支持的双目视觉惯性模组。

参考资料:

  1. 《ORB-SLAM(一)简介》 扶朕起来嗨 CSDN
  2. 《ORB-SLAM2详解(一)简介》sylvester0510 CSDN
  3. raulmur/ORB_SLAM2

推荐阅读:

相关文章