NAVION-2019年的神作与VIO-ASIC化的隐秘面纱

本来想更新一下VIO的FPGA篇,但是之前有同学问到了NAVION

中文网也没人正经写,突然觉得应该好好写一下这个。标题党,最近都开始写得像玄学和小说了,哈哈。

但是开个玩笑说,DM-VIO那篇我写得那么shi阅读量还不错。。。这篇和DSP/GPU那几篇理论上应该付费阅读,哈哈。这一篇我加入的自己的理解是比较重的,而且我相信有相当的可行性,并且已经写好了一点点让原厂开始做一些相关验证了。当然我自己还是喜欢多核并行化。

这几年机器人行业的剧变,其实和MITodrive有很大的关系。一项前沿研究的开源,往往会对整个产业造成深远的影响(ROS和ROS2也有点类似)。就像VIO,没有特拉华,工大,ETH,港科和其他各校前辈和大佬们的不懈努力,就根本不会有后续我们工程化相关的工作与进展,没有高翔,谢晓佳等的视觉SLAM十四讲和翻译机器人学中的状态估计,这个学科目前还是个阳春白雪。作为一名工程师,非常感激科学家们的努力。当然往上朔还有卡尔曼,贝叶斯,高斯等明亮的星辰,大家也不要忘记了LaptonDongsi这2位预积分与FEJ的输出大神~

NAVION,知道的人不算多,知道目前已经又向前迭了1.5代的更是少之又少(哈哈今天写完都知道了,因为我知道)

为什么说它是VIO之巅呢?这么说吧,预积分FEJ,一个16年一个12年才开始真正被关注和深入研究,而NAVION之前的2017年,MIT的这个组就已经完成了初步的FPGA化并完成了发表!(VINS-MONO是2019年),另外,它可是一个超快的ASIC,还是一个有着令人发指的功耗,面积,成本的小东西。

NAVION在2019年的发表年已经是一个低载2mw, 满载24mw,5mm X 4mm,65nm制程的完整ASIC了,后续广泛地在北美AR/VR领域与微型无人机领域使用,国内没有只是因为作为真正的高精尖科技,大家可以回忆2019年发生了什么?国内怎么可能会有呢?老老实实自己做吧。。。

这个东西虽然发了Paper,但是肯定不会开源,也没法开源,难道把板图给你吗? 哈哈

最近特别能写稿和吹水,昨晚又喝了半斤,他们的姐妹篇其实看完很久了,决定今天认真写写它:

2017年他们的工作就不提了,FPGA篇会提及到,而且

FPGA后续有做得更好的组。

我们的工作是3合一完成的,就是CPU+GPU+DSP,我觉得在多核化的时代和CPU+FPGA其实是没什么真正的高下的,我们确实做得很好(虽然是这2年做着玩的还没真正量产,哈哈),但是远逊于NAVION。想到自己2022年做的东西还不如别人2019年的时候。。。就真正感觉到了世界之大与中美科研水准真正的差距。但是相信如果从工程化角度来看,我们还是世界卷王。 今天,顶着华为/海思/港科/紫川共19年的工程师经验,认真说一下我对NAVION精华的理解。并向Sulieman, Luca Carlone, Zhangzhengdong,Sertac Karaman与Vivienne Sze等真大佬们致敬。

Navion重点与精华:

首先NAVION是VIO标准架构的前端后端无回环,回环这种东西本来就很容易拆到一个小核或者扔进云端,做好库和回调就行了。熟悉VINS-MONO的同学就会非常熟悉它,这块我不准备解太多:

分视觉前端(VFE)、IMU前端(IFE)和后端(BE)

前端分了2种模式,单目双目,可以切换,这后续的设计很精美,也是第一个真正的重点知识,也就是这个芯片是可以支持视觉传感端自动找换的,基线同样是可设定参数,一个非常方便的类似VINS-MONO+FUSION的可调节架构。

VFE有特征跟踪(FT)、特征检测(FD)、畸变校正(UR),立体匹配(SM),几何验证(GV)

单目用的标准LK光流法取点匹配三角化SFM,双目就是双目那个我很讨厌的基线算法,GV里面有RANSAC,UR也是标准动作,略

IFE是标准预积分,融合位姿标准15维p,q,v,ba,bg,点用逆深度1维,VIO基础知识标准写法,略

固定滞后平滑器fixed-smooth lager和SFW(滑动窗口)一回事,略

整个滑窗打包有个标准名称Horizon在全文无处不在,是不是很眼熟,哈哈,又开始八卦了~可以叫视野/视界,也可以叫地平线。

BE用的最大后验估计MAP,求解用的舒尔补,cholesky,反替,迭代用的高斯牛顿法。都很标准,但别忘了那是2017-2019年。在那个年头里,这都是近乎完美的选择,更可以说是大量后续工作的源头。

NAVION因为是ASIC,最大可以支持20个KF4000个点,惊人的吞吐。

这个是基础架构图,这个项目小组的研究核心是小型化和低功耗化,所有功能器都被集成进去了,其中帧的缓冲区,因子图与线性求解器占了大部分片上存储。这个总框是有一定的优化空间的,这几年技术又得到了巨大的进步,如果要进一步改进的化重点毫无疑问的会在建图上。我的思路如果要建图一定得为半稠密直接法建图新增一部分专用独立缓冲区,为D相机点云增加输入器并增加ICP匹配算子同样匹配独立缓冲区,但是后面这个应该面积和功耗都会比较高,而且还是会涉及大量内存搬运,这个数据量不好简化。回环本身是肯定不能往芯片里塞的,谁这么设计谁就是沙雕。原来的特征点匹配还是必须得做(为了给外部的回环提供依据),因为抽象的直接法回环能力近乎可以忽略,这个真的会是未来VSLAM和VIO巨大的卡点,而且我们还想不到啥靠谱的办法,世界范围内的相关研究也看得很多,但是都没到这一块来,也许真的是因为太繁琐了,只能自己慢慢想了。

IFE(IMU前端)部分的复杂性比芯片的其他部分较低,这里NAVION用的一个DOUBLE来做的,简单清爽,3加速3角速。整个计算是并行的,预积分过程中操作比较少。但是我觉得这里有问题甚至是埋了雷(没开源没板图我爱怎么猜都行),这个标准的动力积分求解器根本就不需要预积分,满频输入或者降频输入都是完全算得过来的,预积分在很多时候是VIO规模崩溃的罪恶来源,这个求解器因为足够高频,对时也是很好做的,完全可以以高频IMU的时间戳进行同步触发。

VFE最大分辨率为752×480像素,通过两个8位总线进入芯片,为左右立体图像。

VFE这块的设计非常复杂,硬件基础差的同学很难明白。。。首先所有的像素都是被并行处理的(FT,FD,UR,SM,GV)等,这个是非常重要的,相信后续国内就算出了设计也必须遵循这个原则,输入的像素在芯片上进行和/或帧缓冲以降低外部带宽,然后用了FSM有限状态机,共享内存和共享算子完成了单目/双目前端全程。它由四帧缓冲区主导:来自相机的原始帧存储在帧(1)和帧(2)内存中,以支持FT。未进行UR的帧存储在左帧和右帧存储器中,以支持SM。VFE每帧共检测到1824个特征,每帧可以跟踪多达200个特征

这玩意怎么设计呢,其实我想说这个虽然难但是并不算太顶,前端单双目+位姿匹配的ASIC化在国内应该有部分大厂已经搞定了(如某疆肯定早做完了)。

VFE是整个芯片的主体,因为开销确实太高了,后端的开销反而低频一些就是略低,但是拆解的难度远高于前端。

清爽化/并行化/共享化基本就是VIO工程在机器人领域工作和应用的核心,再松耦合好别的传感器如轮速计,而不是整天拿个低幼的双目来觉得自己好犀利(泛用性太差,精度也狗),VIO发展过程首先是在大量场景打败雷达,然后就是消除双目(在scale和开销问题被彻底解决后双目就没什么意义了,当然现在还算好用,VIO+D相机肯定是未来的大主流)。

BE(后端)解决了因子图优化问题。由于该过程的串行性质,一个类似于VFE中的几何验证的数据流与一个复杂的FSM一起使用。为了减少面积和增加资源共享,BE的FSM(有限状态机)被划分为一个较小的FMSS层次。小的FMSS包括:

1)在因子图优化问题上所有使用的矩阵运算

2)在线性求解器和边缘化过程中使用的CHOLESKY因子分解和反替换

3)在线性化和收缩过程中使用的旋转操作

使用一个共享寄存器文件,具有85个DOUBLE寄存器,用于类似于IFE的中间数据存储的内存层次结构,以及412.6kb的SRAM。因子图存储器将VFE和IFE输出存储在Horizon中,然后线性化为线性求解器矩阵存储器。B包括超过4000个因子在20个KFS中来支持一个最小二乘值优化问题。Horizon状态存储存储视界中KFS的状态,而共享存储存储大的中间数据。以KF速率输出周围环境的轨迹和稀疏三维图。

来翻译一下吧,首先(1)需要把所有矩阵运算算子化,这一步还算比较简单,因为乘法不少,乘法总体比较成熟了(2)cholesky分解的算子化(这里我自己浪了2小时画图,毫无思路)维数虽然可以是确定或者可以被参数化的,求解本身是从L0逐行向上求解,但是本身LLT这一步的工作很密,然后还得舒尔补+反替,这里目前看是设计上较大的难点。(3)这个也不简单,要把偏导和链式法则写好,小量代入,李群李代数求解代入,4元数代入。硬件和寄存器数据处理和软件开发是完全不同的逻辑。。。总体很难

采用DOUBLE算法来保证VIO系统的鲁棒性。这使BE和IFE中所有内存的大小增加了一倍。但是这个确实是有相当必要性的。

由于VIO是基于KF的,所以NAVION处理模式有两种,如图2前面所示。图12后面显示了详细的时间图。IFE在这两种模式下都是活跃的。(以下又是精华和重点)

KF处理图2中标记为红色的立体图像):在此模式下,STREO帧流入,所有组件都处于活动状态。FT、FD、UR和SM模块并行处理传入的帧。控制FSM然后启动MONO和STREO RANSAC串联,执行GV,并在添加新功能之前删除异常值。然后就开始求解因子图的优化问题。然后对轨迹和稀疏映射输出进行更新。

非KF处理图2中所有其他立体图像):在这种模式下,FT是唯一的活动组件,而VFE和BE的其余部分都是关闭和时钟门控的,以减少它们的功耗。帧不会流入以减少芯片外内存带宽。先前跟踪的特性存储在跟踪数据存储器中,如果跟踪成功,FT会立即更新它们,如果跟踪失败,则会将它们从内存中删除。处理非KF平均比处理KF快3.8×

NAVION中有一块非常重要的测试:

压缩比VIO误差之间的权衡。为了实现最小的开销成本,NAVION分析了两种压缩方法。截断最不重要的位(LSB)是在没有开销的情况下减少位宽度的最简单的方法。图4显示,VIO误差从8位到5位每像素只增加了6%,同时实现了38%的内存大小减少。然而,在那之后,误差增加得更快,在极端的每像素1位时增加了两倍以上

另一种有损压缩技术是块量化。帧被划分为n×n个像素的块,每个块的动态范围被量化为2级,每像素1位表示。这种技术的开销包括一个存储n−1行的行缓冲区和一些计算每个块的动态范围的逻辑。图4中的阴影部分显示了三种不同的块大小的数字:4×4、8×8和16×16。与3位情况相比,4×4块量化实现了更少的错误,同时将内存节省从2.7×增加到4.4×

所以最终NAVION用的是将像素量化为5位,然后将图像分成4×4像素的块。每个4×4个像素块使用26位来存储其动态范围(1位/像素),阈值(5位)和最小值(5位)这个是非常值得后续设计师参考的

这个内存处理部分是重中之重:

由于VIO存在大量的非连续内存管理(路标与位姿之间变化非线性),其中在最坏的情况下,内存必须将所有观测值存储在20KFS(即Horizon上的最大KFS数量),每个都有200个特征(即每帧跟踪的最大特征数量)和每个路标10个观测值。

为了减小这个大内存的大小,NAVION组注意到了它分布稀疏,从VFE最多观测4000次(每帧跟踪200个特征,视界20KFS)。然而,这些非零项的分布是未知的,并取决于特征轨迹的长度(图6-a)。因此,NAVION使用了一个两级内存架构,如图所示。第一个稀疏存储器仍然有40,000个条目,但它不存储3d双精度坐标,而是存储指向第二个密集内存的12位指针,后者存储4,000个观测结果的3D值。这将图内存减少5.4×,只增加访问延迟一个时钟周期,最终的影响是可以忽略不计的。

线性求解器部分的内存优化:

非线性因子图优化问题的第一步是将Horizon内的所有因子线性化。结果是一个线性方程组(H∆x=ε正定方程),其中H是Hession矩阵,ε是线性化过程产生的残差。在视界上最大为20 KFS,矩阵H(左上角大矩阵)大小为300×300,如图7所示,其中每个KF的状态包含15个变量:3为位置,3为方向,3为速度,6为IMU偏差(与VINS-MONO等同)。H矩阵存储在BE的线性求解器中,在那里每KF更新一次。

H矩阵有一个非常重要的特性,H是对称的,它通过只存储上(或下)三角形,直接减少了2×的内存大小。此外,根据特征轨迹age与水平大小的比值,每个矩阵的三角形中只有38%的非零值,在图7中用黑色标记,它们的位置是固定的。通过只存储非零值,总共实现了5.2×的内存大小的减少。图7显示了线性求解器内存包装器。基于稀疏的控制单元使用行和列地址进行读/写请求,它控制是对134kb的小内存执行读/写操作,还是根据固定的稀疏性模式对其进行掩码。

上图还显示了在线性求解器内存中原地发生的线性求解器过程。采用CHOLESKY连续因式分解和反替换的方法来求解h∆x=ε。这两个操作涉及逐行、逐列遍历矩阵。考虑到H的固定稀疏性模式,通过跳过处理零位置,可以减少线性求解器的处理时间。在最大水平大小为20 KFS时,利用H矩阵结构稀疏性实现了7.2×的加速。图8显示了不同范围下BE节省的总体处理时间。在没有稀疏性的情况下,线性求解器的处理时间随O(n²)的增加而增加,而利用稀疏性时的增加速度远慢于O (n)。这就节省了更多的Horizon上KFS的数量所增加的时间。在20 KFS时,最大加速2.5×。

这个小部分是全文最难的部分,比如我,明明能看懂,却不知道该具体怎么写。。。头疼

以上就是NAVION精华了,最终补一个NAVION框图:

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值