Fusion SLAM
  • 概述
  • 介绍
  • 里程计
  • 地图生成
  • 地图优化
  • 数据集与实验
  • 接口与扩展
  • 已知问题
  • 未来工作
  • 附录与参考
  • 相关教程
项目
  • 简体中文
  • English
  • 概述
  • 介绍
  • 里程计
  • 地图生成
  • 地图优化
  • 数据集与实验
  • 接口与扩展
  • 已知问题
  • 未来工作
  • 附录与参考
  • 相关教程
项目
  • 简体中文
  • English
  • 概述
  • 介绍

    • 符号
    • 流程图
    • 流程描述
    • 坐标系定义
    • 主要论文
    • 相关研究
  • 里程计

    • 介绍
    • 初始化
    • 状态估计
    • 时间同步
    • 地图约束
    • 异常处理
  • 地图生成
  • 地图优化
  • 数据集与实验
  • 接口与扩展
  • 已知问题
  • 未来工作
  • 附录与参考

    • 参考文献
    • 附录
  • 相关教程

    • 里程计教程
    • ROVIOLI教程

状态估计

运动学模型

IMU 测量

我们使用 6 轴惯性测量单元 (IMU) 来传播惯性导航系统 (INS),它提供局部旋转速度 (角速率)ωm和局部平移加速度的测量am:

Iωm(t)=Iω(t)+bg(t)+ng(t)(1)Iam(t)=Ia(t)+WIR(t)Wg+ba(t)+na(t)(2)

其中Iω和Ia分别是IMU局部坐标系{I}中的真实旋转速度和平移加速度,和是陀螺仪和加速度计偏差,ng和na是高斯白噪声,Wg=[009.81]⊤是在全局坐标系{W}中表达的重力(注意,地球不同位置的重力略有不同),WIR是从全局坐标系到IMU局部坐标系的旋转矩阵。

惯性状态向量

我们将时间的INS状态向量XI定义为:

xI(t)=[WIq¯(t)WpI(t)WvI(t)bg(t)ba(t)](3)

其中WIq¯是表示 IMU 坐标系全局旋转的单位四元数,WpI是IMU在全局坐标系中的位置,WvI是IMU在全局坐标系中的速度。为了便于表示,我们通常会将时间写为I的下标,以描述 IMU 当时的状态(例如,ItWq¯=IWq¯(t)))。为了定义 IMU 误差状态,对位置、速度和偏差采用标准的加性误差定义,而我们使用具有左四元数乘性误差⊗的四元数误差状态δq¯:

WIq¯=δq¯⊗WIq¯^(4)δq¯=[k^sin⁡(12θ~)cos⁡(12θ~)]≃[12θ~1](5)

其中k^是旋转轴,θ~是旋转角度。对于小旋转,误差角度向量近似为θ~=θ~k^三个方向轴的误差向量。因此,总IMU误差状态定义为以下15x1(不是16x1)向量:

x~I(t)=[GIθ~(t)Wp~I(t)Wv~I(t)b~g(t)b~a(t)](6)

IMU 运动学方程

WIq¯˙(t)=12Ω(ω(t))WIq¯(t)(7)Wp˙I(t)=WvI(t)(8)Wv˙I(t)=Wa(t)(9)bg˙(t)=nwg(t)(10)b˙a(t)=nwa(t)(11)

其中,

Ω(ω)=[−|ω|×ω−ω⊤0],|ω|×≜[0−ω3ω2ω30−ω1−ω2ω10]

我们将陀螺仪和加速度计的偏差建模为随机游走,因此它们的时间导数为白高斯分布。请注意,上述运动学是根据真实加速度和角速度定义的,它们可以根据传感器测量值和状态计算出来。

连续时间惯性积分

给定在时间间隔(t∈[tk,tk+1])内连续时间Iω(t)和 Ia(t),以及它们的估计值Iω^(t)和Ia^(t),我们可以定义上述IMU运动学微分方程的解。

WIk+1R=exp⁡(−∫tktk+1Iω(tτ)dτ)WIkR(12)≜ΔRkWIkR=IkIk+1RWIkRWpIk+1=WpIk+WvIkΔtk+WIkR⊤∫tktk+1∫tkIτsIIkRIa(tτ)dτds−12WgΔtk2(13)≜WpIk+WvIkΔtk+WIkR⊤Δpk−12aWgΔtk2WvIk+1=WvIk+WIkR⊤∫tktk+1IτIτRIa(tτ)dτ−WgΔtk(14)≜WvIk+WIkR⊤Δvk−WgΔtkbgk+1=bgk+∫tktk+1nwg(tτ)dτ(15)bak+1=bak+∫tktk+1nwa(tτ)dτ(16)

其中,Δtk=tk+1−tk,IτIkR=exp⁡(∫tktτIω(tu)du),exp(⋅)是SO(3)的矩阵指数,向量在它们的下标时间步骤(例如,WvIk=WvI(tk))处进行评估。偏差受到随机游走噪声nwg和nwa的影响,它们是零均值的白高斯噪声。我们有以下的积分组成部分:

ΔRk≜IkIk+1R=exp⁡(−∫tktk+1IIω(tτ)dτ)(17)Δpk≜∫tktk+1∫tksIIkRIa(tτ)dτds(18)Δvk≜∫tktk+1IτIkRIa(tτ)dτ(19)

离散时间IMU状态传播

WIk+1q¯^=exp⁡(12Ω(ωm,k−bg,k−ng,k)Δtk)WIkq¯^=cos⁡(|ω|2Δtk)⋅I4+1|ω|sin⁡(|ω|2Δtk)⋅Ω(ω)≃I4+Δtk2Ω(ω)(20)WpIk+1=WpIk+WvIkΔtk−12WgΔtk2+12WIkR⊤(am,k−ba,k−na,k)Δtk2(21)Wvk+1=WvIk−WgΔtk+WIkR⊤(am,k−ba,k−na,k)Δtk(22)

离散时间IMU状态误差传播(详细推导过程见附录):

WIk+1θ~=IkIk+1R^WIkθ~−IkIk+1R^Jr(IkIk+1θ^)(b~g,k+ng,k)Δtk(23)Wp~Ik+1=Wp~Ik+Wv~IkΔtk−12WIkR^⊤|a^kΔti2|×GIkθ~−12WIkR^⊤Δtk2(b~a,k+na,k)(24)Wv~k+1=Wv~Ik−WIkR^⊤|a^kΔtk|× WIkθ~−WIkR^⊤(b~a,k+na,k)Δtk(25)b~g,k+1=b~g,k+nwg(26)b~a,k+1=b~a,k+nwa(27)

其中,IkIk+1θ^=−Ikω^Δtk,Jr为右雅可比矩阵

离散IMU误差状态传播矩阵:

Φ(tk+1,tk)=[IkIk+1R^0303−IkIk+1R^Jr(IkIk+1θ^)Δtk03−12WIkR^⊤|a^kΔtk2|×I3ΔtkI303−12WIkR^⊤Δtk2−WIkR^⊤|a^kΔtk|×03I303−WIkR^⊤Δtk030303I30303030303I3](28)

离散噪声传播矩阵:

Gk=[−IkIk+1R^Jr(IkIk+1θ^)Δtk03030303−12WIkR^⊤Δtk2030303−WIkR^⊤Δtk03030303I303030303I3](29)

协方差更新:

Pk+1|k=Φ(tk+1,tk)Pk|kΦ(tk+1,tk)⊤+GkQdGk⊤(30)

线性观测更新

线性观测模型:

zm,k=Hkxk+nk(31)

卡尔曼增益计算:

Ki=Pk|k−1Hk⊤(HkPk|k−1Hk⊤+Rk)−1(32)

误差状态更新:

x~Ik=Kkz~m,k(33)

协方差矩阵更新:

Pk|k=(I3−KkHk)Pk|k−1(I3−KkH)⊤+KkRkKk⊤(34)

卡方检验:

z~m,k⊤(HkPk|k−1Hk⊤+αRk)−1z~m,k<χ2(48)

其中,α∈[50,100]为噪声放大系数。

GPS观测

在GPS数据到来时我们首先对其进行坐标系转换,将原始的WGS-84坐标系转换到ENU(东北天)坐标系当中。并且我们还对GPS数据进行处理使用两克隆帧之间的相对GPS位置变换作为观测:

GkdGk+1=∑i=0N−2(EpGk+1−EpGk)

这是因为我们在实验中,发现将GPS数据直接作为观测当轨迹发生漂移时,后续的GPS观测难以进行更新。

GPS误差状态定义:

x~k=[Wp~Ik⊤Wp~Ik−1⊤EWθ~⊤]⊤(35)

观测模型:

GkdGk+1=WER^(Wp^Ik−Wp^Ik−1)(36)

其中,GkdGk+1为在时间间隔t∈[tk,tk+1]内的GPS相对位置变换。

将(35)式对状态x~k进行求导可计算出雅可比矩阵:

Hk=[WER^−WER^−WER^|Wp^Ik−Wp^Ik−1|×](37)

轮速观测

我们获取的轮速数据是由轮式编码器发出的原始数据,因此我们要对原始数据进行结算,并且找到两个克隆帧之间的数据进行积分,获得时间内的相对位置和旋转变换作为观测。

轮速状态定义:

xk=[xIk⊤xCk⊤xWE⊤xWI⊤]⊤(38)

其中,xWI=[rlrrb]⊤ 分别表示左右轮的半径和基准连接点的长度,xWE=[IOq¯⊤OpI⊤]⊤,表示IMU和轮速的外参。

车轮编码器测量模型:

地面车辆由两个差动轮驱动,安装在共同的轴上,每个轮子都配备有编码器,提供局部角速率读数:

ωml=ωl+nωl,ωmr=ωr+nωr(39)

其中,ωl和ωr分别表示每个轮子的真实角速度,nωl和nωr表示对应的白噪声。编码器读数组合起来可以提供车辆主体坐标系{O}的2D线性和角速度,坐标系{O}位于基准连接点的中心:

Oω=(ωrrr−ωlrl)/b , Ov=(ωrrr+ωlrl)/2(40)

车轮里程计预积分:

在两个克隆时间点tk和tk+1之间对轮式里程计测量进行预积分。连续时间下的2D运动学模型在时间区间tτ∈[tk,tk+1]内给定为:

[OkOτθ˙Okx˙OτOky˙Oτ]=[−OτωOτvcos⁡(τOkθ)Oτvsin⁡(τOkθ)]=[−OτωOτvcos⁡(kOτθ)−Oτvsin⁡(kOτθ)](41)

其中,OτOkθ是局部偏航角,OkxOτ和OkyOτ是{Oτ}在起始积分坐标系{Ok}中的二维位置。请注意,使用−Oτω和−Oτvsin(OkOτθ)是因为遵循全局到局部的方向表示。

将从时间步i到τ+1的所有轮式里程计测量局部组合,执行以下测量的积分(详细推导过程见附录):

OkOτ+1θ=OkOτθ−OτωΔt(42)OkxOτ+1=OkxOτ−Oτv(sin⁡(OkOτθ−OτωΔt)−sin⁡(OkOτθ))Oτω(43)OkyOτ+1=OkyOτ−Oτv(cos⁡(OkOτθ−OτωΔt)−cos⁡(OkOτθ))Oτω(44)

其中, Δtk = tτ+1−tτ。请注意,假设Oτω和Oτv是恒定的,但考虑了tτ和tτ+1之间的航向角变化。

从tk积分到tk+1,并得到如下的2D相对姿态测量:

zk+1=[OkOk+1θOkdOk+1]=[∫tktk+1Otωdt∫tktk+1Otvcos⁡(OkOtθ)dt∫tktk+1Otvsin⁡(OkOtθ)dt]=:g(ωl(k:k+1),ωr(k:k+1),xWI)(45)

其中,ω(k:k+1)表示从tk到tk+1所有轮式测量值的积分。

观测模型:

OkOk+1θ=e3⊤Log(IORWIi+1RWIkR⊤IOR⊤)(46)OkdOk+1=ΛIORWIkR(WpIk+1+WIk+1R⊤IpO−WpIk−GIkR⊤IpO)(47)

雅可比矩阵(详细推导过程见附录):

Hk+1=[∂h∂x~Ik+1∂h∂x~Ck+1∂h∂x~WE−∂g∂x~WI](48)

其中,

∂g∂x~WI=[Γθ1Γθ2Γθ3Γx1Γx2Γx3Γy1Γy2Γy3]∂h∂x~Ik+1=[e3⊤IOR^01×301×9−ΛIOR^WIkR^WIk+1R^⊤|Ip^O|×ΛIOR^WIkR^02×9]∂h∂x~Ci+1=[−e3⊤IOR^WIk+1R^WIkR^⊤01×3ΛIOR^|WIkR^(Wp^Ik+1+WIk+1R^⊤Ip^O−Wp^Ik)|×−ΛIOR^WIkR^]∂h∂x~WE=[e3⊤(I−IOR^WIk+1R^WIkR^⊤IOR^⊤)01×3HWE1Λ(I−IOR^WIkR^WIk+1R^⊤IOR^⊤)]HWE1=Λ(|IOR^WIkR^(Wp^Ik+1+WIk+1R^⊤Ip^O−Wp^Ik)|×+IOR^WIkR^WIk+1R^⊤IOR^⊤|Op^I|×)

视觉观测

我们对前端已经成功匹配的特征点进行三角化,投影到全局坐标系{W}中生成landmark作为观测,我们将测量模型概括为一系列嵌套函数,以涵盖不同的特征参数化,如 3D 位置和逆深度等。假设一个视觉特征已经在随机克隆的滑动窗口上被追踪 ,我们可以将视觉承载测量值(即像素坐标)写成以下一系列嵌套函数:

观测模型:

zm,k=h(xk)+nk=hd(zn,k,ζ)+nk=hd(hp(Ckpf),ζ)+nk=hd(hp(ht(Wpf,WCkR,WpCk)),ζ)+nk=hd(hp(ht(hr(λ,⋯),WCkR,WpCk)),ζ)+nk

zk=hd(zn,k,ζ):将归一化坐标映射到畸变的UV坐标的畸变函数

zn,k=hp(Ckpf):将图像中的3D点投影到归一化UV坐标的投影函数

Ckpf=ht(Wpf,WCkR,WpCk):将全局坐标系中的特征位置转换为当前相机坐标系

Wpf=hr(λ,⋯):将特征的表示形式转换为全局坐标系中的三维特征

其中,zm,k是原始UV像素坐标;nk是原始像素噪声,通常假设为零均值白色高斯;zn,k是归一化的未失真UV测量值;Ckpf是当前相机帧中的地标位置;λ是特征landmark的表示;并且{WCkR,WpCk}表示全局坐标系中的当前相机姿势(位置和方向)。

雅可比矩阵:

考虑到上述的嵌套函数,我们可以利用链式法则来找到总状态雅可比矩阵。由于我们的特征表示函数hr(⋯)可能还依赖于状态,即一个锚定姿势,我们需要仔细考虑它的额外导数。请考虑以下关于状态x雅可比矩阵的测量示例:

∂zk∂x=∂hd(⋅)∂zn,k∂hp(⋅)∂Ckpf∂ht(⋅)∂x+∂hd(⋅)∂zn,k∂hp(⋅)∂Ckpf∂ht(⋅)∂Wpf∂hr(⋅)∂x

在全局特征表示中,参见点特征表示部分,第二项将为零,而对于锚定表示,需要进行计算。

其中,

∂hd(⋅)∂zn,k=[fx∗((1+k1r2+k2r4)+(2k1xn2+4k2xn2(xn2+yn2))+2p1yn+(2p2xn+4p2xn))fx∗(2k1xnyn+4k2xnyn(xn2+yn2)+2p1xn+2p2yn)fy∗(2k1xnyn+4k2xnyn(xn2+yn2)+2p1xn+2p2yn)fy∗((1+k1r2+k2r4)+(2k1yn2+4k2yn2(xn2+yn2))+(2p1yn+4p1yn)+2p2xn)]∂hp(⋅)∂Ckpf=[1Cz0−Cx(Cz)201Cz−Cy(Cz)2]∂ht(⋅)∂x=[ICR|WIkR(Wpf−WpIk)|×−ICRWIkRICRWIkR]∂ht(⋅)∂Wpf=ICRWIkR

此外,如果进行在线外部标定,还需要相对于IMU-相机外部参数的雅可比矩阵:

∂ht(⋅)∂ICR=|ICRWIkR(Wpf−WpIk)|×∂ht(⋅)∂CpI=I3×3

点特征表示:

3D点特征有两种主要的参数化方式:3D位置(xyz)和具有方向的逆深度。这两种方式都可以在全局坐标系中表示,也可以在参考锚定坐标系中表示,这样就需要依赖于观测到特征的“锚定”姿势。为了在我们的代码库中统一处理不同的特征参数化λ,我们详细推导了通用函数Gpf=f(⋅)(详细推导过程见附录),将不同的表示形式映射到全局位置。

全局XYZ

作为标准参数化,3D点特征的全局位置简单地由其在全局参考坐标系中的xyz坐标给出:

Wpf=f(λ)=[WxWyWz]

其中,

λ=Wpf=[WxWyWz]⊤

很明显,相对于特征参数的雅可比矩阵是:

∂f(⋅)∂λ=I3×3

全局逆深度

3D点特征的全局逆深度表示形式类似于球坐标系,具体表达为:

Wpf=f(λ)=1ρ[cos⁡(θ)sin⁡(ϕ)sin⁡(θ)sin⁡(ϕ)cos⁡(ϕ)]

其中:

λ=[θϕρ]⊤

相对于特征参数的雅可比矩阵可以计算为:

∂f(⋅)∂λ=[−1ρsin⁡(θ)sin⁡(ϕ)1ρcos⁡(θ)cos⁡(ϕ)−1ρ2cos⁡(θ)sin⁡(ϕ)1ρcos⁡(θ)sin⁡(ϕ)1ρsin⁡(θ)cos⁡(ϕ)−1ρ2sin⁡(θ)sin⁡(ϕ)0−1ρsin⁡(ϕ)−1ρ2cos⁡(ϕ)]

锚定XYZ

我们可以将3D点特征表示为某个“锚定”框架中(比如某个IMU本地框架,{WIaR,WpIa}),通常这个框架对应于检测到该特征的第一个相机帧对应的IMU姿势。

Wpf=f(λ,WIaR,WpIa,ICR,CpI)=WIaRI⊤CR⊤(λ−CpI)+WpIa

其中,

λ=Capf=[CaxCayCaz]⊤

相对于特征状态的雅可比矩阵为:

∂f(⋅)∂λ=WIaR⊤ICR⊤

由于锚定姿态涉及到这种表示,其雅可比矩阵被计算为:

∂f(⋅)∂WIaR=−WIaR⊤|ICR⊤(Capf−CpI)|×∂f(⋅)∂WpIa=I3×3

此外,如果进行外部标定,还需要计算相对于IMU-相机外参数的以下雅可比矩阵:

∂f(⋅)∂ICR=−WIaR⊤ICR⊤|(Capf−CpI)|×∂f(⋅)∂CpI=−WIaR⊤ICR⊤

锚定逆深度

类似于全局逆深度情况,我们可以在锚定框架中,{WIaR,WpIa},使用具有方位角的逆深度(类似于球面坐标),来表示一个3D点特征:

Gpf=f(λ,WIaR,WpIa,ICR,CpI)=WIaR⊤ICR⊤(Capf−CpI)+WpIa=WIaR⊤ICR⊤(1ρ[cos⁡(θ)sin⁡(ϕ)sin⁡(θ)sin⁡(ϕ)cos⁡(ϕ)]−CpI)+WpIa

其中:

λ=[θϕρ]⊤

对于特征状态的雅可比矩阵为:

∂f(⋅)∂λ=WIaR⊤ICR⊤[−1ρsin⁡(θ)sin⁡(ϕ)1ρcos⁡(θ)cos⁡(ϕ)−1ρ2cos⁡(θ)sin⁡(ϕ)1ρcos⁡(θ)sin⁡(ϕ)1ρsin⁡(θ)cos⁡(ϕ)−1ρ2sin⁡(θ)sin⁡(ϕ)0−1ρsin⁡(ϕ)−1ρ2cos⁡(ϕ)]

相对于锚定姿态的雅可比矩阵为:

∂f(⋅)∂WIaR=−WIaR⊤|ICR⊤(Capf−CpI)|×∂f(⋅)∂WpIa=I3×3

相对于IMU-相机外部参数的雅可比矩阵为:

∂f(⋅)∂ICR=−WIaR⊤ICR⊤|(Capf−CpI)|×∂f(⋅)∂CpI=−WIaR⊤ICR⊤
Prev
初始化
Next
时间同步