g2o_a_general_framework_for_graph_optimaization

g2o: A General Framework for Graph Optimization

NONLINEAR GRAPH OPTIMIZATION USING LEAST-SQUARES

  • 机器人和计算机视觉中的许多问题都可以用下列方程的最小化来求解

  • F ( x ) = ∑ ⟨ i , j ⟩ ∈ C e ( x i , x j , z i j ) ⊤ Ω i j e ( x i , x j , z i j ) ⏟ F i j \mathbf{F}(\mathbf{x})=\sum_{\langle i, j\rangle \in \mathcal{C}} \underbrace{\mathbf{e}\left(\mathbf{x}_{i}, \mathbf{x}_{j}, \mathbf{z}_{i j}\right)^{\top} \boldsymbol{\Omega}_{i j} \mathbf{e}\left(\mathbf{x}_{i}, \mathbf{x}_{j}, \mathbf{z}_{i j}\right)}_{\mathbf{F}_{i j}} F(x)=i,jCFij e(xi,xj,zij)Ωije(xi,xj,zij)

  • x ∗ = argmin ⁡ x F ( x ) . \mathbf{x}^{*}=\underset{\mathbf{x}}{\operatorname{argmin}} \mathbf{F}(\mathbf{x}) . x=xargminF(x).

    • ( x 1 T , ⋯   , x n T ) T \mathbf{(x_1^T, \cdots ,x_n^T)^T} (x1T,,xnT)T:参数向量, x i \mathbf{x}_i xi:表示一个一般的参数块

    • z i j \mathbf{z}_{ij} zij Ω i j \Omega_{ij} Ωij:分别表示与参数相关约束的均值和信息矩阵

    • e ( x i , x j , z i j ) \mathbf{e}\left(\mathbf{x}_{i}, \mathbf{x}_{j}, \mathbf{z}_{i j}\right) e(xi,xj,zij) :向量误差函数,度量参数块 x i \mathbf{x}_i xi x j \mathbf{x}_j xj 满足约束 z i j \mathbf{z}_{ij} zij 的程度,完全满足约束条件时为 0 \mathbf 0 0

  • 简单起见:

  • e ( x i , x j , z i j ) =  def.  e i j ( x i , x j ) =  def.  e i j ( x ) . \mathbf{e}\left(\mathbf{x}_{i}, \mathbf{x}_{j}, \mathbf{z}_{i j}\right) \stackrel{\text { def. }}{=} \mathbf{e}_{i j}\left(\mathbf{x}_{i}, \mathbf{x}_{j}\right) \stackrel{\text { def. }}{=} \mathbf{e}_{i j}(\mathbf{x}). e(xi,xj,zij)= def. eij(xi,xj)= def. eij(x).

    • 注意:每一个误差函数,每一个参数块,每一个误差函数都能张成不同的空间。在这种形式下,一个问题能用一个图来高效地表示。

    • 节点 i i i 表示参数块 x i \mathbf{x}_i xi ,节点 i i i 和节点 j j j 之间的边表示两个参数块 x j 和 x i \mathbf{x}_j和\mathbf{x}_i xjxi 之间的有序约束。

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ciloICLW-1648560327983)(g2o_a_general_framework_for_graph_optimaization.assets/image-20220328163210512.png)]

  • A. 最小二乘优化

    • 如果已知参数 X ˘ \breve{\mathbf{X}} X˘ 有一个良好的猜测值,可以用(2) 使用G-N或L-M算法求数值解,思想:用当前状态猜测值 X ˘ \breve{\mathbf{X}} X˘ 附近的一阶泰勒展开近似误差函数。

    • e i j ( x ˘ i + Δ x i , x ˘ j + Δ x j ) = e i j ( x ˘ + Δ x ) \mathbf{e}_{i j}\left(\breve{\mathbf{x}}_{i}+\boldsymbol{\Delta} \mathbf{x}_{i}, \breve{\mathbf{x}}_{j}+\boldsymbol{\Delta} \mathbf{x}_{j}\right)=\mathbf{e}_{i j}(\breve{\mathbf{x}}+\boldsymbol{\Delta} \mathbf{x}) eij(x˘i+Δxi,x˘j+Δxj)=eij(x˘+Δx)

    • ≃ e i j + J i j Δ x . \quad \qquad \qquad \qquad \qquad \qquad \simeq \mathbf{e}_{i j}+\mathbf{J}_{i j} \Delta \mathbf{x}. eij+JijΔx.

    • J i j \mathbf{J}_{ij} Jij 是在 X ˘ \breve{\mathbf{X}} X˘ e i j =  def.  e i j ( X ˘ ) \mathbf{e}_{i j} \stackrel{\text { def. }}{=}\mathbf{e}_{i j}(\breve{\mathbf{X}}) eij= def. eij(X˘) 处的雅克比,将(5) 带入(1)中 F i j \mathbf{F}_{ij} Fij​的误差项中得到:

    • F i j ( x ˘ + Δ x ) = e i j ( x ˘ + Δ x ) ⊤ Ω i j e i j ( x ˘ + Δ x ) ≃ ( e i j + J i j Δ x ) ⊤ Ω i j ( e i j + J i j Δ x ) = e i j ⊤ Ω i j e i j ⏟ c i j + 2 e i j ⊤ Ω i j J i j ⏟ b i j Δ x + Δ x ⊤ J i j ⊤ Ω i j J i j ⏟ H i j Δ x ( 9 ) = c i j + 2 b i j Δ x + Δ x ⊤ H i j Δ x \begin{aligned} \mathbf{F}_{i j} &(\breve{\mathbf{x}}+\boldsymbol{\Delta} \mathbf{x}) \\ &=\mathbf{e}_{i j}(\breve{\mathbf{x}}+\boldsymbol{\Delta} \mathbf{x})^{\top} \boldsymbol{\Omega}_{i j} \mathbf{e}_{i j}(\breve{\mathbf{x}}+\boldsymbol{\Delta} \mathbf{x}) \\ & \simeq\left(\mathbf{e}_{i j}+\mathbf{J}_{i j} \boldsymbol{\Delta} \mathbf{x}\right)^{\top} \boldsymbol{\Omega}_{i j}\left(\mathbf{e}_{i j}+\mathbf{J}_{i j} \boldsymbol{\Delta} \mathbf{x}\right) \\ &=\underbrace{\mathbf{e}_{i j}^{\top} \boldsymbol{\Omega}_{i j} \mathbf{e}_{i j}}_{c_{i j}}+2 \underbrace{\mathbf{e}_{i j}^{\top} \boldsymbol{\Omega}_{i j} \mathbf{J}_{i j}}_{\mathbf{b}_{i j}} \boldsymbol{\Delta} \mathbf{x}+\Delta \mathbf{x}^{\top} \underbrace{\mathbf{J}_{i j}^{\top} \boldsymbol{\Omega}_{i j} \mathbf{J}_{i j}}_{\mathbf{H}_{i j}} \boldsymbol{\Delta} \mathbf{x}(9) \\ &=\mathrm{c}_{i j}+2 \mathbf{b}_{i j} \boldsymbol{\Delta} \mathbf{x}+\boldsymbol{\Delta} \mathbf{x}^{\top} \mathbf{H}_{i j} \boldsymbol{\Delta} \mathbf{x} \end{aligned} Fij(x˘+Δx)=eij(x˘+Δx)Ωijeij(x˘+Δx)(eij+JijΔx)Ωij(eij+JijΔx)=cij eijΩijeij+2bij eijΩijJijΔx+ΔxHij JijΩijJijΔx(9)=cij+2bijΔx+ΔxHijΔx

    • 有了这个局部近似后,重写(1)中的函数 F ( x ) \mathbf{F(x)} F(x)​:

    • F ( x ˘ + Δ x ) = ∑ ⟨ i , j ⟩ ∈ C F i j ( x ˘ + Δ x ) ≃ ∑ ⟨ i , j ⟩ ∈ C c i j + 2 b i j Δ x + Δ x ⊤ H i j Δ x ( 12 ) = c + 2 b ⊤ Δ x + Δ x ⊤ H Δ x . \begin{aligned} \mathbf{F}(\breve{\mathbf{x}}+\boldsymbol{\Delta} \mathbf{x}) &=\sum_{\langle i, j\rangle \in \mathcal{C}} \mathbf{F}_{i j}(\breve{\mathbf{x}}+\boldsymbol{\Delta} \mathbf{x}) \\ & \simeq \sum_{\langle i, j\rangle \in \mathcal{C}} c_{i j}+2 \mathbf{b}_{i j} \boldsymbol{\Delta} \mathbf{x}+\Delta \mathbf{x}^{\top} \mathbf{H}_{i j} \boldsymbol{\Delta} \mathbf{x}(12) \\ &=\mathrm{c}+2 \mathbf{b}^{\top} \boldsymbol{\Delta} \mathbf{x}+\boldsymbol{\Delta} \mathbf{x}^{\top} \mathbf{H} \boldsymbol{\Delta} \mathbf{x}. \end{aligned} F(x˘+Δx)=i,jCFij(x˘+Δx)i,jCcij+2bijΔx+ΔxHijΔx(12)=c+2bΔx+ΔxHΔx.

      • c = ∑ c i j ,   b = ∑ b i j ,   H = ∑ H i j . c = \sum c_{ij}, \ \mathbf{b} = \sum{\mathbf{b}_{ij}}, \ \mathbf{H} = \sum\mathbf{H}_{ij}. c=cij, b=bij, H=Hij.
    • 通过求解线性方程组来最小化 Δ x \Delta \mathbf{x} Δx​ :

    • H Δ x ∗ = − b . \mathbf{H} \Delta \mathbf{x}^{*}=-\mathbf{b}. HΔx=b.

    • H \mathbf{H} H是系统的信息矩阵,解为初始猜想加上增量 Δ x ∗ \Delta \mathbf{x}^{*} Δx

    • x ∗ = x ˘ + Δ x ∗ . \mathbf{x}^{*}=\breve{\mathbf{x}}+\Delta \mathbf{x}^{*}. x=x˘+Δx.

    • L-M算法:

    • ( H + λ I ) Δ x ∗ = − b . (\mathbf{H}+\lambda \mathbf{I}) \boldsymbol{\Delta} \mathbf{x}^{*}=-\mathbf{b}. (H+λI)Δx=b.

  • B. 可选参数化

    • 上面的问题假设参数 x \mathbf{x} x处于欧几里得空间上,对于SLAM或BA等问题并不适用。

    • 为了处理非欧空间上的状态变量,常见方法是在一个不同于参数 x i \mathbf{x}_i xi 的空间中表示增量 Δ x \Delta \mathbf{x} Δx

    • SLAM 中每个参数块 x i = { t i , α i } \mathbf{x}_i = \{t_i, \alpha_i \} xi={ti,αi} t i t_i ti 为欧式空间中表示平移的向量, α i \alpha_i αi 为2D或3D旋转群 S O ( 2 ) 或 S O ( 3 ) SO(2)或SO(3) SO(2)SO(3) 张成的非欧空间。

    • 为避免奇异点,这些空间通常采用过参数化的描述,如旋转矩阵或四元数。

    • 直接将公式(15) 应用到过参数化的表示会破坏由过参数化引起的约束,可以用最小化的旋转表示(如3维中的欧拉角),但是这样会有奇异点(万向锁)。

    • 另一个方法就是计算一种新的误差函数(扰动模型), Δ x i \boldsymbol{\Delta} \mathbf{x}_{i} Δxi 是当前状态变量 X ˘ \breve{\mathbf{X}} X˘ 周围的一个扰动,表示一个细小的旋转, x i \mathbf{x}_i xi 使用过参数化的表示。优化后的变量 x ∗ \mathbf{x^*} x 通过非线性运算符 ⊞ \boxplus 的增量求得:

    • x i ∗ = x ˘ i ⊞ Δ x i ∗ . \mathbf{x}_{i}^{*}=\breve{\mathbf{x}}_{i} \boxplus \boldsymbol{\Delta} \mathbf{x}_{i}^{*}. xi=x˘iΔxi.

    • 在三维SLAM中可用平移向量和归一化四元数的轴来表示增量 Δ x i \boldsymbol{\Delta} \mathbf{x}_{i} Δxi ,位姿 x i \mathbf{x}_i xi 可用旋转向量和完整四元数表示。在将增量转换为与状态变量相同的表示之后,操作符 ⊞ \boxplus 通过使用标准运动组合操作符 ⊕ \oplus 将增量 Δ x i \boldsymbol{\Delta} \mathbf{x}_{i} Δxi 应用到 x i \mathbf{x}_i xi​ .

    • x ˘ i ⊞ Δ x i ∗ =  def.  x ˘ i ⊕ Δ x i ∗ . \breve{\mathbf{x}}_{i} \boxplus \boldsymbol{\Delta} \mathbf{x}_{i}^{*} \stackrel{\text { def. }}{=} \quad \breve{\mathbf{x}}_{i} \oplus \mathbf{\Delta} \mathbf{x}_{i}^{*}. x˘iΔxi= def. x˘iΔxi.

    • 定义一个新的误差函数:

    • e i j ( Δ x i , Δ x j ) =  def.  e i j ( x ˘ i ⊞ Δ x i , x ˘ j ⊞ Δ x j ) = e i j ( x ˘ ⊞ Δ x ) ≃ e i j + J i j Δ x . \begin{aligned} \mathbf{e}_{i j}\left(\boldsymbol{\Delta} \mathbf{x}_{i}, \boldsymbol{\Delta} \mathbf{x}_{j}\right) \stackrel{\text { def. }}{=} & \mathbf{e}_{i j}\left(\breve{\mathbf{x}}_{i} \boxplus \boldsymbol{\Delta} \mathbf{x}_{i}, \breve{\mathbf{x}}_{j} \boxplus \boldsymbol{\Delta} \mathbf{x}_{j}\right) \\ =&\mathbf{e}_{i j}(\breve{\mathbf{x}} \boxplus \boldsymbol{\Delta} \mathbf{x}) \simeq \mathbf{e}_{i j}+\mathbf{J}_{i j} \boldsymbol{\Delta} \mathbf{x}. \end{aligned} eij(Δxi,Δxj)= def. =eij(x˘iΔxi,x˘jΔxj)eij(x˘Δx)eij+JijΔx.

    • X ˘ \breve{\mathbf{X}} X˘ 张成原始的过参数化空间,雅克比 J i j \mathbf{J}_{ij} Jij​等于:

    • J i j = ∂ e i j ( x ˘ ⊞ Δ x ) ∂ Δ x ∣ Δ x = 0 . \mathbf{J}_{i j}=\left.\frac{\partial \mathbf{e}_{i j}(\breve{\mathbf{x}} \boxplus \boldsymbol{\Delta} \mathbf{x})}{\partial \boldsymbol{\Delta} \mathbf{x}}\right|_{\Delta \mathbf{x}=\mathbf{0}}. Jij=Δxeij(x˘Δx)Δx=0.

    • 增量 Δ x ~ ∗ \Delta \tilde{\mathrm{x}}^{*} Δx~ 是在初始猜想 X ˘ \breve{\mathbf{X}} X˘ 的局部欧式空间中计算,故需要由 ⊞ \boxplus 算子重新映射到冗余空间中。

    • g2o框架允许为增量和状态变量定义不同的空间,支持同一个问题中任意参数。无论参数化的选择如何,Hessian 矩阵 H \mathbf{H} H 的结构一般是不变的。

  • 线性系统结构

    • 根据公式(13), H \mathbf{H} H矩阵和向量 b \mathbf{b} b由一组矩阵和向量求和得到,对每个约束,设 b i j = J i j ⊤ Ω i j e i j \mathbf{b}_{i j}=\mathbf{J}_{i j}^{\top} \boldsymbol{\Omega}_{i j} \mathbf{e}_{i j} bij=JijΩijeij H i j = J i j ⊤ Ω i j J i j \mathbf{H}_{i j}=\mathbf{J}_{i j}^{\top} \boldsymbol{\Omega}_{i j} \mathbf{J}_{i j} Hij=JijΩijJij (公式9中也有这样的表达),然后重写 b \mathbf{b} b H \mathbf{H} H​:

    • b = ∑ ⟨ i , j ⟩ ∈ C b i j H = ∑ ⟨ i , j ⟩ ∈ C H i j . \mathbf{b}=\sum_{\langle i, j\rangle \in \mathcal{C}} \mathbf{b}_{i j} \quad \mathbf{H}=\sum_{\langle i, j\rangle \in \mathcal{C}} \mathbf{H}_{i j}. b=i,jCbijH=i,jCHij.

    • 每个约束都对系统有一个附加值的贡献,该值只取决于误差函数的雅克比,由于约束的误差函数只依赖两个节点的值,公式(5) 的雅克比有如下形式:

    • J i j = ( 0 ⋯ 0   A i j ⏟ i   0 ⋯ 0   B i j ⏟ j   0 ⋯ 0 ) . \mathbf{J}_{i j}=(\mathbf{0} \cdots \mathbf{0}\ \underbrace{\mathbf{A}_{i j}}_{i}\ \mathbf{0} \cdots \mathbf{0}\ \underbrace{\mathbf{B}_{i j}}_{j} \ \mathbf{0} \cdots \mathbf{0}). Jij=(00 i Aij 00 j Bij 00).

    • A i j \mathbf{A}_{ij} Aij B i j \mathbf{B}_{ij} Bij分别是误差函数对 Δ x i \boldsymbol{\Delta} \mathbf{x}_{i} Δxi Δ x j \boldsymbol{\Delta} \mathbf{x}_{j} Δxj 的导数,由(9)得到下边的 H i j \mathbf{H}_{ij} Hij​​矩阵块结构: H i j = ( ⋱ A i j ⊤ Ω i j A i j ⋯ A i j ⊤ Ω i j B i j ⋮ ⋮ B i j ⊤ Ω i j A i j ⋯ B i j ⊤ Ω i j B i j ⋱ ) b i j = ( ⋮ A i j ⊤ Ω i j e i j ⋮ B i j ⊤ Ω i j e i j ⋮ ) . \mathbf{H}_{i j}=\left(\begin{array}{cccc} \ddots & & & \\ \mathbf{A}_{i j}^{\top} \boldsymbol{\Omega}_{i j} \mathbf{A}_{i j} & \cdots & \mathbf{A}_{i j}^{\top} \boldsymbol{\Omega}_{i j} \mathbf{B}_{i j} \\ \vdots & & \vdots \\ \mathbf{B}_{i j}^{\top} \boldsymbol{\Omega}_{i j} \mathbf{A}_{i j} & \cdots & \mathbf{B}_{i j}^{\top} \boldsymbol{\Omega}_{i j} \mathbf{B}_{i j} \\ & & & \ddots \end{array}\right) \qquad \mathbf{b}_{ij}= \left(\begin{array}{c} \vdots \\ \mathbf{A}_{i j}^{\top} \boldsymbol{\Omega}_{i j} \mathbf{e}_{i j} \\ \vdots \\ \mathbf{B}_{i j}^{\top} \boldsymbol{\Omega}_{i j} \mathbf{e}_{i j} \\ \vdots \end{array}\right). Hij=AijΩijAijBijΩijAijAijΩijBijBijΩijBijbij=AijΩijeijBijΩijeij.

    • 注: Ω i j \boldsymbol{\Omega}_{i j} Ωij是高维空间上的流型吗?在这里当作一个常数来处理.本质为信息矩阵(有确定的望告知)

    • 为简单表示,省略了0块, H \mathbf{H} H矩阵的块结构是图的邻接矩阵(存放边的数据) ,因此它的非零块的数量与图中的边的数量成正比,通常会得到稀疏的 H \mathbf{H} H矩阵。在g2o中利用 H \mathbf{H} H的这一特性,采用最先进的方法求解(14)的线性系统。

  • 特殊结构系统

    • 某些问题(如BA) 中会导致 H \mathbf{H} H矩阵具有某些特殊结构,本系统可以利用这些特殊结构来提高性能。在BA中一般由两种变量:相机的位姿P和相机观测到的地标点的位姿 I ,通过对(14)中的变量重新排序,得到下列系统:

    • ( H p p H p l H p l ⊤ H l l ) ( Δ x p ∗ Δ x l ∗ ) = ( − b p − b l ) \left(\begin{array}{cc} \mathbf{H}_{\mathrm{pp}} & \mathbf{H}_{\mathrm{pl}} \\ \mathbf{H}_{\mathrm{pl}}^{\top} & \mathbf{H}_{\mathrm{ll}} \end{array}\right)\left(\begin{array}{l} \Delta \mathbf{x}_{\mathrm{p}}^{*} \\ \Delta \mathbf{x}_{\mathbf{l}}^{*} \end{array}\right)=\left(\begin{array}{l} -\mathbf{b}_{\mathrm{p}} \\ -\mathbf{b}_{\mathbf{l}} \end{array}\right) (HppHplHplHll)(ΔxpΔxl)=(bpbl)

    • 通过取 H \mathbf{H} H​矩阵的Schur补得到一个等价的约化系统 [7]

    • ( H p p − H p l H l l − 1 H p l ⊤ ) Δ x p ∗ = − b p + H p l H 1 l − 1 b l . \left(\mathbf{H}_{\mathrm{pp}}-\mathbf{H}_{\mathrm{pl}} \mathbf{H}_{\mathrm{ll}}^{-1} \mathbf{H}_{\mathrm{pl}}^{\top}\right) \Delta \mathrm{x}_{\mathrm{p}}^{*}=-\mathbf{b}_{\mathrm{p}}+\mathbf{H}_{\mathrm{pl}} \mathbf{H}_{1 l}^{-1} \mathbf{b}_{\mathbf{l}}. (HppHplHll1Hpl)Δxp=bp+HplH1l1bl.

    • H 11 \mathbf{H}_{11} H11是一个块对角阵, H 11 − 1 \mathbf{H}_{11}^{-1} H111很好求解,求解(25) 我们可以得到相机的增量 Δ x p ∗ \Delta \mathrm{x}_{\mathrm{p}}^{*} Δxp ,然后利用这个来解

    • H 11 Δ x l ∗ = − b l − H p l ⊤ Δ x p ∗ \mathbf{H}_{11} \Delta \mathbf{x}_{\mathbf{l}}^{*}=-\mathbf{b}_{\mathbf{l}}-\mathbf{H}_{\mathbf{p l}}^{\top} \boldsymbol{\Delta} \mathbf{x}_{\mathbf{p}}^{*} H11Δxl=blHplΔxp

    • 利用 Δ x 1 ∗ \Delta \mathrm{x}_{\mathrm{1}}^{*} Δx1 来调整观测到的世界特征。通常,世界特征的数量大于相机位姿数量,因此用(25) 的求解速度要快于(14). 尽管(25) 需要计算左边的矩阵需要额外的时间。

IMPLEMENTATION

  • 通过实现途中顶点和边的抽象基类来实现目标,连个基类都提供了一组方便子类化的虚函数,大多数内部操作都使用模板参数来实现。运用了Eigen库。

  • 系统框架,只由灰色方框需要自己定义来解决新的优化问题[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GKC6qto5-1648560327984)(g2o_a_general_framework_for_graph_optimaization.assets/image-20220329153511062.png)]

  • 使用所提供的的基类,派生新的节点类型只需要定义 ⊞ \boxplus 算子应用与增量。

  • 连接两个顶点 x i \mathbf{x}_i xi x j \mathbf{x}_j xj 的边需要定义误差函数 e i j ( ⋅ ) \mathbf{e}_{ij}(\cdot) eij(). 用数值计算雅克比矩阵 J i j \mathbf{J}_{ij} Jij ,或者用户可以通过重写虚基类显示地指定 J i j \mathbf{J}_{ij} Jij ,因此只需要编写几行代码就可以实现解决新优化问题或比较不同参数化的新类型。

  • H \mathbf{H} H矩阵的计算可以使用动态尺寸矩阵(一般情况下),也可使用固定尺寸的矩阵(已知变量 x i \mathbf{x}_{i} xi的维度)。利用已知的先验维度可以实现编译时的优化,如展开循环来执行矩阵乘法。

  • 在实现(25)中舒尔补简化所需的矩阵乘法时,利用底层图的稀疏结构,只有乘非零项才会形成额外的 H P P \mathbf{H}_{PP} HPP矩阵。对底层矩阵块结构进行操作,相比于标量矩阵乘法更加高效的矩阵乘法。

  • 该框架时未知的嵌入式线性求解器,可适用于不同问题。

  • 实验中作者使用了两个求解器

    • 1、由于 H \mathbf{H} H是半正定对称矩阵,稀疏Cholesky分解得到了一个有效的求解器。最小二乘迭代期间的非零模式是恒定的,因此能够复用第一次迭代中计算的符号分解,从而减少填充,并减少后继迭代中的总体计算时间。
    • 注意:这种Cholesky分解没有利用参数的块结构。
    • 2、第二种方法是带有块Jacobi预调节器的预条件共轭梯度(PCG),由于PCG本身就是一种迭代方法,求解一个 n × n n\times n n×n矩阵的线性系统需要 n n n 次迭代,使用PCG进行 n n n次迭代通常比Cholesky分解慢,所以基于PCG平方残差的相对减少来限制迭代次数。

EXPERIMENTS

使用真实数据集和人工数据集比较g2o与其他先进算法。然后介绍了实现数据集、设备相关信息。

A. Runtime Comparison

与其他算法运行时间比较。

  • 虽然g2o专注于批处理优化,但它可以通过向图中添加节点后进行优化来增量地处理数据。效率性能类似与为增量使用而设计的方法,可以作为更复杂在线系统的组件。
  • g2o可以数值计算雅克比矩阵 J i j \mathbf{J}_{ij} Jij,可以快速建立一个新的优化问题或一个新的误差函数的原型。

测试不同的参数化

  • 该框架只需要实现误差函数和更新步骤,能够轻松地比较不同的参数化。为此实现了BA中表示姿态的两个不同的参数化。

    1. 增量 Δ x i \Delta x_i Δxi 由平移向量和单位四元数的轴表示。
    2. 增量 Δ x i \Delta x_i Δxi 由李代数 s e ( 3 ) se(3) se(3)表示
    • 两个参数化都收敛到同一个解,但使用李代数 s e ( 3 ) se(3) se(3) 更快。

线性求解器的比较

  • 本系统可以使用不同的线性求解器来求解(14)或(25) ,作者已经实现了两个基于Cholesky分解的求解器CHOLMODCSpare. 还利用block-Jacobi预调节器将PCG实现为一种迭代方法。
  • PCG 的收敛取决于初始猜想与最优解的接近程度。

利用有关结构的知识

  • 如前文所述,某些问题尤其特有的结构。使用这种结构可能会导致线性系统的求解获得实质性的改进。基于地标的SLAM和BA有相同的线性结构:地标/ 点只能与机器人姿态/ 摄像机连接,因此 Hessian H l l \mathbf{H}_{ll} Hll 的地标点部分具有块对角结构。
  • 评估了使用特定分解对基于地标的SLAM和BA的优势。
    • 当地标的数量超多姿态的数量时,预分解的结果会显著加快(BA中典型情况) ,当姿态数量占主导地位时,效率并不是很高。

CONCLUSIONS

  • 使用g2o只需定义误差函数和对当前解施加扰动的过程。还可以很容易地在系统中嵌入新的线性求解器来验证特定求解器的特性,适用于广泛的共享该图结构的问题。

你可能感兴趣的:(SLAM,非线性优化,图论)