从零开始学习VIO笔记 --- 第一讲:基础知识(四元数,李代数)

一. 向量的内积与外积

主要针对三维向量,两个三维向量必定共面;
内积 :
a ⋅ b = a 1 b 1 + a 2 b 2 + a 3 b 3 = ∑ i = 1 3 a i b i = ∣ a ∣ ∣ b ∣ cos ⁡ ⟨ a , b ⟩ a\cdot b=a_1b_1+a_2b_2+a_3b_3=\sum_{i=1}^3a_ib_i=\vert a\vert\vert b\vert\cos\left\langle a,b\right\rangle ab=a1b1+a2b2+a3b3=i=13aibi=abcosa,b
为标量
外积/叉乘 :
a × b = [ 0 − a 3 a 2 a 3 0 − a 1 − a 2 a 1 0 ] b = a ∧    b a\times b=\begin{bmatrix}\begin{array}{ccc}0&-a_3&a_2\\a_3&0&-a_1\\-a_2&a_1&0\end{array}\end{bmatrix}b=a^{\wedge}\;b a×b=0a3a2a30a1a2a10b=ab
外积结果为矢量,此矢量与向量 a a a 和向量 b b b 都垂直;它的大小为 ∣ a ∣ ∣ b ∣ sin ⁡ ⟨ a , b ⟩ |a||b|\sin\left\langle a,b\right\rangle absina,b,大小等于向量 a a a b b b 组成的平行四边形面积大小;

a ∧ a^{\wedge} a 为向量 a a a 的反对称矩阵 A A A(任意向量都对应着唯一的一个反对称矩阵)

a ∧ = A a^{\wedge} = A a=A
A ∨ = a A^{\vee} = a A=a

二. 旋转与平移

2.1 旋转表示 — 旋转矩阵R

有坐标系 a a a,基为 a = [ a 1 , a 2 , a 3 ] a=\begin{bmatrix}a_1,&a_2,&a_3\end{bmatrix} a=[a1,a2,a3] (注:为3 × \times × 3的单位正交矩阵) ,在坐标系 a a a 下,有一个空间点 x x x,坐标为 [ x 1 x 2 x 3 ] \begin{bmatrix}x_1\\x_2\\x_3\end{bmatrix} x1x2x3 ,坐标系 a a a 经过旋转后为坐标系 b b b,基为 b = [ b 1 , b 2 , b 3 ] b=\begin{bmatrix}b_1,&b_2,&b_3\end{bmatrix} b=[b1,b2,b3] x x x点在坐标系 b b b 下的坐标为 [ x 1 ′ x 2 ′ x 3 ′ ] \begin{bmatrix}x_1'\\x_2'\\x_3'\end{bmatrix} x1x2x3 。对于 x x x点,它并未发生位置变换,向量关系没有改变,所以有下式成立:

[ a 1 , a 2 , a 3 ] [ x 1 x 2 x 3 ]    =    [ b 1 , b 2 , b 3 ] [ x 1 ′ x 2 ′ x 3 ′ ] \begin{bmatrix}a_1,&a_2,&a_3\end{bmatrix}\begin{bmatrix}x_1\\x_2\\x_3\end{bmatrix}\;=\;\begin{bmatrix}b_1,&b_2,&b_3\end{bmatrix}\begin{bmatrix}x_1'\\x_2'\\x_3'\end{bmatrix} [a1,a2,a3]x1x2x3=[b1,b2,b3]x1x2x3
x x x在坐标系 b b b 下便可以通过如下表示:

[ x 1 ′ x 2 ′ x 3 ′ ] = (    [ b 1 , b 2 , b 3 ] ) − 1 [ a 1 , a 2 , a 3 ] [ x 1 x 2 x 3 ]    = (    [ b 1 , b 2 , b 3 ] ) T [ a 1 , a 2 , a 3 ] [ x 1 x 2 x 3 ]                      = ( [ b 1 b 2 b 3 ] [ a 1 , a 2 , a 3 ] )    [ x 1 x 2 x 3 ]    =    R b a    [ x 1 x 2 x 3 ]    \begin{array}{l}\begin{bmatrix}x_1'\\x_2'\\x_3'\end{bmatrix}={(\;\begin{bmatrix}b_1,&b_2,&b_3\end{bmatrix})}^{-1}\begin{bmatrix}a_1,&a_2,&a_3\end{bmatrix}\begin{bmatrix}x_1\\x_2\\x_3\end{bmatrix}\;={(\;\left[\begin{array}{clc}b_1,&b_2,&b_3\end{array}\right])}^T\begin{bmatrix}a_1,&a_2,&a_3\end{bmatrix}\begin{bmatrix}x_1\\x_2\\x_3\end{bmatrix}\\\;\;\;\;\;\;\;\;\;\;=\left(\begin{bmatrix}b_1\\b_2\\b_3\end{bmatrix}\begin{bmatrix}a_1,&a_2,&a_3\end{bmatrix}\right)\;\begin{bmatrix}x_1\\x_2\\x_3\end{bmatrix}\;=\;R_{ba}\;\begin{bmatrix}x_1\\x_2\\x_3\end{bmatrix}\;\\\end{array} x1x2x3=([b1,b2,b3])1[a1,a2,a3]x1x2x3=([b1,b2,b3])T[a1,a2,a3]x1x2x3=b1b2b3[a1,a2,a3]x1x2x3=Rbax1x2x3
即:
[ x 1 ′ x 2 ′ x 3 ′ ] =    R b a [ x 1 x 2 x 3 ] \begin{array}{l}\begin{bmatrix}x_1'\\x_2'\\x_3'\end{bmatrix}=\;R_{ba}\begin{bmatrix}x_1\\x_2\\x_3\end{bmatrix}\\\end{array} x1x2x3=Rbax1x2x3
:直角坐标系的基是3 × \times × 3的正交矩阵,行列式为1,并相互正交,为单位正交基;
基与基相乘依旧为正交基,有 a T a = I        a − 1 = a T \begin{array}{l}a^Ta=I\;\;\;a^{-1}=a^T\\\end{array} aTa=Ia1=aT )

旋转矩阵即为 R b a R_{ba} Rba ,称坐标系 a a a b b b 的旋转矩阵

2.2 平移向量

向量 χ \chi χ 经过旋转和平移之后为 χ ′ \chi' χ ,其中旋转矩阵为 R R R ,平移向量为 t = [ t 1 t 2 t 3 ] t=\begin{bmatrix}t_1\\t_2\\t_3\end{bmatrix} t=t1t2t3
χ ′ = R χ + t \chi'=R\chi+t χ=Rχ+t

2.3 变换矩阵T与齐次坐标

为了方便进行坐标系变换中的乘法运算,我们引入变换矩阵 T = [ R t 0 T 1 ] T=\begin{bmatrix}R&t\\0^T&1\end{bmatrix} T=[R0Tt1];为了对其维数,引入齐次坐标 [ X ′ 1 ] \begin{bmatrix}X^{'}\\1\end{bmatrix} [X1] ,则有:
[ X ′ 1 ]    =    [ R t 0 T 1 ] [ X 1 ]    = T [ X 1 ] \begin{bmatrix}X^{'}\\1\end{bmatrix}\;=\;\begin{bmatrix}R&t\\0^T&1\end{bmatrix}\begin{bmatrix}X\\1\end{bmatrix}\;=T\begin{bmatrix}X\\1\end{bmatrix} [X1]=[R0Tt1][X1]=T[X1]

2.4 旋转表示 — 旋转向量与欧拉角

旋转向量
任意旋转可以通过一个旋转轴和旋转角表示;即可以通过旋转向量(或角轴,为三维向量)表示,旋转向量的方向与旋转轴方向一至,模长为旋转角度;
假设单位向量 n = [ n 1 n 2 n 3 ] n=\begin{bmatrix}n_1\\n_2\\n_3\end{bmatrix} n=n1n2n3 与 旋转轴方向一至,旋转角度为 θ \theta θ ,则旋转向量为 θ n \theta n θn

旋转向量转换到旋转矩阵R :(罗德里格斯公式)
R    = cos ⁡ ( θ I )    +    ( 1 − cos ⁡ θ ) n n T    +    sin ⁡ θ n ∧ R\;=\cos\left(\theta I\right)\;+\;(1-\cos\theta)nn^T\;+\;\sin\theta n^{\wedge} R=cos(θI)+(1cosθ)nnT+sinθn
欧拉角

能直观的表示旋转,但是会出现万向锁问题

  1. 绕 Z 轴转,偏航角 yaw
  2. 绕 Y 轴转,俯仰角 pitch
  3. 绕 X 轴转,翻滚角 roll

2.5 旋转表示 — 四元数

2.5.1 四元数

四元数用 q = [ q 0 q 1 q 2 q 3 ] = [ s v ] q=\begin{bmatrix}q_0\\q_1\\q_2\\q_3\end{bmatrix}=\begin{bmatrix}s\\v\end{bmatrix} q=q0q1q2q3=[sv] 四维向量表示 ; q 0 q_0 q0 , s s s 为实部, [ q 1 , q 2 , q 3 ] T \begin{bmatrix}q_1,&q_2,&q_3\end{bmatrix}^T [q1,q2,q3]T , v v v 为虚部;

旋转向量 变换到 四元数q:
q = [ cos ⁡ θ 2 , n sin ⁡ θ 2 ] T q={\lbrack\cos\frac\theta2,n\sin\frac\theta2\rbrack}^T q=[cos2θ,nsin2θ]T
四元数 q q q 到旋转矩阵 R R R 的变换 :
R    = v v T    + s 2 I + 2 s v ∧ + ( v ∧    ) 2 R\;=vv^T \;+s^2I+2sv^{\wedge} + ( v^{\wedge}\;)^2 R=vvT+s2I+2sv+(v)2

2.5.2 四元数对时间的导数

设初始旋转为 q = [ s , v ] q = [s, v] q=[s,v],然后,发生了角轴为 ω , θ \omega,\theta ω,θ 的旋转(右乘,对应四元数记作 △ q \bigtriangleup q q),那么 q q q 相对该旋转的导数为:
在这里插入图片描述
因此,若角速度为 ω \omega ω,那么旋转的时间导数即为:
在这里插入图片描述
除了利用四元数求导,亦可利用李代数进行旋转求导
使用旋转矩阵 R R R 时,角速度为 ω \omega ω,那么 R R R 相对于时间的导数可写作
在这里插入图片描述
在优化带有旋转的函数时,通常计算一个增量 ϕ ∈ s o ( 3 ) \phi \in so(3) ϕso(3),然后用它更新当前估计值:(由于这个增量并没有指定方向,所以左乘右乘都可以)
在这里插入图片描述
表示旋转可以用 矩阵 R R R表示,也可以用 四元数表示,是一样的形式进行更新。

2.6 李群与李代数

2.6.1 李群

群:只有一个合法的运算的集合

旋转矩阵 R R R 构成特殊正交群 S O ( 3 ) SO(3) SO(3)
S O ( 3 ) = { R ∈ R 3 × 3    ∣    R R T = I    , d e t ( R )    =    1 } SO(3)=\{R\in\mathbb{R}^{3\times3}\;\vert\;RR^T=I\;,det(R)\;=\;1\} SO(3)={RR3×3RRT=I,det(R)=1}

变换矩阵 T T T 构成特殊欧式群 S E ( 3 ) SE(3) SE(3)
S E ( 3 ) = { T = [ R t 0 T 1 ] ∈ R 4 × 4    ∣    R ∈ S O ( 3 )    , t ∈ R 3 } SE(3)=\{T=\begin{bmatrix}R&t\\0^T&1\end{bmatrix}\in \mathbb{R}^{4\times4}\;\vert\;R\in SO(3)\;,t\in \mathbb{R}^3\} SE(3)={T=[R0Tt1]R4×4RSO(3),tR3}

2.6.1 李代数的引出

相机运动过程时,旋转矩阵可以用 R ( t ) R(t) R(t) R R R 关于时间 t t t 的函数表示
对于旋转矩阵
R R T = I RR^T = I RRT=I
于是有
R ( t ) R ( t ) T = I R(t)R(t)^T = I R(t)R(t)T=I 等式两边对时间求,得
R . ( t ) R ( t ) T    +    R ( t ) R . ( t ) T    =    0 \overset.R(t)R{(t)}^T\;+\;R(t)\overset.R{(t)}^T\;=\;0 R.(t)R(t)T+R(t)R.(t)T=0 ⇒ R . ( t ) R ( t ) T    =    − R ( t ) R . ( t ) T ⇒ R . ( t ) R ( t ) T    =    − ( R . ( t ) R ( t ) T ) T \Rightarrow\overset.R(t)R{(t)}^T\;=\;-R(t)\overset.R{(t)}^T\\\Rightarrow\overset.R(t)R{(t)}^T\;=\;-\left(\overset.R(t)R{(t)}^T\right)^T\\ R.(t)R(t)T=R(t)R.(t)TR.(t)R(t)T=(R.(t)R(t)T)T 说明 R . ( t ) R ( t ) T \overset.R(t)R{(t)}^T R.(t)R(t)T 为反对称矩阵,存在一个三维向量 ϕ ( t ) \phi(t) ϕ(t) 与之对应,有
R . ( t ) R ( t ) T = ϕ ( t ) ∧ \overset.R(t)R{(t)}^T=\phi(t)^\wedge R.(t)R(t)T=ϕ(t) 等式两边右乘 R ( t ) R(t) R(t),得:
R . ( t ) = ϕ ( t ) ∧ R ( t ) \overset.R(t)=\phi(t)^\wedge R(t) R.(t)=ϕ(t)R(t)

总结:
1. 说明对旋转矩阵求导,等价于在旋转矩阵左乘一个反对称矩阵
如何求得这个反对称矩阵呢 ?
对于 t 0 t_0 t0时刻, R ( 0 ) = I R(0) = I R(0)=I ,把 R ( t ) R(t) R(t) t = 0 t=0 t=0附近进行一阶泰勒展开:
R ( t ) ≈ R ( t 0 ) + R . ( t 0 ) ( t − t 0 ) = R ( t 0 ) + ϕ ( t 0 ) ∧ R ( t 0 ) ( t − t 0 ) = I + ϕ ( t 0 ) ∧ t R(t)\approx R(t_0)+\overset.R(t_0)(t-t_0)=R(t_0)+{\phi(t_0)}^\wedge R(t_0)(t-t_0)\\=I+{\phi(t_0)}^\wedge t R(t)R(t0)+R.(t0)(tt0)=R(t0)+ϕ(t0)R(t0)(tt0)=I+ϕ(t0)t
此为一个关于 R R R 的微分方程,且 R ( 0 ) = I R(0) = I R(0)=I,便可解得:
R ( t ) = e x p ( ϕ 0 ∧ t ) R(t)=exp(\phi_0^\wedge t) R(t)=exp(ϕ0t)

2. 说明在 t = 0 t=0 t=0的附近,旋转矩阵可以由 e x p ( ϕ 0 ∧ t ) exp(\phi_0^\wedge t) exp(ϕ0t),解出。

给定某个时刻的 R R R,我们可以求出一个 ϕ \phi ϕ ,描述了 R R R 在局部的导数关系; ϕ \phi ϕ S O ( 3 ) SO(3) SO(3)对应的李代数 s o ( 3 ) so(3) so(3);
R = e x p ( ϕ ∧ ) R= exp(\phi^\wedge) R=exp(ϕ)

2.6.2 李代数 s o ( 3 ) so(3) so(3) s e ( 3 ) se(3) se(3)

→ \rightarrow 给定一个 ϕ \phi ϕ 可以通过指数映射 e x p ( ϕ ∧ ) exp(\phi^\wedge ) exp(ϕ),求出 R R R
→ \rightarrow 给定一个 R R R 可以通过对数映射,求出 ϕ \phi ϕ

R R R的李代数为 s o ( 3 ) so(3) so(3),变换矩阵 T T T 的李代数为 s e ( 3 ) se(3) se(3)

s o ( 3 ) so(3) so(3)中的 ϕ \phi ϕ 变换到 S O ( 3 ) SO(3) SO(3)中的 R R R:
R = e x p ( ϕ ∧ ) R= exp(\phi^\wedge) R=exp(ϕ)
S O ( 3 ) SO(3) SO(3)中的 R R R 变换到 s o ( 3 ) so(3) so(3)中的 ϕ \phi ϕ:
ϕ = ln ⁡ ( R ) ∨ \phi= {\ln\left(R\right)}^\vee ϕ=ln(R)
总结:
s o ( 3 ) so(3) so(3) 这个李代数集合中的元素为 三维向量 ϕ \phi ϕ 或者是三维反对称矩阵 ϕ ∧ \phi^\wedge ϕ

s e ( 3 ) se(3) se(3) 这个李代数集合中的元素为 六维向量 ξ = [ ρ ϕ ] \xi=\begin{bmatrix}\rho\\\phi\end{bmatrix} ξ=[ρϕ] ,其中 ρ \rho ρ 表示平移, ϕ \phi ϕ 则是上面的旋转三维向量;但是 ρ \rho ρ 并不直接等于变换矩阵中的 t t t;对应的四维 反对称矩阵 ξ ∧ = [ ϕ ∧ ρ 0 T 0 ] \xi^\wedge=\begin{bmatrix}\phi^\wedge&\rho\\0^T&0\end{bmatrix} ξ=[ϕ0Tρ0]

2.6.3 李代数求导

使用李代数表示姿态,根据李代数加法运算对李代数求导
旋转之后的位姿对旋转矩阵求导: ∂ ( R p ) ∂ R \frac{\partial(Rp)}{\partial R} R(Rp) ,由于 S O ( 3 ) SO(3) SO(3)没有加法运算,转而使用李代数加法运算去求导:
∂ ( e x p ( ϕ ∧ ) p ) ∂ ϕ = lim ⁡ △ ϕ → 0 e x p ( ( ϕ + △ ϕ ) ∧ ) p − e x p ( ϕ ∧ ) p △ ϕ = . . . = ( − R p ) ∧ J l \frac{\partial(exp(\phi^\wedge)p)}{\partial\phi}=\lim_{\triangle\phi\rightarrow0}\frac{exp({(\phi+\triangle\phi)}^\wedge)p-exp(\phi^\wedge)p}{\triangle\phi}=...={(-Rp)}^\wedge J_l ϕ(exp(ϕ)p)=ϕ0limϕexp((ϕ+ϕ))pexp(ϕ)p=...=(Rp)Jl

2.6.4 李群左右扰动

左扰动求导:
R R R 进行一次左扰动 △ R \triangle R R,左乘在 R R R左侧, △ R \triangle R R对应的李代数设为 φ \varphi φ , R p Rp Rp φ \varphi φ 求导:
∂ ( R p ) ∂ φ = lim ⁡ φ → 0 △ R R p − R p φ = lim ⁡ φ → 0 e x p ( φ ∧ ) e x p ( ϕ ∧ ) p − e x p ( ϕ ∧ ) p φ                  = lim ⁡ φ → 0 ( I + φ ∧ ) e x p ( ϕ ∧ ) p − e x p ( ϕ ∧ ) p φ = lim ⁡ φ → 0 φ ∧ e x p ( ϕ ∧ ) p φ = lim ⁡ φ → 0 φ ∧ R p φ = lim ⁡ φ → 0 − ( R p ) ∧ φ φ = − ( R p ) ∧ \frac{\partial(Rp)}{\partial\varphi}=\lim_{\varphi\rightarrow0}\frac{\bigtriangleup RRp-Rp}\varphi=\lim_{\varphi\rightarrow0}\frac{exp(\varphi^\wedge)exp(\phi^\wedge)p-exp(\phi^\wedge)p}\varphi\\\;\;\;\;\;\;\;\;=\lim_{\varphi\rightarrow0}\frac{(I+\varphi^\wedge)exp(\phi^\wedge)p-exp(\phi^\wedge)p}\varphi=\lim_{\varphi\rightarrow0}\frac{\varphi^\wedge exp(\phi^\wedge)p}\varphi\\=\lim_{\varphi\rightarrow0}\frac{\varphi^\wedge Rp}\varphi=\lim_{\varphi\rightarrow0}\frac{-{(Rp)}^\wedge\varphi}\varphi=-{(Rp)}^\wedge φ(Rp)=φ0limφRRpRp=φ0limφexp(φ)exp(ϕ)pexp(ϕ)p=φ0limφ(I+φ)exp(ϕ)pexp(ϕ)p=φ0limφφexp(ϕ)p=φ0limφφRp=φ0limφ(Rp)φ=(Rp)
此式比上面用李代数求导少了一个雅克比计算,所以扰动模型更实用。

旋转点右扰动求导:
在这里插入图片描述

三. 旋转连乘雅克比

在这里插入图片描述

四. 作业

4.1 题目一 — VIO 文献阅读

参考文献: “A review of visual inertial odometry from filtering and optimisation perspectives”. Advanced Robotics 29.20 (2015)

4.1.1 视觉与 IMU 进行融合之后有何优势?

4.1.2 有哪些常见的视觉 +IMU 融合方案?有没有工业界应用的例子?

4.1.3 学术界,VIO 研究有哪些新进展?有没有将(深度)学习方法用到 VIO 中的例子?

4.2 题目二 — 四元数和李代数更新

4.1.1 题目:

在这里插入图片描述

4.1.2 解答

需要的库:

sophus :李群SO(3),SE(3) --- Sophus::SO3d ;   // d表示 double
eigen3 :旋转矩阵R --- Eigen : :Matrix3d; 微小增量ω ---- Vector3d  ; 李代数(三维向量) ---- Vector3d ;
					 四元数--- Quaterniond

引入头文件

#include <iostream>
#include <sophus/se3.hpp>
#include <sophus/so3.hpp>
#include <eigen3/Eigen/Core>
#include <eigen3/Eigen/Dense>

旋转向量 θ n \theta n θn (角度+单位三维向量) 转为旋转矩阵 R R R

// Eigen::AngleAxisd(M_PI / 2, Eigen::Vector3d(0, 0, 1)) 旋转向量 
Eigen::Matrix3d R = Eigen::AngleAxisd(M_PI / 2, Eigen::Vector3d(0, 0, 1)).toRotationMatrix();

旋转矩阵 R R R 构造四元数 q q q

Quaterniond q(R); 

旋转矩阵 R R R ,四元数 q q q 构造 S O ( 3 ) SO(3) SO(3) ; Sophus::SO3d 是一个类 ; S O ( 3 ) SO(3) SO(3)本质是矩阵 R R R
类方法 SO3_R.matrix() 返回其旋转矩阵形式

 Sophus::SO3d SO3_R(R); // 从旋转矩阵构造Sophus::SO(3)
 Sophus::SO3d SO3_q(q); // 也可以使用四元素构造Sophus::SO(3)
std::cout << "SO3 :  "  << SO3_R.matrix() << std::endl; 

1.使用旋转矩阵更新 R ← R    e x p ( ω ∧ ) R\leftarrow R\;exp(\omega^\wedge) RRexp(ω) , ω \omega ω 微小增量李代数,三维向量

Vector3d update_so3(0.01, 0.02, 0.03);                            //更新量 
Sophus::SO3d SO3_updated = SO3_R * Sophus::SO3d::exp(update_so3); //右乘更新

SO(3) 用矩阵R显示

std::cout << "SO3  R= \n"<< SO3_updated.matrix() <<std::endl;

2.使用四元数更新 q ← q    ⊗ [ 1 , 1 2 ω ] T q\leftarrow q\;\otimes\begin{bmatrix}1,&\frac12\omega\end{bmatrix}^T qq[1,21ω]T

Eigen::Quaterniond update_q(1, update_so3(0) / 2, update_so3(1) / 2, update_so3(2) / 2);
update_q.normalize();   //四元数归一化处理
Eigen::Quaterniond q_updated = q * update_q;

四元数 转为 矩阵R显示

Eigen : : Matrix3d  q2R =  q_updated.toRotationMatrix() 
std::cout << "q2R = \n"<< q2R <<std::endl;

4.3 题目三 — 推导其他导数

4.3.1 题目

在这里插入图片描述

4.3.2 解答

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值