三维空间刚体变换:欧拉角、旋转向量、四元数

除了使用旋转矩阵 R R R来表示旋转外,还有其他许多常用的方式用于表示旋转:

欧拉角

欧拉角是一种相对直观的表示旋转效果的方法,它将一个旋转分解为绕三个轴进行旋转,由于分解顺序有多种,故而有不同的欧拉角。此处旋转较为经典的"偏航-俯仰-滚动"模型也即ZYX分解进行学习:

  • 绕Z轴旋转,得到偏航角(Yaw)
  • 旋转后的Y轴旋转,得到俯仰角(Pitch)
  • 旋转后的X轴旋转,得到滚动角(Roll)

由此可用 [ r p y ] T \begin{bmatrix}r&p&y\end{bmatrix}^T [rpy]T表达任意一个旋转,如图所示:

三维空间刚体变换:欧拉角、旋转向量、四元数_第1张图片

欧拉角存在的缺点在于,存在万向锁问题。当俯仰角为 ± 90 ° \pm90\degree ±90°时,第一次旋转和第三次旋转使用的为同一个轴,也即系统丢失一个自由度(有三自由度变为二自由度)。

三维空间刚体变换:欧拉角、旋转向量、四元数_第2张图片

旋转向量(角轴)

旋转矩阵有九个元素,但仅存在三个自由度存在。而变换矩阵有十六个元素,但同样仅有六个自由度。同时由于旋转矩阵 R R R和变换矩阵 T T T为正交矩阵,难以优化。故而希望用一个三维向量来表示旋转,一个六维向量来表示变换。

任意一个旋转可通过一个等效转轴和一个等效转角 进行表示,定义一个向量,使其方向同等效转轴一致,其大小等于等效转角,称其为旋转向量(角轴,Axis-Angle)

定义转轴为单位长度的向量 n n n,其转角为 θ \theta θ,则采用罗德里格斯公式可得到由旋转向量到旋转矩阵的变换:
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
通常,用符号 v e r s θ = 1 − cos ⁡ θ vers\theta=1-\cos\theta versθ=1cosθ表示正矢函数:
R = cos ⁡ θ   I + v e r s θ   n n T + sin ⁡ θ   n ∧ R=\cos\theta\:I+vers\theta\:nn^T+\sin\theta\:n^\wedge R=cosθI+versθnnT+sinθn
符号 ∧ {}^\wedge 表示求反对称矩阵。

同样也可以得到由旋转矩阵到旋转向量的转换,对上式两侧求迹(trace):
t r ( R ) = cos ⁡ θ   t r ( I ) + v e r s θ   t r ( n n T ) + sin ⁡ θ   t r ( n ∧ ) = 3 cos ⁡ θ + v e r s θ + 0 = 3 cos ⁡ θ + 1 − cos ⁡ θ = 1 + 2 cos ⁡ θ \begin{aligned} tr(R)=&\cos\theta\:tr(I)+vers\theta\:tr(nn^T)+\sin\theta\:tr(n^\wedge)\\ =&3\cos\theta+vers\theta+0\\ =&3\cos\theta+1-\cos\theta\\ =&1+2\cos\theta \end{aligned} tr(R)====cosθtr(I)+versθtr(nnT)+sinθtr(n)3cosθ+versθ+03cosθ+1cosθ1+2cosθ
式中, n n n为单位向量,则 t r ( n n T ) = 1 tr(nn^T)=1 tr(nnT)=1;反对称矩阵主对角线元素为0,则 t r ( n ∧ ) = 0 tr(n^\wedge)=0 tr(n)=0,由此得到旋转角表达式:
θ = arccos ⁡ t r ( R ) − 1 2 \theta=\arccos\frac{tr(R)-1}{2} θ=arccos2tr(R)1
此外,旋转轴旋转后不发生变换,也即:
R   n = n R\:n=n Rn=n
由此,转轴 n n n是由矩阵 R R R特征值为1的特征向量,求解方程并归一化可得。

四元数

四元数表示标准

四元数用复数形式表示旋转,具有一个实部和三个虚部,四元数是紧凑的,无奇异性的:
q = w + x i + y j + z k q=w+xi+yj+zk q=w+xi+yj+zk
其中, i 、 j 、 k i、j、k ijk为三个虚部,四元数有两种表示方法,分别对应不同标准。

Hamilton表示法(右手系)满足如下条件:
{ i 2 = j 2 = k 2 = − 1 i j = k i j k = − 1 \begin{cases} i^2=j^2=k^2=-1\\ ij=k\\ ijk=-1 \end{cases} i2=j2=k2=1ij=kijk=1
JPL表示法(左手系)满足如下条件:
{ i 2 = j 2 = k 2 = − 1 i j = − k i j k = 1 \begin{cases} i^2=j^2=k^2=-1\\ ij=-k\\ ijk=1 \end{cases} i2=j2=k2=1ij=kijk=1
Hamilton表示法被广泛运用在Eigen库、Ceres库、MATLAB、ROS等开源库、工具中,后续推导采用Hamilton表示法(右手系)。

可将 i 、 j 、 k i、j、k ijk视为三个坐标轴,一般四元数也可以表示为一个标量和一个向量的形式:
q = [ s v ] T , s = w ∈ ℜ , v = [ x y z ] T ∈ ℜ 3 q=\begin{bmatrix}s&v\end{bmatrix}^T,\quad s=w\in\Re,\quad v=\begin{bmatrix}x&y&z\end{bmatrix}^T\in \Re^{3} q=[sv]T,s=w,v=[xyz]T3
称标量 s s s为四元数的实部,矢量 v v v为四元数的虚部。

当四元数的实部为零,称其为虚四元数;当四元数的虚部为零,称其为实四元数。

采用单位四元数可表示三维空间中的旋转。

四元数运算

定义两个四元数 q 1 、 q 2 q_1、q_2 q1q2
q 1 = w 1 + x 1 i + y 1 j + z 1 k = [ s 1 v 1 ] T q 2 = w 2 + x 2 i + y 2 j + z 2 k = [ s 2 v 2 ] T q_1=w_1+x_1i+y_1j+z_1k=\begin{bmatrix}s_1&v_1\end{bmatrix}^T\\ q_2=w_2+x_2i+y_2j+z_2k=\begin{bmatrix}s_2&v_2\end{bmatrix}^T q1=w1+x1i+y1j+z1k=[s1v1]Tq2=w2+x2i+y2j+z2k=[s2v2]T

加减

四元数的加减法同复数一样:
q 1 ± q 2 = [ s 1 ± s 2 v 1 ± v 2 ] T q_1\pm q_2=\begin{bmatrix}s_1\pm s_2&v_1\pm v_2\end{bmatrix}^T q1±q2=[s1±s2v1±v2]T

乘法

两个四元数相乘可利用向量的内外积公式进行计算:
q 1 q 2 = [ s 1 s 2 − v 1 T v 2 s 1 v 2 + s 2 v 1 + v 1 × v 2 ] T q_1q_2=\begin{bmatrix}s_1s_2-v_1^Tv_2&s_1v_2+s_2v_1+v_1\times v_2\end{bmatrix}^T q1q2=[s1s2v1Tv2s1v2+s2v1+v1×v2]T
四元数的相乘顺序不可交换,这是因为使用到向量的外积。

模长

∥ q ∥ = w 2 + x 2 + y 2 + z 2 \begin{Vmatrix}q\end{Vmatrix}=\sqrt{w^2+x^2+y^2+z^2} q=w2+x2+y2+z2

易得,两四元数乘积的模长等于每个四元数模长的乘积:
∥ q 1 q 2 ∥ = ∥ q 1 ∥ ∥ q 2 ∥ \begin{Vmatrix}q_1q_2\end{Vmatrix}=\begin{Vmatrix}q_1\end{Vmatrix}\begin{Vmatrix}q_2\end{Vmatrix} q1q2=q1q2

共轭

四元数的共轭即为虚部求反:
q ∗ = w − x i − y j − z k = [ s − v ] T q^*=w-xi-yj-zk=\begin{bmatrix}s&-v\end{bmatrix}^T q=wxiyjzk=[sv]T
同时,一个四元数同自身共轭的积等于其自身的向量内积,也即模长的平方:
q ∗ q = q q ∗ = q ⋅ q = ∥ q ∥ 2 = [ s 2 + v T v 0 ] T q^*q=qq^*=q\cdot q=\begin{Vmatrix}q\end{Vmatrix}^2=\begin{bmatrix}s^2+v^Tv&0\end{bmatrix}^T qq=qq=qq=q2=[s2+vTv0]T

四元数的逆如下:
q − 1 = q ∗ ∥ q ∥ 2 q^{-1}=\frac{q^*}{\begin{Vmatrix}q\end{Vmatrix}^2} q1=q2q
易得,四元数和自身的逆的乘积为1:
q q − 1 = q − 1 q = 1 qq^{-1}=q^{-1}q=1 qq1=q1q=1
同时,四元数乘积的逆具有矩阵的特性:

( q 1 q 2 ) − 1 = q 2 − 1 q 1 − 1 (q_1q_2)^{-1}=q_2^{-1}q_1^{-1} (q1q2)1=q21q11

数乘

四元数也可以和常数相乘:
a q = a w + a x i + a y j + a z k = [ a s a v ] T aq=aw+axi+ayj+azk=\begin{bmatrix}as&av\end{bmatrix}^T aq=aw+axi+ayj+azk=[asav]T

四元数表示旋转

对于三维空间内的一个点 p = [ x y z ] T ∈ ℜ 3 p=\begin{bmatrix}x&y&z\end{bmatrix}^T\in\Re^3 p=[xyz]T3,可以使用一个单位四元数 q q q指定其旋转。此处假设该点旋转至 p ′ p^{'} p点,则首先用四元数形式来描述该点坐标:
p = [ 0 x y z ] T = [ 0 v ] T p=\begin{bmatrix}0&x&y&z\end{bmatrix}^T=\begin{bmatrix}0&v\end{bmatrix}^T p=[0xyz]T=[0v]T
也即将坐标系三个轴同单位四元数的三个虚部所在空间相对应。对于旋转后的点 p ′ p^{'} p可用如下方式进行计算:
p ′ = q p q − 1 p^{'}=qpq^{-1} p=qpq1
所得结果为纯虚四元数,三个虚部对应三个轴坐标。

四元数与其他表示的转变

运算算子

对于一个四元数 q = [ s v ] T = [ w x y z ] T q=\begin{bmatrix}s&v\end{bmatrix}^T=\begin{bmatrix}w&x&y&z\end{bmatrix}^T q=[sv]T=[wxyz]T,定义算子 q + q^+ q+ q ⊕ q^\oplus q
q + = [ s − v T v s I + v ∧ ] q ⊕ = [ s − v T v s I − v ∧ ] q^+=\begin{bmatrix}s&-v^T\\v&sI+v^\wedge\end{bmatrix}\qquad q^\oplus=\begin{bmatrix}s&-v^T\\v&sI-v^\wedge\end{bmatrix} q+=[svvTsI+v]q=[svvTsIv]
上述算子将四元数映射至 4 × 4 4\times 4 4×4的矩阵,由此可将四元数的乘法写为矩阵形式:
q 1 + q 2 = [ s 1 − v 1 T v 1 s 1 I + v 1 ∧ ] [ s 2 v 2 ] = [ s 1 s 2 − v 1 T v 2 s 1 v 2 + s 2 v 1 + v 1 ∧ v 2 ] = q 1 q 2 q_1^+q_2=\begin{bmatrix}s_1&-v_1^T\\v_1&s_1I+v_1^\wedge\end{bmatrix}\begin{bmatrix}s_2\\v_2\end{bmatrix}=\begin{bmatrix}s_1s_2-v_1^Tv_2\\s_1v_2+s_2v_1+v_1^\wedge v_2\end{bmatrix}=q_1q_2 q1+q2=[s1v1v1Ts1I+v1][s2v2]=[s1s2v1Tv2s1v2+s2v1+v1v2]=q1q2
也即,易得如下等式成立:
q 1 q 2 = q 1 + q 2 = q 2 ⊕ q 1 q_1q_2=q_1^+q_2=q_2^\oplus q_1 q1q2=q1+q2=q2q1

四元数到旋转矩阵

使用旋转矩阵表示某点旋转至另一点如下所示:
p ′ = R   p p^{'}=R\:p p=Rp
首先,将四元数表示旋转的形式化为算子形式:
p ′ = q p q − 1 = q + p + q − 1 = q + ( q − 1 ) ⊕ p \begin{aligned} p^{'}=&qpq^{-1}\\ =&q^+p^+q^{-1}\\ =&q^+(q^{-1})^\oplus p \end{aligned} p===qpq1q+p+q1q+(q1)p
将式中 q + q − 1 ⊕ q^+q^{-1^\oplus} q+q1展开:
q + ( q − 1 ) ⊕ = [ s − v T v s I + v ∧ ] [ s v T − v s I + v ∧ ] = [ 1 0 0 T v v T + s 2 I + 2 s v ∧ + ( v ∧ ) 2 ] \begin{aligned} q^+(q^{-1})^\oplus =&\begin{bmatrix}s&-v^T\\v&sI+v^\wedge\end{bmatrix}\begin{bmatrix}s&v^T\\-v&sI+v^\wedge\end{bmatrix}\\ =&\begin{bmatrix}1&0\\0^T&vv^T+s^2I+2sv^\wedge+(v^\wedge)^2 \end{bmatrix} \end{aligned} q+(q1)==[svvTsI+v][svvTsI+v][10T0vvT+s2I+2sv+(v)2]
已知 p p p与点 p ′ p^{'} p为纯虚四元数,也即 s p = s p ′ 0 s_p=s_{p^{'}}0 sp=sp0,则上式矩阵中右下角元素同旋转矩阵等价:
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

也即:
R = [ x 2 − y 2 − z 2 + w 2 2 x y − 2 w z 2 x z + 2 w y 2 x y + 2 w z y 2 − x 2 − z 2 + w 2 2 y z − 2 w x 2 x z − 2 w y 2 y z + 2 w x z 2 − x 2 − y 2 + w 2 ] R=\begin{bmatrix} x^2-y^2-z^2+w^2&2xy-2wz&2xz+2wy\\ 2xy+2wz&y^2-x^2-z^2+w^2&2yz-2wx\\ 2xz-2wy&2yz+2wx&z^2-x^2-y^2+w^2 \end{bmatrix} R=x2y2z2+w22xy+2wz2xz2wy2xy2wzy2x2z2+w22yz+2wx2xz+2wy2yz2wxz2x2y2+w2
由于单位四元数模长为1: x 2 + y 2 + z 2 + w 2 = 1 x^2+y^2+z^2+w^2=1 x2+y2+z2+w2=1,故而对主对角线进行化简:
R = [ 1 − 2 y 2 − 2 z 2 2 x y − 2 w z 2 x z + 2 w y 2 x y + 2 w z 1 − 2 x 2 − 2 z 2 2 y z − 2 w x 2 x z − 2 w y 2 y z + 2 w x 1 − 2 x 2 − 2 y 2 ] R=\begin{bmatrix} 1-2y^2-2z^2&2xy-2wz&2xz+2wy\\ 2xy+2wz&1-2x^2-2z^2&2yz-2wx\\ 2xz-2wy&2yz+2wx&1-2x^2-2y^2 \end{bmatrix} R=12y22z22xy+2wz2xz2wy2xy2wz12x22z22yz+2wx2xz+2wy2yz2wx12x22y2
上式所得旋转矩阵为Hamilton表示法下的旋转矩阵,若使用JPL表示法,则得到的旋转矩阵应为上式的转置矩阵:
R J P L = ( R H a m ) T R_{JPL}=(R_{Ham})^T RJPL=(RHam)T

旋转矩阵到四元数:

设旋转矩阵如下:
R = [ r 11 r 12 r 13 r 21 r 22 r 23 r 31 r 32 r 33 ] R=\begin{bmatrix}r_{11}&r_{12}&r_{13}\\r_{21}&r_{22}&r_{23}\\r_{31}&r_{32}&r_{33}\\\end{bmatrix} R=r11r21r31r12r22r32r13r23r33
首先,对矩阵对角线元素进行加减运算:
r 11 + r 22 + r 33 = 4 w 2 − 1 r 12 + r 21 = 4 x y r 12 − r 21 = 4 w z r 31 + r 13 = 4 x z r 31 − r 13 = 4 w y r 23 + r 32 = 4 y z r 23 − r 32 = 4 w x \begin{aligned} r_{11}+r_{22}+r_{33}=&4w^2-1\\ r_{12}+r_{21}=&4xy\\ r_{12}-r_{21}=&4wz\\ r_{31}+r_{13}=&4xz\\ r_{31}-r_{13}=&4wy\\ r_{23}+r_{32}=&4yz\\ r_{23}-r_{32}=&4wx\\ \end{aligned} r11+r22+r33=r12+r21=r12r21=r31+r13=r31r13=r23+r32=r23r32=4w214xy4wz4xz4wy4yz4wx
解的 w w w的值如下:
w = r 11 + r 22 + r 33 + 1 2 w=\frac{\sqrt{r_{11}+r_{22}+r_{33}+1}}{2} w=2r11+r22+r33+1
同样,可以使用对角线得到 x 、 y 、 z x、y、z xyz的值:
x = r 11 − r 22 − r 33 + 1 2 y = − r 11 + r 22 − r 33 + 1 2 z = − r 11 − r 22 + r 33 + 1 2 x=\frac{\sqrt{r_{11}-r_{22}-r_{33}+1}}{2}\\ y=\frac{\sqrt{-r_{11}+r_{22}-r_{33}+1}}{2}\\ z=\frac{\sqrt{-r_{11}-r_{22}+r_{33}+1}}{2}\\ x=2r11r22r33+1 y=2r11+r22r33+1 z=2r11r22+r33+1
此处应注意,由于开方无法确定每一个数值的正负号。故而计算时应使用上述四个公式中的某一个计算得到四元数四个值中的一个后,带入如下公式计算其余量:
w = r 11 + r 22 + r 33 + 1 2 ⇒ x = r 23 − r 32 4 w y = r 31 − r 13 4 w z = r 12 − r 21 4 w x = r 11 − r 22 − r 33 + 1 2 ⇒ w = r 23 − r 32 4 x y = r 12 + r 21 4 x z = r 31 + r 13 4 x y = − r 11 + r 22 − r 33 + 1 2 ⇒ w = r 31 − r 13 4 y x = r 12 + r 21 4 y z = r 23 + r 32 4 y z = − r 11 − r 22 + r 33 + 1 2 ⇒ w = r 12 − r 21 4 z x = r 31 + r 13 4 z z = r 23 + r 32 4 z w=\frac{\sqrt{r_{11}+r_{22}+r_{33}+1}}{2}\Rightarrow x=\frac{r_{23}-r_{32}}{4w}\enspace y=\frac{r_{31}-r_{13}}{4w}\enspace z=\frac{r_{12}-r_{21}}{4w}\\ x=\frac{\sqrt{r_{11}-r_{22}-r_{33}+1}}{2}\Rightarrow w=\frac{r_{23}-r_{32}}{4x}\enspace y=\frac{r_{12}+r_{21}}{4x}\enspace z=\frac{r_{31}+r_{13}}{4x}\\ y=\frac{\sqrt{-r_{11}+r_{22}-r_{33}+1}}{2}\Rightarrow w=\frac{r_{31}-r_{13}}{4y}\enspace x=\frac{r_{12}+r_{21}}{4y}\enspace z=\frac{r_{23}+r_{32}}{4y}\\ z=\frac{\sqrt{-r_{11}-r_{22}+r_{33}+1}}{2}\Rightarrow w=\frac{r_{12}-r_{21}}{4z}\enspace x=\frac{r_{31}+r_{13}}{4z}\enspace z=\frac{r_{23}+r_{32}}{4z}\\ w=2r11+r22+r33+1 x=4wr23r32y=4wr31r13z=4wr12r21x=2r11r22r33+1 w=4xr23r32y=4xr12+r21z=4xr31+r13y=2r11+r22r33+1 w=4yr31r13x=4yr12+r21z=4yr23+r32z=2r11r22+r33+1 w=4zr12r21x=4zr31+r13z=4zr23+r32

此时,由于四元数 q q q − q -q q表示同一个位姿,故而不考虑正负号问题。

四元数到旋转向量

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求迹:
t r ( R ) = t r ( v v T + s 2 I + 2 s v ∧ + ( v ∧ ) 2 ) = t r ( v v T ) + s 2   t r ( I ) + 2 s   t r ( v ∧ ) + t r ( ( v ∧ ) 2 ) = ( x 2 + y 2 + z 2 ) + s 2 ⋅ 3 + 2 s ⋅ 0 − 2 ( x 2 + y 2 + z 2 ) \begin{aligned}tr(R) =&tr(vv^T+s^2I+2sv^\wedge+(v^\wedge)^2)\\ =&tr(vv^T)+s^2\:tr(I)+2s\:tr(v^\wedge)+tr((v^\wedge)^2)\\ =&(x^2+y^2+z^2)+s^2\cdot 3+2s\cdot 0-2(x^2+y^2+z^2)\\ \end{aligned} tr(R)===tr(vvT+s2I+2sv+(v)2)tr(vvT)+s2tr(I)+2str(v)+tr((v)2)(x2+y2+z2)+s23+2s02(x2+y2+z2)
式中,已知单位四元数 q q q的模长为一:
∥ q ∥ 2 = w 2 + x 2 + y 2 + z 2 = 1 \begin{Vmatrix}q\end{Vmatrix}^2=w^2+x^2+y^2+z^2=1 q2=w2+x2+y2+z2=1
其中, w w w为四元数的实部,也即 s = w s=w s=w,则带入上式可得:
t r ( R ) = ( 1 − s 2 ) + 3 s 2 + 0 − 2 ( 1 − s 2 ) = 4 s 2 − 1 \begin{aligned} tr(R)=&(1-s^2)+3s^2+0-2(1-s^2)\\ =&4s^2-1 \end{aligned} tr(R)==(1s2)+3s2+02(1s2)4s21
由角轴旋转角计算公式知:
θ = arccos ⁡ t r ( R ) − 1 2 = arccos ⁡ ( 2 s 2 − 1 ) \begin{aligned} \theta=&\arccos\frac{tr(R)-1}{2}\\ =&\arccos(2s^2-1) \end{aligned} θ==arccos2tr(R)1arccos(2s21)
由三角公式可得:
cos ⁡ θ = 2 cos ⁡ 2 θ 2 − 1 2 s 2 − 1 = 2 cos ⁡ 2 θ 2 − 1 \cos\theta=2\cos^2\frac{\theta}{2}-1\\ 2s^2-1=2\cos^2\frac{\theta}{2}-1 cosθ=2cos22θ12s21=2cos22θ1
由此得到:
θ = 2 arccos ⁡ s \theta=2\arccos s θ=2arccoss
旋转轴可由四元数的虚部除以模长得到:
[ n x n y n z ] T = [ x y z ] T / sin ⁡ θ 2 \begin{bmatrix}n_x&n_y&n_z\end{bmatrix}^T=\begin{bmatrix}x&y&z\end{bmatrix}^T/\sin\frac{\theta}{2} [nxnynz]T=[xyz]T/sin2θ

旋转向量到四元数

同样,可得旋转向量到四元数的表达式:
q = [ cos ⁡ θ 2 n x sin ⁡ θ 2 n y sin ⁡ θ 2 n z sin ⁡ θ 2 ] T q=\begin{bmatrix}\cos\frac{\theta}{2}&n_x\sin\frac{\theta}{2}&n_y\sin\frac{\theta}{2}&n_z\sin\frac{\theta}{2}\end{bmatrix}^T q=[cos2θnxsin2θnysin2θnzsin2θ]T

你可能感兴趣的:(《视觉SLAM十四讲》笔记,线性代数)