Hi my new friend!

DROID-SLAM

Scroll down

简介

DROID-SLAM 是一种基于深度学习的实时单目 SLAM(Simultaneous Localization and Mapping)系统。它结合了传统 SLAM 方法和深度神经网络的优势,能够在动态环境中实现高精度的相机定位和三维地图构建。相比于后来的MASt3R-SLAM,它能够保证全局一致性,本文重点关注后端优化部分。

高斯牛顿法

argminxf(x)f(x)=12imri(x)2=12r(x)2\begin{aligned} &\arg\min_x f(x) \\ f(x)&=\frac{1}{2}\sum_i^m r_i(x)^2=\frac{1}{2}\|r(x)\|^2 \end{aligned}

一阶泰勒展开:

r(x+Δx)r(x)+J(x)ΔxJ(x)=r(x)x\begin{aligned} r(x+\Delta x) &\approx r(x)+J(x)\Delta x \\ J(x)&=\frac{\partial r(x)}{\partial x} \end{aligned}

近似后的优化问题:

argminΔx12r(x)+J(x)Δx2f(x+Δx)12(r+JΔx)T(r+JΔx)=12(rTr+rTJΔx+ΔxTJTr+ΔxTJTJΔx)\begin{aligned} &\arg\min_{\Delta x} \frac{1}{2}\|r(x)+J(x)\Delta x\|^2 \\ f(x+\Delta x) &\approx \frac{1}{2}(r+J\Delta x)^T(r+J\Delta x) \\ &=\frac{1}{2}(r^Tr + r^TJ\Delta x + \Delta x^TJ^Tr + \Delta x^TJ^TJ\Delta x) \end{aligned}

其中:rTJΔx+ΔxTJTr=2rTJΔxr^TJ\Delta x+\Delta x^TJ^Tr=2 r^TJ\Delta x

定理:

x(12xTAx)=Ax(CTx)=C\begin{aligned} \frac{\partial}{\partial x}(\frac{1}{2}x^TAx)&= Ax \\ (C^Tx)'&=C \end{aligned}

令:

fΔx=JTr+JTJΔx=0\frac{\partial f}{\partial\Delta x}=J^Tr+J^TJ\Delta x=0

可得正规方程:

JTJΔx=JTrJ^TJ\Delta x=-J^Tr

迭代公式:

Δx=(JTJ)1JTr\Delta x=-(J^TJ)^{-1}J^Tr

其中,H=JTJH=J^TJ 称为近似的 Hessian 矩阵,g=JTrg=J^Tr 称为梯度。

DROID-SLAM 后端优化

原帧ii,目标帧jj,坐标系Fi,Fj\mathcal{F_i},\mathcal{F_j}

ii中的3D点:

Xi=[xiyizidi]=[(ucx)/fx(vcy)/fy1di]X_i= \begin{bmatrix} x_i\\y_i\\z_i\\d_i \end{bmatrix} =\begin{bmatrix} (u-c_x)/f_x\\(v-c_y)/f_y\\1\\d_i \end{bmatrix}

did_i为逆深度值,使用齐次坐标的好处是能够线性表示:

[XYZ]world=1di[xiyizi]\begin{bmatrix}X\\Y\\Z \end{bmatrix}_{world} =\frac{1}{d_i}\begin{bmatrix} x_i\\y_i\\z_i \end{bmatrix}

使用SE3变换:

Tij=[Rijtij01]SE(3)Xj=[xjyjzjdj]=[RijXi+ditijdi]\begin{aligned} T_{ij}&=\begin{bmatrix} R_{ij} & t_{ij} \\ 0 & 1 \end{bmatrix}\in SE(3) \\ X_j&=\begin{bmatrix} x_j\\y_j\\z_j\\d_j \end{bmatrix}= \begin{bmatrix} R_{ij}X_i+d_it_{ij}\\d_i \end{bmatrix} \end{aligned}

可以得到:

{xj=Rijxi+ditxyj=Rijyi+dityzj=Rijzi+ditzdj=di\left\{ \begin{matrix} x_j=R_{ij}x_i+d_it_x\\ y_j=R_{ij}y_i+d_it_y\\ z_j=R_{ij}z_i+d_it_z\\ d_j=d_i \end{matrix} \right.

注:dj,did_j,d_i仅为占位变量

归一化到平面:

{x=xizi=xjzjy=yizi=yjzj\left\{ \begin{matrix} \overline{x}=\frac{x_i}{z_i}=\frac{x_j}{z_j}\\ \overline{y}=\frac{y_i}{z_i}=\frac{y_j}{z_j} \end{matrix} \right.

由相机内参得到像素坐标:

{u^=fxx+cxv^=fyy+cy\left\{ \begin{matrix} \hat{u}=f_x\overline{x}+c_x\\ \hat{v}=f_y\overline{y}+c_y \end{matrix} \right.

定义投影函数π\pi

π(Tij,di,u,v)=[u^v^]\pi(T_{ij},d_i,u,v)= \begin{bmatrix} \hat{u}\\\hat{v} \end{bmatrix}

要求的变量为:

πTij,πdi\frac{\partial \pi}{\partial T_{ij}},\frac{\partial \pi}{\partial d_i}

SE3李代数参数化

ζ=[τϕ]=[τxτyτzϕxϕyϕz]R6Tij=exp(ζ^)ζ^R4×4\begin{aligned} \zeta&= \begin{bmatrix} \tau\\\phi \end{bmatrix}= \begin{bmatrix} \tau_x\\\tau_y\\\tau_z\\\phi_x\\\phi_y\\\phi_z \end{bmatrix}\in \mathbb{R}^6 \\ T_{ij} &= \exp(\hat{\zeta}) \\ \hat{\zeta}&\in \mathbb{R}^{4\times4} \end{aligned}

ζ^\hat{\zeta}ζ\zeta的反对称矩阵表示,exp(ζ^)\exp(\hat{\zeta})为矩阵指数映射,代表旋转平移矩阵。

在当前变换TijT_{ij}中加一个扰动:

Tij(ζ)=exp(ζ^)TijT_{ij}(\zeta)=\exp(\hat{\zeta})T_{ij}

求:

ξξ=0[exp(ξ)TijXi]\left. \frac{\partial}{\partial \boldsymbol{\xi}} \right|_{\boldsymbol{\xi}=\mathbf{0}} \left[ \exp(\boldsymbol{\xi}^\wedge) \mathbf{T}_{ij} \cdot \mathbf{X}_i \right]

  1. 投影对3D点的导数

u^Xj=Xj(fxxjzj+cx)\frac{\partial \hat{u}}{\partial X_j}=\frac{\partial}{\partial X_j}(f_x\frac{x_j}{z_j}+c_x)

可以得到:

u^xj=fxzj,u^yj=0,u^zj=fxxjzj2,u^dj=0v^xj=0,v^yj=fyzj,v^zj=fyyjzj2,v^dj=0\begin{aligned} \frac{\partial \hat{u}}{\partial x_j}&=\frac{f_x}{z_j},\frac{\partial \hat{u}}{\partial y_j}=0,\frac{\partial \hat{u}}{\partial z_j}=-f_x\frac{x_j}{z_j^2},\frac{\partial \hat{u}}{\partial d_j}=0 \\ \frac{\partial \hat{v}}{\partial x_j}&=0,\frac{\partial \hat{v}}{\partial y_j}=\frac{f_y}{z_j},\frac{\partial \hat{v}}{\partial z_j}=-f_y\frac{y_j}{z_j^2},\frac{\partial \hat{v}}{\partial d_j}=0 \end{aligned}

  1. 3D点对SE3的导数

Xjζ=ζ[exp(ζ^)TijXi]\frac{\partial X_j}{\partial \zeta}=\frac{\partial}{\partial \zeta}[\exp(\hat{\zeta})T_{ij}X_i]

根据李代数的性质,可以得到:

[xj,yj,zj]Tζ=[djI3[xj]×]R3×6,ζ=[τ,ϕ]\frac{\partial [x_j,y_j,z_j]^T}{\partial \zeta}= \begin{bmatrix} -d_jI_3 & [x_j]_\times \\ \end{bmatrix} \in \mathbb{R}^{3\times6}, \zeta=[\tau,\phi]

[xj]×[x_j]_\timesxjx_j的叉乘矩阵:

[xj]×=[0zjyjzj0xjyjxj0][x_j]_\times=\begin{bmatrix} 0 & -z_j & y_j \\ z_j & 0 & -x_j \\ -y_j & x_j & 0 \end{bmatrix}

  1. 链式法则组合:

u^ζ=[u^xju^yju^zj][xj,yj,zj]Tζ=[fxzj0fxxjzj2][dj000zjyj0dj0zj0xj00djyjxj0]=[fxdizj0fxxjdizj2fxxjyjzj2fx(1+xj2zj2)fxyjzj]T\begin{aligned} \frac{\partial \hat{u}}{\partial \zeta}&= \begin{bmatrix} \frac{\partial \hat{u}}{\partial x_j} & \frac{\partial \hat{u}}{\partial y_j} & \frac{\partial \hat{u}}{\partial z_j} \end{bmatrix} \frac{\partial [x_j,y_j,z_j]^T}{\partial \zeta}\\&= \begin{bmatrix} \frac{f_x}{z_j} & 0 & -f_x\frac{x_j}{z_j^2} \end{bmatrix} \begin{bmatrix} -d_j&0&0&0&-z_j&y_j\\ 0&-d_j&0&z_j&0&-x_j\\ 0&0&-d_j&-y_j&x_j&0 \end{bmatrix}\\&= \begin{bmatrix} -f_x\frac{d_i}{z_j}\\ 0\\ f_x\frac{x_j d_i}{z_j^2}\\ f_x\frac{x_j y_j}{z_j^2}\\ -f_x\left(1+\frac{x_j^2}{z_j^2}\right)\\ f_x\frac{y_j}{z_j} \end{bmatrix}^T \end{aligned}

由于残差r=utargetu^r=u_{target}-\hat{u},所以:

ruζ=u^ζrvζ=v^ζ\begin{aligned} \frac{\partial r_u}{\partial \zeta}&=-\frac{\partial \hat{u}}{\partial \zeta} \\ \frac{\partial r_v}{\partial \zeta}&=-\frac{\partial \hat{v}}{\partial \zeta} \end{aligned}

带有负号,最终得到:

rζ=[ruζrvζ]=[fxdizj0fxxjdizj2fxxjyjzj2fx(1+xj2zj2)fxyjzj0fydizjfyyjdizj2fy(1+yj2zj2)fyxjyjzj2fyxjzj]\begin{aligned} \frac{\partial r}{\partial \zeta}&= \begin{bmatrix} \frac{\partial r_u}{\partial \zeta}\\ \frac{\partial r_v}{\partial \zeta} \end{bmatrix}\\&= \begin{bmatrix} f_x\frac{d_i}{z_j} & 0 & -f_x\frac{x_j d_i}{z_j^2} & -f_x\frac{x_j y_j}{z_j^2} & f_x\left(1+\frac{x_j^2}{z_j^2}\right) & -f_x\frac{y_j}{z_j} \\ 0 & f_y\frac{d_i}{z_j} & -f_y\frac{y_j d_i}{z_j^2} & -f_y\left(1+\frac{y_j^2}{z_j^2}\right) & f_y\frac{x_j y_j}{z_j^2} & f_y\frac{x_j}{z_j} \end{bmatrix} \end{aligned}

源帧ii的位姿变化用伴随表示:

u^ζi=AdTij1T(u^ζj)T\frac{\partial \hat{u}}{\partial \zeta_i} =-\mathbf{Ad}_{T_{ij}^{-1}}^T(\frac{\partial \hat{u}}{\partial \zeta_j})^T

对应adjSE3函数。

深度参数化

投影对深度的导数:

u^di=di(fxxjzj+cx)=fx(1zjxjdixjzj2zjdi)=fx(txzjxjtzzj2)v^di=fy(tyzjyjtzzj2)\begin{aligned} \frac{\partial \hat{u}}{\partial d_i}&=\frac{\partial}{\partial d_i}(f_x\frac{x_j}{z_j}+c_x) \\ &=f_x(\frac{1}{z_j}\frac{\partial x_j}{\partial d_i}-\frac{x_j}{z_j^2}\frac{\partial z_j}{\partial d_i}) \\ &=f_x(\frac{t_x}{z_j}-\frac{x_j t_z}{z_j^2})\\ \frac{\partial \hat{v}}{\partial d_i}&=f_y(\frac{t_y}{z_j}-\frac{y_j t_z}{z_j^2}) \end{aligned}

残差带负号。

计算流程为:
DROID-SLAM-backend

求解

线性化后的正规方程:

[HxxHxdHdxHdd][ΔxΔd]=[bxbd]\begin{bmatrix}H_{xx} & H_{xd} \\ H_{dx} & H_{dd} \end{bmatrix} \begin{bmatrix}\Delta x \\ \Delta d \end{bmatrix} = \begin{bmatrix}b_x \\ b_d \end{bmatrix}

通过Schur补消元法,消去深度变量Δd\Delta d

S=HxxHxdHdd1Hdxv=bxHxdHdd1bd\begin{aligned} S&=H_{xx}-H_{xd}H_{dd}^{-1}H_{dx} \\ v&=b_x - H_{xd}H_{dd}^{-1}b_d \end{aligned}

得到简化后的方程:

SΔx=vS\Delta x = v

通过共轭梯度法求解Δx\Delta x,然后回代求解Δd\Delta d

Δd=Hdd1(bdHdxΔx)\Delta d = H_{dd}^{-1}(b_d - H_{dx}\Delta x)

我是学生,给我钱

其他文章
MASt3R-SLAM
  • 25/11/28
  • 16:12
  • 2k
  • 11
目录导航 置顶
  1. 1. 简介
  2. 2. 高斯牛顿法
  3. 3. DROID-SLAM 后端优化
    1. 3.1. SE3李代数参数化
    2. 3.2. 深度参数化
  4. 4. 求解
请输入关键词进行搜索