CodeSLAM论文学习

四足机器人 SLAM 导航实战

从零实现 Unitree Go2 的 SLAM 建图与 ROS2 导航,手把手集成 slam_toolbox

CodeSLAM - Learning a Compact, Optimisable Representation for Dense Visual SLAM

该文是帝国理工学院戴森机器人实验室在2018年在CVPR上发表的论文,并且是一篇Best Paper。

主要贡献

  1. 通过对灰度图的自动编码器进行调节,推导出地图的紧凑表示。
  2. 实现了一个实时的单目SLAM系统,可以实现相机运动和地图的同时优化。

本文主要是在自动编码器上下功夫,并结合图像几何信息实现了单目相机的密集SLAM。对于一张rgb图像,利用一个U-net去提取特征及估计深度的不确定性,并利用另外一个变分自动编码器以编码和解码一个初始的深度值,然后联合两帧图像的相关信息来优化相机位姿及进一步估计深度。

算法流程

1、网络架构

基于图像强度的深度变分自动编码器的网络体系结构。
上半部分使用U-Net,左边是一个下采样的过程,将灰度图拆分为高维度的特征表示,得到的是一个抽象的特征,接着是一个带有跳层的上采样部分,负责将抽象的特征进行细化,还原到原来的尺寸,跳层的作用是联系输入图像的信息,有助于还原抽象的特征。本文的U-Net估计了4个不同尺寸的关于深度的不确定性,并提取了图像强度特征。

然后使用这些图像强度特征对深度进行编码和解码。下半部分是一个变分自动编码器结构(VAE),下采样通过改变卷积步长来实现,而上采样则使用双线性插值,自动编码器的瓶颈部分包括两个全连接层。然后计算平均值和方差,采用KL散度来优化这个VAE,最终输出四个等级的预测平均值μ和深度的不确定度b。

本文利用了一个类高斯的分布Laplace分布来计算网络训练的loss,为什么要用这个Laplace分布呢?因为他的尾部比高斯分布更重,可以看下图。

p ( d ~ ∣ μ , b ) ) = 1 2 b exp ⁡ ( − ∣ d ~ − μ ∣ b ) p(\tilde{d} | \mu, b))=\frac{1}{2 b} \exp \left(-\frac{|\tilde{d}-\mu|}{b}\right) p(d~μ,b))=2b1exp(bd~μ)
蓝为Laplace分布,绿为高斯分布
对Laplace分布求一个对数,并取负,这里将常数忽略了。

− log ⁡ ( p ( d ~ ∣ μ , b ) ) = ∣ d ~ − μ ∣ b + log ⁡ ( b ) -\log (p(\tilde{d} | \mu, b))=\frac{|\tilde{d}-\mu|}{b}+\log (b) log(p(d~μ,b))=bd~μ+log(b)

论文将数据集的深度值转换为范围[0,1]。为此,采用了混合深度参数化,称之为接近度,如下式,给定一个平均深度值a,它将[0,a]中的深度映射到[0.5,1.0](类似于常规深度),并将[a,∞]的深度映射到[0,0.5](类似于逆深度)。

p = a d + a p=\frac{a}{d+a} p=d+aa

2、仿射变换

对于每一张图像 I A I_{A} IA存在一个对应的代码 c A \boldsymbol{c}_{A} cA,视角A和视角B间的变换关系为 w ( u , c A , T A B ) = π ( R A B π − 1 ( u , D A [ u ] ) + B t A B ) w\left(\boldsymbol{u}, \boldsymbol{c}_{A}, \boldsymbol{T}_{A}^{B}\right)=\pi\left(\boldsymbol{R}_{A}^{B} \pi^{-1}\left(\boldsymbol{u}, D_{A}[\boldsymbol{u}]\right)+_{B} \boldsymbol{t}_{A}^{B}\right) w(u,cA,TAB)=π(RABπ1(u,DA[u])+BtAB),可以参照下图进行理解,其中 π \pi π是投影, π − 1 \pi^{-1} π1是反投影, R A B \boldsymbol{R}_{A}^{B} RAB可以理解为视角A转换为视角B的方向旋转矩阵, B t A B _{B} \boldsymbol{t}_{A}^{B} BtAB可以理解为视角A到视角B的位置平移矩阵。
视角转换
对于的雅克比矩阵为
∂ I B [ v ] ∂ B t A B = ∂ I B [ v ] ∂ v ∂ π ( x ) ∂ x ∂ I B [ v ] ∂ R A B = ∂ I B [ v ] ∂ v ∂ π ( x ) ∂ x ( − R A B π − 1 ( u , d ) ) × ∂ I B [ v ] ∂ c a = ∂ I B [ v ] ∂ v ∂ π ( x ) ∂ x R A B ∂ π − 1 ( u , d ) ∂ d ∂ D A [ u ] ∂ c A \begin{array}{l}{\frac{\partial I_{B}[\boldsymbol{v}]}{\partial_{B} \boldsymbol{t}_{A}^{B}}=\frac{\partial I_{B}[\boldsymbol{v}]}{\partial \boldsymbol{v}} \frac{\partial \pi(\boldsymbol{x})}{\partial \boldsymbol{x}}} \\ {\frac{\partial I_{B}[\boldsymbol{v}]}{\partial \boldsymbol{R}_{A}^{B}}=\frac{\partial I_{B}[\boldsymbol{v}]}{\partial \boldsymbol{v}} \frac{\partial \pi(\boldsymbol{x})}{\partial \boldsymbol{x}}\left(-\boldsymbol{R}_{A}^{B} \pi^{-1}(\boldsymbol{u}, d)\right)^{\times}} \\ {\frac{\partial I_{B}[\boldsymbol{v}]}{\partial \boldsymbol{c}_{a}}=\frac{\partial I_{B}[\boldsymbol{v}]}{\partial \boldsymbol{v}} \frac{\partial \pi(\boldsymbol{x})}{\partial \boldsymbol{x}} \boldsymbol{R}_{A}^{B} \frac{\partial \pi^{-1}(\boldsymbol{u}, d)}{\partial d} \frac{\partial D_{A}[\boldsymbol{u}]}{\partial \boldsymbol{c}_{A}}}\end{array} BtABIB[v]=vIB[v]xπ(x)RABIB[v]=vIB[v]xπ(x)(RABπ1(u,d))×caIB[v]=vIB[v]xπ(x)RABdπ1(u,d)cADA[u]
其中 × \times ×对应下列等式
v = w ( u , c A , T A B ) x = R A B π − 1 ( u , D A [ u ] ) + B t A B d = D ( I A , c A ) [ u ] \begin{aligned} \boldsymbol{v} &=w\left(\boldsymbol{u}, \boldsymbol{c}_{A}, \boldsymbol{T}_{A}^{B}\right) \\ \boldsymbol{x} &=\boldsymbol{R}_{A}^{B} \pi^{-1}\left(\boldsymbol{u}, D_{A}[\boldsymbol{u}]\right)+_{B} \boldsymbol{t}_{A}^{B} \\ d &=D\left(I_{A}, \boldsymbol{c}_{A}\right)[\boldsymbol{u}] \end{aligned} vxd=w(u,cA,TAB)=RABπ1(u,DA[u])+BtAB=D(IA,cA)[u]

3、逐帧优化

在这里插入图片描述
每帧图像都有 I i I_{i} Ii都有对应的编码 c i \boldsymbol{c}_{i} ci和深度 D i D_{i} Di,结合估计出的位姿 T i \boldsymbol{T}_{i} Ti可以推导出光度误差和几何误差,如下面两个公式所示,通过高斯牛顿法来对其进行联合优化。
E pho  = L p ( I A [ u ] − I B [ w ( u , c A , T A B ) ] ) E geo  = L g ( D A [ u ] − D B [ w ( u , c A , T A B ) ] ) \begin{array}{l}{E_{\text {pho }}=L_{p}\left(I_{A}[\boldsymbol{u}]-I_{B}\left[w\left(\boldsymbol{u}, \boldsymbol{c}_{A}, \boldsymbol{T}_{A}^{B}\right)\right]\right)} \\ {E_{\text {geo }}=L_{g}\left(D_{A}[\boldsymbol{u}]-D_{B}\left[w\left(\boldsymbol{u}, \boldsymbol{c}_{A}, \boldsymbol{T}_{A}^{B}\right)\right]\right)}\end{array} Epho =Lp(IA[u]IB[w(u,cA,TAB)])Egeo =Lg(DA[u]DB[w(u,cA,TAB)])

  1. 图像A经过U-net,得到深度的不确定性和图像强度特征;,并初始化得到代码 c A \boldsymbol{c}_{A} cA ,得到一个非常模糊的深度图 D A \boldsymbol D_{A} DA,注意,图像A的不确定性、深度、代码 c A \boldsymbol{c}_{A} cA将结合下一帧B进行优化;
  2. 图像B进行同样操作,得到深度的不确定性和图像强度特征,并初始化代码 c B \boldsymbol{c}_{B} cB,得到一个非常模糊的深度图 D B \boldsymbol D_{B} DB,注意图B的不确定性、深度、代码 c B \boldsymbol{c}_{B} cB将结合下一帧C进行优化;
  3. 有了两张图片A,B的深度等信息, 先给定位置,利用图A的像素 u \boldsymbol{u} u在图B上找到对应的像素 v \boldsymbol{v} v,计算光度误差和几何误差。
  4. 根据光度误差和几何误差对代码 c A \boldsymbol{c}_{A} cA进行优化。

4、结果

结果图我就不放了,说实话,他这个结果图我是真的看不下去,就零代码重建和编码后的有明显的区别,编码后的与优化后的,恕本人眼拙,实在看不出来,你好歹给个数值吧,这我也能知道优化后有变化啊。

5、论文地址

本人对这篇文章只是浅薄的理解,想要更深层次的理解,请去看原文
CodeSLAM原文地址
有条件的人可以去Youtube上面看一下原视频,有助于理解该文
CodeSLAM视频

四足机器人 SLAM 导航实战

从零实现 Unitree Go2 的 SLAM 建图与 ROS2 导航,手把手集成 slam_toolbox

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值