1、前言
本回答仅是根据本人入门Robitics和SLAM的亲身经历,基于一步一个脚印摸索而来的路线来尽可能避免小伙伴们走我的弯路,文章内容的广度和深度应该是不如网上其他大佬们整理出来的综述,但贵在真实可靠,希望对求学的伙伴们有些帮助,文章内容若有不当之处希望读者朋友们勘误。
本人当初的情况:本科专业是机械设计制造及其自动化,语言仅仅是C语言基础入门,工具软件也就用Matlab做了3次机械相关的大作业、电机的简单PID控制和毕设时的实验数据输出处理。读研时专业才转到了机器人学,开始了较为系统地学习相关知识,而本科时常用的软件如Solidwork、AutoCAD和Inventor、Ansys这些读研后就再也没用过了。
前置学习条件:高等数学、线性代数、概率论、C/C++基础、外加一个英语四级?
内容大纲:理论知识学习+就业工程实践能力提升
理论学习部分: 机器人学的内容分类与教材推荐,语言学习书籍推荐;就业工程实践能力部分: 经典算法推荐与简单介绍,SLAM技术的研究方向讨论;
2、机器人学Robotics学习分类
回到正题,机器人学相关学习本人认为可以分成两个大部分: 理论知识和语言能力 。
语言能力 单指C++ ,并不是说Python语言学了没有用, 只是机器人学学术界和工业上的应用主要还是以C++为主。 针对Robotics机器人学的理论知识, 从场景类型的应用分类 就有工业机械臂,移动机器人,无人机,手持式设备和无人船, 从知识内容分类 有运动控制:Kinematics运动学,Dynamics动力学,非线性系统控制理论;路径规划:Global Planning和Local Planning;定位建图:贝叶斯网络及原理,基于滤波的方法,基于优化的方法,各类点云配准算法,地图构建算法,etc;还有感知的各个算法,决策的框架等。 但综合考虑所涉及的知识点无非就是李群李代数、状态估计、滤波算法和非线性优化理论、控制理论和一些具体算法。
2.1、理论知识:李群李代数和状态估计
Robotics和SLAM中的状态估计是贯穿始终的,而状态估计的学习又肯定离不开高等数学、线性代数、概率论和李群李代数,其中李群李代数应该是绝大多数初学者遇到的第一个难题,对李群李代数的理论知识理解很难深刻,公式的理解和推导过程又是乏味的。 此处学习的重点本人认为是在于可以根据实际的应用场景来感受李群李代数在具体问题中的应用 ,故而推荐以下关键的学习资料:
2.2、理论知识:非线性优化问题算法与滤波算法
2.3、理论知识:非线性优化与控制理论
这部分的内容是 针对移动机器人或无人机 的运动控制了,还有一小部分的轨迹规划内容。本人也仅仅是学习了三门相关的课程,课程中老师推荐的教辅资料就整理在这小节中了。
在本小结的末尾跑一下火车:想当初做优化控制问题相关的应用时,最头疼的就是评估系统的优化条件,推导系统的优化方程及最后系统+控制结果的稳定性,回想当初虽然痛苦,但对个人成长的帮助还是挺大的。
2.4、理论知识:运动规划
2.5、语言能力
虽然我不是科班出身的,但还是想推荐一下几本C++相关的资料,供大家学习参考。下面分享的书籍都是我完整研读过,并其中几本是反复阅读的,个人认为不仅是可以作为学习入门,还可以用作工具书使用。
3、机器人学工程能力提升相关
3.1、ROS系统
机器人学的工程能力和应用能力,除了需要C++的语言能力外,就是需要熟悉ROS环境和系统了。本人的ROS学习入门只使用了一本教材那就是大名鼎鼎的【ROS Robot Programming:From the basic concept to practical programming and robot application】和其配套的ROS wiki网站,当时学习起来都是不分昼夜地实现书中一个一个的教程示例,Linux系统和ROS系统及环境经历崩溃和重装不知道多少次,是真实地在痛苦中快速成长。
3.2、SLAM工程能力提升方法论
本小节以SLAM工程能力的提升出发,因为本人毕业后的工作内容是多传感器融合和建图定位,机器人的控制和运动规划就没再深耕了。根据上文中每个分类里的模块,根据实际的需求和应用情况还需熟悉 各类经典算法框架的处理策略和逻辑方法论 。再者,抛开上层的各类算法和应用,进一步的阶段中除了需要对算法模块内的数学及相关知识有深入的研究和理解,最好还需清楚各类传感器的原理和特性以便于进行机器人问题的建模和解算设计。若是满足于调参、跑开源算法demo和简单算法应用,恐怕人就死在Robotics这片汪洋里了。
具体的提升依赖的在相关模块中的深耕, 本人认为至少得深入研究和熟悉2个及以上的经典SLAM工程和具体案例 ,如果没有时间参照第二部分中的学习路线来系统学习相关的理论知识的话,直接从工程代码开始入门也是没有什么问题,只是本人觉得在其过程中至少得做到以下几点:
- 清楚其中每个模块、每个函数、每行代码的设计目的和实现细节,这个是必须要做到的;
- 相关的SLAM工程中必然有配套的论文, 论文中的理论知识是万万不能省略的 ,在分析代码中的实现部分时需要对照论文中的理论部分,同时加强对理论和实践以保证理解和能力的提升,同时在论文中若有不理解的公式推导,则可以专项地查询相关的理论依据,实时补充知识储备中的不足;
- 最后分享一个本人在阅读论文和代码时的小trick ,在深入研读代码后,可以尝试比对一下代码中有但是相对应论文中没有说明部分,这块内容就是一些作者自己的工程经验和一些小技巧的体现了,都是可以学习的地方。
下面是推荐入门学习的经典的SLAM算法系统,供大家学习参考:
github链接: https:// github.com/cartographer -project/cartographer ;
相关论文: 【Real-Time Loop Closure in 2D LIDAR SLAM】,【Real-Time Correlative Scan Matching】,【Efficient Sparse Pose Adjustment for 2D Mapping】。
Carto是一个非常非常好的基于图优化的SLAM系统,非常完整。系统模块中包含相对鲁棒的前端,基于submap和node约束独立的pose graph后端及各类评测工具。模块化、系统化、工程化程度很高, 封装很完善。但是若觉得cartographer的代码量实在太大,短期想简单了解下的话,可以选择平替的SLAM系统 Karto 。
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系统。
可能有些人会推荐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】。
VINS系统中的VO部分是利用的 特征提取并使用稀疏光流进行快速高效地跟踪位姿 ,然后在优化中除了利用惯性传感器的观测构建残差项外,还利用重投影误差构建残差项实现对位姿的优化。 而除了像VINS和ORB这类使用视觉特征进行匹配的方法外,还有一种视觉直接法的匹配,比如经典的DSO就是使用的直接法,上述中LiDAR SLAM中LOAM系是点云特征匹配方案,Cartographer属于点云直接法配准方案 ,这里就不展开细说差异了。
其实上述的经典SLAM系统,只要花时间和精力,理解通透一个系统后,其他SLAM系统的上手也就快了,毕竟背后的理论知识都是一样的,一通百通。最后附上一篇SLAM技术的综述文章,详见链接:https:// zhuanlan.zhihu.com/p/50 1102444 。
4、SLAM领域研究方向讨论
可详见文章:https:// zhuanlan.zhihu.com/p/53 9375248
5、小结
最后,希望回答中的内容能对题主和读者们有所帮助,望与各位技术同僚共勉,一同在SLAM技术道路上高歌猛进,完成我们未竟的事业。
我是致力于机器人和自动驾驶技术研究的Sky Shaw,乐衷于在知乎上分享前沿技术的分析和个人职业经验,欢迎大家点赞和关注支持