ISAM1论文讲解

引言

ISAM的全称为增量式平滑和建图(Incremental Smoothing and Mapping),它是一种用于SLAM问题的非线性优化算法,与常见的高斯牛顿法、LM等非线性优化算法不同,ISAM可以增量式的求解非线性优化问题。目前有ISAM1和ISAM2两个版本,这个两个版本的主要区别在于做重新线性化(relinearization)的时机不同。ISAM1只支持周期性重新线性化而ISAM2则会通过贝叶斯树自动判断重新线性化的时机,该机制比较复杂,后续会再写一篇博客专门讲解ISAM2重新线性化的机制。本篇博客主要讲解ISAM1,下面我们将详细讲解一下ISAM中增量式到底是怎么实现的。

一、SLAM中的非线性最小二乘问题

第一步: 我们对SLAM中的最小二乘问题建模:
假设运动方程为和观测方程如下所示:

运动方程: x i = f i ( x i − 1 , u i ) + w i x_i = f_i(x_{i-1}, u_i) + w_i xi=fi(xi1,ui)+wi 观测方程: z k = h k ( x i k , l j k ) + v k z_k = h_k(x_{i_k}, l_{j_k}) + v_k zk=hk(xikljk)+vk
第二步: 那么对应的最小二乘问题则如下所示:
X ∗ , L ∗ = arg min ⁡ X , L ∑ i = 1 M ∣ ∣ f i ( x i − 1 , u i ) − x i ∣ ∣ Λ 2 + ∑ i = 1 K ∣ ∣ h k ( X i k , I j k ) − z k ∣ ∣ Γ 2 X^{*}, L^{*} = \argmin_{X,L} \sum_{i = 1} ^{M} ||f_i(x_{i-1}, u_i) - x_i||^{2}_{\Lambda} + \sum_{i = 1} ^{K}||h_k(X_{i_k}, I_{j_k}) - z_k||_{\Gamma}^2 X,L=X,Largmini=1M∣∣fi(xi1,ui)xiΛ2+i=1K∣∣hk(Xik,Ijk)zkΓ2
第三步:对上述运动方程的残差进行线性化(一阶泰勒展开)有:
f i ( x i − 1 , u i ) − x i ≈ { f i ( x i − 1 0 , u i ) + F i i − 1 δ x i − 1 } − { x i 0 + δ x i } = { F i i − 1 δ x i − 1 − δ x i } − a i \begin{aligned} f_i(x_{i - 1}, u_i) - x_i & \approx \{f_i(x_{i-1}^0, u_i) + F_i^{i - 1}\delta x_{i-1}\} - \{ x_i^0 + \delta x_i \} \\ & = \{F_i^{i-1} \delta x_{i-1} - \delta x_i \} -a_i \end{aligned} fi(xi1,ui)xi{fi(xi10,ui)+Fii1δxi1}{xi0+δxi}={Fii1δxi1δxi}ai

其中
F i i − 1 : = ∂ f i ( x i − 1 , u i ) ∂ x i − 1 ∣ x i − 1 0 F_i^{i-1} :=\left. \frac{ \partial f_i(x_{i-1}, u_i) } {\partial x_{i-1}} \right|_{x_{i-1}^0} Fii1:=xi1fi(xi1,ui) xi10
a i = x i 0 − f i ( x i − 1 0 , u i ) a_i = x_i^0 - f_i(x_{i-1}^0, u_i) ai=xi0fi(xi10,ui)

第四步:对上述观测方程的残差进行线性化(一阶泰勒展开)有:
h k ( x i k , l j k ) − z k ≈ { h k ( x i k 0 , l j k 0 ) + H k i δ x i k + J k j δ l j k } − z k = { H k i δ x i k + J k j δ l j k } − c k \begin{aligned} h_k(\mathbf{x}_{ik}, \mathbf{l}_{jk}) - \mathbf{z}_k & \approx \left\{ h_k(\mathbf{x}_{ik}^0, \mathbf{l}_{jk}^0) + H_k^i \delta \mathbf{x}_{ik} + J_k^j \delta \mathbf{l}_{jk} \right\} - \mathbf{z}_k \\ & = \left\{ H_k^i \delta \mathbf{x}_{ik} + J_k^j \delta \mathbf{l}_{jk} \right\} - \mathbf{c}_k \end{aligned} hk(xik,ljk)zk{hk(xik0,ljk0)+Hkiδxik+Jkjδljk}zk={Hkiδxik+Jkjδljk}ck

其中
H k i k : = ∂ h k ( x i k , l j k ) ∂ x i k ∣ x i k 0 , l j k 0 H_k^{ik} :=\left. \frac{ \partial h_k(x_{ik}, l_{jk}) } {\partial x_{ik}} \right|_{x_{ik}^0, l_{jk}^0} Hkik:=xikhk(xik,ljk) xik0,ljk0
J k j k : = ∂ h k ( x i k , l j k ) ∂ l j k ∣ x i k 0 , l j k 0 J_k^{jk} :=\left. \frac{ \partial h_k(x_{ik}, l_{jk}) } {\partial l_{jk}} \right|_{x_{ik}^0, l_{jk}^0} Jkjk:=ljkhk(xik,ljk) xik0,ljk0
c k = z k − h k ( x i k 0 , l j k 0 ) c_k = z_k - h_k(x_{ik}^0, l_{jk}^0) ck=zkhk(xik0,ljk0)
第五步:那么最小二乘可化简为:
δ θ ∗ = arg min ⁡ δ θ ∑ i = 1 M ∣ ∣ F i i − 1 δ x i − 1 + G i i δ x i − a i ∣ ∣ Λ 2 + ∑ i = 1 K ∣ ∣ H k i k δ x i k + J k j k δ l j k − c k ∣ ∣ Γ 2 \delta \theta ^ * = \argmin_{\delta \theta} \sum_{i = 1} ^{M} ||F_i^{i -1}\delta x_{i-1} + G_i^i \delta x_i - a_i||^{2}_{\Lambda} + \sum_{i = 1} ^{K}||H_k^{ik}\delta x_{ik} + J_k^{jk} \delta l_{jk} - c_k||_{\Gamma}^2 δθ=δθargmini=1M∣∣Fii1δxi1+GiiδxiaiΛ2+i=1K∣∣Hkikδxik+JkjkδljkckΓ2

第六步:将上述最小二乘写成矩阵形式,把雅可比矩阵放到矩阵 A A A中,把 a i a_i ai c k c_k ck放到向量 b b b中,那么最终的最小二乘形式如下:
δ θ ∗ = arg min ⁡ δ θ ∣ ∣ A δ θ − b ∣ ∣ 2 \delta \theta ^ * = \argmin_{\delta \theta} ||A\delta \theta - b||^2 δθ=δθargmin∣∣Aδθb2

二、通过QR分解求解上述最小二乘

对测量雅可比 A A A进行QR分解可得:
A = Q [ R 0 ] A = Q \begin{bmatrix} R \\ 0 \end{bmatrix} A=Q[R0]
注:这里的 R R R等于 A T A A^TA ATA的Cholesky分解的上三角矩阵。

将QR分解结果应用到上面的最小二乘中可得:
∥ A θ − b ∥ 2 = ∥ Q [ R 0 ] θ − b ∥ 2 = ∥ Q T [ R 0 ] θ − Q T b ∥ 2 = ∥ [ R 0 ] θ − [ d e ] ∥ 2 = ∥ R θ − d ∥ 2 + ∥ e ∥ 2 \begin{aligned} \| A \boldsymbol{\theta} - \boldsymbol{b} \|^2 & = \left\| Q \begin{bmatrix} R \\ 0 \end{bmatrix} \boldsymbol{\theta} - \boldsymbol{b} \right\|^2 \\ &= \left\| Q^T \begin{bmatrix} R \\ 0 \end{bmatrix} \boldsymbol{\theta} - Q^T \boldsymbol{b} \right\|^2 \\ &= \left\| \begin{bmatrix} R \\ 0 \end{bmatrix} \boldsymbol{\theta} - \begin{bmatrix} \boldsymbol{d} \\ \boldsymbol{e} \end{bmatrix} \right\|^2 \\ &= \| R \boldsymbol{\theta} - \boldsymbol{d} \|^2 + \| \boldsymbol{e} \|^2 \end{aligned} Aθb2= Q[R0]θb 2= QT[R0]θQTb 2= [R0]θ[de] 2=Rθd2+e2

由此便可得到最小二乘解为:
R θ ∗ = d R \boldsymbol{\theta}^* = \boldsymbol{d} Rθ=d
这里由于 R R R是上三角矩阵,因此我们可通过从下往上的回代很快的求出 θ ∗ \boldsymbol{\theta}^* θ

三、通过Givens旋转,增量式更新矩阵 R R R

到这一步就是整个算法最核心的步骤:增量式更新,常规的高斯牛顿法是构造一个 J T J J^TJ JTJ形式的信息矩阵来迭代求解 θ \theta θ,每次迭代的时候都需要重新做线性化并构造 J T J J^TJ JTJ,然后通过Cholesky分解或者QR分解求解正规方程,而ISAM则是从始至终只会维护一个 R R R矩阵,每当有新的观测时,可通过Given旋转直接更新R矩阵,无需再做QR分解或者Cholesky分解(关于Givens旋转含义可参考博客下方链接[2]),具体过程如下:

假设新的测量雅可比矩阵为 w T \boldsymbol{w}^T wT,RHS(right hand side)向量为 γ \gamma γ,将其插入到之前的最小二乘中有:
[ Q T 1 ] [ A w T ] = [ R w T ] , new rhs:  [ d γ ] . \begin{bmatrix} Q^T \\ 1 \end{bmatrix} \begin{bmatrix} A \\ \mathbf{w}^T \end{bmatrix} = \begin{bmatrix} R \\ \mathbf{w}^T \end{bmatrix}, \quad \text{new rhs: } \begin{bmatrix} \mathbf{d} \\ \gamma \end{bmatrix}. [QT1][AwT]=[RwT],new rhs: [dγ].
最终通过Givens旋转便可求得更新后的正规方程 R ′ θ ′ = b ′ R^{'} \theta^{'} = b^{'} Rθ=b,完整的更新过程如下图所示:
R矩阵更新过程

四: 回环和变量重排序

当发生回环时,直接通过Given旋转更新 R R R会使得矩阵中出现很多的非零项,也称fill-in现象,ISAM中通过变量重排序来避免fill-in现象的发生。ISAM1中会周期性的执行变量重排序,在重排序的同时也会重新做线性化重置 R R R矩阵。为啥是周期性的执行重排序呢,是因为它不知道什么时候要做重排序,但为了防止fill-in的发生,它就周期性的执行重排序。在ISAM2中,通过贝叶斯解决了这个问题,ISAM2会判断当前状态是否需要做重排序,只有当需要做重排序的时候才会做重排序。

五: 小结

  1. ISAM通过Giens旋转增量式的更新QR分解中的 R R R矩阵,避免了每次求解释从头构造 J T J J^TJ JTJ,也避免了每次都对这个大的 J T J J^TJ JTJ做Cholesky分解,极大的提高了效率。
  2. 但是ISAM每次观测来的时候默认只会更新一次 R R R矩阵,精度应该会比常用的GN、LM差一点,应为GN和LM每次优化的时候都会多次迭代。
  3. ISAM1无法判断时候该做重新线性化,所以为了防止fill-in的现象,它只能周期性的执行重新线性化和重排序,ISAM2通过贝叶斯树解决了这个问题。

参考资料

  1. Michael Kaess. iSAM: Incremental Smoothing and Mapping
  2. Given旋转: https://zhuanlan.zhihu.com/p/136551885
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值