视觉同步定位和映射(vSLAM)是指计算相机相对于周围环境的位置和方向,同时映射环境的过程。这个过程只使用来自相机的视觉输入。视觉SLAM的应用包括增强现实、机器人和自动驾驶。有关为什么SLAM很重要以及它如何在不同应用程序中工作的一般描述,请参见什么是SLAM?
视觉SLAM算法大致分为两类,这取决于它们如何估计摄像机的运动。间接的,基于特征的方法利用图像的特征点来最小化重投影误差。直接法利用图像的整体亮度来减小光度误差。计算机视觉工具箱™算法提供了执行基于特征的视觉SLAM的功能。该工作流程包括地图初始化、跟踪、局部映射、环路检测和漂移校正。
请注意
本概述中描述的工作流程适用于针孔相机拍摄的图像。要对鱼眼相机拍摄的图像使用可视化SLAM工作流,请将鱼眼相机转换为虚拟针孔相机undistortFisheyeImage
函数。
视觉SLAM文献使用这些常见术语:
关键帧-包含定位和跟踪线索的视频帧的子集。两个连续的关键帧通常表示由摄像机运动引起的较大视觉变化。
地图点——三维世界点的列表,表示由关键帧重建的环境地图。
共视图-关键帧作为节点的图。如果两个关键帧共享公共映射点,则由一条边连接。一条边的权值是共享映射点的数量。
识别数据库——存储基于特征输入包的可视单词到图像映射的数据库。通过在数据库中搜索与查询图像在视觉上相似的图像,确定过去是否访问过某个地方。
要在一系列图像上构建一个基于特征的可视化SLAM管道,请遵循以下步骤:
初始化地图-从两个图像帧初始化3-D点的地图。基于二维特征对应的三角剖分,计算三维点和相对相机姿态。
跟踪特征——对于每一个新的帧,通过匹配当前帧的特征和最后一个关键帧的特征来估计相机的姿势。
创建本地地图——如果您将当前帧确定为关键帧,则创建一个新的点的3-D地图。使用束调整来细化相机姿态和3-D点。
检测循环——通过使用特征袋方法将当前帧与所有之前的关键帧进行比较,来检测每个关键帧的循环。
正确漂移-优化姿态图,以纠正所有关键帧的相机姿态漂移。
该图说明了一个典型的基于特征的可视化SLAM工作流。它还显示了从管理数据的对象中存储数据或检索数据的点。
使用视图集、点集和转换对象来管理关键帧和映射数据。
使用imageviewset
对象来管理与里程计和映射过程关联的数据。对象包含一组视图的数据以及视图之间的成对连接。该对象还可以用于构建和更新姿态图。
每一个视图由相机的绝对姿态和从图像中提取的特征点组成。视图集中的每个视图都有其唯一标识符(视图ID),构成了姿态图的一个节点。
每一个连接存储将一个视图链接到另一个视图的信息。连接包括视图之间的匹配特征指标、连接视图之间的相对转换以及计算测量时的不确定度。每个连接在姿态图中形成一条边。
使用一个rigid3d
对象的输入imageviewset
存储测程边的绝对相机姿态和相对相机姿态。使用一个affine3d
对象的输入imageviewset
存储环闭边的相对相机姿态。
使用worldpointset
对象来存储跨摄像机视图的3-D地图点和2-D图像点之间的对应关系。
的WorldPoints
的属性worldpointset
存储地图点的三维位置。
的对应
的属性worldpointset
存储观察映射点的关键帧的视图id。
要初始化映射,必须匹配两个图像之间的特征,估计相对相机姿态,并对初始3-D世界点进行三角测量。该工作流通常使用加速健壮特性(SURF)和定向快速和旋转简要(ORB)特性点特性。地图初始化流程包括特征检测、提取和匹配,然后查找相对相机姿态估计,查找匹配特征的三维位置,并细化初始地图。最后,将得到的关键帧和映射点分别存储在图像视图集和世界点集中。
工作流 | 函数 | 描述 |
---|---|---|
1.检测 | detectSURFFeatures |
检测SURF特征并返回SURFPoints 对象。 |
detectORBFeatures |
检测ORB特性并返回ORBPoints 对象。 |
|
detectSIFTFeatures |
检测SIFT特征并返回SIFTPoints 对象。 |
|
2.提取 | extractFeatures |
提取二值图像或强度图像中的特征向量及其对应位置。 |
3.匹配 | matchFeatures |
获取两个特征集之间匹配特征的索引。 |
4.从匹配的特征点估计相对的相机姿态 | estimateGeometricTransform2D |
从匹配的点对计算单应性。 |
estimateFundamentalMatrix |
从匹配的点对估计基本矩阵。 | |
relativeCameraPose |
计算相对相机姿态,表示为rigid3d 对象,基于单应性或基本矩阵。位置只能按比例计算,因此两个摄像机之间的距离设置为1 . |
|
5.找到匹配特征点的三维位置 | 由三角形组成的 |
找到匹配的未失真图像点对的三维位置。 |
6.细化初始地图 | bundleAdjustment |
完善3-D地图点和相机姿势,最大限度地减少重投影误差。 |
7.管理初始地图和关键帧的数据 | addView |
将特征点形成的两个视图及其绝对位姿添加到imageviewset 对象。 |
addConnection |
将由相机之间的相对位姿变换形成的连续关键视图之间的连接所定义的测程边缘添加到imageviewset 对象。 |
|
addWorldPoints |
属性中添加初始映射点worldpointset 对象。 |
|
addCorrespondences |
将关键帧和映射点之间的3-D到2-D投影对应关系添加到worldpointset 对象。 |
跟踪工作流使用每一帧来确定何时插入新的关键帧。为跟踪工作流使用这些步骤和函数。
工作流 | 函数 | 描述 |
---|---|---|
匹配提取的特征 | matchFeatures |
将当前帧中提取的特征与上一个关键帧中已知三维位置的特征进行匹配。 |
预估相机姿势 | estimateWorldCameraPose |
估计当前的相机姿势。 |
项目地图点 | worldToImage |
将最后一个关键帧观察到的映射点投影到当前帧中。 |
搜索特征对应 | matchFeaturesInRadius |
在空间约束下搜索特征对应。 |
优化相机姿势 | bundleAdjustmentMotion |
通过执行仅运动的束调整,用3-D到2-D的对应来细化相机姿态。 |
识别本地地图点 | 识别视图中的点和对应于点轨迹的点。 | |
搜索更多的特征对应 | matchFeaturesInRadius |
在当前帧中搜索更多的特征对应,其中包含投影的局部地图点。 |
优化相机姿势 | bundleAdjustmentMotion |
通过执行仅运动的束调整,用3-D到2-D的对应来细化相机姿态。 |
存储新的关键帧 | 如果您确定当前帧是一个新的关键帧,请将它及其与共视关键帧的连接添加到imageviewset . |
特征匹配在跟踪工作流程中至关重要。使用matchFeaturesInRadius
函数返回更多的假定匹配时,估计匹配特征点的位置是可用的。工作流中使用的两个匹配特征函数是:
matchFeatures
—返回两个输入特征集中匹配特征的索引。
matchFeaturesInRadius
—返回两个输入特征集中满足空间约束的匹配特征的索引。
属性的值可获得更多匹配的特征对MatchThreshhold
而且MaxRatio
的名称-值参数matchFeatures
而且matchFeaturesInRadius
功能。在本地映射步骤中进行bundle调整后,可以丢弃异常值对。
对每个关键帧执行本地映射。按照以下步骤创建新的地图点。
工作流 | 函数 | 描述 |
---|---|---|
连接关键帧 | connectedViews |
找到当前关键帧的共视关键帧。 |
在连接的关键帧中搜索匹配 | matchFeatures |
对于当前关键帧中的每个不匹配的特征点,使用matchFeatures 函数在共视关键帧中搜索与其他不匹配点的匹配。 |
计算新匹配的位置 | 由三角形组成的 |
计算匹配特征点的三维位置。 |
存储新地图点 | addWorldPoints |
将新的地图点添加到worldpointset 对象。 |
存储3-D到2-D的对应关系 | addCorrespondences |
添加新的3-D到2-D对应worldpointset 对象。 |
更新里程表连接 | updateConnection |
更新当前关键帧与其共视帧之间的连接,使用更多的特征匹配。 |
完善构成 | bundleAdjustment |
细化当前关键帧的姿态,共视关键帧的姿态,以及在这些关键帧中观察到的所有地图点。为了提高性能,在细化过程中只包括强连接的共视关键帧。 使用 |
删除离群值 | removeWorldPoints |
移除重投影误差较大的异常点worldpointset 对象。相关的3-D到2-D对应关系将自动删除。 |
这个表格比较了3-D重建中使用的每个bundle调整函数的相机姿势、地图点和相机数量。
函数 | 相机的姿势 | 地图上点 | 摄像头数量 |
---|---|---|---|
bundleAdjustment |
优化 | 优化 | 多个 |
bundleAdjustmentMotion |
优化 | 固定 | 一个 |
bundleAdjustmentStructure |
固定 | 优化 | 多个 |
由于误差的累积,仅使用视觉里程计可能导致漂移。这些错误会导致长距离的严重误差。使用基于图的SLAM有助于纠正漂移。要做到这一点,可以通过查找以前访问过的位置来检测循环关闭。一个常见的方法是使用这样的功能包工作流:
工作流 | 函数 | 描述 |
---|---|---|
构造一袋视觉单词 | bagOfFeatures |
构造一袋用于位置识别的视觉单词。 |
创建识别数据库 | indexImages |
创建一个识别数据库,invertedImageIndex ,将视觉文字映射到图像。 |
确定环路闭合候选 | retrieveImages |
搜索与当前关键帧相似的图像。如果连续图像与当前帧相似,则将它们标识为循环关闭候选图像。否则,将当前关键帧添加到识别数据库中。 |
计算相对相机姿态闭环候选人 | estimateGeometricTransform3D |
计算候选关键帧和当前关键帧之间的相对相机姿态,对于每个循环闭包候选 |
闭环 | addConnection |
控件中添加具有相对相机姿态的循环关闭边来关闭循环imageviewset 对象。 |
的imageviewset
对象在添加视图和连接时在内部更新姿态图。方法执行姿态图优化,以使漂移最小化optimizePoses
函数,一旦添加了足够的循环闭包。的optimizePoses
函数返回imageviewset
对象使用每个视图的优化绝对位姿转换。
您可以使用createPoseGraph
函数以MATLAB的形式返回姿态图®有向图
对象。您可以使用MATLAB中的图算法来检查、查看或修改姿态图。使用optimizePoseGraph
(导航工具箱)函数来优化修改后的姿态图,然后使用updateView
函数更新视图集中的相机姿势。
为了开发可视化SLAM系统,您可以使用以下可视化函数。
函数 | 描述 |
---|---|
imshow |
显示图像 |
showMatchedFeatures |
在两幅图像中显示匹配的特征点 |
情节 |
图图像视图集合视图和连接 |
plotCamera |
在三维坐标中画出摄像机 |
pcshow |
图3-D点云 |
pcplayer |
可视化流3-D点云数据 |
[1]哈特利,理查德和安德鲁·泽瑟曼。计算机视觉中的多视图几何.第二版。剑桥:剑桥大学出版社,2003年。
frundorfer, Friedrich和Davide Scaramuzza。视觉里程计:第二部分:匹配,稳健性,优化和应用IEEE机器人与自动化杂志19日,没有。2(2012年6月):78-90。https://doi.org/10.1109/MRA.2012.2182810。
穆尔-阿塔尔,劳尔,j·m·m·蒙蒂埃尔,胡安·d·塔多斯。“ORB-SLAM:一种多功能和精确的单目SLAM系统。”IEEE机器人汇刊31日。5(2015年10月):1147-63。https://doi.org/10.1109/TRO.2015.2463671。
[4] Kümmerle, Rainer, Giorgio Grisetti, Hauke Strasdat, Kurt Konolige和Wolfram Burgard。“G2o:图形优化的通用框架。”在2011年IEEE机器人与自动化国际会议2011年5月9-13日,上海,3607-13。纽约:电气和电子工程师协会。https://doi.org//10.1109/ICRA.2011.5979949。
detectSURFFeatures
|detectSIFTFeatures
|detectORBFeatures
|extractFeatures
|matchFeatures
|matchFeaturesInRadius
|estimateGeometricTransform2D
|estimateGeometricTransform3D
|estimateFundamentalMatrix
|relativeCameraPose
|estimateWorldCameraPose
|worldToImage
|由三角形组成的
|bundleAdjustment
|bundleAdjustmentMotion
|bundleAdjustmentStructure
|createPoseGraph
|optimizePoses