1、前言
可能因为进入了新学期,本人遇到了几次身边小学弟和网友的提问:机器人学和SLAM该怎么入门好?由于回答了几次问题,就借着这个机会把问题的回答整理归纳下。这篇分享仅是根据本人入门Robitics和SLAM的亲身经历,基于一步一个脚印摸索而来的路线来尽可能避免小伙伴们走我的弯路,文章内容的广度和深度应该是不如网上其他大佬们整理出来的综述,但贵在真实可靠,希望对求学的伙伴们有些帮助,文章内容若有不当之处希望读者朋友们勘误。
本人当初的情况:本科专业是机械设计制造及其自动化,语言仅仅是C语言基础入门,工具软件也就用Matlab做了3次机械相关的大作业、电机的简单PID控制和毕设时的实验数据输出处理。读研时专业才转到了机器人学,开始了较为系统地学习相关知识,而本科时常用的软件如Solidwork、AutoCAD和Inventor、Ansys这些读研后就再也没用过了。
前置学习条件:高等数学、线性代数、概率论、C/C++基础、外加一个英语四级?
针对有时间可以系统性学习的相关理论的同学可以从第二部分开始阅读,针对时间不太够的朋友,可以以文章第三部分的内容为主。
回到正题,机器人学相关学习本人认为可以分成两个大部分:理论知识和语言能力。
语言能力单指C++,并不是说Python语言学了没有用,只是机器人学学术界和工业上的应用主要还是以C++为主。针对Robotics机器人学的理论知识,从场景类型的应用分类就有工业机械臂,移动机器人,无人机,手持式设备和无人船,从知识内容分类有运动控制:Kinematics运动学,Dynamics动力学,非线性系统控制理论;路径规划:Global Planning和Local Planning;定位建图:贝叶斯网络及原理,基于滤波的方法,基于优化的方法,各类点云配准算法,地图构建算法,etc;还有感知的各个算法,决策的框架等。但综合考虑所涉及的知识点无非就是李群李代数、状态估计、滤波算法和非线性优化理论、控制理论和一些具体算法。
Robotics和SLAM中的状态估计是贯穿始终的,而状态估计的学习又肯定离不开高等数学、线性代数、概率论和李群李代数,其中李群李代数应该是绝大多数初学者遇到的第一个难题,对李群李代数的理论知识理解很难深刻,公式的理解和推导过程又是乏味的。此处学习的重点本人认为是在于可以根据实际的应用场景来感受李群李代数在具体问题中的应用,故而推荐以下关键的学习资料:
·Joan Sola的《A micro Lie theory for state estimate on robotics》,论文内容十分精炼,这是为机器人学状态估计量身定做的一篇“Math Preliminaries”,必看,首推,并建议边读边推导和做笔记,真正做到理解其中的大部分内容;
·Timothy D. Barfoot的《State Estimation for Robotics》,书中第二部分:Three-Dimensional Machinery详细讲解了3D位姿变换并引入李群的概念以用作分析3D位姿变换。我个人感觉内容比《概率机器人Probabilistic Robotics》一书更适合入门,因为它不仅有引入概率的状态估计基础,而且不像《概率机器人》注重2D平面的应用,而是直接从3D的状态和位姿变换入手,本书最后还有一个完整的章节结合前两章的理论内容来分析实际应用的问题,内容不晦涩,很生动。
·Richard M. Murray、Zexiang Li的《A Mathematical Introduction to Robotic Manipulation》,这本书可以说是想从事工业机器人、机械臂相关领域的关键教材了,内容中是详细地包括基础理论,刚体运动变换理论、机械臂正逆运动学、动力学、机械臂运动规划和控制。虽然没有针对移动机器人相关的应用讲解,但是在3D位姿变换和李群李代数的运用上是相通的。
·中文教材,首推高翔博士的《视觉十四讲》,本人虽然没有完整地品读过《十四讲》的全部内容,但是学习中是参考了其中g2o和ceres的教程与代码示例,在我入门ceres时的帮助是很大的。
·K. Madsen, H.B. Nielsen, O. Tingleff的《METHODS FOR NON-LINEAR LEAST SQUARES PROBLEMS》,个人认为这篇著作对于非线性优化问题的帮助好比与上文中提到的《A micro Lie theory for state estimate on robotics》对状态估计问题的帮助,必看,首推,还是建议边读边推导和做笔记。
·Timothy D. Barfoot的《State Estimation for Robotics》,书中第一部分:Estimation Machinery介绍了贝叶斯理论和解释了状态量变量的不确定性,然后详细讲解了基础的KF与EKF,虽然介绍的基础滤波算法,但有详细地数学推导和证明,推荐跟着书中内容一起推算理解。
·Joan Sola的另一篇《Quaternion kinematics for the error-state Kalman Filter》,ESKF可以说是学习LIO 、VIO的必看论文,甚至后期算得上是“工具书”了。
这部分的内容是针对移动机器热或无人机的运动控制了,还有一小部分的轨迹规划内容。本人也仅仅是学习了三门相关的课程,课程中老师推荐的教辅资料就整理在这小节中了。
·H.K.Khalil的《Nonlinear-Systems》,这本教材是详细讲解了非线性系统中系统定义、稳定性分析和控制问题的相关解法,本人当时学习非线性系统控制时就是靠老师讲解和这本书入门的。
·Donald E. Kirk的《Optimal Control Theory: An Introduction》这本书老师在讲解时是引用了书中对系统的描述,对优化问题处理效果的分析,Dynamic Programming动态规划和最优控制法则,和书中第五节the variational approach to optimal control problem“最优控制问题的变分方法”的内容
·A E. Bryson.的《Applied Optimal Control: Optimization, Estimation, and Control》,这本书好像是美国高校里“动态系统控制和分析”的常见教材,除了介绍基础的优化问题定义和优化问题解法,书中注重针对各种场景条件下的动态优化问题解法的工程应用,当时学这门课时可没少被课程中的各种lab作业折磨。
(跑一下火车:想当初做优化控制问题相关的应用时,最头疼的就是评估系统的优化条件,推导系统的优化方程及最后系统+控制结果的稳定性,回想当初虽然痛苦,但对个人成长的帮助还是挺大的。)
·Howie Choset,Kevin M. Lynch,etc的《Principles of Robot Motion Theory, Algorithms, and Implementations》,这本算得上是学习机器人运动规划入门最好的教材之一了,涵盖了经典的运动、路径规划算法,同时还有针对各种场景的应用示例,很友好的著作,书中甚至还有一些简单位姿估计和优化控制的介绍。
·Steven M. LaValle的《PLANNING ALGORITHMS》,书中介绍了路径规划和运动规划中常见的算法,从离散的基于图的搜索(Graph Search Algorithms):D算法、A*算法,到Geometric Representations几何表示和The Configuration Space配置空间的定义,再到基于采用的搜索(Sampling Based Planning)和组合运动规划:Probablistic Road Map,RRT(RRT*),Cell Decomposition,Potential Field Method和Visibility Graph等。
虽然我不是科班出身的,但还是想推荐一下几本C++相关的资料,供大家学习参考。下面分享的书籍都是我完整研读过,并其中几本是反复阅读的,个人认为不仅是可以作为学习入门,还可以用作工具书使用。
·《Effective C++:改善程序设计的55个具体做法》
·《深入应用C++11:代码优化与工程级应用》
·《Effective STL》
·《数据结构与算法之美》
机器人学的工程能力和应用能力,除了需要C++的语言能力外,就是需要熟悉ROS环境和系统了。本人的ROS学习入门只使用了一本教材那就是大名鼎鼎的《ROS Robot Programming:From the basic concept to practical programming and robot application》和其配套的ROS wiki网站,当时学习起来都是不分昼夜地实现书中一个一个的教程示例,Linux系统和ROS系统及环境经历崩溃和重装不知道多少次,是真实地在痛苦中快速成长。
·ROS wiki:http://wiki.ros.org/cn
·ROS Moveit:https://docs.ros.org/en/kinetic/api/moveit_tutorials/html/index.html
·鱼香ROS,一键ROS安装、环境配置,重装系统神器,不允许大家不知道:http://www.fishros.com/#/fish_home
本小节以SLAM工程能力的提升出发,因为本人毕业后的工作内容是多传感器融合和建图定位,机器人的控制和运动规划就没再深耕了。
根据上文中每个分类里的模块,根据实际的需求和应用情况还需熟悉各类经典的处理策略和逻辑方法论。再者,抛开上层的各类算法和应用,若是想更进一步除了需要对模块内的知识有深入的研究和理解,最好还需清楚各类传感器的原理和特性以便于进行问题的建模和解算设计,若是满足于调调参,跑跑demo和简单应用应用,恐怕人就死在Robotics这片汪洋里了。
具体的提升其实还是依赖在相关模块的深耕,所以说本人认为至少得深入研究和熟悉2个及以上的经典SLAM工程,如果没有时间参照第二部分中的学习路线来系统学习相关的理论知识的话,也可以直接从工程代码开始,本人觉得至少得做到以下几点:
1)清楚其中每一个模块、每一个函数、每一行代码的设计目的和实现细节,这个是必须要做到的;
2)相关的SLAM工程中必然有配套的论文,对照着论文中的理论部分和代码中的实现部分,可以加强对两个方面的理解和能力的提升,同时在论文中若有不理解的公式推导,则可以专项地查询相关的理论依据,实时补充不足;
3)另外还有一个就是,需要在深入研读代码后,比对一下代码中有但是相对应论文中没有说明部分,这块内容就是一些作者自己的工程经验和一些小技巧的体现了,都是可以学习的地方。
最后就整理一下经典的SLAM算法系统,供大家学习参考:
Carto是一个非常非常好的基于图优化的SLAM系统,非常完整。系统模块中包含相对鲁棒的前端,基于submap和node约束独立的pose graph后端及各类评测工具。模块化、系统化、工程化程度很高, 封装很完善。但是若觉得cartographer的代码量实在太大,短期想简单了解下的话,可以选择平替的SLAM系统Karto。
·3D LiDAR SLAM: LOAM\Lego-LOAM\LIO-SAM;github链接:https://github.com/cuitaixiang/LOAM_NOTED;https://github.com/wykxwyc/LeGO-LOAM_NOTED/tree/master/src;https://github.com/TixiaoShan/LIO-SAM;相关论文:《LOAM: Lidar Odometry and Mapping in Real-time.》,《LeGO-LOAM: Lightweight and Groundoptimized Lidar Odometry and Mapping on Variable Terrain》,《LIO-SAM: Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping》。3D激光SLAM的系统,其实也是可以看看cartograppher,但更好的选择应该还得是LOAM系列相关的SLAM系统。
·Visual SLAM:可能有些人会推荐ORB-SLAM系列,但我这边首推VINS系列中的VINS-Fusion。Github链接:https://github.com/HKUST-Aerial-Robotics/VINS-Fusion;相关论文:《A General Optimization-based Framework for Global Pose Estimation with Multiple Sensors》,《VINS-Mono: A Robust and Versatile Monocular Visual-Inertial State Estimator》,《VINS on Wheels》,《On-Manifold Preintegration for Real-Time Visual-Inertial Odometry》,《Online Temporal Calibration for Monocular Visual-Inertial Systems》。
其实上述的经典SLAM系统,只要花时间和精力,理解通透一个系统后,其他SLAM系统的上手也就快了,毕竟背后的理论知识都是一样的,一通百通。最后附上一篇SLAM技术的综述文章,详见链接:https://zhuanlan.zhihu.com/p/501102444。
可详见文章:https://zhuanlan.zhihu.com/p/539375248
最后,希望读者朋友们能从本文中获取有价值的内容,望与各位技术同僚共勉,一同在SLAM技术道路上高歌猛进,完成我们未竟的事业。
本文仅做学术分享,如有侵权,请联系删文。