SLAM问题中平面与平面夹角约束的雅可比推导

1.1 理论层面:

  • 当拿到平面和平面匹配关系以后,要利用此约束来优化当前的位姿与此平面。所以对于 g2o 实现来说,我们需要一个二元边。
  • 此二元边的两个顶点为 VertexPlaneVertexSE3Expmap ,其中 VertexSE3Expmap 为 g2o 官方定义的,以 SE3Quat 为优化对象的顶点,而 VertexPlane 为自己定义的,以 Plane3D 类为优化对象的顶点。
  • 由于使用 hessian 方法表达平面会有过参数化的问题,也就是在优化的时候会变成一个自带约束(因为四个参数表示平面的三个自由度,所以这四个参数一定是自带约束的)的优化问题,这样会有问题。所以在此优化问题中,使用球坐标参数化形式作为平面的表示方法 (具体参照 球坐标)。
  • 由于使用球坐标表达误差求雅可比难求,所以这里误差采用 Hessian 的表达形式
  • 总结:对于 g2o 内部运算(或者说最小二乘的运算中)涉及到的增量以及雅各比矩阵都采用球坐标,对于误差的计算采用 Hessian 表达。雅各比中使用链式法则将两者串联(详细见雅各比部分)
  • 对于这个误差的计算,想了四种方案,接下来详细介绍
class EdgeParallelPlane : public BaseBinaryEdge<2, Plane3D, VertexPlane, VertexSE3Expmap> 

1.1.1 误差和雅可比计算方案:

  • 对于所有的方案,共同点都是会遇到维度问题
  • 因为 T w c T_{wc} Twc 是一个 4x4 的矩阵,所以对于这里的向量,应该是用 4x1 的齐次坐标表示,而与 3D 点的齐次坐标 [ x , y , z , 1 ] T [x,y,z,1]^T [x,y,z,1]T 不同,向量的齐次坐标应该是 [ a , b , c , 0 ] T [a,b,c,0]^T [a,b,c,0]T,在之后的式子中使用 n ˉ \bar{n} nˉ 表示 n 向量为齐次坐标的形式,即 n ˉ = [ n x n y n z 0 ] \bar{n} = \begin{bmatrix} n_x \\ n_y \\ n_z \\ 0 \end{bmatrix} nˉ= nxnynz0 ,而 n n n 表示非齐次坐标 n = [ n x n y n z ] n = \begin{bmatrix} n_x \\ n_y \\ n_z \end{bmatrix} n= nxnynz
  • 然而,使用 4x1 的齐次坐标表达向量没办法表示两向量间的夹角
  • 这里复习一下向量夹角的表达方式,假设有向量 a,b。点乘: a ⋅ b = a T b = ∣ a ∣ ∣ b ∣ cos ⁡ θ a\cdot b = a^T b = \lvert a \rvert \lvert b \rvert \cos{\theta} ab=aTb=abcosθ ; 叉乘: ∣ a × b ∣ = ∣ a ∣ ∣ b ∣ sin ⁡ θ \lvert a \times b \rvert = \lvert a \rvert \lvert b\rvert \sin{\theta} a×b=absinθ
  • 按照上述公式,夹角的求法只能使用非齐次向量表示
  • 所以需要有一个矩阵 P = [ 1 0 0 0 0 1 0 0 0 0 1 0 ] 3 × 4 \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0&1&0&0 \\ 0&0&1&0 \end{bmatrix}_{3\times 4} 100010001000 3×4 将变换后的齐次向量 ( T w c n ˉ c 齐次 ( 4 × 1 ) T_{wc}\bar n_{c齐次}(4\times1) Twcnˉc齐次(4×1)) 转换成非齐次向量 ( P T w c n c 齐次 ( 3 × 1 ) PT_{wc}n_{c齐次}(3 \times 1) PTwcnc齐次(3×1)),然后再用点乘或者叉乘进行夹角的表示
  • 注意:对于下面所有的雅可比,都是采用先平移后旋转(与 SLAM 十四讲对应),而 ORB_SLAM 上是先旋转后平移,所以写的时候要把前三列与后三列调换,参考:6. 雅各比中旋转和平移的顺序问题
1.1.1.1 方案一:最终采用
1.1.1.1.1 误差:

此方案的误差使用叉乘来表达

  • !但是对于叉乘来说,得到的是一个向量,也就是说此时的 Error 是三维的,如果按照叉乘求雅各比的话最终优化的结果是 [ 0 , 0 , 0 ] T [0,0,0]^T [0,0,0]T,幸运的是,当 a 和 b 的模长都等于 1 时(或者不为零),并且叉乘的结果等于 [ 0 , 0 , 0 ] T [0,0,0]^T [0,0,0]T 的时候,等价于两向量的夹角 sin ⁡ θ = 0 \sin\theta = 0 sinθ=0也就是说两向量叉乘的结果等于 [ 0 , 0 , 0 ] T [0,0,0]^T [0,0,0]T 是这两个向量夹角为 0/180 的充分必要条件。
  • 所以最终使得 Error 为 0,就可以保证两向量是平行的
  • 由于 ORB_SLAM2 里的优化部分,优化的是 Tcw,所以这里的误差最终要化成含有 Tcw 的表达式,以便后面对其求关于 Tcw 的雅可比

a × b = ∣ a ∣ ∣ b ∣ sin ⁡ θ n E r r o r = ( P T w c n c ˉ ) × n w = ( P T c w − 1 n c ˉ ) × n w \begin{align} a \times b &= \lvert a \rvert \lvert b\rvert \sin{\theta}n \\ Error &= (PT_{wc}\bar{n_{c}})\times n_{w} \\ &=(PT_{cw}^{-1}\bar{n_{c}})\times n_{w} \end{align} a×bError=absinθn=(PTwcncˉ)×nw=(PTcw1ncˉ)×nw

1.1.1.1.2 雅各比矩阵 (对 T c w T_{cw} Tcw最终采用
1.1.1.1.2.1 结果

∂ ( E = ( P T c w − 1 n c ˉ ) × n w ) ∂ T c w = [ 0 3 × 3 − [ 0 − n w z n w y n w z 0 − n w x − n w y n w x 0 ] ⋅ R c w T ⋅ [ 0 − n c z n c y n c z 0 − n c x − n c y n c x 0 ] ] 3 × 6 \begin{align} {\partial (E=(PT_{cw}^{-1}\bar{n_{c}})\times n_{w}) \over \partial T_{cw}}=\begin{bmatrix} 0_{3\times3} &-\begin{bmatrix} 0 & -n_{wz} & n_{wy} \\ n_{wz} & 0 & -n_{wx} \\ -n_{wy} & n_{wx} & 0 \end{bmatrix} \cdot R_{cw}^T \cdot \begin{bmatrix} 0 & -n_{cz} & n_{cy} \\ n_{cz} & 0 & -n_{cx} \\ -n_{cy} & n_{cx} & 0\end{bmatrix}\end{bmatrix}_{3\times6} \end{align} Tcw(E=(PTcw1ncˉ)×nw)= 03×3 0nwznwynwz0nwxnwynwx0 RcwT 0nczncyncz0ncxncyncx0 3×6

1.1.1.1.2.2 推导过程:

对于 T − 1 T^{-1} T1 求法所用到的性质可以看 雅各比和优化问题/SLAM中李代数的扰动模型如何对逆变换矩阵,或者逆旋转矩阵求导? - 知乎

E r r o r = ( P ⋅ T c w − 1 ⋅ n c ˉ ) × n w = ( P ⋅ T c w − 1 ⋅ n c ˉ ) ∧ ⋅ n w = − n w ∧ ⋅ ( P ⋅ T c w − 1 ⋅ n c ˉ ) = − n w ∧ ⋅ P ⋅ T c w − 1 ⋅ n c ˉ ∂ ( E = ( P T c w − 1 n c ˉ ) × n w ) ∂ T c w = ∂ E r r o r ∂ δ ξ = lim ⁡ δ ξ → 0 − n w ∧ P [ exp ⁡ ( δ ξ ∧ ) exp ⁡ ( ξ ∧ ) ] − 1 n c ˉ + n w ∧ P [ exp ⁡ ( ξ ∧ ) ] − 1 n c ˉ δ ξ = lim ⁡ δ ξ → 0 − n w ∧ P [ exp ⁡ ( ξ ∧ ) ] − 1 [ exp ⁡ ( δ ξ ∧ ) ] − 1 n c ˉ + n w ∧ P [ exp ⁡ ( ξ ∧ ) ] − 1 n c ˉ δ ξ = lim ⁡ δ ξ → 0 − n w ∧ P exp ⁡ ( − ξ ∧ ) exp ⁡ ( − δ ξ ∧ ) n c ˉ + n w ∧ P exp ⁡ ( − ξ ∧ ) n c ˉ δ ξ = lim ⁡ δ ξ → 0 − n w ∧ P exp ⁡ ( − ξ ∧ ) ( I − δ ξ ∧ ) n c ˉ + n w ∧ P exp ⁡ ( − ξ ∧ ) n c ˉ δ ξ = lim ⁡ δ ξ → 0 n w ∧ P exp ⁡ ( − ξ ∧ ) δ ξ ∧ n c ˉ δ ξ = lim ⁡ δ ξ → 0 n w ∧ ⋅ [ I 3 × 3 0 3 × 1 ] 3 × 4 ⋅ [ R c w T − R c w T t 0 1 ] 4 × 4 [ δ ϕ ∧ δ ρ 0 T 0 ] 4 × 4 ⋅ [ n c 0 ] 4 × 1 [ δ ρ δ ϕ ] T = lim ⁡ δ ξ → 0 n w ∧ ⋅ R c w T δ ϕ ∧ n c [ δ ρ δ ϕ ] T = lim ⁡ δ ξ → 0 − n w ∧ ⋅ R c w T n c ∧ δ ϕ [ δ ρ δ ϕ ] T = [ 0 3 × 3 − n w ∧ ⋅ R c w T n c ∧ ] 3 × 6 = [ 0 3 × 3 − [ 0 − n w z n w y n w z 0 − n w x − n w y n w x 0 ] ⋅ R c w T ⋅ [ 0 − n c z n c y n c z 0 − n c x − n c y n c x 0 ] ] \begin{align} Error&=(P\cdot T_{cw}^{-1}\cdot \bar{n_c}) \times n_w \\ &=(P\cdot T_{cw}^{-1}\cdot \bar{n_c})^\wedge \cdot n_w \\ &=-{n_w}^\wedge \cdot (P\cdot T_{cw}^{-1}\cdot \bar{n_c}) \\ &=-{n_w}^\wedge \cdot P\cdot T_{cw}^{-1}\cdot \bar{n_c} \\ \\ {\partial (E=(PT_{cw}^{-1}\bar{n_c})\times n_{w}) \over \partial T_{cw}}&={{\partial Error} \over \partial\delta \xi } \\ &=\lim_{\delta\xi\to0}{-n_w^\wedge P [{\exp(\delta \xi^\wedge) \exp(\xi^\wedge)}]^{-1} \bar{n_c} + n_w^\wedge P [\exp(\xi^\wedge)]^{-1}\bar{n_c}\over \delta \xi} \\ &=\lim_{\delta\xi\to0}{-n_w^\wedge P [\exp(\xi^\wedge)]^{-1} [\exp(\delta \xi^\wedge)]^{-1} \bar{n_c} + n_w^\wedge P [\exp(\xi^\wedge)]^{-1}\bar{n_c}\over \delta \xi} \\ &=\lim_{\delta\xi\to0}{-n_w^\wedge P \exp(-\xi^\wedge) \exp(-\delta \xi^\wedge) \bar{n_c} + n_w^\wedge P \exp(-\xi^\wedge)\bar{n_c}\over \delta \xi} \\ &=\lim_{\delta\xi\to0}{-n_w^\wedge P \exp(-\xi^\wedge) (I - \delta\xi^\wedge) \bar{n_c} + n_w^\wedge P \exp(-\xi^\wedge)\bar{n_c}\over \delta \xi} \\ &=\lim_{\delta\xi\to0}{n_w^\wedge P \exp(-\xi^\wedge) \delta\xi^\wedge \bar{n_c} \over \delta \xi} \\ &=\lim_{\delta\xi\to0}{n_w^\wedge \cdot {\begin{bmatrix}I_{3\times3} & 0_{3\times1}\end{bmatrix}_{3\times4}} \cdot {\begin{bmatrix} R_{cw}^T & -R_{cw}^Tt \\ 0 & 1\end{bmatrix}_{4\times4}} {\begin{bmatrix} \delta\phi^\wedge & \delta\rho \\ 0^T & 0\end{bmatrix}_{4\times4}} \cdot {\begin{bmatrix} n_c \\ 0\end{bmatrix}_{4\times1}}\over \begin{bmatrix}\delta\rho & \delta\phi\end{bmatrix}^T} \\ &=\lim_{\delta\xi\to0}{n_w^\wedge \cdot R_{cw}^T \delta \phi^\wedge n_c \over \begin{bmatrix}\delta\rho & \delta\phi\end{bmatrix}^T} \\ &=\lim_{\delta\xi\to0}{-n_w^\wedge \cdot R_{cw}^T n_c^\wedge \delta \phi \over \begin{bmatrix}\delta\rho & \delta\phi\end{bmatrix}^T} \\ &=\begin{bmatrix} 0_{3\times3} & -n_w^\wedge \cdot R_{cw}^T n_c^\wedge \end{bmatrix}_{3\times6} \\ &=\begin{bmatrix} 0_{3\times3} &-\begin{bmatrix} 0 & -n_{wz} & n_{wy} \\ n_{wz} & 0 & -n_{wx} \\ -n_{wy} & n_{wx} & 0 \end{bmatrix} \cdot R_{cw}^T \cdot \begin{bmatrix} 0 & -n_{cz} & n_{cy} \\ n_{cz} & 0 & -n_{cx} \\ -n_{cy} & n_{cx} & 0\end{bmatrix}\end{bmatrix} \end{align} ErrorTcw(E=(PTcw1ncˉ)×nw)=(PTcw1ncˉ)×nw=(PTcw1ncˉ)nw=nw(PTcw1ncˉ)=nwPTcw1ncˉ=δξError=δξ0limδξnwP[exp(δξ)exp(ξ)]1ncˉ+nwP[exp(ξ)]1ncˉ=δξ0limδξnwP[exp(ξ)]1[exp(δξ)]1ncˉ+nwP[exp(ξ)]1ncˉ=δξ0limδξnwPexp(ξ)exp(δξ)ncˉ+nwPexp(ξ)ncˉ=δξ0limδξnwPexp(ξ)(Iδξ)ncˉ+nwPexp(ξ)ncˉ=δξ0limδξnwPexp(ξ)δξncˉ=δξ0lim[δρδϕ]Tnw[I3×303×1]3×4[RcwT0RcwTt1]4×4[δϕ0Tδρ0]4×4[nc0]4×1=δξ0lim[δρδϕ]TnwRcwTδϕnc=δξ0lim[δρδϕ]TnwRcwTncδϕ=[03×3nwRcwTnc]3×6= 03×3 0nwznwynwz0nwxnwynwx0 RcwT 0nczncyncz0ncxncyncx0

1.1.1.1.3 雅各比矩阵 (对 T w c T_{wc} Twc)
1.1.1.1.3.1 结果

∂ ( E = ( P T w c n c ˉ ) × n w ) ∂ T w c = [ 0 0 0 − n w y y − n w z z n w y x n w z x 0 0 0 n w x y − n w x x − n w z z n w z y 0 0 0 n w x z n w y z − n w x x − n w y y ] \begin{align} {\partial (E=(PT_{wc}\bar{n_{c}})\times n_{w}) \over \partial T_{wc}}=\begin{bmatrix} 0&0&0& -n_{wy}y - n_{wz}z & n_{wy}x & n_{wz}x \\ 0&0&0& n_{wx}y & -n_{wx}x - n_{wz}z & n_{wz}y \\ 0&0&0& n_{wx}z & n_{wy}z & -n_{wx}x - n_{wy}y \end{bmatrix} \end{align} Twc(E=(PTwcncˉ)×nw)= 000000000nwyynwzznwxynwxznwyxnwxxnwzznwyznwzxnwzynwxxnwyy

1.1.1.1.3.2 推导过程:

E r r o r = ( P ⋅ T w c ⋅ n c ˉ ) × n w = ( P ⋅ T w c ⋅ n c ˉ ) ∧ ⋅ n w = − n w ∧ ⋅ ( P ⋅ T w c ⋅ n c ˉ ) = − n w ∧ ⋅ P ⋅ T w c ⋅ n c ˉ ∂ ( E = ( P T w c n c ˉ ) × n w ) ∂ T w c = ∂ E r r o r ∂ δ ξ = lim ⁡ δ ξ → 0 − n w ∧ P exp ⁡ ( δ ξ ∧ ) exp ⁡ ( ξ ∧ ) n c ˉ + n w ∧ P exp ⁡ ( ξ ∧ ) n c ˉ δ ξ = lim ⁡ δ ξ → 0 − n w ∧ P ( I + δ ξ ∧ ) exp ⁡ ( ξ ∧ ) n c ˉ + n w ∧ P exp ⁡ ( ξ ∧ ) n c ˉ δ ξ = lim ⁡ δ ξ → 0 − n w ∧ P δ ξ ∧ exp ⁡ ( ξ ∧ ) n c ˉ δ ξ = lim ⁡ δ ξ → 0 − n w ∧ ⋅ [ I 3 × 3 0 3 × 1 ] 3 × 4 ⋅ [ δ ϕ ∧ δ ρ 0 T 0 ] 4 × 4 ⋅ [ R n c 0 ] 4 × 1 [ δ ρ δ ϕ ] T = lim ⁡ δ ξ → 0 − n w ∧ ⋅ [ I 0 ] ⋅ [ δ ϕ ∧ ( R n c ) 0 ] [ δ ρ δ ϕ ] T = lim ⁡ δ ξ → 0 − n w ∧ ⋅ δ ϕ ∧ ( R n c ) [ δ ρ δ ϕ ] T = lim ⁡ δ ξ → 0 n w ∧ ⋅ ( R n c ) ∧ δ ϕ [ δ ρ δ ϕ ] T = [ 0 3 × 3 n w ∧ ⋅ ( R n c ) ∧ ] 3 × 6 = [ 0 3 × 3 [ 0 − n w z n w y n w z 0 − n w x − n w y n w x 0 ] ⋅ [ 0 − z y z 0 − x − y x 0 ] ] = [ 0 0 0 − n w y y − n w z z n w y x n w z x 0 0 0 n w x y − n w x x − n w z z n w z y 0 0 0 n w x z n w y z − n w x x − n w y y ] \begin{align} Error&=(P\cdot T_{wc}\cdot \bar{n_{c}}) \times n_w \\ &=(P\cdot T_{wc}\cdot \bar{n_{c}})^\wedge \cdot n_w \\ &=-{n_w}^\wedge \cdot (P\cdot T_{wc}\cdot \bar{n_{c}}) \\ &=-{n_w}^\wedge \cdot P\cdot T_{wc}\cdot \bar{n_{c}} \\ \\ {\partial (E=(PT_{wc}\bar{n_{c}})\times n_{w}) \over \partial T_{wc}}&={{\partial Error} \over \partial\delta \xi } \\ &=\lim_{\delta\xi\to0}{-n_w^\wedge P \exp(\delta \xi^\wedge) \exp(\xi^\wedge)\bar{n_{c}} + n_w^\wedge P \exp(\xi^\wedge)\bar{n_{c}}\over \delta \xi} \\ &=\lim_{\delta\xi\to0}{-n_w^\wedge P (I + \delta\xi^\wedge) \exp(\xi^\wedge)\bar{n_{c}} + n_w^\wedge P \exp(\xi^\wedge)\bar{n_{c}}\over \delta \xi} \\ &=\lim_{\delta\xi\to0}{-n_w^\wedge P \delta\xi^\wedge \exp(\xi^\wedge)\bar{n_{c}} \over \delta \xi} \\ &=\lim_{\delta\xi\to0}{-n_w^\wedge \cdot {\begin{bmatrix}I_{3\times3} & 0_{3\times1}\end{bmatrix}_{3\times4}} \cdot {\begin{bmatrix} \delta\phi^\wedge & \delta\rho \\ 0^T & 0\end{bmatrix}_{4\times4}} \cdot {\begin{bmatrix} Rn_c \\ 0\end{bmatrix}_{4\times1}}\over \begin{bmatrix}\delta\rho & \delta\phi\end{bmatrix}^T} \\ &=\lim_{\delta\xi\to0}{-n_w^\wedge \cdot \begin{bmatrix} I&0 \end{bmatrix} \cdot \begin{bmatrix} \delta \phi^\wedge(Rn_c) \\ 0 \end{bmatrix} \over \begin{bmatrix}\delta\rho & \delta\phi\end{bmatrix}^T} \\ &=\lim_{\delta\xi\to0}{-n_w^\wedge \cdot \delta \phi^\wedge(Rn_c) \over \begin{bmatrix}\delta\rho & \delta\phi\end{bmatrix}^T} \\ &=\lim_{\delta\xi\to0}{n_w^\wedge \cdot (Rn_c)^\wedge \delta \phi \over \begin{bmatrix}\delta\rho & \delta\phi\end{bmatrix}^T} \\ &=\begin{bmatrix} 0_{3\times3} & n_w^\wedge \cdot (Rn_c)^\wedge \end{bmatrix}_{3\times6} \\ &=\begin{bmatrix} 0_{3\times3} &\begin{bmatrix} 0 & -n_{wz} & n_{wy} \\ n_{wz} & 0 & -n_{wx} \\ -n_{wy} & n_{wx} & 0 \end{bmatrix} \cdot \begin{bmatrix} 0 & -z & y \\ z & 0 & -x \\ -y & x & 0 \end{bmatrix}\end{bmatrix} \\ &=\begin{bmatrix} 0&0&0& -n_{wy}y - n_{wz}z & n_{wy}x & n_{wz}x \\ 0&0&0& n_{wx}y & -n_{wx}x - n_{wz}z & n_{wz}y \\ 0&0&0& n_{wx}z & n_{wy}z & -n_{wx}x - n_{wy}y \end{bmatrix} \end{align} ErrorTwc(E=(PTwcncˉ)×nw)=(PTwcncˉ)×nw=(PTwcncˉ)nw=nw(PTwcncˉ)=nwPTwcncˉ=δξError=δξ0limδξnwPexp(δξ)exp(ξ)ncˉ+nwPexp(ξ)ncˉ=δξ0limδξnwP(I+δξ)exp(ξ)ncˉ+nwPexp(ξ)ncˉ=δξ0limδξnwPδξexp(ξ)ncˉ=δξ0lim[δρδϕ]Tnw[I3×303×1]3×4[δϕ0Tδρ0]4×4[Rnc0]4×1=δξ0lim[δρδϕ]Tnw[I0][δϕ(Rnc)0]=δξ0lim[δρδϕ]Tnwδϕ(Rnc)=δξ0lim[δρδϕ]Tnw(Rnc)δϕ=[03×3nw(Rnc)]3×6= 03×3 0nwznwynwz0nwxnwynwx0 0zyz0xyx0 = 000000000nwyynwzznwxynwxznwyxnwxxnwzznwyznwzxnwzynwxxnwyy

1.1.1.2 方案二:
1.1.1.2.1 误差:

此方案的误差使用点乘来表达,并且要使用两个约束

  • 由于是点乘,所以此时的 Error 是一个标量
  • 并且由于点乘最后与角度相关的是 cos,所以当 Error=0 时,角度是接近 90/270 度的
  • 基于上面的特性,所以使用两个约束,最终使用两个边,也就是要保证当前的向量与其余的两个曼哈顿向量都垂直
  • 这样就可以保证当前向量与其中一个曼哈顿轴平行

a ⋅ b = a T b = ∣ a ∣ ∣ b ∣ cos ⁡ θ E r r o r = n w T ⋅ ( P T w c n c ˉ ) \begin{align} a\cdot b &= a^T b = \lvert a \rvert \lvert b \rvert \cos{\theta} \\ \\ Error &= n_{w}^T \cdot (PT_{wc}\bar{n_{c}}) \end{align} abError=aTb=abcosθ=nwT(PTwcncˉ)

1.1.1.2.2 雅各比矩阵(对 T c w T_{cw} Tcw

结果

∂ ( E = n w T ⋅ ( P T c w − 1 n c ˉ ) ) ∂ T c w = [ 0 0 0 [ n w T R c w T n c ∧ ] ( 1 × 3 ) ] = [ 0 0 0 [ n w x n w y n w z ] ⋅ R c w T ⋅ [ 0 − n c z n c y n c z 0 − n c x − n c y n c x 0 ] ] \begin{align} {\partial (E=n_{w}^T \cdot (PT_{cw}^{-1}\bar{n_{c}})) \over \partial T_{cw}} &=\begin{bmatrix}0&0&0& [n_w^T R_{cw}^T n_{c}^\wedge]_{(1\times3)}\end{bmatrix} \\ &=\begin{bmatrix} 0&0&0&\begin{bmatrix} n_{wx} & n_{wy} & n_{wz} \end{bmatrix} \cdot R_{cw}^T \cdot \begin{bmatrix} 0 & -n_{cz} & n_{cy} \\ n_{cz} & 0 & -n_{cx} \\ -n_{cy} & n_{cx} & 0 \end{bmatrix} \end{bmatrix} \end{align} Tcw(E=nwT(PTcw1ncˉ))=[000[nwTRcwTnc](1×3)]= 000[nwxnwynwz]RcwT 0nczncyncz0ncxncyncx0

推导过程略

1.1.1.2.3 雅各比矩阵(对 T w c T_{wc} Twc

结果

∂ ( E = n w T ⋅ ( P T w c n c ˉ ) ) ∂ T w c = [ 0 0 0 − n w y z + n w z y n w x z − n w z x − n w x y + n w y x ] {\partial (E=n_{w}^T \cdot (PT_{wc}\bar{n_{c}})) \over \partial T_{wc}} =\begin{bmatrix} 0&0&0&-n_{wy}z + n_{wz}y & n_{wx}z - n_{wz}x & -n_{wx}y + n_{wy}x \end{bmatrix} Twc(E=nwT(PTwcncˉ))=[000nwyz+nwzynwxznwzxnwxy+nwyx]

推导过程:

∂ ( E = n w T ⋅ ( P T w c n c ˉ ) ) ∂ T w c = ∂ E r r o r ∂ δ ξ = lim ⁡ δ ξ → 0 n w T P exp ⁡ ( δ ξ ∧ ) exp ⁡ ( ξ ∧ ) n c ˉ − n w T P exp ⁡ ( ξ ∧ ) n c ˉ δ ξ = lim ⁡ δ ξ → 0 n w T P ( I + δ ξ ∧ ) exp ⁡ ( ξ ∧ ) n c ˉ − n w T P exp ⁡ ( ξ ∧ ) n c ˉ δ ξ = lim ⁡ δ ξ → 0 n w T P δ ξ ∧ exp ⁡ ( ξ ∧ ) n c ˉ δ ξ = lim ⁡ δ ξ → 0 n w T ⋅ [ I 3 × 3 0 3 × 1 ] 3 × 4 ⋅ [ δ ϕ ∧ δ ρ 0 T 0 ] 4 × 4 ⋅ [ R n c 0 ] 4 × 1 [ δ ρ δ ϕ ] T = lim ⁡ δ ξ → 0 n w T ⋅ [ I 0 ] ⋅ [ δ ϕ ∧ ( R n c ) 0 ] [ δ ρ δ ϕ ] T = lim ⁡ δ ξ → 0 n w T ⋅ δ ϕ ∧ ( R n c ) [ δ ρ δ ϕ ] T = lim ⁡ δ ξ → 0 − n w T ⋅ ( R n c ) ∧ δ ϕ [ δ ρ δ ϕ ] T = [ 0 1 × 3 − n w T ⋅ ( R n c ) ∧ ] 1 × 6 = [ 0 3 × 3 − [ n w x n w y n w z ] ⋅ [ 0 − z y z 0 − x − y x 0 ] ] = [ 0 0 0 − n w y z + n w z y n w x z − n w z x − n w x y + n w y x ] \begin{align} {\partial (E=n_{w}^T \cdot (PT_{wc}\bar{n_{c}})) \over \partial T_{wc}} &={{\partial Error} \over \partial\delta \xi } \\ &=\lim_{\delta\xi\to0}{n_w^T P \exp(\delta \xi^\wedge) \exp(\xi^\wedge)\bar{n_{c}} - n_w^T P \exp(\xi^\wedge)\bar{n_{c}}\over \delta \xi} \\ &=\lim_{\delta\xi\to0}{n_w^T P (I + \delta\xi^\wedge) \exp(\xi^\wedge)\bar{n_{c}} - n_w^T P \exp(\xi^\wedge)\bar{n_{c}}\over \delta \xi} \\ &=\lim_{\delta\xi\to0}{n_w^T P \delta\xi^\wedge \exp(\xi^\wedge)\bar{n_{c}} \over \delta \xi} \\ &=\lim_{\delta\xi\to0}{n_w^T \cdot {\begin{bmatrix}I_{3\times3} & 0_{3\times1}\end{bmatrix}_{3\times4}} \cdot {\begin{bmatrix} \delta\phi^\wedge & \delta\rho \\ 0^T & 0\end{bmatrix}_{4\times4}} \cdot {\begin{bmatrix} Rn_c\\ 0\end{bmatrix}_{4\times1}}\over \begin{bmatrix}\delta\rho & \delta\phi\end{bmatrix}^T} \\ &=\lim_{\delta\xi\to0}{n_w^T \cdot \begin{bmatrix} I&0 \end{bmatrix} \cdot \begin{bmatrix} \delta \phi^\wedge(Rn_c) \\ 0 \end{bmatrix} \over \begin{bmatrix}\delta\rho & \delta\phi\end{bmatrix}^T} \\ &=\lim_{\delta\xi\to0}{n_w^T \cdot \delta \phi^\wedge(Rn_c) \over \begin{bmatrix}\delta\rho & \delta\phi\end{bmatrix}^T} \\ &=\lim_{\delta\xi\to0}{-n_w^T \cdot (Rn_c)^\wedge \delta \phi \over \begin{bmatrix}\delta\rho & \delta\phi\end{bmatrix}^T} \\ &=\begin{bmatrix} 0_{1\times3} & -n_w^T \cdot (Rn_c)^\wedge \end{bmatrix}_{1\times6} \\ &=\begin{bmatrix} 0_{3\times3} & -\begin{bmatrix} n_{wx} & n_{wy} & n_{wz} \end{bmatrix} \cdot \begin{bmatrix} 0 & -z & y \\ z & 0 & -x \\ -y & x & 0 \end{bmatrix}\end{bmatrix} \\ &=\begin{bmatrix} 0&0&0&-n_{wy}z + n_{wz}y & n_{wx}z - n_{wz}x & -n_{wx}y + n_{wy}x \end{bmatrix} \end{align} Twc(E=nwT(PTwcncˉ))=δξError=δξ0limδξnwTPexp(δξ)exp(ξ)ncˉnwTPexp(ξ)ncˉ=δξ0limδξnwTP(I+δξ)exp(ξ)ncˉnwTPexp(ξ)ncˉ=δξ0limδξnwTPδξexp(ξ)ncˉ=δξ0lim[δρδϕ]TnwT[I3×303×1]3×4[δϕ0Tδρ0]4×4[Rnc0]4×1=δξ0lim[δρδϕ]TnwT[I0][δϕ(Rnc)0]=δξ0lim[δρδϕ]TnwTδϕ(Rnc)=δξ0lim[δρδϕ]TnwT(Rnc)δϕ=[01×3nwT(Rnc)]1×6= 03×3[nwxnwynwz] 0zyz0xyx0 =[000nwyz+nwzynwxznwzxnwxy+nwyx]

1.1.1.3 方案三:
1.1.1.3.1 误差:

此方案的误差使用叉乘的模长(范数)来表达

  • 由于是叉乘的模长,所以此时的 Error 是一个标量
  • 由于不知道怎么对一个范数求对位姿的雅可比,所以使用链式法则 ∂ e ( 范数 ) ∂ T c w = ∂ e ( 范数 ) ∂ e 非范数 ⋅ ∂ δ e ( 非范数 ) ∂ T c w {{\partial e_{(范数)}}\over {\partial T_{cw}}} ={{\partial e_{(范数)}}\over {\partial e_{非范数}}} \cdot {{\partial \delta e_{(非范数)}}\over {\partial T_{cw}}} Tcwe(范数)=e非范数e(范数)Tcwδe(非范数)
  • 非范数的雅可比见方案一

∥ a × b ∥ = ∥ ∣ a ∣ ∣ b ∣ sin ⁡ θ n ∥ E r r o r = ∥ ( P T w c n c ˉ ) × n w ∥ = ∥ ( P T c w − 1 n c ˉ ) × n w ∥ \begin{align} \left\| a \times b \right\| &= \left\| \lvert a \rvert \lvert b\rvert \sin{\theta}n \right\| \\ Error &=\left\| (PT_{wc}\bar{n_{c}})\times n_{w} \right\| \\ &=\left\| (PT_{cw}^{-1}\bar{n_{c}})\times n_{w} \right\| \end{align} a×bError=absinθn=(PTwcncˉ)×nw= (PTcw1ncˉ)×nw

1.1.1.3.2 雅各比矩阵

1.1.1.4 方案四:
1.1.1.4.1 误差:

**此方案的误差使用点乘的平方来表达,但是后面要 -1,这样可以用点乘表达平行关系

  • 由于是点乘,所以此时的 Error 是一个标量
  • 并且由于点乘最后与角度相关的是 cos,所以要让点乘的结果接近于 1/-1 才是平行
  • 对于点乘进行平方处理,这样可以保证点乘平方接近于 1 就是平行

a ⋅ b = a T b = ∣ a ∣ ∣ b ∣ cos ⁡ θ E r r o r = ( n w T ⋅ ( P T w c n c ˉ ) ) 2 − 1 \begin{align} a\cdot b &= a^T b = \lvert a \rvert \lvert b \rvert \cos{\theta} \\ \\ Error &= (n_{w}^T \cdot (PT_{wc}\bar{n_{c}}))^2 -1 \end{align} abError=aTb=abcosθ=(nwT(PTwcncˉ))21

1.1.1.4.2 雅各比矩阵

1.2 代码层面:重载边成员方法

具体实现可参照 从高斯牛顿法理解如何自定义G2O

对于自定义的边,有以下函数需要重载以实现自定义的功能

virtual bool read(std::istream& is);
virtual bool write(std::ostream& os) const;
virtual void computeError();
virtual void linearizeOplus();

1.2.1 readwirte

这两个成员方法是用来 存盘和读盘,可以留空。

1.2.2 computeError 定义误差计算方式

如果直接使用球坐标的方式求误差,那么对位姿 SE3 的雅各比会特别难求,以下为球坐标表达的 Error:

{ ϕ = arctan ⁡ ( T w c ⋅ n c _ y T w c ⋅ n c _ x ) θ = arcsin ⁡ ( T w c ⋅ n c _ z ) R 当前坐标 → 基坐标 = [ cos ⁡ ( θ ) − sin ⁡ ( θ ) 0 sin ⁡ ( θ ) cos ⁡ ( θ ) 0 0 0 1 ] ⋅ [ cos ⁡ ( ϕ ) 0 sin ⁡ ( ϕ ) 0 1 0 − sin ⁡ ( ϕ ) 0 cos ⁡ ( ϕ ) ] E r r o r = R 当前坐标 → 基坐标 T ⋅ n 2 \begin{cases} \phi = \arctan\left(\frac{T_{wc}\cdot{n_{c\_y}}}{T_{wc}\cdot{n_{c\_x}}}\right) \\ \theta = \arcsin\left(T_{wc}\cdot{n_{c\_z}}\right) \\ R_{当前坐标\to基坐标} = \begin{bmatrix} \cos(\theta) & -\sin(\theta) & 0 \\ \sin(\theta) & \cos(\theta) & 0 \\ 0 & 0 & 1 \end{bmatrix}\cdot \begin{bmatrix} \cos(\phi) & 0 & \sin(\phi) \\ 0 & 1 & 0 \\ -\sin(\phi) & 0 & \cos(\phi) \end{bmatrix} \\ Error = R_{当前坐标\to基坐标}^T \cdot n_{2} \end{cases} ϕ=arctan(Twcnc_xTwcnc_y)θ=arcsin(Twcnc_z)R当前坐标基坐标= cos(θ)sin(θ)0sin(θ)cos(θ)0001 cos(ϕ)0sin(ϕ)010sin(ϕ)0cos(ϕ) Error=R当前坐标基坐标Tn2

所以直接还是使用 Hessian 方法表示平面,并且使用上面 方案一 的方式求误差。但是由于 Δ x \Delta x Δx 增量更新用的还是球坐标,所以在计算误差前,要将球坐标转换为 Hessian 表达 ( n x , n y , n z , d ) (n_{x},n_{y},n_{z},d) (nx,ny,nz,d)

{ n x = cos ⁡ ϕ cos ⁡ θ n y = cos ⁡ ϕ sin ⁡ θ n z = sin ⁡ ϕ E r r o r = ( P T c w − 1 n c ˉ ) × n w \begin{aligned} &\begin{cases} n_{x} = \cos{\phi}\cos{\theta} \newline n_{y} = \cos{\phi}\sin{\theta} \newline n_{z} = \sin{\phi} \end{cases} \newline &Error = (PT_{cw}^{-1}\bar{n_{c}})\times n_{w} \end{aligned} nx=cosϕcosθny=cosϕsinθnz=sinϕError=(PTcw1ncˉ)×nw

1.2.3 linearizeOplus 定义误差关于状态量的偏导数 (雅可比矩阵).

1.2.3.1 误差对平面雅各比:

由于 Error 采用 Hessian 方式表达,所以误差对平面雅各比需要使用链式法则求:

$$
\begin{align}
&{\partial e_{hessian} \over \partial n_{球} } = {\partial e_{hessian} \over \partial n_{hessian}} \cdot {\partial n_{hessian} \over \partial n_{球}}
\
&{\partial n_{hessian} \over \partial n_{球}} =
\begin{bmatrix}
-\cos \phi \sin \theta & -\sin \phi \cos \theta & 0 \
\cos \phi \cos \theta & -\sin \phi \sin \theta & 0 \
0 & \cos \phi & 0 \
0 & 0 & 1
\end{bmatrix}

\end{align}
$$

1.2.3.2 误差对位姿 SE3 雅各比:

1.1 理论层面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值