g2o_a_general_framework_for_graph_optimaization

2023-05-16

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只需定义误差函数和对当前解施加扰动的过程。还可以很容易地在系统中嵌入新的线性求解器来验证特定求解器的特性,适用于广泛的共享该图结构的问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

g2o_a_general_framework_for_graph_optimaization 的相关文章

  • 如何用networkx绘制社区

    如何使用 python networkx 绘制其社区的图表 如下图所示 图片网址 https data graphstream project org talks CSSS2012 media Community Structure2 jp
  • 如何向图表添加适当的噪声

    我有一个 matlab 图表 类似轨迹的东西 我想向图表添加噪音 我尝试添加正态分布噪声 使用兰特 例如 x1 x a rand size x 对于 y 也是如此 结果附在下面 这不是我想要的 这给了我一个散点图 或者完全嘈杂的图 如下图所
  • R 过渡图

    我想绘制一个转换矩阵 但每个状态都需要 2 列 我的矩阵是 gt R 0 30 60 90
  • 使用facet_wrap 设置中间的最后一个图

    我正在尝试使用facet wrap 创建一些多重图 但是我不确定这是否是适合我的图表的正确方法 这是一个简短的可重现示例 ggplot airquality aes x Day y Temp facet wrap Month geom li
  • Stata 中各个图表的条形图颜色一致

    我在 Stata 中输出堆积条形图 每个堆积条形图从下到上排序 最大 gt 每个团队的最小获胜百分比 clear set obs 10 gen team yankees if inlist n 1 6 replace team red so
  • networkx 边到节点 节点到边表示

    有一个图 G e v 有 N 个节点和 M 个边 它的距离矩阵D是一个NxN矩阵 现在让我们想象一下该图的另一种表示形式G e v v e 即 G 中的节点 v 实际上是图 G 中的边 保持连通性相同 现在它的距离矩阵 D 是 MxM Ne
  • 用Python绘制不等式图

    我正在创建一个程序 它将随机生成线 即不等式 并显示满足约束的区域 我不介意使用哪些库 所以可以随意使用 sympy numpy 等 我将显示我当前的代码 但这只是填充了两行之间的区域 并且根本不使用不等式 如果可能的话 有一个图例就好了
  • 为加权图生成邻接矩阵

    我正在尝试实施弗洛伊德 沃歇尔算法 http en wikipedia org wiki Floyd E2 80 93Warshall algorithm 为此 我需要设置一个adjacency matrix的加权图 我该怎么做呢 我知道这
  • 使用数据值在 d3 js 条形图中添加背景颜色

    我创建了一个非常简单的条形图 现在 我想向创建的条形图添加一些样式 如示例所示 我想在x值大于200时添加红色 我尝试了各种样式填充和背景 但无法获得预期结果 现在知道如何处理吗 添加了代码
  • 给定源顶点,查找有向图中具有环路的所有路径

    我无法解决这个问题 我必须找到所有simple从源顶点开始的路径s含有一个simple有向图中的循环 即不允许重复 当然除了循环在路径上连接回的单个重复顶点 我知道如何使用 DFS 访问来查找图形是否有循环 但我找不到一种方法来使用它来查找
  • java 的地理图表

    谁能推荐一个 Java 组件 它可以让您创建一个漂亮的世界地图图像 突出显示某些国家 基于一些统计数据 与此图像类似的东西 类似于 Google 地理图表 但适用于 Java https developers google com char
  • 如何将共现矩阵转换为 networkx 图

    我正在使用以下代码将列表列表转换为共现矩阵 lst a b b c d e a d b e u pd get dummies pd DataFrame lst prefix prefix sep groupby level 0 axis 1
  • R/Javascript:崩溃和扩展的网络

    我正在使用 R 编程语言 我有以下图形网络数据 library igraph library visNetwork from lt c Boss TeamA TeamA TeamA SubteamA1 SubteamA1 SubteamA1
  • 在 MATLAB 中绘制圆

    我被要求找到在 MATLAB 中绘制圆的不同方法 看起来很无聊 不过我可以想出一些想法 有些可能效率低下 Method 1 ezpolar x 1 Method 2 t linspace 0 2 pi 100 plot sin t cos
  • 如何使用 Chart.js 在堆积条形图中显示内联值?

    我正在使用 Chart js 库在堆叠条形图中显示一些值 但我正在努力找出如何显示条形图中的值 即 现在 我有以下代码 可以在条形顶部显示数字 但我想知道如何在条形内部显示它们 var numberWithCommas function x
  • 如何避免动态图中的“堆指针意大利面条”?

    一般问题 假设您正在编写一个由图组成的系统 以及可以根据相邻节点的配置激活的图重写规则 也就是说 您有一个在运行时不可预测地增长 收缩的动态图 如果你天真地使用malloc 新节点将被分配在内存中的随机位置 经过足够的时间 你的堆将变成一个
  • boost::property_map 在 boost 中是如何实现的以及如何更改它

    我想知道属性映射是如何在提升图中实现的 例如 我的顶点和边属性定义如下 vertex property gt struct NodeInfo int a b c actual bundled property struct NodeInfo
  • ZedGraph 垂直线与 LineObj 问题

    我有一个 ZedGraphControl 里面有几条曲线 我想在一些固定的 x 位置添加垂直线 当然 这些线只能位于实际图形区域内 我尝试以下 LineObj line new LineObj Color Black xPos myPane
  • Gremlin 按顶点属性分组并获取同一顶点中其他属性的总和

    我们有顶点来存储各种作业及其类型 并算作属性 我必须按状态和数量进行分组 我尝试了以下查询 该查询适用于一个属性 receiveCount g V hasLabel Jobs has Type within A B C group by T
  • Kamada 和 Kawai 图形布局算法? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有人尝试过 Kamada Kawai 的 88 算法来绘制一般无向图吗 如果是这样 并且您知道其中的任

随机推荐

  • 小觅双目相机标准彩色版SDK的环境配置

    一 初用MYNTEYE双目相机标准彩色版 xff08 SC xff09 1 小觅相机目前标准版有三款 xff0c 详见 xff1a 小觅双目摄像头标准版系列参数比较 2 彩色工程版有以下7种分辨率可选 xff0c 数据输出格式为YUYV x
  • 小觅双目摄像头标准版系列产品参数比较

  • java for无限循环

    for无限循环的几个情况 判断条件为true 会无限循环 省略了判断条件 会无限循环 判断条件为true 会无限循环 package test010 public class Main nbsp nbsp nbsp public stati
  • 计数器与定时器有何区别

    计数器是当你开始从0开始计数时一直不停的开始记数 除非你让他停下来要不他会不停的记下去 而定时器则是不一样的 是需要你自己先设定一个时间然后开始倒计时 当你的所定时间倒计完以后 他就自动停止下来了 懂了吗 至于用哪个就要看你干什么而定了 8
  • C++基础知识

    1 面向对象的程序设计思想是什么 xff1f 答 xff1a 把数据结构和对数据结构进行操作的方法封装形成一个个的对象 2 什么是类 xff1f 答 xff1a 把一些 具有共性的对象归类后形成一个集合 xff0c 也就是所谓的类 3 对象
  • 【开关电源】降压变换器(BUCK)的断续模式建模

    1 前言 在DCDC变换器中BUCK变换器是最基础的一类降压型变换器 xff0c 它可以将输入电压降低后输出 在连续模式CCM下 xff0c 输出和输入之间的比值是D xff08 D为占空比 xff09 这种开关变换器是一种通过电子开关周期
  • 变量命名规范

    本文转载于https blog csdn net ZCF1002797280 article details 51495229 是我见过的描述最精炼 最好懂的命名文档 xff0c 故收藏转载推荐 1 驼峰命名法 1 1 小驼峰法 除第一个单
  • C++实现websocket服务器握手协议(使用Qt)

    前提 xff1a 笔者在开发server程序时 xff0c 要求websocket与server连接 websocket的机制是在第一次连接时进行握手协议 xff0c 协议通过 xff0c 才可以进行正常的通信 xff0c 否则websoc
  • 00011__ARM和STM32的区别

    https blog csdn net qq 34385566 article details 79668280
  • linux中查看系统资源占用情况的命令

    size 61 large top size 主要参数 d xff1a 指定更新的间隔 xff0c 以秒计算 q xff1a 没有任何延迟的更新 如果使用者有超级用户 xff0c 则top命令将会以最高的优先序执行 c xff1a 显示进程
  • 关于PendSV异常和SVC异常

    这里先说什么是异常 xff0c 什么是中断 xff1f 请下这张图 颜色加深的表项为异常 xff0c 这些属于cm3内核自带的 其中 3 xff0c 2 xff0c 1异常的优先级固定 xff0c 是不可更改的 xff0c 其余的异常中断优
  • FreeRTOS学习4-任务创建和删除

    关于任务创建有3个函数 1 动态创建一个任务 可以自动分配任务堆栈和TCB FreeRTOSConfig h中 xff0c 需要定义 define configSUPPORT DYNAMIC ALLOCATION 1 支持动态内存申请 Ba
  • java里 equals和== 区别

    1 java中equals和 61 61 的区别 值类型是存储在内存中的堆栈 xff08 简称栈 xff09 xff0c 而引用类型的变量在栈中仅仅是存储引用类型变量的地址 xff0c 而其本身则存储在堆中 2 61 61 操作比较的是两个
  • VRPTW建模与求解—基于粒子群算法

    VRPTW建模与求解 基于粒子群算法 1 VRPTW简要描述 VRPTW xff08 Vehicle Routing Problem with Time Windows xff09 是指在经典VRP的前提上 xff0c 给每个客户增添时间窗
  • 伽马分布,指数分布,泊松分布的关系 -转自简书

    原文链接 xff1a https www jianshu com p 6ee90ba47b4a 伽马分布 xff0c 指数分布 xff0c 泊松分布的关系 thinkando 关注 2018 09 25 21 13 字数 714 阅读 29
  • 双轴驱动步进电机云台二自由度单片机控制程序PTU57

    高精度云台由两个电机驱动 xff0c 可控制方位角和高度角 xff0c 具有两自由度的机械电子设备 可用于机器视觉 摄影摄像 监控安防 天文观测 雷达扫描 DIY雕刻机 转盘转台 智能机械手臂 双轴跟踪太阳能定日镜等各类应用高精度云台的场合
  • php使用curl获取需要认证的https请求

    lt php php使用curl获取需要认证的https请求的方法 url 61 34 XXXXXX 34 arr header 61 34 Accept application json 34 arr header 61 34 Autho
  • i-vector本质剖析

    1 i vector的由来 基于因子分析理论 xff0c 句子h的超向量可以描述成 其中为ubm模型的均值超向量 xff0c 即为i vector 2 i vector的计算 2 1 T矩阵的估计 为句子h的观察特征 xff0c 可以对应于
  • C++程序设计基础实验-实验七 多态性

    实验七多态性 一 实验目的 掌握运算符重载的方法 xff1b 掌握使用虚函数的继承实现动态多态性 掌握纯虚函数及抽象类的使用 二 实验内容 设计复数类Complex xff08 请参照教材例题8 1的设计 xff09 xff0c 实现运算符
  • g2o_a_general_framework_for_graph_optimaization

    g2o A General Framework for Graph Optimization NONLINEAR GRAPH OPTIMIZATION USING LEAST SQUARES 机器人和计算机视觉中的许多问题都可以用下列方程的