g2o_a_general_framework_for_graph_optimaization

2024-03-15 04:48

本文主要是介绍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只需定义误差函数和对当前解施加扰动的过程。还可以很容易地在系统中嵌入新的线性求解器来验证特定求解器的特性,适用于广泛的共享该图结构的问题。

这篇关于g2o_a_general_framework_for_graph_optimaization的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/810843

相关文章

Windows中,.net framework 3.5安装

安装.net framework,目前已知2种方法,如下: 一、在MSDN下载对应的安装包,安装,这种可能无法安装成功,概率很大,不成功使用第二种方法,基本上没问题。 二、win8/8.1/10 下安装 .net framework 3.5.1: 1. 打开 win8/8.1/10 安装盘(这里指系统安装镜像文件),提取 sources\sxs 文件夹到 X:\sources\sxs (X代

Android Framework学习(四)之Launcher启动流程解析

在之前的博客中,我们学习了init进程、Zygote进程和SyetemServer进程的启动过程,我们知道SystemServer进程主要用于启动系统的各种服务,二者其中就包含了负责启动Launcher的服务,LauncherAppService,本篇博客我们将一起学习Launcher相关的知识。 Launcher概述 Launcher程序就是我们平时看到的桌面程序,它其实也是一个Androi

Android Framework学习(三)之SyetemServer进程启动解析

从上篇博客中,我们知道了Zygote进程启动了SyetemServer进程,本篇博客我们就一起来学习SyetemServer进程。 SystemServer的作用 整个系统的android framework进程启动流程如下: init进程 –> Zygote进程 –> SystemServer进程 –>各种应用进程 SystemServer进程主要的作用是启动各种系统服务,比如Activ

Android Framework学习(二)之Zygote进程启动解析

上篇博客,我们学习了init进程的相关知识,本篇博客我们一次来学习zygote进程的相关知识。 Zygote简介 在Android系统中,JavaVM(Java虚拟机)、应用程序进程以及运行系统的关键服务的SystemServer进程都是由Zygote进程来创建的,我们也将它称为孵化器。它通过fock(复制进程)的形式来创建应用程序进程和SystemServer进程,由于Zygote进程在启动

论文《Tree Decomposed Graph Neural Network》笔记

【TDGNN】本文提出了一种树分解方法来解决不同层邻域之间的特征平滑问题,增加了网络层配置的灵活性。通过图扩散过程表征了多跳依赖性(multi-hop dependency),构建了TDGNN模型,该模型可以灵活地结合大感受场的信息,并利用多跳依赖性进行信息聚合。 本文发表在2021年CIKM会议上,作者学校:Vanderbilt University,引用量:59。 CIKM会议简介:全称C

CentOS报错make: *** [fuzz-commit-graph.o] Error 1

目录 一、问题描述二、解决方法 一、问题描述 CentOS 7 下执行 make profix=/usr/local/git 命令时报错: [root@server-c00ef8c3-710d-4708-9cde-2c864e7c03e2 git-2.35.1]# make profix=/usr/local/gitCC fuzz-commit-graph.oIn fil

vcpkg安装g2o,提示找不到cs.h,debug模式运行提示找不到libcxsparse.dll

1 找不到cs.h 在VS中双击错误提示,定位到csparse_extension.h文件,将 #include<cs.h> 修改为 // #include<cs.h>#include <suitesparse/cs.h> 即可正常编译 2 debug模式找不到libcxsparse.dll 我这边直接使用RelWithDebug模式,使用release版本的动态库,即可正常运

Comparison method violates its general contract! 神奇的报错

发生情况 定位到问题代码如下(脱敏处理过后),意思是集合排序,如果第一个元素大于第二个元素,比较结果返回1,否则返回-1,这里粗略的认为小于和等于是一样的结果 List<Integer> list = Arrays.asList(2213, 2214, 2235, 2211, 228, 2233, 2215, 2229, 2212, 0, 2245, 2220, 225,2237, 2241,

Graph representation and definition

representation: adjacency matrix 好处是对边或者权重的queries 都是O(1), remove or add an edge也是O(1). 坏处是对点不友好,增加一个点的操作是O(V^2). 而且本身存储太space consuming,同样是点的平方复杂度。导致在sparse matrix里不适用。 Adjacency Matrix is a 2D ar

Play framework 1.2.3 使用缓存、Memcached集成

play框架包含一个缓存lib,这个lib是用来和Memcached集成做分布式缓存用的。  如果不配置Memcached,play框架将会使用单独的缓存(EhCache),其数据存储在JVM的堆中。把数据存储在JVM的堆中 违反了play框架“不共享任何东西”的原则,这也导致了你不能把应用程序同时部署到多个机器,即不能在多个机器上负载均衡以保证应用的可用性、高性能(即使在多个机器部署