点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

研究SLAM的同学平时除了要看很多头疼的公式原理外,对编程也是有不少要求的。在学生阶段,很多同学都是用MATLAB作为主要编程语言,容易上手又简单。但是去看SLAM的开源代码,发现基本清一色都是C++,而且有不少开源代码使用C++到了出神入化的地步了。那么问题来了,学习SLAM是否可以不拘泥于编程语言的选择?到底对编程的要求有多高?

本文来自知乎上的同名问题,已经征得了部分答主的授权,对几个优秀回答进行了整理,如下

高翔

关于MATLAB

题主说MATLAB,主要原因是大多数人本科阶段接触的都是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++大概要学到什么程度。用程序员的话说,C++语言比较特殊,你可以说自己精通了Java,但千万不要说自己精通了C++。C++非常之博大精深,有数不清的特性,而且随着时间还会不断变化更新。不过,大多数人都用不着学会所有的C++特性,因为许多东西一辈子都用不到。

作为SLAM研究人员,我们面对的主要是算法层面的开发,所以更关心如何有效地实现各种相关的算法。而相对的,那些复杂的软件架构,设计模式,我个人认为在SLAM中倒是占次要地位的。毕竟您用SLAM的目的是计算一个位置以及建个地图,并不是要去写一套能够自动更新的、多人网上对战功能的机器人大战平台。您的主要精力可能会花在矩阵运算、分块、非线性优化的实现、图像处理上面;您可能对并发、指令集加速、GPU加速等话题感兴趣,也可以花点时间学习;你还可能想用模板来拓展你的算法,也不妨一试。相应的,很多功能性的东西,比如说UI、网络通信等等,当你用到的时候不妨接触一下,但专注于SLAM上时就不必专门去学习了。

话虽如此,SLAM所需的C++水平,大抵要高于你在书本上看到的那些个示例代码。因为那些代码是作者用来向初学者介绍语法的,所以会尽量简单。而实际见到的代码往往结合了各种奇特的技巧,乍看起来会显得高深莫测。比方说你在教科书里看的大概是这样:

int main ( int argc, char** argv )
{vector<string> vec;vec.push_back("abc");for ( int i=0; i<vec.size(); i++ ){// ...}return 0;
}

你看了C++ Primer Plus,觉得C++也不过如此,并没有啥特别难以理解的地方。然而实际代码大概是这样的:

嵌套的模板类(来自g2o的块求解器):

g2o::BlockSolver< g2o::BlockSolverTraits<3,1> >::LinearSolverType* linearSolver = new g2o::LinearSolverDense<g2o::BlockSolver< g2o::BlockSolverTraits<3,1> >::PoseMatrixType>();
g2o::BlockSolver< g2o::BlockSolverTraits<3,1> >* solver_ptr = new g2o::BlockSolver< g2o::BlockSolverTraits<3,1> >( linearSolver );
g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg( solver_ptr );
g2o::SparseOptimizer optimizer;
optimizer.setAlgorithm( solver );

模板元(来自ceres的自动求导):

virtual bool Evaluate(double const* const* parameters,double* residuals,double** jacobians) const {if (!jacobians) {return internal::VariadicEvaluate<CostFunctor, double, N0, N1, N2, N3, N4, N5, N6, N7, N8, N9>::Call(*functor_, parameters, residuals);}return internal::AutoDiff<CostFunctor, double,N0, N1, N2, N3, N4, N5, N6, N7, N8, N9>::Differentiate(*functor_,parameters,SizedCostFunction<kNumResiduals,N0, N1, N2, N3, N4,N5, N6, N7, N8, N9>::num_residuals(),residuals,jacobians);
}

C11新特性(来自SVO特征提取部分)

void Frame::setKeyPoints()
{for(size_t i = 0; i < 5; ++i)if(key_pts_[i] != NULL)if(key_pts_[i]->point == NULL)key_pts_[i] = NULL;std::for_each(fts_.begin(), fts_.end(), [&](Feature* ftr){ if(ftr->point != NULL) checkKeyPoints(ftr); });
}

谜之运算(来自SVO的深度滤波器):

void DepthFilter::updateSeed(const float x, const float tau2, Seed* seed)
{float norm_scale = sqrt(seed->sigma2 + tau2);if(std::isnan(norm_scale))return;boost::math::normal_distribution<float> nd(seed->mu, norm_scale);float s2 = 1./(1./seed->sigma2 + 1./tau2);float m = s2*(seed->mu/seed->sigma2 + x/tau2);float C1 = seed->a/(seed->a+seed->b) * boost::math::pdf(nd, x);float C2 = seed->b/(seed->a+seed->b) * 1./seed->z_range;float normalization_constant = C1 + C2;C1 /= normalization_constant;C2 /= normalization_constant;float f = C1*(seed->a+1.)/(seed->a+seed->b+1.) + C2*seed->a/(seed->a+seed->b+1.);float e = C1*(seed->a+1.)*(seed->a+2.)/((seed->a+seed->b+1.)*(seed->a+seed->b+2.))+ C2*seed->a*(seed->a+1.0f)/((seed->a+seed->b+1.0f)*(seed->a+seed->b+2.0f));// update parametersfloat mu_new = C1*m+C2*seed->mu;seed->sigma2 = C1*(s2 + m*m) + C2*(seed->sigma2 + seed->mu*seed->mu) - mu_new*mu_new;seed->mu = mu_new;seed->a = (e-f)/(f-e/f);seed->b = seed->a*(1.0f-f)/f;
}

我不知道你们看到这些代码是什么心情,总之我当时内心的感受是:卧槽这怎么和教科书里的完全不一样啊!而且研究了半天发现人家居然是对的啊!

[我不是很擅长贴表情图总之你们脑补一下就好]

总而言之,对C++的水平要求应该是在教科书之上的。而且这个水平的提高,多数时候建立在你不断地看别人代码、码自己代码的过程之上。它是反复练习出来的,并不是仅仅通过看书就能领会的。特别是对于视觉SLAM问题,很多时候你没法照着论文把一套方案实现出来,这很大程度上取决于你的理论和代码功底。

所以,请尽早开始学习C++,尽早开始使用C++,才是研究SLAM的正确之道。不要长期彷徨在自己的舒适区里犹豫不决,这样是没有进步的。(同样的道理亦适用于想研究SLAM但不愿意学习Linux的朋友们)

Kache

我觉得对编程要求还是挺高的,先从后端说起吧
g2o, gtsam,ceres知道是肯定需要知道的,三者其实学习曲线都挺难的,你觉得你会用了是一回事,然后用好是一回事,自己写vertex, edge, factor, cost function又是另外一回事,如果你会写g2o里面的solver应该又是一个级别了吧。但是这三个在网上的资源而论g2o > ceres > gtsam。再者,你会调用api就代表你懂优化了吗,自己动手matlab写一下gauss-newton应该也可以试一试吧。当然,远古一点了levmar也很不错哦。直到这里,你确定你明白各种算法底层suitesparse里面的效率问题吗,如果挖掘到了这一层,还有各种线性代数库的比较哦,肯定是又快有慢。所以说,想要学会一到两个优化器不难,学会自定义有一点难,考虑到后端的效率自己写solver更难,深入到线性代数库的最底层,考虑问题结构,提升效率就更难了

前端,其实仅仅考虑点特征,也就那么多东西,V-SLAM用OPENCV也就够用了,而且opencv我觉得到API调用那一层也就足够了。如果考虑上RGBD,再加上一个PCL。理论知识方面基本的Multiview geometry其实也就足够了。但是前端的问题在于很多都是经验的东西,参数的选择,循环的次数等等。说白了我个人觉得视觉部分调参的问题更多,理论倒是不容易出问题。

前后段一起的话,什么线程管理就不用说了,该用的库都得上,例如boost啥的。有时候做visualization可能还需要一些别的库。

说完好像要求也就那样,反正我又不是CS出身活得还好好的

邵天兰

要搞SLAM,编程能力非常非常重要。编程能力就像运动员的力量和体能,是一切技巧和战术的基础。虽然研究的是算法,但良好的编程能力能够使你节省大量的时间,并且达到更好的效果。

根据我的经验,算法搞得特别好的人很少有编程不行的,因为编程好可以使你能够迅速验证想法。见过不少学生因为编程基础不好,在实现和debug上浪费大把大把的时间。这样的人当然很难把算法搞好。

这里编程能力有很多方面,以下简单说几个。赞多了再补( ̄▽ ̄)/

1. 阅读代码的能力
未说写,先说读。搞科研和搞工程都大忌闭门造车,除了paper外,开源代码是最有效的学习途径。一般而言,paper中只是着重描述比较创新的部分,80%以上的实现细节(甚至很多很关键的东西)需要从代码中了解。编程不好的人,往往也不太会读代码。

2. 架构软件,管理复杂项目的能力
一个SLAM方案通常由很多模块组成。我见过不少实验室的内部代码,一锅粥,学生们各种胡乱修补。这样必然导致效率低下。如果能做到模块化、低耦合,可以使开发事半功倍。

3. 高效实现的能力
过去八年间,我最少的一年也码了两万多行。。。根据我的体会,同样的算法,好的实现可以比不好的实现快2-10倍。复杂度越高越如是,例如3D  SLAM。要拥有高效实现的能力,必须熟悉常用的数据结构,对复杂度分析形成很好的直觉。

4. 管理多线程、异步程序的能力
SLAM往往涉及到多线程和异步程序,例如用于后端优化等。玩儿不转这个就会出现程序不稳定,或效率低。

Matlab不能满足需要。Matlab对数据结构的支持太差,而且速度慢。即使不考虑产品,只是做算法,也很不适合。自己做算法验证基本上就是C++或python,如果你因为不熟悉这些而选其他语言,会因为参考少、轮子少的原因效率很低。强烈建议题主学习C++。

好消息,小白学视觉团队的知识星球开通啦,为了感谢大家的支持与厚爱,团队决定将价值149元的知识星球现时免费加入。各位小伙伴们要抓住机会哦!

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

研究SLAM,对编程的要求有多高?相关推荐

  1. 一些研究SLAM的团队和网站 [2008年10月20日]

    1. http://www.openslam.org/ 2. http://www-personal.acfr.usyd.edu.au/nebot/victoria_park.htm 经典数据库 3. ...

  2. NVIDIA研究人员利用AI将标准视频转换为高质量慢动作镜头

    内容来源:ATYUN AI平台 来自NVIDIA的研究人员开发了一个基于深度学习的系统,该系统可以用每秒30帧的视频制作高质量的慢动作视频,超过了旨在实现相同效果的各种方法.研究人员将在本周CVPR会 ...

  3. 编程c语言读后感,《高质量c语言编程》读后感

    当阅读完一本名著后,你心中有什么感想呢?需要回过头来写一写读后感了.那么你真的懂得怎么写读后感吗?下面是小编帮大家整理的<高质量c语言编程>读后感范文,希望能够帮助到大家. 读完<高 ...

  4. 基于matlab编程方法实现模糊推理及解模糊的方法研究,基于Matlab编程方法实现模糊推理及解模糊的方法研究.doc...

    基于Matlab编程方法实现模糊推理及解模糊的方法研究 基于M a tlab 编程方法实现模糊推理及解模糊的方法研究 王海江, 陈 瑾, 徐卫忠 (中船重工集团 第七一一研究所 上海 200090) ...

  5. 【VBA研究】VBA编程产生不重复随机数

    作者:iamlasong VBA编程实现不重复随机数输出.VBA里的随机函数是RND,在工作表中随机函数是RAND,一字之差,可要记好了.RND取值范围是[0,1),意思是0和1之间的一个随机数,包含 ...

  6. 科大讯飞2019秋招研究算法笔试编程题

    第一题 样例输入 2 5 60 59 20 30 90 100 5 60 59 20 10 10 100 样例输出 1 2 Hint 对于第一组数据,将59改成60即可 AC代码: def minst ...

  7. 智驾科技招聘|SLAM算法总监、感知定位、高精地图等岗位(20~50K)

    公司介绍 上海智驾汽车科技有限公司(智驾科技 MAXIEYE),是一家智能驾驶和智慧出行领域的核心技术服务商.我们为客户及合作伙伴提供全工况.多场景.跨平台的辅助驾驶(ADAS)和自动驾驶(ADS)系 ...

  8. 立足自主创新,编程猫助推国内高质量编程教育普及

    来源:金融界百家 2017年,国务院印发<新一代人工智能发展规划>,要求在中小学阶段设置人工智能相关课程,逐步推广编程教育.编程教育逐渐受到广泛重视,作为国内少儿编程赛道先行者,编程猫始终 ...

  9. 计算机编程薪资真有那么高?真实,有的一毕业就失业,有的一毕业就进大厂

    计算机行业的薪资高于不高,与所在的城市有关,与所在的公司有关,最重要的是,与个人能力有关. 前段时间,某培训机构晒出来的 Java 学员的就业薪资榜. 虽然这张图片有些模糊,但放大后,能看得很清楚,有 ...

最新文章

  1. 上班第一天公司就倒闭了??? | 每日趣闻
  2. boost的字符串处理函数——format
  3. 在Exchange Server 2007中使用多主机名称证书
  4. SQLite安装、编译与应用
  5. 大牛唐健,带你领略游戏服务器与后台架构的奥妙
  6. sql server系统表详细说明(转)
  7. 基于几何距离的椭圆拟合
  8. 交叉报表crosstab隐藏列名显示_SAP软件 报表查询之 输出格式设置
  9. [css] 如何形成BFC?
  10. Unity3d地形刷入自定义树木
  11. 培养逻辑思维的app_久趣数学思维V1.4.1-久趣数学思维APP下载
  12. 湘教云实名服务平台怎样认证_【i通知】小贝喊你来校园一卡通微信支付实名认证!...
  13. galleryview-3.0b3使用小记
  14. Cortex-M3 (NXP LPC1788)之IIS控制器
  15. 《浪潮之颠》学习笔记
  16. 详解AUTOSAR:Green Hills Software(GHS)编译下载瑞萨RH850程序(环境配置篇—2)
  17. 什么人才适合学习嵌入式?嵌入式就业做什么?
  18. Mysql断流_Hystrix 断流器
  19. 基于2.4GHz射频NRF24L01模块的智能家居项目总结
  20. node.js PM2部署项目

热门文章

  1. Python快速入门,你想要的就在这里了!
  2. 刷新记录,算法开源!字节跳动获人体姿态估计竞赛双冠 | CVPR 2019
  3. 智能音箱玩出新花样?这家公司推出2699元的智能虚拟机器人
  4. 22首很棒的诗词欣赏,你相信这是AI的杰作吗?
  5. 惊艳!基于RNN的AI写词机竟能写出如此优秀的情诗!
  6. 不吹不黑!让你搜遍GitHub都找不到这么吊炸天的网约车项目!
  7. 从0梳理1场CV缺陷检测赛事!
  8. 【收藏】万字综述,核心开发者全面解读PyTorch内部机制
  9. 声波刺激就可长出新骨头?每天只需10分钟,干细胞5天快速分化,芯片装置只需1美元...
  10. 中国内地高校ESI排名出炉:342所大学上榜