目录
1 引出
1.1 什么是SLAM?
1.2 SLAM一些典型引用
2 LiDAR SLAM
2.1 假设传感器的位姿是知道的,怎样构建地图?
2.2 假设地图是知道的,怎样计算传感器的位姿(pose)?
2.2.1 点云匹配问题 ICP 基本思想
2.2.2 给定最近邻点时,怎样求解运动?
3 Visual SLAM
3.1 基于关键帧的视觉SLAM(Key‐frame based Visual SLAM)
3.1.1 Tracking
3.1.2 Mapping
3.1.3 Keyframes如何定义的?
3.1.4 PTAM 2007 经典方案中,运行时间分布
3.2 A Brief History of Visual SLAM
4 高级功能 (Robustness Techniques)
4.1 重定位(Re‐localization)
4.1.1 典型步骤
4.1.2 典型应用:在 Localization 过程中
4.2 漂移问题(Drifting)
4.3 闭环检测(Loop Closure)
4.4 Repetitive Structures
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
增强现实:比如家具布置,虚拟装修,是否合适,直接购买下单;使用微软的 HoloLens 将游戏中的物体布置到实际场景中;
扫地机器人:上面有一个360度的全景镜头,拍照后三维重建,确定自己的位置,可以做路径跟踪,路径规划等;
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
2D LiDAR SLAM 使用于平面中的运动。
使用激光的方式,获取的地图的描述的一种方式为:占用网格地图(Occupancy Grid Map),描述如下。
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
假设此时地图已知,也有了传感器的输入(一圈激光点),然后去确定传感器在地图中的位置(定位),即点云匹配问题。
首先,为当前传感器所在位置扫描得到的,一圈激光点云中的每一个点,在地图种找到一个最近邻的点。找到这个对应关系后,我们可以根据3D到3D的对应关系,把我输入的这一圈激光点云,register 到地图上面去。然后,第一次 registration 可能不会完美,我就暂停在那个地方,以这个 pose 为初始,重新去找他的对应点。当我的pose更新时,我的最近邻关系也会随之更新,所以我可以重新去找一次最近邻点,然后再次求解传感器的运动,逐步的迭代。
------------------------------------------------------------
------------------------------------------------------------
即,怎样去求解一个旋转矩阵R和位移向量t,来确定当前传感器扫的一圈点,和地图中待确定的对应点之间的对应关系。显然,这是一个优化问题。即优化 E(R,t),如下图所示。
------------------------------------------------------------
------------------------------------------------------------
LiDAR SLAM 一般初始化流程
------------------------------------------------------------
------------------------------------------------------------
典型的SLAM系统架构:LiDAR SLAM 对比 Visual SLAM
------------------------------------------------------------
------------------------------------------------------------
简单理解,就是把 SfM 应用在一个 video sequence (视频序列) 上,基本上可以认为它是一个“增量式的SfM”。每来一帧解一帧。
鉴于 SLAM 特定的应用,所以有一些特定的特点:比如 “实时性”、“视频序列输入”。
------------------------------------------------------------
------------------------------------------------------------
只有在关键帧时,才会进行 三角测量 (triangulate),才会触发Bundle Adjustment。
------------------------------------------------------------
------------------------------------------------------------
2007年提出的一种不错的方案是,将整个过程分为两个线程,一个负责图像采集(Tracking),解相机的 pose,一个负责地图优化(Mapping)。
------------------------------------------------------------
------------------------------------------------------------
目标:解相机的 pose。
KLT 特征跟踪:当你在这一帧中,有一些图像的特征点,有一个很快速的机制,可以很快的算出来对应的图像点在哪里,通过这样的方式,就可以得到相邻的两帧之间的 feature correspondence。
另外一种方式:当新来的当前帧,我在这一帧里面,作特征提取,提完这一帧后,我再跟上一帧进行 match;不过因为我知道相机运动是连续的,我就知道我提取出来的这一个特征点,它的 correspondence,一定是在附近,不会跑太远。同时,因为相机的运动也比较小,我们可以根据相机的运动,预测一下,我对应的特征点在什么地方。然后,在这个邻域里面去做 search。
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
即,当 tracking lose (追踪丢失)时,怎么样 re-localization(重新定位)的问题。
基本思想:假定之前已经跑了一段的SLAM了,即历史上已经建立了一段地图在哪里了,只是因为某种偶然的原因,中间突然有个几帧出现一些极端情况,使得你的系统挂掉,再然后,又来了很好的一帧,我想要,根据这一帧,跟之前地图(的关键帧)建立联系,进行registrate。
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
即,不管做 localization 还是 mapping 的过程中,总是会有误差,且误差总是会累积。如转了一圈,本来计划回到原点,缺因为累积误差,有了gap,如下图所示。解决方法:闭环检测(Loop Closure)。
------------------------------------------------------------
------------------------------------------------------------
首先,先检查是否有闭环应该存在,若是,通过图像搜索的方式,添加帧之间的 constrain。通常在每一个keyframe上都需要做这样的事情,这样就会形成一个 pose-graph (每一个关键帧,就是这个 pose-graph 的 vertex,每两个有 relative constrain motion 的关键帧之间,就要连一条边,形成一个graph)。
------------------------------------------------------------
------------------------------------------------------------
然后,就可以做闭环优化了。最简单也是最早期的方式,就是加上一条 constrain,做一次 BA(Bundle Adjustment)。当 drifting error 过大时(如初始值距离 groundtruth 太远),BA 就优化不过去了(收敛到正确解就很困难)。这时,就变成了一个 global SfM 的问题了;因为 pose-graph 里面放的是 keyframes 和 两两 keyframes 之间的 relative motion,想要的是每一个 keyframe 在世界坐标下的一个绝对姿态。
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
参考:SFU 浙江大学 计算机视觉课程 谭平教授 https://www.jiqizhixin.com/articles/19052902