编辑丨3D视觉工坊

方法一

作者|半闲居士

https://www.zhihu.com/question/553199862/answer/2672914532

Good question. 这种问题分两种情况:

一是你准备从头开始撸某个slam系统,所谓的start from scratch,正向设计,那么可以按照模块-单线程-多线程-分布式的方式去写。写一点内容就写一个测试,用测试驱动你的功能。大部分现有系统也是这么个发展逻辑,不可能一上来就设计一堆节点相互通信。

如果自己写的话,我通常不写多个node类型的程序,我自己管理各个线程之间通信就行了,用不着从ROS那边再转一通。这样写出来的程序还不依赖ROS,很多地方即插即用,兼容性好一些。

对于一些本身就写的不好的slam系统,或者本身就已经很复杂,什么功能都揉在一起的系统,从头写也是有必要的。然而自己从头写也意味着自己趟一遍所有坑。有些逻辑类的调试相对简单,数值类的调试就很麻烦(比如矩阵某块的符号写反了这种),即使有单元测试也不保证系统实际跑起来就是对的。这种就看个人的经验了。所谓没把点云整飞过的人都是没写过激光slam的。

第二种情况是在现有系统上面改,这样可以不用自己去趟坑,但能改成什么样,很大程度上要看原生系统写成什么样子。原生系统是分布式的,你断点了某个node,其他node并不会跟着断点,所以想要舒服地调试,恐怕还得自己把它改成单节点单线程的。如果原生的slam系统实现现的比较好,各模块可以解耦复用,那写起来还舒适一些。如果原生的系统已经把各种东西揉在一块了,那改写也没有什么特别好的办法。所以很多人还是会回过头去尝试第一种方法。

比如vslam里的dso,属于效果很好但代码写的很无敌的,从头照着原理再写一个可能是更好的办法,例如:

1)https://github.com/versatran01/dsol

2)https://github.com/jzubizarreta/dsm

这两个都算从头写的。当然也有在dso基础上改的,只是一般不太敢去动他原生代码。

至于lio-sam,它是在lego-loam上面改的,lego-loam又是在loam基础上改的,loam和lego-loam自己还有各种各样的变种。这种传了几代人的代码就是会比较复杂(当然比vslam还是要少不少东西)。用哪种方案取决于你想改哪块东西。如果只想改个小功能,比如提不同特征这种或者后端各种优化因子改个个形式,那大部分东西就不用动。如果要改整体框架,那就不妨自己从头起一个然后把一些必要的东西移进来。写论文的话,不妨把创新点尽量限制在一个范围内,在某些地方实现不同的效果就可以了,没必要追求大而全地把所有东西都包进来。

方法二

作者|菠萝包包包

https://www.zhihu.com/question/553199862/answer/2673570083

确实像高博说的,有的写的太乱只能重构,但单纯的重写,可能治标不治本,往后项目不免还是变成一团。

我们最近也在LOAM系基础上魔改,最终的办法是:进行功能拆分和隔离,说人话就是把系统拆散,不要纠缠在一起,让每个功能能支持单独调试。

作为更小的功能分割单位,单模块肯定会比乱作一团的系统好调试,并且一个模块内基本都是同步代码,定位问题比异步的情况要简单的多。

我自己写了一套模块化的系统框架,然后把lio-sam那套重构,拆散成功能模块封装,这样日后有什么其他好的想法和功能也可以作为新模块直接替换或者植入。

当初决定这么做,就是因为项目人多起来之后,开源的那套耦合严重的代码大家基本没法协同了,牵一发而动全身。

并且之前做Demo的阶段就异常痛苦:明明只是一个简单的功能修改或者添加,得前后小心翼翼适配调试。

正好那段时间项目不那么紧,于是参考游戏引擎的设计自己搭了一套框架,本来LOAM系那套东西里的实现就有很多“奇怪”的地方,于是干脆拆散重写成一个个模块了。

公司项目没法开源了,不过自己基于ROS去把原系统拆分封装成节点也是一样的,虽然ROS1节点多了会有各种问题。

个人觉得算是一个思路吧,但是要这么搞,得有一个对系统整体结构和代码都很熟悉的人,去拆分解耦整个系统,对这个人本身其实帮助不大,还费功夫。

算是前人栽树后人乘凉了吧。

本文仅做学术分享,如有侵权,请联系删文。

干货下载与学习

后台回复:巴塞罗自治大学课件,即可下载国外大学沉淀数年3D Vison精品课件

后台回复:计算机视觉书籍,即可下载3D视觉领域经典书籍pdf

后台回复:3D视觉课程,即可学习3D视觉领域精品课程

3D视觉工坊精品课程官网:3dcver.com

1.面向自动驾驶领域的多传感器数据融合技术

2.面向自动驾驶领域的3D点云目标检测全栈学习路线!(单模态+多模态/数据+代码)
3.彻底搞透视觉三维重建:原理剖析、代码讲解、及优化改进
4.国内首个面向工业级实战的点云处理课程
5.激光-视觉-IMU-GPS融合SLAM算法梳理和代码讲解
6.彻底搞懂视觉-惯性SLAM:基于VINS-Fusion正式开课啦
7.彻底搞懂基于LOAM框架的3D激光SLAM: 源码剖析到算法优化
8.彻底剖析室内、室外激光SLAM关键算法原理、代码和实战(cartographer+LOAM +LIO-SAM)

9.从零搭建一套结构光3D重建系统[理论+源码+实践]

10.单目深度估计方法:算法梳理与代码实现

11.自动驾驶中的深度学习模型部署实战

12.相机模型与标定(单目+双目+鱼眼)

13.重磅!四旋翼飞行器:算法与实战

14.ROS2从入门到精通:理论与实战

15.国内首个3D缺陷检测教程:理论、源码与实战

16.基于Open3D的点云处理入门与实战教程

重磅!3DCVer-学术论文写作投稿 交流群已成立

扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。

同时也可申请加入我们的细分方向交流群,目前主要有3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、多传感器融合、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流、ORB-SLAM系列源码交流、深度估计等微信群。

一定要备注:研究方向+学校/公司+昵称,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。原创投稿也请联系。

▲长按加微信群或投稿,加微信:dddvision

▲长按关注公众号

3D视觉从入门到精通知识星球:针对3D视觉领域的视频课程(三维重建系列、三维点云系列、结构光系列、手眼标定、相机标定、激光/视觉SLAM自动驾驶等)、知识点汇总、入门进阶学习路线、最新paper分享、疑问解答五个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近4000星球成员为创造更好的AI世界共同进步,知识星球入口:

学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

圈里有高质量教程资料、答疑解惑、助你高效解决问题

觉得有用,麻烦给个赞和在看~  

SLAM算法开发中,C++编程+多节点的正确调试方法相关推荐

  1. PHP开发中常见的安全问题详解和解决方法

    PHP开发中常见的安全问题详解和解决方法 参考文章: (1)PHP开发中常见的安全问题详解和解决方法 (2)https://www.cnblogs.com/walblog/articles/83313 ...

  2. Android开发中常见的内存泄露案例以及解决方法总结

    Android开发中常见的内存泄露案例以及解决方法总结 参考文章: (1)Android开发中常见的内存泄露案例以及解决方法总结 (2)https://www.cnblogs.com/shen-hua ...

  3. SLAM算法评估中的轨迹拟合与外参求解

    文章同步更新到github pages,欢迎收藏 文章目录 问题描述 数学关系 求解方法 求解$_{gp}^{gv}T$ 求解$_{lp}^{lv}T$ 交替迭代优化 时间戳对齐 实验结果 参考文献 ...

  4. 结合Unity开发中一些编程基础概念与原理性知识总结

     目录: //里氏替换 //抽象类和接口 //虚函数(方法)和抽象方法.普通方法.重载.重写 //指针.引用.值类型.引用类型 //程序.进程.线程.死锁.协程 //内存的几个分区及其作用 //con ...

  5. 游戏开发中2D场景下实现伪3D碰撞检测方法

    当前市面上有许多2D类型的格斗游戏,比如经典的KOF,侍魂,DNF,还有现今的摸头村手游等等,2D游戏众所周知只有两个轴--X轴和Y轴,需要完成攻击判定也仅仅只能通过构建一个2D的碰撞器,通过碰撞器检 ...

  6. 小程序开发中使用节流函数throttle的正确方式

    问题 以前在开发小程序项目时,经常遇到节流需求,然后研究了好久都没成功.今天又遇到了,终于被我弄成功了.原来是使用方法错误,终究还是Javascript的基本功差导致的. 使用的小程序开发框架是mpv ...

  7. 【算法】论平衡二叉树(AVL)的正确种植方法

    参考资料 <算法(java)>                           - - Robert Sedgewick, Kevin Wayne <数据结构>       ...

  8. ESP32开发环境的搭建和 ESP-IDF支持以下调试方法

    ESP32开发环境的搭建 ESP-IDF 支持以下调试方法: 一. JTAG 二. GDB调试 三. 日志系统 四. Core Dump 五. esp32 heap 内存管理简析 ESP32开发环境的 ...

  9. android监听器在哪里创建,[转载]android开发中创建按钮事件监听器的几种方法

    第一种:匿名内部类作为事件监听器类 Button button=(Button) findViewById(R.id.button); button.setOnClickListener(new On ...

  10. jsp开发中cannot resolve taglib with uri的解决方法

    问题描述: IDE错误提示:cannot resolve taglib with uri http://java.sun.com/jsp/jstl/fmt 或者 cannot resolve tagl ...

最新文章

  1. OpenSSL简介及在Windows、Linux、Mac系统上的编译步骤
  2. 软件质量保证计划_软件测试计划 笔记
  3. java中example函数作用_MyBatis逆向工程中的Mapper接口以及Example的实例函数及详解...
  4. Java开发需掌握的常用Linux命令(持续更新)
  5. linux 进程数量限制,LINUX下每进程限制线程数量
  6. 4.50Nginx负载均衡
  7. 用c语言实现蚂蚁算法,rsa算法的c语言实现
  8. 转换php script类型,ECMAScript 类型转换
  9. 用matlab进行拉普拉斯滤波,[转载]matlab滤波技术及区域处理---线性滤波
  10. 海康摄像头近距离不能对焦模糊问题
  11. Python植物大战僵尸源码分享
  12. InfoGAN详细介绍及特征解耦图像生成
  13. matlab 期权delta,欧式期权定价(BS方法delta值和隐含波动率计算)
  14. 数组的下标为什么从0开始而不是从1开始
  15. 华为数通笔记-NDP原理
  16. 消息称魅族将首发Helio X30:今年用联发科是最好选择
  17. Proxifier使用代理ip教程
  18. 【转】本人常用资源整理
  19. ajax,HTTP原理 : 网络传输协议,网页从输入url到渲染的流程,函数防抖和节流
  20. Python之——UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 0 解决办法

热门文章

  1. Spotfire 连接mysql数据库
  2. iOS人脸识别(CoreImage)
  3. 网络故障和网络诊断工具(5.0)
  4. 小学生计算机应用教学ppt,小学计算机课件ppt
  5. 天地图矢量mxd版标准地图
  6. 微信小程序实现登录注册页面
  7. itext实现PDF模板套打java,生成电子合同电子收据电子发票
  8. Java开发快递物流项目(7)
  9. Shiro完整教程, 附带各种配置
  10. 《人月神话》出版后的网友评论