点击上方“3D视觉工坊”,选择“星标”
干货第一时间送达
https://www.zhihu.com/question/51707998/answer/1263706761
本文仅作为学术分享,如果有侵权,会删文处理
研究SLAM,对编程的要求有多高?作者:岑斌 https://www.zhihu.com/question/51707998/answer/1263706761
作为不知名slam从业者,狗刨江湖6年,回答一波。
本人技术差强人意,经验倒是累计不少,权当跟题主分享一下个人感受和看法吧。
题主问slam对编程的要求有多高。
大概有两三层楼那么高吧。(开篇先皮一下就很开心)
slam编程个人认为主要分两方面,基本技术和综合素质。
拿绘画做比方,首先都是先要提升技巧熟练度和色彩敏感度,成为一个合格的绘画技工。在这个过程中不断提高个人审美度,知道什么是美,什么是不美,形成自己的风格后,就进化成了艺术家。(手动狗头护身)
先说slam编程要求中的基本技术:
1、Matlab\c\c++
说来惭愧,我现在还在用matlab写的代码跑一些离线的数据来调试和验证。
跑一些轻量的算法代码还挺好用的。
gui之类的插件啊,plot做图形显示在ppt用来展示说明啊等等,反正就是当个工具来用。
如果真的用matlab跑offline slam,2015年的时候我试过,10米轨迹采集的数据,跑了16个小时...头都是晕的,没法实际调试。
毕竟matlab全称就是矩阵实验室嘛,理论和工程还是有差距的,最直接的体现就是效率上。
所以编程语言主力还是c\c++,不论是效率还是环境,在嵌入式端实时跑slam,毋庸置疑是不二选择。
我一直认为编程语言只是一件用来辅助工程师实现需求的工具箱。
尤其是c\c++,里面的工具琳琅满目,目不暇接,接天莲叶无穷碧。
要一口气吃饱,把所有技术都运用得融会贯通显然不切实际,也没有必要。
用工程化的术语来说,就是投入和产出比非常低下。
你可以在手边常备一本当作工具书,对大体的技术框架很了解(其实就是对目录烂熟于心),到时候遇到问题,边学边用即可。
手艺活嘛,贵在坚持,日积月累,自然而然,水到渠成,臻于化境。
2、通读经典源码
slam编程其实很容易入门。因为有非常多好的开源代码免费给你看。
就好比少林寺的易筋经某天突然在路边摊就可以用五毛钱买到的感觉,真的是血赚。
只是好东西不是每个人都能够消化的,有些好书也不一定就很好读。
要有耐心和毅力,仔仔细细、里里外外看几遍,受益匪浅。
当然这个很花时间,我有工作压力,一般挑着看部分算法的代码实现就完事儿了。
3、Google
这个懂的都懂。如果没有goole和GitHub,我的编程生涯是不完整的(狗头)
4、各种成熟的配套库和工具
ros, eigen, opencv, g2o, ceres, PCL等等,也是当工具使唤,先是拿来主义,后面再慢慢转化成自己的东西。
再说slam编程中的综合素质。
基本技巧可以让你守住饭碗,那么综合素质则是让你超凡脱俗的存在。
以下内容,题主信则有,不信就当听个说书。
1、逻辑能力
如果研究slam是练武修真的话,那么逻辑能力一定是里面最具杀力的剑术!
清晰的思维,缜密的逻辑,可以帮助你斩断乱麻,集中火力,直达本质,让自己的slam更上一层楼。
一样的算法,别人耗时不少,效果一般,你有出众的思维逻辑能力,优化代码后,可以做到耗时更短,效果更佳!
出现问题,经过数据分析,合理推断,能够更加快速的定位源头,解决问题。
2、数学功底
如果思维逻辑是剑术,那么数学就是内力。
降龙十八掌谁都知道厉害吧,但是如果没有内力支持,就只是一个花架子的拳脚功夫。
对slam来说,窃以为最重要的数学有两门,其一是线性代数,其二是概率论。
下限要求很低,目前主流的公式,直接拿来主义。
上限无限高,具体公式的推导和调整,包括有些magicvalue,不懂就是玄学,搞懂了用起来可以达到另一个境界。
以上就是我这个狗刨slam江湖六年的不知名小游侠的经验之谈。
做不了天上来地上飞的神仙大侠,起码也能在江湖里混口饭吃。
作者:半闲居士 https://www.zhihu.com/question/51707998/answer/127192245
大多数人本科阶段接触的都是MATLAB,所以希望之后研究SLAM也用它。 MATLAB确实有很多优点:语法简单,开发速度快,调试方便,功能丰富。然而,在SLAM领域,MATLAB缺点也很明显,主要是这两个:
· 需要正版软件(你不能实机上也装个盗版MATLAB吧);
· 运行效率不高;
· 需要一个巨大的安装包;
而相对的,C++的优势在于直接使用,有很高的运行效率,不过开发速度和调试方面慢于MATLAB。不过光运行效率这一条,就够许多SLAM方案选择C++作为开发语言了,因为运行效率真的很重要。同一个算法,拿MATLAB写出来实现不能实时,拿C++写的能实时,你说用哪个?
当然MATLAB也有一些用武之地。我见过一些SLAM相关的公开课程,让学生用MATLAB做仿真,交作业,这没有问题,比如SLAM toolbox 。同样的,比较类似于MATLAB的Python(以及octave)亦常被用于此道。它们在开发上的快捷带来了很多便利,当你想要验证一些数学理论、思想时,这些都是不错的工具。所谓技多不压身,题主掌握MATLAB和Python当然是很棒的。
但是一牵涉到实用,你会发现几乎所有的方案都在用C++。 因为运行效率实在是太重要了。
那既然有心思学MATLAB,为什么不学好C++呢?
---------------------分割线------------------
接下来说说C++大概要学到什么程度。用程序员的话说,C++语言比较特殊,你可以说自己精通了Java,但千万不要说自己精通了C++。C++非常之博大精深,有数不清的特性,而且随着时间还会不断变化更新。不过,大多数人都用不着学会所有的C++特性,因为许多东西一辈子都用不到。
作为SLAM研究人员,我们面对的主要是算法层面的开发,所以更关心如何有效地实现各种相关的算法。而相对的,那些复杂的软件架构,设计模式,我个人认为在SLAM中倒是占次要地位的。毕竟您用SLAM的目的是计算一个位置以及建个地图,并不是要去写一套能够自动更新的、多人网上对战功能的机器人大战平台。您的主要精力可能会花在矩阵运算、分块、非线性优化的实现、图像处理上面;您可能对并发、指令集加速、GPU加速等话题感兴趣,也可以花点时间学习;你还可能想用模板来拓展你的算法,也不妨一试。相应的,很多功能性的东西,比如说UI、网络通信等等,当你用到的时候不妨接触一下,但专注于SLAM上时就不必专门去学习了。
话虽如此,SLAM所需的C++水平,大抵要高于你在书本上看到的那些个示例代码。因为那些代码是作者用来向初学者介绍语法的,所以会尽量简单。而实际见到的代码往往结合了各种奇特的技巧,乍看起来会显得高深莫测。比方说你在教科书里看的大概是这样:
int main (int argc, char** argv ) { vectorvec; vec.push_back("abc"); for ( int i=0; i


微信扫码登录