ORB SLAM2运行步骤/怎样跑通orbslam2运行

1007人阅读
ORB_SLAM近年来在slam问题上取得了state-of-art的结果,运行速度很快,在i5的NUC上运行帧率可达20帧/s。今年,原作者又公布了ORB_SLAM2源码,程序更加简洁,并且增加了localization mode功能。本篇博客讲介绍如何搭建ORB_SLAM2的运行环境,构建地图,加载离线地图并进行全场定位。
(1)下载源码:/raulmur/ORB_SLAM2
(2)根据作者列出的依赖项安装相应的依赖,注意opencv的版本最好为作者测试的版本2.4.11。经踩坑,使用opencv3.0会报错。
(3)建议安装ros indigo,本文的测试都是建立在ORB_SLAM2的ROS版本上。
(4)下载read camera软件包,作为调用摄像头图像的一个ROS节点。下载链接:http://download.csdn.net/detail/u10843
(5)运行read_cam节点
rosrun read_cam webCameraRead
(6)运行ORB_SLAM2节点
cd ~/ORB_SLAM2/Example/ROS/ORB_SLAM2
./Mono ~/ORB_SLAM2-master/Vocabulary/ORBvoc.txt ~/ORB_SLAM2/Examples/Monocular/TUM1.yaml
若成功运行,则表示slam环境配置成功,接下来便可进行下一步工作。
离线地图的加载与全场定位
论文作者给出的源码是不支持地图的保存与载入了,因此需要对源码进行修改。所幸github上已经有网友做完了这部分工作,源码链接。
(1)下载源码,以同样的步骤编译源码。
(2)将自己使用的相机标定文件替换掉源码中的标定文件
(3)运行read_cam节点
(4)构建地图
./Mono ~/ORB_SLAM2-master/Vocabulary/ORBvoc.txt ~/MyCamera.yaml false
(5)当地图构建完成后,点击GUI上的localization mode,ctrl+c结束该节点,地图便保存为Slam_latest_Map.bin
(6)加载离线地图:将地图的名字改为Slam_Map.bin,执行以下命令:
./Mono ~/ORB_SLAM2-master/Vocabulary/ORBvoc.txt ~/MyCamera.yaml true
经过漫长的字典加载过程,将会看到之前建好的地图,和相机的当前位置。
ORB_SLAM2总体来说是一个非常优秀的slam源码,单目的效果也很好,速度很快,实时性较高。比较适合于光照条件比较稳定、纹理较为丰富的室内环境。实验中发现,光照对ORB_SLAM的效果影响较大,对于重复纹理的背景容易出现误匹配现象,大家在使用过程中都应该尽力避免。
以上是初步的使用心得,后面将会仔细地阅读源码和论文,做点更有价值的工作。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:5069次
排名:千里之外
原创:15篇
评论:20条
(2)(1)(1)(6)(1)(1)(1)(1)(1)slam学习(17)
这篇将要讲orbslam2相机初始位置估计的另一种方法:单应矩阵H(使用场景:平面,视差小)和map point的求法
(一):单应矩阵
在计算机视觉中,平面的单应性被定义为一个平面到另外一个平面的投影映射。因此一个二维平面上的点映射到摄像机成像仪上的映射就是平面单应性的例子。如果点Q到成像仪上的点q的映射使用齐次坐标,这种映射可以用矩阵相乘的方式表示。若有一下定义:
Q=[X Y Z& 1]T
q=[x y& 1]T
则可以将单应性简单的表示为:
这里引入参数s,它是任意尺度的比例(目的是使得单应性定义到该尺度比例)。通常根据习惯放在H的外面。
H有两部分组成:用于定位观察的物体平面的物理变换和使用摄像机内参数矩阵的投影。
物理变换部分是与观测到的图像平面相关的部分旋转R和部分平移t的影响之和,表示如下
这里R为3*3大小的矩阵,t表示一个一个3维的列矢量。
摄像机内参数矩阵用M表示,那么我们重写单应性如下:
q=sWMQ& where W是相机内参矩阵
我们知道单应性研究的是一个平面上到另外一个平面的映射,那么上述公式中的~Q,就可以简化为平面坐标中的~Q',即我们使Z=0。即物体平面上的点我们用x,y表示,相机平面上的点,我们也是用二维点表示。我们去掉了Z方向的坐标,那么相对于旋转矩阵R,R可以分解为R=[r1 r2 r3],那么r3也就不要了。
H=sM[r1 r2 t]
是一个3×3大小的矩阵.
&故最终的单应性矩阵可表示如下:
我们可以从H矩阵中恢复R,T。但是同样存在尺度问题(指T),所以只有在初始位置估计的时候才用到E或H。以后一般都用opencv的PNP求解也就是3D-2D的映射。
(二)我们除了要求相机的pose以外,还要求map point。下面来讲解map point的求法。
对于三维空间中的一点
P,我们假设第一个摄像机坐标系C1就是世界坐标系,P在世界坐标系下的表示为P=(x,y,z,1)T,这时,摄像机坐标系C1的外参数矩阵M1为单位矩阵。
点P和光心的连线交第一个图像平面于点p1
,注意这里的p1是在摄像机坐标系的坐标表示,不是在图像坐标系下,这在上一篇博客中已经强调。同理,和第二个摄像机光心连线交第二幅图像于点p2
。 pi在各自摄像机坐标系中的表示为:
p1=???x1y11???c1
p2=???x2y21???c2
摄像机坐标系C2的外参数矩阵为M2,由于摄像机坐标系C1就是世界坐标系,所以有
在推导本征矩阵E的时候,我们说R是从坐标系C2到坐标系C1的旋转变换矩阵,即12R。t是平移,更确却的说是光心C2在C1中的坐标表示,即1t2。所以在通过8点法求出的R,T以后,得到的从摄像机坐标2变换到到摄像机坐标系1的变换矩阵为
12H=[R3×30t3×11]
而这里的外参数矩阵M2是将世界坐标系中的一点P投影到摄像机坐标系C2。所以M2=21H=12H-1,只需去掉H矩阵的最下面一行齐次坐标就行了。
所以,通过本征矩阵得到R,t以后,要计算摄像机坐标系C2外参数矩阵的程序如下:
有了外参矩阵,我们就可以得到这些点坐标的关系:
由于光心Ci,三维坐标点P,以及pi三点共线,所以向量Cipi、CiP的叉乘应该为0,上述方程又可以转化为:
这又是一个要用最小二乘求解的线性方程方程组 ,和求本征矩阵一样,计算矩阵A的SVD分解,然后奇异值最小的那个奇异向量就是三维坐标P的解。
在以上计算P三维坐标的推导过程中,可以看到和本征矩阵E是息息相关的,E和我们的尺度紧密相连,所以计算出来的深度和尺度scale也是直接相关的。同时,根据这种三角法(triangulation )计算的深度,其实是不怎么靠谱的,一般只是拿这个做一个初始值。
两个射线夹角越小,误差协方差越大。所以点到光心连线组成的射线向量在orbslam中是有明确记录的。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:7470次
排名:千里之外
原创:12篇
(2)(1)(2)(12)(2)

我要回帖

更多关于 orbslam2 的文章

 

随机推荐