SLAM十四讲(二)——变换矩阵、欧拉变换、四元数

一、旋转矩阵、变换矩阵

此知识点见我知乎文章:https://zhuanlan.zhihu.com/p/226132779

不再赘述

二、欧拉变换

1. 旋转向量

应用前面的知识,旋转矩阵可以描述旋转、变换矩阵可以描述一个6自由度的三位刚体运动,但是用这种矩阵表示方式至少有以下两个缺点:

  1. SO(3)的旋转矩阵有9个量,但一次旋转只有3个自由度。显然,表达方式冗余。
  2. 旋转矩阵自身带有约束:它必须是个正交矩阵,且行列式为1。变换矩阵也是如此。使得估计或优化时,求解困难。

任意旋转都可以用一个旋转轴和一个旋转角来刻画,即只需一个三维向量即可描述旋转轴。

旋转向量:方向与旋转轴一致,长度等于旋转角。

旋转向量( θ n \theta \boldsymbol{n} θn)( n \boldsymbol{n} n为单位向量, θ \theta θ 为旋转角度)到旋转矩阵的转换过程由罗德里格斯公式推出:

R = c o s θ I + ( 1 − c o s θ ) n n T + s i n θ n ^ \boldsymbol{R} = cos\theta \boldsymbol{I} +(1-cos\theta)\boldsymbol{nn^T}+sin\theta \boldsymbol{\hat{n}} R=cosθI+(1cosθ)nnT+sinθn^

从旋转矩阵到旋转向量的转换:

θ = a r c c o s t r ( R ) − 1 2 \theta = arccos\frac{tr(\boldsymbol{R})-1}{2} θ=arccos2tr(R)1

R n = n \boldsymbol{Rn}=\boldsymbol{n} Rn=n

因此,转轴 n \boldsymbol{n} n是矩阵 R \boldsymbol{R} R特征值1对应的特征向量

2. 欧拉角

使用3个分离的转角,把一个旋转分解成3次绕不同轴的旋转。存在XYZ、ZYZ、ZYX等形式。

欧拉角当中比较常见的一种,使用"偏航-俯仰-滚转(yaw-pitch-raw)"3个角度来描述一个旋转。

  • 绕物体的Z轴旋转,得到偏航角yaw
  • 绕旋转之后的Y轴旋转,得到俯仰角pitch
  • 绕旋转之后的X轴旋转,得到滚转角roll

欧拉角不适用于插值和迭代,往往只用于人机交互,很少在SLAM中直接使用欧拉角表达姿态。

(存在万向锁问题)

三、四元数

1. 定义

旋转矩阵用9个量描述3自由度的旋转,具有冗余性 ;欧拉角和旋转向量是紧凑的,但是具有奇异性。所以Hamilton找到一种扩展的复数,既是紧凑的,也没有奇异性——四元数。三维旋转可以由单位四元数来描述。

一个四元数 q \boldsymbol{q} q拥有一个实部和三个虚部:

q = q 0 + q 1 i + q 2 j + q 3 k \boldsymbol{q} = q_0+q_1\boldsymbol{i}+q_2\boldsymbol{j}+q_3\boldsymbol{k} q=q0+q1i+q2j+q3k

其中,三个虚部满足以下关系式:

{ 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{matrix}i^2=j^2=k^2=-1\\ ij=k,ji=-k\\ jk=i,kj=-i\\ ki=j,ik=-j\end{matrix}\right. i2=j2=k2=1ij=k,ji=kjk=i,kj=iki=j,ik=j

有时,人们也用一个标量和一个向量来表达四元数:

q = [ s , v ] T , s = q 0 ∈ R , v = [ q 1 , q 2 , q 3 ] T ∈ R 3 q=[s,v]^T,s=q_0\in \mathbb{R},v=[q_1,q_2,q_3]^T\in \mathbb{R}^3 q=[s,v]T,s=q0R,v=[q1,q2,q3]TR3

  • 单元四元数

    s = 0 , v s=0,v s=0,v为单位向量的四元数: q ^ = [ 0 , v ^ ] \hat q=[0,\hat v] q^=[0,v^]

可以用单位四元数表示三维空间中的任意一个旋转(为了使旋转后该点的模不变,或者说到原点的距离不变)

2. 运算

For:

q a = s a + x a i + y a j + z a k q_a = s_a+x_ai+y_aj+z_ak qa=sa+xai+yaj+zak

q b = s b + x b i + y b j + z b k q_b = s_b+x_bi+y_bj+z_bk qb=sb+xbi+ybj+zbk

  • 加法和减法

q a ± q b = [ s a ± s b , v a ± v b ] T q_a\pm q_b=[s_a\pm s_b,v_a\pm v_b]^T qa±qb=[sa±sb,va±vb]T

  • 乘法

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_aq_b=[s_as_b-v_a^{T}v_b,s_av_b+s_bv_a+v_a\times v_b]^T qaqb=[sasbvaTvb,savb+sbva+va×vb]T

  • 模长

∥ q a ∥ = s a 2 + x a 2 + y a 2 + z a 2 \begin{Vmatrix}q_a\end{Vmatrix}=\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 ∥ \begin{Vmatrix}q_aq_b\end{Vmatrix}=\begin{Vmatrix}q_a\end{Vmatrix}\begin{Vmatrix}q_b\end{Vmatrix} qaqb=qaqb

  • 共轭

q a ∗ = s a − x a i − y a j − z a k = [ s a , − v a ] T q_a^* =s_a-x_ai-y_aj-z_ak=[s_a,-v_a]^T qa=saxaiyajzak=[sa,va]T

q ∗ q = q q ∗ = [ s a 2 + v T v , 0 ] T q^*q = qq^*=[s_a^2+v^Tv,0]^T qq=qq=[sa2+vTv,0]T

q − 1 = q ∗ / ∥ q ∥ 2 q^{-1}=q^*/\begin{Vmatrix}q\end{Vmatrix}^2 q1=q/q2

q q − 1 = q − 1 q = 1 qq^{-1}=q^{-1}q=1 qq1=q1q=1

( q a q b ) − 1 = q b − 1 q a − 1 (q_aq_b)^{-1}=q_b^{-1}q_a^{-1} (qaqb)1=qb1qa1

  • 数乘

k q = [ k s , k v ] T kq=[ks,kv]^T kq=[ks,kv]T

3. 用四元数表示旋转

假设有一个空间三维点 p = [ x , y , z ] ∈ R 3 p=[x,y,z]\in \mathbb{R}^3 p=[x,y,z]R3,以及一个由单位四元数 q q q指定的旋转。三维点 p p p经过旋转之后变为 p ′ p' p。如果用矩阵描述,那么有 p ′ = R p p'=Rp p=Rp。如果用四元数描述,则:

首先, p p p可用一个虚四元数来描述: 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

则有:(此处左乘单位四元数,右乘其共轭,怎么推还不知道,汉密尔顿提出来的)

p ′ = q p q − 1 p'=qpq^{-1} p=qpq1

这个运算形式是为了限制其运算结果所在的空间,左乘单位四元数,右乘其共轭的运算保证了结果是一个在三维超平面上中的纯四元数。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8Anl1sQM-1636978339440)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/1d0aa0bb-1340-4858-a418-4dbc334c2f70/Untitled.png)]

最后把 p ′ p' p的虚部取出,即得旋转之后点的坐标。

参考:https://blog.csdn.net/linyijiong/article/details/79777399

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

q = [ s , v ] T q=[s,v]^T q=[s,v]T

  • 从四元数到旋转矩阵的变换

    R = v v T + s 2 I + 2 s v ^ + ( v ^ ) 2 R = vv^T+s^2I+2s\hat v + (\hat v)^2 R=vvT+s2I+2sv^+(v^)2

    其中, v ^ \hat v v^ v v v的反对称矩阵,即:

    v ^ = [ 0 − v 3 v 2 v 3 0 − v 1 − v 2 v 1 0 ] \hat v = \begin{bmatrix} 0& -v_3 & v_2\\ v_3& 0&-v_1 \\ -v_2& v_1& 0 \end{bmatrix} v^=0v3v2v30v1v2v10

  • 从四元数到旋转向量的转换

    { θ = 2 a r c c o s q 0     [ n x , n y , n z ] T = [ q 1 , q 2 , q 3 ] T / s i n θ 2 \left\{\begin{matrix}\theta =2arccos q_0\\  [n_x,n_y,n_z]^T =[q_1,q_2,q_3]^T/sin{\frac{\theta}{2}}\end{matrix}\right. {θ=2arccosq0  [nx,ny,nz]T=[q1,q2,q3]T/sin2θ

推导见《视觉SLAM十四讲》P59-60.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值