最近做产设和综述把头都整晕了,本来想认真更新GPU那篇DSP的姊妹篇,突然觉得太长了实在是没有写的欲望,还是写篇杂文算了。。。一看这个标题就知道

首先如果没有关于机器人状态估计(4)-成长路径与能力提升这块基础知识建议自行劝退。。。别往下看了,还差得太远。

之前有提过:

一个完美的VIO,其实是一个既要又要还要且要的东西,非常的恶心:

1.既要位姿准确(ORB-SLAM3, VINS-MONO)

2.又要能够半稠密建图(DSO, DM-VIO)

3.还要能够工程化,克服各种极端情况,ZUPT等 (PR-MONO1)

4.且要低开销(只能在高性能高算力平台上跑的东西根本没有足够商业价值-除自动驾驶,违背VINS/VIO等基础设计宗旨)

这种同时满足1,2,3,4的东西当下是不存在的,但是作为一个正在努力奋战3项全能的小组,还是有必要去给大家避避坑。PS: 我们1/3/4全能的软硬件已经基本成型。

首先讲一下工程的难度递进:

1.二维SLAM(满地都是能跑的代码,主流轮速计+IMU卡尔曼滤波,单点激光或TOF二维网络栅格地图)

2.双目VSLAM+部分传感器松耦(很简单,测距硬件算子市面挺多了,没有测距算子的话开销比较高基本解决不了4,户外调测难度大,不同场景应用基线不同,很容易飘,室外耦合RTK,室内耦合轮速计/imu会好一点,开销更高了。。。)

3.单目VSLAM +部分传感器松耦(开销比双目低,调测起来方便,精度和毛病更多,初始化会被客户与伙伴来回diss,但是比VIO善良多了)

4.多目或全景VSLAM+部分传感器松耦(牛比,牛比还是牛比的好方案,做得好的话鲁棒性极好,好几个师弟在弄这块,不对我的胃口,因为传感端更重了!开销激增,另外不还是得耦合别的传感器,切~~)

5.VIO+部分传感器松耦(这个是我最喜欢的方案,一般尽量要耦合进去个D相机用来建图或者避障,其他要耦合的传感器还是那一些,缺点就是难度太大。。。紧耦合开销也是巨高,建议有能力的话把轮速计也紧耦合进去)

6.双目+VIO+部分传感器松耦(这个方案比楼上那个难度更大,工作繁杂,但是我觉得除了L2-L3辅助驾驶其他地方没啥用,可以参考DJI和五菱宏光的联合方案)

今天的思路是先从VSLAM和VIO主流路径优缺点来分析工程难点:

1. ORB-SLAM2和ORB-SLAM3:这个东西怎么说呢。。。还是不错的,做得非常非常工程化,也很好调,毛病不多,做了非常好的闭环约束精度也高。方方面面看都是80分。走这条路线的同学非常多,但是我想说在从一个多年老工程师和产品经理的角度看,这个系统其实是一个伪开源,选了它你就相当于上了一条不归路。原因是在也是非常简单,这个系统做得太完整了,会让你沉醉在作为调参侠的快乐中。用NV的Xavier青春版随便加个Real senseD435i就能调起来,没有难度。但是要知道,ORB-SLAM3你连关个闭环约束都困难,走这条线,基本调参侠宿命,打打比赛还可以。整个ORB-SLAM改造难度很大。

​​​​​​​2.VINS-MONO:怎么说呢,港科的输出,照道理应该全力支持,但还是得拆开说下优缺点。首先VINS-MONO第一个优点是它就像整个VIO中的太祖长拳,非常正统, 相对容易学习上手,代码写得清晰明了。第二个优点是改造空间很大,代码应该是来源于不同的作者,后端写得很好也没啥能优化的哈哈(CERES改改手写可以,但其实没啥必要)。缺点主要2个:第一个缺点:前端有巨大的改善空间(原版的开销高得令人发指,点的可用性也一般),因为用的是非常传统的FAST,并行化难度很低。BCs圆优化的方法实在是多这里不赘述了(其他文和后面要更的DSP篇也会有)。第二个缺点:不能有理想建图,稀疏建图实现不了VIO大全能。之前已经有前人尝试往里面并直接法了(效果一言难尽就不说谁做的了),我们做得稍微好一点但是因为开销实在是太太太重就不发出来丢人了(相当于在原基础特征点法+回环的基础上又并了一套直接法,可悲)。

​​​​​​​3. TUM线:主要是DSO到VIDSO到DMVIO,怎么说呢。。。这条线在我看来是唯一能实现VIO大全能的线路,之前写了DM-VIO简述(已说明这条线仍然开销很重),其实最近工作又深化了很多,春节前肯定要出全解了。这条线优点很多就不赘述了,重点说缺点:第一个是门槛极高:基本算是VSLAM/VIO天花板级别,DSO本身就算是最难的VSLAM之一(无论理论还是代码),不懂DSO就去弄VI-DSO或DM-VIO会撞得头破血流。第二个是极其依赖光度误差:对光学硬件的理解要很深,如果连个Kalibr或者张正友标定都整不明白麻烦远离TUM主线。私信问的问题我也不会回。。。第三个缺点是TUM线代码难度很高。

那工程化的难点到底在哪呢?

1.首先除了所有VSLAM/VIO的基础知识以外你还必须要懂工程化

2.除1外要熟悉和了解各种各样的处理核心:CPU/GPU/NPU/DSP/FPGA等blablabla

3.熟悉各种各样的相机,其实这些我别的文章都有大概写一些

4.并行化,多核化,NV线的话大量使用寄存器和WARP原语,DSP和FPGA后续会写

5.熟悉各种各样的接口:VI/DPC/SDI/MIPI/USB/CAN/232/485等

6.开源里的Pangolin和RVIZ这些统统弄出去,不要占用任何资源!

7.开源里的RAW输出全部转硬件编码,所有OSD转硬算,编译好位姿与点云输出运行库

8.指针的使用,共享内存的使用,能手写的尽量不调库

当然如果你有钱能直接堆Xavier TX2或者i7再买Real sense高版,那就当我没说~

因为这才是最好的选择。。。