视觉SLAM十四讲笔记-3-02

视觉SLAM十四讲笔记-3-02


参考链接: link
高翔,张涛,等. 视觉 SLAM 十四讲:从理论到实践[M]. 电子工业出版社, 2019.

3.3 旋转向量和欧拉角

3.3.1 旋转向量

前面 3.1 节、 3.2 节已经介绍了 旋转矩阵、变换矩阵。那描述一个6自由度的三维刚体运动是不是已经足够了尼?
矩阵表示至少存在以下两个缺点:
1.SO(3) 的旋转矩阵有 9 个量,但一次旋转只有 3 个自由度,因此这种表达方式是冗余的。同理,变换矩阵用 16 个量表示 6 自由度的变换, 存在冗余。
2.旋转矩阵自身带有约束,必须是一个正交矩阵,且行列式为1。变换矩阵也是如此。当想估计或者优化一个旋转矩阵或者变换矩阵时,这些约束会使得求解变得很困难。
因此,希望有一种方式能够紧凑地描述旋转和平移。例如,用一个三维向量表达旋转,用一个六维向量表达变换,可行吗?事实上,任意旋转都可以用一个旋转轴和一个旋转角来刻画。
于是,可以使用一个向量,方向与旋转轴一致,长度等于旋转角。这种向量称为旋转向量。同样,对于变换矩阵,可以使用一个旋转向量和一个平移向量即可表达一次变换。这样的变量维数正好是六维。
考虑某个用 R 表示的旋转。如果用旋转向量来表示,假设旋转轴为一个单位长度的向量n,角度为 θ \theta θ,那么向量 θ n \theta n θn 也可以描述这个旋转。那么 R 和 θ n \theta n θn 之间有什么关系吗?
从旋转向量到旋转矩阵的转换过程用罗德里格斯公式表明
R = cos ⁡ θ I + ( 1 − cos ⁡ θ ) n n T + sin ⁡ θ n ∧ R = \cos \theta I + (1-\cos \theta )nn^T + \sin \theta n^\wedge R=cosθI+(1cosθ)nnT+sinθn
^为上一节中介绍的反对称符号。
对式子两边取迹,得:
tr ⁡ ( R ) = cos ⁡ θ tr ⁡ ( I ) + ( 1 − cos ⁡ θ ) tr ⁡ ( n n T ) + sin ⁡ θ tr ⁡ ( n ∧ ) = 3 cos ⁡ θ + ( 1 − cos ⁡ θ ) = 1 + 2 cos ⁡ θ \begin{aligned} \operatorname{tr}(R) &=\cos \theta \operatorname{tr}(I)+(1-\cos \theta) \operatorname{tr}\left(n n^{T}\right)+\sin \theta \operatorname{tr}\left(n^{\wedge }\right) \\ &=3 \cos \theta+(1-\cos \theta) \\ &=1+2 \cos \theta \end{aligned} tr(R)=cosθtr(I)+(1cosθ)tr(nnT)+sinθtr(n)=3cosθ+(1cosθ)=1+2cosθ
因此有:
θ = arccos ⁡ tr ⁡ ( R ) − 1 2 \theta=\arccos \frac{\operatorname{tr}(R)-1}{2} θ=arccos2tr(R)1
关于转轴 n,旋转轴上的向量在旋转后不发生改变,说明:
R n = n Rn = n Rn=n
因此,转轴 n 是矩阵 R 特征值 1 对应到特征向量。求解此方程,再归一化,就得到了转轴。
这里的两个方程在后续仍将出现,会发现这正是 SO(3)上李群和李代数的对应关系。

3.3.2 欧拉角

无论是旋转矩阵还是旋转向量,它们虽然能描述旋转,但是对于人类来说是非常不直观的。当人们看到一个旋转矩阵或者旋转向量时,很难想象出来这个旋转究竟是什么样的。当它们变换时,也不知道物体时在哪个方向上转动,而欧拉角提供了一种非常直观的方式来描述旋转,使用了3个分离的转角,把每次的旋转分解为3次绕不同轴的旋转。人们很容易理解绕单个轴的旋转过程。
但是,分解的方式有很多种。但是在特定领域内,欧拉角通常有统一的定义方式。欧拉角当中比较常用的一种是使用 “偏航-俯仰-滚转(yaw-pitch-roll)” 3 个角度来描述一个旋转。它等价于ZYX方向的旋转。如下图所示,假设一个刚体的前方(朝向我们的方向为 X 轴,右侧为 Y轴, 上方为 Z 轴)。那么, ZYX转角相当于把任意旋转分解为以下3个轴上的转角:
1.绕物体的 Z 轴旋转,得到偏航角 yaw;
2.绕旋转之后的 Y 轴旋转,得到俯仰角 pitch;
3.绕旋转之后的 X 轴旋转,得到滚转角 roll

下图参考链接: link
请添加图片描述
此时,可以使用 [ r , p , y ] T [r, p, y]^T [r,p,y]T 这样一个三维的向量描述任意旋转。这个向量十分直观,可以从这个向量中想象出旋转的过程。其他的欧拉角也是通过这种方式,把旋转分解到3个轴上,得到一个三维的向量,只不过选用的轴及顺序不一样。
缺点:万向锁问题:在俯仰角为 ± 90 \pm 90 ±90 时 (即第二次旋转时),第一次旋转和第三次旋转将使用同一个轴,使得系统丢失了一个自由度。(由三次旋转变为两次旋转)。这种称为奇异性问题。在其他形式的欧拉角中也同样存在。
理论上可以证明,只要想用三个实数来表达三维旋转,都会不可避免的碰到奇异值问题。由于这种原理,欧拉角不适用于插值和迭代,往往只用于人机交互中。通常也很少在 SLAM 中直接使用欧拉角表示姿态,同样不会在滤波或者优化中使用欧拉角表达旋转(因为有奇异性)。不过,若想验证自己的算法是否有错,转换成欧拉角能够帮你快速分辨结果是否正确。

3.4 四元数

3.4.1 四元数的定义

旋转矩阵用 9 个量描述 3 自由度的旋转,具有冗余性;欧拉角和旋转向量是紧凑的,但具有奇异性。事实上,我们找不到不带奇异性的三维向量描述方式
回忆以前学习过的复数。用复数集 C 表示复平面上的向量,而复数的乘法则表示复平面上的旋转。例如,乘上复数 i 相当于逆时针把一个复向量旋转 9 0 ∘ 90^{\circ} 90。类似地,在表达三维空间旋转时,也有一种类似于复数的代数:四元数。四元数既是紧凑的,也没有奇异性。但是四元数不够直观,且运算稍微复杂一些。
欧拉公式:
e i θ = cos ⁡ θ + i sin ⁡ θ e^{i\theta} = \cos \theta + i \sin \theta eiθ=cosθ+isinθ
四元数的形式:一个四元数 q 拥有一个实部和三个虚部。如:
q = q 0 + q 1 i + q 2 j + q 3 k q = q_{0} + q_{1}i + q_{2}j+q_{3}k q=q0+q1i+q2j+q3k
其中, i, j, k, 为四元数的三个虚部。这三个虚部满足以下关系式:
{ i 2 = j 2 = k 2 = − 1 i j = k , j i = − k j k = i , k j = − i k i = j , i k = − j \left\{\begin{array}{l} i^{2}=j^{2}=k^{2}=-1 \\ i j=k, j i=-k \\ j k=i, k j=-i \\ k i=j, i k=-j \end{array}\right. i2=j2=k2=1ij=k,ji=kjk=i,kj=iki=j,ik=j
如果把 i, j, k 看成三个坐标轴,则它们与自己的乘法和复数是一样的,相互之间的乘法和外积是一样的。也可以用一个标量和一个向量来表达四元数:
q = [ s , v ] T , s = q 0 ∈ R , v = [ q 1 , q 2 , q 3 ] T q = [s, v]^T, s = q_{0}\in R,v = [q_{1}, q_{2}, q_{3}]^T q=[s,v]T,s=q0R,v=[q1,q2,q3]T
s 称为四元数的实部,v称为四元数的虚部。如果一个四元数的虚部为0,则称为实四元数;若实部为0称为虚四元数。
讲了四元数,但是如何用四元数表示三维空间中任意一个旋转。

3.4.2 四元数的运算

四元数和通常的复数一样,可以进行一些列的运算。常见的有四则运算、共轭、求逆、数乘等。
现有两个四元数 q 0 q_{0} q0 q 1 q_{1} q1, 它们的向量表示为 [ s a , v a ] [s_{a}, v_{a}] [sa,va] [ s b , v b ] [s_{b}, v_{b}] [sb,vb],或者原始四元数表示为:
q a = s a + x a i + y a j + z a k q b = s b + x b i + y b j + z b k q_{a} = s_{a} + x_{a}i + y_{a}j + z_{a}k \\ q_{b} = s_{b} + x_{b}i + y_{b}j + z_{b}k qa=sa+xai+yaj+zakqb=sb+xbi+ybj+zbk
那么,其运算可以表示如下:
1.加减法:
q a ± q b = [ s a ± s b , v a ± v b ] \boldsymbol{q}_{a} \pm \boldsymbol{q}_{b}=\left[s_{a} \pm s_{b}, \boldsymbol{v}_{a} \pm \boldsymbol{v}_{b}\right] qa±qb=[sa±sb,va±vb]
2.乘法
乘法是把 q a q_{a} qa 的每一项与 q b q_{b} qb 的每一项相乘,最后相加。
q a q b = s a s b − x a x b − y a y b − z a z b + ( s a x b + x a s b + y a z b − z a y b ) i + ( s a y b − x a z b + y a s b + z a x b ) j + ( s a z b + x a y b − y a x b + z a s b ) k \begin{aligned} q_{a} q_{b}=& s_{a} s_{b}-x_{a} x_{b}-y_{a} y_{b}-z_{a} z_{b} \\ &+\left(s_{a} x_{b}+x_{a} s_{b}+y_{a} z_{b}-z_{a} y_{b}\right) i \\ &+\left(s_{a} y_{b}-x_{a} z_{b}+y_{a} s_{b}+z_{a} x_{b}\right) j \\ &+\left(s_{a} z_{b}+x_{a} y_{b}-y_{a} x_{b}+z_{a} s_{b}\right) k \end{aligned} qaqb=sasbxaxbyaybzazb+(saxb+xasb+yazbzayb)i+(saybxazb+yasb+zaxb)j+(sazb+xaybyaxb+zasb)k
写成向量的形式,用内外积表示:
q a q b = [ s a s b − v a T v b , s a v b + s b v a + v a × v b ] T q_{a} q_{b}=\left[s_{a} s_{b}-v_{a}^{T} v_{b}, s_{a} v_{b}+s_{b} v_{a}+v_{a} \times v_{b}\right]^{T} qaqb=[sasbvaTvb,savb+sbva+va×vb]T
由于最后一项外积的存在,通常四元数乘法是不可以交换的。
3.模长
∥ q a ∥ = s a 2 + x a 2 + y a 2 + z a 2 \left\|q_{a}\right\|=\sqrt{s_{a}^{2}+x_{a}^{2}+y_{a}^{2}+z_{a}^{2}} qa=sa2+xa2+ya2+za2
两个四元数乘积的模即模的乘积。
∥ q a q b ∥ = ∥ q a ∥ ∥ q b ∥ \left \| q_{a}q_{b} \right \| = \left \| q_{a}\right \| \left \| q_{b}\right \| qaqb=qaqb
4.共轭
q a ∗ = s a − x a i − y a j − z a k = [ s a , − v a ] \boldsymbol{q}_{a}^{*}=s_{a}-x_{a} i-y_{a} j-z_{a} k=\left[s_{a},-\boldsymbol{v}_{a}\right] qa=saxaiyajzak=[sa,va]
四元数共轭和其本身相乘,会得到一个实四元数,其模等于模长的平方
q ∗ q = q q ∗ = [ s a 2 + v T v , 0 ] T q^{*} q=q q^{*}=\left[s_{a}^{2}+v^{T} v, 0\right]^{T} qq=qq=[sa2+vTv,0]T
5.逆
q − 1 = q ∗ / ∥ q a ∥ 2 q^{-1}=q^{*} /\left\|q_{a}\right\|^{2} q1=q/qa2
q q − 1 = q − 1 q = 1 q q^{-1}=q^{-1} q=1 qq1=q1q=1
若 q 为单位四元数,则有 q − 1 = q ∗ q^{-1} = q ^{*} q1=q
乘积的逆具有和矩阵的逆相似的性质:
( q a q b ) − 1 = q b − 1 q a − 1 \left(q_{a} q_{b}\right)^{-1}=q_{b}^{-1} q_{a}^{-1} (qaqb)1=qb1qa1
6.数乘
k q = [ k s , k v ] k \boldsymbol{q}=[k s, k \boldsymbol{v}] kq=[ks,kv]

3.4.3 用四元数表示旋转

假设有一个空间三维点 p = [ x , y , z ] ∈ R 3 p = [x,y,z] \in R^3 p=[x,y,z]R3,以及一个由单位四元数 q 指定的旋转。三维点 p 经过旋转之后变为 p ′ p' p。如果使用矩阵描述,那么有 p ′ = R p p' = Rp p=Rp。而如果使用四元数描述旋转,它们的关系该如何表达尼?
首先,把三维空间点用一个虚四元数来描述:
p = [ 0 , x , y , z ] T = [ 0 , v ] T p = [0,x,y,z]^T = [0, v]^T p=[0,x,y,z]T=[0,v]T
相当于把四元数的3个虚部与空间中的3个轴相对应。那么,旋转后的点 p ′ p' p 可以表示为这样的乘积:
p ′ = q p q − 1 p'= qpq^{-1} p=qpq1
这里的乘法均为四元数乘法,结果也是四元数。最后把 p ′ p' p 的虚部取出,即得旋转之后点的坐标,并且可以验证,计算结果的实部为0,故为纯虚四元数。

3.4.4 四元数到其他旋转表示的转换

任意单位四元数描述了一个旋转,该旋转也可用旋转矩阵或者旋转向量来描述。现在考察四元数与旋转向量、旋转矩阵之间的转换关系
四元数乘法可以写成一种矩阵的乘法。设 q = [ s , v ] T q = [s, v]^T q=[s,v]T,那么,定义如下的符号 + 和 ⊕ \oplus 为:
q + = [ s − v T v s I + v ∧ ] q^{+}=\left[\begin{array}{cc} s & -v^{T} \\ v & s I+v^{\wedge } \end{array}\right] q+=[svvTsI+v]
q ⊕ = [ s − v T v s I − v ⊕ ] q^{\oplus}=\left[\begin{array}{cc} s & -v^{T} \\ v & s I-v^{\oplus} \end{array}\right] q=[svvTsIv]
这两个符号将四元数映射成为了一个 4*4 的矩阵。于是,四元数乘法可以写成矩阵的形式:
q 1 + q 2 = [ s 1 − v 1 T v 1 s 1 I + v 1 ∧ ] [ s 2 v 2 ] = [ − v 1 T v 2 + s 1 s 2 s 1 v 2 + s 2 v 1 + v 1 ∧ v 2 ] = q 1 q 2 q_{1}^{+}q_{2}=\left[\begin{array}{cc} s_{1} & -v_{1}^{T} \\ v_{1} & s_{1} I+v_{1}^{\wedge } \end{array}\right]\begin{bmatrix} s_{2}\\ v_{2} \end{bmatrix} = \begin{bmatrix} -v_{1}^Tv_{2} + s_{1}s_{2}\\ s_{1}v_{2} + s_{2}v_{1} + v_{1}\wedge v_{2} \end{bmatrix} = q_{1}q_{2} q1+q2=[s1v1v1Ts1I+v1][s2v2]=[v1Tv2+s1s2s1v2+s2v1+v1v2]=q1q2
同理可证:
q 1 q 2 = q 1 + q 2 = q 2 ⊕ q 1 q_{1}q_{2} = q_{1}^{+}q_{2} = q_{2}^{\oplus}q_{1} q1q2=q1+q2=q2q1
然后,考虑使用四元数对空间点进行旋转的问题。根据前面得到的关系,可以得:
p ′ = q p q − 1 = q + p q − 1 = q + p + q − 1 = q + q − 1 ⊕ p p'= qpq^{-1} = q^{+}pq^{-1} = q^{+}p^{+}q^{-1} = q^{+}{q^{-1}}^{\oplus}p p=qpq1=q+pq1=q+p+q1=q+q1p
带入两个符号对应的矩阵:
q + q − 1 ⊕ = [ 1 0 0 T v v T + s 2 I + 2 s v ∧ + ( v ∧ ) 2 ] q^{+} q^{-1^{\oplus}}=\left[\begin{array}{cc} 1 & 0 \\ 0^{T} & v v^{T}+s^{2} I+2 s v^{\wedge}+\left(v^{\wedge}\right)^{2} \end{array}\right] q+q1=[10T0vvT+s2I+2sv+(v)2]
这个式子的右下角给出了从四元数到旋转矩阵的变换关系
R = v v T + s 2 I + 2 s v ∧ + ( v ∧ ) 2 R=v v^{T}+s^{2} I+2 s v^{\wedge}+\left(v^{\wedge}\right)^{2} R=vvT+s2I+2sv+(v)2
为了得到四元数到旋转向量的转换公式,对上述两侧求迹,得:
t r ( R ) = t r ( v v T + 3 s 2 + 2 s . 0 + t r ( v ∧ ) 2 ) = v 1 2 + v 2 2 + v 3 2 + 3 s 2 − 2 ( v 1 2 + v 2 2 + v 3 2 ) = ( 1 − s 2 ) + 3 s 2 − 2 ( 1 − s 2 ) = 4 s 2 − 1 tr(R) = tr(vv^T + 3s^2 + 2s.0 + tr(v\wedge)^2) \\ =v_1^2+v_2^2+v_3^2+3s^2 -2(v_1^2+v_2^2+v_3^2) \\ = (1-s^2) + 3s^2 - 2(1-s^2) \\ = 4s^2 - 1 tr(R)=tr(vvT+3s2+2s.0+tr(v)2)=v12+v22+v32+3s22(v12+v22+v32)=(1s2)+3s22(1s2)=4s21
上一节中推导出旋转向量和旋转矩阵的转换关系:
t r ( R ) = 1 + 2 c o s θ tr(R) = 1 + 2 cos \theta tr(R)=1+2cosθ
则:
θ = arccos ⁡ ( 2 s 2 − 1 ) \theta=\arccos \left(2 s^{2}-1\right) θ=arccos(2s21)
即:
θ = 2 arccos ⁡ s \theta=2 \arccos s θ=2arccoss
四元数到旋转向量的转换关系
{ θ = 2 arccos ⁡ q 0 [ n x , n y , n z ] T = [ q 1 , q 2 , q 3 ] / sin ⁡ ( θ 2 ) \left\{\begin{array}{l} \theta=2 \arccos q_{0} \\ {\left[n_{x}, n_{y}, n_{z}\right]^{T}=\left[q_{1}, q_{2}, q_{3}\right] / \sin \left(\frac{\theta}{2}\right)} \end{array}\right. {θ=2arccosq0[nx,ny,nz]T=[q1,q2,q3]/sin(2θ)

3.5 相似、仿射、射影变换

除了欧氏变换,3D 空间还存在其他几种变换方式,只不过欧氏变换是最简单的。欧氏变换保持了向量的长度和夹角,相当于把一个刚体原封不动地进行了移动或者旋转,不改变自身的样子。其他的几种变换则会改变它的外形。
1.相似变换
相似变换比欧氏变换多了一个自由度,它允许物体进行均匀缩放,矩阵表示为:
T S = [ s R t 0 T 1 ] T_{S}=\left[\begin{array}{ll} s R & t \\ 0^{T} & 1 \end{array}\right] TS=[sR0Tt1]
缩放因子允许对向量旋转之后,可以在 x,y,z 三个坐标上进行均匀缩放。三维相似变换的集合也叫做相似变换群,记做 S i m ( 3 ) Sim(3) Sim(3)
2.仿射变换
T S = [ A t 0 T 1 ] T_{S}=\left[\begin{array}{cc} A & t \\ 0^{T} & 1 \end{array}\right] TS=[A0Tt1]
只要求 A 是一个可逆矩阵,而不要求是正交矩阵。
3.射影变换
T S = [ A t a T v ] T_{S}=\left[\begin{array}{cc} A & t \\ a^{T} & v \end{array}\right] TS=[AaTtv]
摄影变换形式最为一般。
下表参考: link
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值