连载文章,长期更新,欢迎关注:


写在前面

第1章-ROS入门必备知识

第2章-C++编程范式

第3章-OpenCV图像处理

第4章-机器人传感器

第5章-机器人主机

第6章-机器人底盘

第7章-SLAM中的数学基础

7.1 SLAM发展简史

7.2 SLAM中的概率理论

7.3 估计理论

7.4 基于贝叶斯网络的状态估计

7.5 基于因子图的状态估计

7.6 SFM、BA和SLAM比较

7.7 典型SLAM算法

第8章-激光SLAM系统

第9章-视觉SLAM系统

第10章-其他SLAM系统

第11章-自主导航中的数学基础

第12章-典型自主导航系统

第13章-机器人SLAM导航综合实战


纵观历史,历经30多年的发展,SLAM已经不是一个新鲜事物了。但要得益于近几年来火遍全球的人工智能及无人驾驶技术,SLAM才真正进入大众的视野。虽然这些年SLAM研究取得了无数举世瞩目的成果,但是国内的研究状态还处于起步阶段,相关专业学习资料很少,并兼理论性和实践性的系统化归纳整理资料就更少了。为了帮助国内的广大学习者更深入地理解SLAM技术,这里特意对SLAM发展历史做一个梳理,通过对SLAM数学理论发展演进过程的介绍,帮助广大学习者把握SLAM技术背后的本质。

最初,机器人定位问题和机器人建图问题被看成两个独立的问题来研究的。机器人定位问题,是在已知全局地图的条件下,通过机器人传感器测量环境,利用测量信息与地图之间存在的关系求解机器人在地图中的位姿。定位问题的关键点是必须事先给定环境地图,比如分拣仓库中地面粘贴的二维码路标,就是人为提供给机器人的环境地图路标信息,机器人只需要识别二维码并进行简单推算就能求解出当前所处的位姿。机器人建图问题,是在已知机器人全局位姿的条件下,通过机器人传感器测量环境,利用测量地图路标时刻的机器人位姿和测量距离与方位信息,很容易求解出观测到的地图路标点坐标值。建图问题的关键点是必须事先给定机器人观测时刻的全局位姿,比如装载了GPS定位的测绘飞机,飞机由GPS提供全局定位信息,测量设备基于GPS定位信息完成对地形的测绘。很显然,这种建立在环境先验基础之上的定位和建图具有很大的局限性。将机器人放置到未知环境(比如火星探测车、地下岩洞作业等场景),前面这种上帝视角般的先验信息将不再存在,机器人将陷入一种进退两难的局面,即所谓的“先有鸡还是先有蛋”的问题。如果没有全局地图信息,机器人位姿将无法求解;没有机器人位姿,地图又将如何求解呢?

还有,这种传统的定位和建图问题,通常是基于模型的。就拿定位来说,只要构建出机器人运动的数学模型,利用运动信息就可以推测出机器人将来任意时刻的位姿,只需要引入少量的观测反馈对模型误差做修正就行了。这种基于模型的机器人,很显然没有考虑实际机器人问题中存在的众多不确定性因素,比如传感器测量噪声、电机控制偏差、计算机软件计算精度近似等。因此,机器人中的不确定性问题也需要被特别关注。

在1986年,Smith和Cheeseman将机器人定位问题和机器人建图问题放在基于概率论理论框架之下进行统一研究[1]。其中有两个开创性的点,第一是采用了基于概率论理论框架对机器人的不确定性进行讨论,第二是将定位和建图中的机器人位姿量与地图路标点作为统一的估计量进行整体状态估计,这算得上是同时定位与建图问题研究的起源。

在2006年,Durrant-Whyte和Bailey在其研究课题中首次使用SLAM(Simultaneous Localization and Mapping,同时定位与建图)这一名词进行表述。在其发表的论文[2]中,给SLAM问题制定了详细的概率理论分析框架,并对SLAM问题中的计算效率、数据关联、收敛性、一致性等进行了讨论,可以认为这是SLAM问题真正进入系统性研究的元年。而SLAM可以按时间简单划分为:古典SLAM和现代SLAM。

首先是古典SLAM时期。在Smith等人的那个年代,将机器人定位和建图问题转换成状态估计问题,在概率框架之中展开研究,利用扩展卡尔曼滤波(EKF)、粒子滤波(PF)等滤波方法来求解。到后来的Durrant-Whyte等人的年代,SLAM理论体系被建立起来了,并且该理论框架的收敛性得到了论证。可以说,在理论上SLAM问题已经得到解决了,这一时期也被称作SLAM的古典时期。在古典时期,滤波方法是解决SLAM问题的主要方法,EKF-SLAM算法就是最突出的代表。不过EKF-SLAM在非线近似和计算效率上都存在巨大的问题,于是就有人提出了能有效解决SLAM问题的Rao-Blackwellized粒子滤波算法,将SLAM问题中的机器人路径估计和环境路标点估计分开来处理,分别用粒子滤波和扩展卡尔曼滤波对机器人路径和环境路标点进行状态估计。之后,基于Rao-Blackwellized粒子滤波的SLAM算法诞生,该算法被命名为Fast-SLAM。其中也有人基于Rao-Blackwellized粒子滤波来研究构建栅格地图的SLAM算法,它就是ROS中大名鼎鼎的Gmapping算法。可以说,基于粒子滤波的SLAM算法大大提高了求解效率,让SLAM在工程应用中成为可能。

接着介绍现代SLAM时期。在贝叶斯网络中采用滤波法求解SLAM的方法,需要实时获取每一时刻的信息,并把信息分解到贝叶斯网络的概率分布中去,可以看出滤波方法是一种在线SLAM系统,计算代价非常大。鉴于滤波方法计算代价昂贵这一前提,机器人只能采用基于激光等观测数据量不大的测距仪,并且只能构建小规模的地图,这是古典SLAM鲜明的特征。为了进行大规模建图,在因子图中采用优化方法求解SLAM的方法被提出,优化方法的思路与滤波方法恰恰相反,它只是简单地累积获取到的信息,然后利用之前所有时刻累积到的全局性信息离线计算机器人的轨迹和路标点,也就是说优化方法是一种完全SLAM系统。由于优化方法糟糕的实时性,最开始并没有引起重视。随着优化方法在稀疏性和增量求解方面的突破,以及闭环检测方面的研究,优化方法体现出巨大的价值。得益于计算机视觉研究日趋成熟和计算机性能的大幅提升,基于视觉传感器的优化方法成为现代SLAM研究的主流方向。特别是2016年ORB_SLAM2开源算法的问世,给了学术界和商业界极大的鼓舞。

7.1.1 数据关联、收敛和一致性

在后面的SLAM理论和实践中,经常会碰到数据关联、收敛和一致性这些概念,这里就拿出来给大家介绍一下。

1.数据关联

SLAM建图是一个增量的过程,随着机器人不断对环境的探测,环境路标信息需要不断被加入到已构建出来的地图中。所谓数据关联,就是将传感器观测数据跟已构建出来的地图进行匹配,判断传感器观测数据中哪些路标特征是新的、哪些是旧的,并将新路标特征数据有效地融入到地图中。

比如,机器人在不同地方观测到环境中同一个实物所产生的路标特征,这个时候如果将该路标特征判断成新路标特征加入到地图中,这种错误数据关联将给整个SLAM计算引入致命的错误,这个错误引入的路标特征将对后续的计算产生持续的影响。数据关联出错,可能由传感器观测错误造成,也可能由机器人定位累积误差造成。严苛的路标特征剔除机制是地图信息自我纠错的有效手段,闭环检测则能大大降低定位累积误差。

2.收敛

收敛性用于衡量SLAM系统在理论上的可行性。由于机器人观测模型和运动模型都是具有不确定性的,所以SLAM被放在概率框架下讨论,并利用状态估计去求解,也就是说估计量都是带有不确定性的估计值。由路标特征组成的地图是实际环境特征的估计,估计出来的路标特征与实际环境特征存在偏差的原因是观测的不充分性导致的。换句话说,只要给机器人足够的机会对环境进行彻彻底底的观测,所得到地图的不确定性将最终消除,即构建出来的地图路标特征收敛于实际环境特征。

当然,这种收敛性是理论上讨论的东西。在设计SLAM系统时,肯定是需要首先保证SLAM系统在理论上的收敛性。但是理论上的收敛性只是第一步,实际工程应用中还有很多问题需要解决。比如,系统中数据关联算法非常糟糕时,虽然观测信息越来越多,但是错误信息也快速增加,系统很容易就发散开来。再比如,将机器人放置在一个运动范围受限的环境,虽然机器人能试图去全面观测环境,但是由于活动受限,环境中始终有很多未知特征无法获得。

3.一致性

不仅要关注估计问题的收敛性,还需要关注收敛的一致性,收敛一致性讨论估计量收敛于实际数值的问题。图7-1展示了收敛一致性问题。

图7-1  收敛一致性问题

如图7-1所示,是待估计参数真值,是估计量,是当前能获取到的k个观测值,下面用数学符号表示图中的两种收敛形式。第一种是弱一致收敛,当观测值规模k趋于无穷大时,依概率收敛于,如式(7-1)。所谓依概率收敛,是指随k不断增大,估计值趋近于,但是偶尔也会出现一些与偏差很大的值,只是这些偏差大的取值出现的概率将慢慢变为0。

第二种是强一致收敛,当观测值规模k趋于无穷大时,严格收敛于,如式(7-2)所示。

也就是说,第一种收敛并不能保证估计量的取值一定与真值一致,而第二种收敛能保证估计量的取值一定与真值一致。考虑到机器人中参数随时间变化的动态性,比如机器人的位姿会经常移动。那么估计不仅要具有良好的一致性,还要能在少量观测值条件下快速收敛[3] p123。

7.1.2 SLAM研究方向

SLAM是一个错综复杂的研究领域,涉及到非常多的关键技术。为了帮助大家理清学习思路,这里按照本书的叙述顺序,整理出了对应的学习动线,如图7-2所示。当然,这里的学习动线只是为了方便本书的叙述,有些概念表述在理论上可能并不严谨,如果存在疑问可以自行查阅相关资料。

图7-2  SLAM研究方向

后面将要讲到的SLAM具体实现算法,都是这个动线中的某条具体路线。比如Gmapping算法,就是“滤波方法+激光+占据栅格地图”这个路线的实现案例。再比如ORB_SLAM算法,就是“优化方法+视觉+路标特征地图”这个路线的实现案例。不难发现,想要学好SLAM,需要在全局上把握理论本质的基础上,将具体的SLAM实现算法在机器人本体上用起来。单纯地学习理论知识,或单纯地跑跑SLAM实现算法,都无法达到融会贯通的效果,更不用说依据实际需求修改完善开源SLAM代码或编写自己的SLAM代码了。

1.基本理论

(先占个坑,有时间再来补充详细内容,大家可以直接看文后的参考文献)

2.传感器

(先占个坑,有时间再来补充详细内容,大家可以直接看文后的参考文献)

3.地图

(先占个坑,有时间再来补充详细内容,大家可以直接看文后的参考文献)

4.场景

(先占个坑,有时间再来补充详细内容,大家可以直接看文后的参考文献)

源码仓库

  • Github下载:github.com/xiihoo/Books_Robot_SLAM_Navigation

  • Gitee下载(国内访问速度快):gitee.com/xiihoo-robot/Books_Robot_SLAM_Navigation

参考文献

【1】 张虎,机器人SLAM导航核心技术与实战[M]. 机械工业出版社,2022.

一起自学SLAM算法:7.1 SLAM发展简史相关推荐

  1. SLAM算法总结——经典SLAM算法框架总结

    SLAM算法总结--经典SLAM算法框架总结 SLAM算法总结--经典SLAM算法框架总结 SLAM算法总结--经典SLAM算法框架总结 从研究生接触SLAM算法到现在也有两三年了,期间学习了很多经典 ...

  2. slam算法_[招聘] SLAM算法工程师

    欢迎私信! 岗位:1-2名 薪资:25-50k 工作地点:深圳市龙岗区 工作职责 1. 基于激光雷达(LiDAR)或视觉SLAM的导航定位的算法和系统开发,包括但不限于: 2. 定位导航系统选型设计, ...

  3. slam算法_[招聘] SLAM算法工程师(实习生亦可)

    欢迎私信! 岗位:1-2名 薪资:15-35k 工作地点:深圳市龙岗区 实习生包住 工作职责 1. 基于激光雷达(LiDAR)或视觉SLAM的导航定位的算法和系统开发,包括但不限于: 2. 定位导航系 ...

  4. SLAM算法学习(2): SLAM原理理顺

    slam原理流程详解:http://www.360doc.com/content/10/0928/16/3482759_57075454.shtml (这里面主要涉及到自主定位部分,但并未谈到地图特征 ...

  5. 八种常用激光雷达和视觉SLAM算法的评估与比较

    文章:Evaluation and comparison of eight popular Lidar and Visual SLAM algorithms 作者:Bharath Garigipati ...

  6. 转:SLAM算法解析:抓住视觉SLAM难点,了解技术发展大趋势

    SLAM(Simultaneous Localization and Mapping)是业界公认视觉领域空间定位技术的前沿方向,中文译名为"同步定位与地图构建",它主要用于解决机器 ...

  7. 一起自学SLAM算法:11.5 强化学习与自主导航

    连载文章,长期更新,欢迎关注: 写在前面 第1章-ROS入门必备知识 第2章-C++编程范式 第3章-OpenCV图像处理 第4章-机器人传感器 第5章-机器人主机 第6章-机器人底盘 第7章-SLA ...

  8. 一起自学SLAM算法:7.4 基于贝叶斯网络的状态估计

    连载文章,长期更新,欢迎关注: 写在前面 第1章-ROS入门必备知识 第2章-C++编程范式 第3章-OpenCV图像处理 第4章-机器人传感器 第5章-机器人主机 第6章-机器人底盘 第7章-SLA ...

  9. 一起自学SLAM算法:7.7 典型SLAM算法

    连载文章,长期更新,欢迎关注: 写在前面 第1章-ROS入门必备知识 第2章-C++编程范式 第3章-OpenCV图像处理 第4章-机器人传感器 第5章-机器人主机 第6章-机器人底盘 第7章-SLA ...

最新文章

  1. linux平台调试终端,10款Linux平台上优秀的调试器,总有一款适合你!
  2. ORA-00904: 标识符无效——解决方案
  3. 跳水比赛背后的隐形教练现身了!百度智能云还完成了历史性的大升级
  4. 读《Android 安全架构深究》
  5. 例用C# 变更文件夹时间
  6. th标签能包裹select吗_电影《八佰》过后,他能摘掉马思纯前男友标签了吗?
  7. java 获取插入数据的自增长id
  8. 20个MySQL运维案例,请查收!
  9. 剑指offer——4.二维数组中的查找
  10. express : 无法将“express”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。express: command not found
  11. 基于JAVA获取行政区边界坐标_从百度地图批量获取中国县级以上行政区划边界坐标...
  12. android sdk环境变量配置
  13. linux开发板通过网线连接电脑
  14. C#报错Newtonsoft.Json.JsonSerializationException: “A member with the name ‘phone‘ already
  15. MFI认证——苹果MFI认证流程
  16. 在WINDOWS下的Services.mscl里有好几个ORACLE的SERVICES的一些作用
  17. java配置dsf,基于Spring-DM实现分布式服务框架(DSF)(二)
  18. 【Luat-esp32】3.陀螺仪-mpu6050
  19. 陀螺研究院 | 产业区块链发展周报(12.19—12.25)
  20. win7电脑开启wifi

热门文章

  1. csdn使用Markdown
  2. android xml apk jar反编译工具包
  3. 手写一个selenium浏览器池
  4. 开源工业自动化SCADA数据采集系统(基于win2016ser)
  5. 石头剪刀布php源码,微信小程序 石头剪刀布实例代码
  6. 【谨慎学习】手把手教你破解网站管理后台帐号密码
  7. 测试二手显卡性能什么软件好,网上的二手显卡是否靠谱?教你三招让你翻不了车...
  8. xds510 usb2.0驱动
  9. 银河麒麟操作系统基础学习笔记八
  10. js根据数据关键字实现模糊查询功能