1.1 理论层面:
- 当拿到平面和平面匹配关系以后,要利用此约束来优化当前的位姿与此平面。所以对于 g2o 实现来说,我们需要一个二元边。
- 此二元边的两个顶点为
VertexPlane
和VertexSE3Expmap
,其中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} a⋅b=aTb=∣a∣∣b∣cosθ ; 叉乘: ∣ a × b ∣ = ∣ a ∣ ∣ b ∣ sin θ \lvert a \times b \rvert = \lvert a \rvert \lvert b\rvert \sin{\theta} ∣a×b∣=∣a∣∣b∣sinθ
- 按照上述公式,夹角的求法只能使用非齐次向量表示
- 所以需要有一个矩阵 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=∣a∣∣b∣sinθn=(PTwcncˉ)×nw=(PTcw−1ncˉ)×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=(PTcw−1ncˉ)×nw)= 03×3− 0nwz−nwy−nwz0nwxnwy−nwx0 ⋅RcwT⋅ 0ncz−ncy−ncz0ncxncy−ncx0 3×6
1.1.1.1.2.2 推导过程:
对于 T − 1 T^{-1} T−1 求法所用到的性质可以看 雅各比和优化问题/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} Error∂Tcw∂(E=(PTcw−1ncˉ)×nw)=(P⋅Tcw−1⋅ncˉ)×nw=(P⋅Tcw−1⋅ncˉ)∧⋅nw=−nw∧⋅(P⋅Tcw−1⋅ncˉ)=−nw∧⋅P⋅Tcw−1⋅ncˉ=∂δξ∂Error=δξ→0limδξ−nw∧P[exp(δξ∧)exp(ξ∧)]−1ncˉ+nw∧P[exp(ξ∧)]−1ncˉ=δξ→0limδξ−nw∧P[exp(ξ∧)]−1[exp(δξ∧)]−1ncˉ+nw∧P[exp(ξ∧)]−1ncˉ=δξ→0limδξ−nw∧Pexp(−ξ∧)exp(−δξ∧)ncˉ+nw∧Pexp(−ξ∧)ncˉ=δξ→0limδξ−nw∧Pexp(−ξ∧)(I−δξ∧)ncˉ+nw∧Pexp(−ξ∧)ncˉ=δξ→0limδξnw∧Pexp(−ξ∧)δξ∧ncˉ=δξ→0lim[δρδϕ]Tnw∧⋅[I3×303×1]3×4⋅[RcwT0−RcwTt1]4×4[δϕ∧0Tδρ0]4×4⋅[nc0]4×1=δξ→0lim[δρδϕ]Tnw∧⋅RcwTδϕ∧nc=δξ→0lim[δρδϕ]T−nw∧⋅RcwTnc∧δϕ=[03×3−nw∧⋅RcwTnc∧]3×6= 03×3− 0nwz−nwy−nwz0nwxnwy−nwx0 ⋅RcwT⋅ 0ncz−ncy−ncz0ncxncy−ncx0
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)= 000000000−nwyy−nwzznwxynwxznwyx−nwxx−nwzznwyznwzxnwzy−nwxx−nwyy
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} Error∂Twc∂(E=(PTwcncˉ)×nw)=(P⋅Twc⋅ncˉ)×nw=(P⋅Twc⋅ncˉ)∧⋅nw=−nw∧⋅(P⋅Twc⋅ncˉ)=−nw∧⋅P⋅Twc⋅ncˉ=∂δξ∂Error=δξ→0limδξ−nw∧Pexp(δξ∧)exp(ξ∧)ncˉ+nw∧Pexp(ξ∧)ncˉ=δξ→0limδξ−nw∧P(I+δξ∧)exp(ξ∧)ncˉ+nw∧Pexp(ξ∧)ncˉ=δξ→0limδξ−nw∧Pδξ∧exp(ξ∧)ncˉ=δξ→0lim[δρδϕ]T−nw∧⋅[I3×303×1]3×4⋅[δϕ∧0Tδρ0]4×4⋅[Rnc0]4×1=δξ→0lim[δρδϕ]T−nw∧⋅[I0]⋅[δϕ∧(Rnc)0]=δξ→0lim[δρδϕ]T−nw∧⋅δϕ∧(Rnc)=δξ→0lim[δρδϕ]Tnw∧⋅(Rnc)∧δϕ=[03×3nw∧⋅(Rnc)∧]3×6= 03×3 0nwz−nwy−nwz0nwxnwy−nwx0 ⋅ 0z−y−z0xy−x0 = 000000000−nwyy−nwzznwxynwxznwyx−nwxx−nwzznwyznwzxnwzy−nwxx−nwyy
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} a⋅bError=aTb=∣a∣∣b∣cosθ=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⋅(PTcw−1ncˉ))=[000[nwTRcwTnc∧](1×3)]= 000[nwxnwynwz]⋅RcwT⋅ 0ncz−ncy−ncz0ncxncy−ncx0
推导过程略
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ˉ))=[000−nwyz+nwzynwxz−nwzx−nwxy+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[δρδϕ]T−nwT⋅(Rnc)∧δϕ=[01×3−nwT⋅(Rnc)∧]1×6= 03×3−[nwxnwynwz]⋅ 0z−y−z0xy−x0 =[000−nwyz+nwzynwxz−nwzx−nwxy+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}}} ∂Tcw∂e(范数)=∂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×b∥Error=∥∣a∣∣b∣sinθn∥=∥(PTwcncˉ)×nw∥= (PTcw−1ncˉ)×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} a⋅bError=aTb=∣a∣∣b∣cosθ=(nwT⋅(PTwcncˉ))2−1
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 read
和 wirte
这两个成员方法是用来 存盘和读盘,可以留空。
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(Twc⋅nc_xTwc⋅nc_y)θ=arcsin(Twc⋅nc_z)R当前坐标→基坐标= cos(θ)sin(θ)0−sin(θ)cos(θ)0001 ⋅ cos(ϕ)0−sin(ϕ)010sin(ϕ)0cos(ϕ) Error=R当前坐标→基坐标T⋅n2
所以直接还是使用 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=(PTcw−1ncˉ)×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 理论层面