0%

三维旋转的表示

三维旋转的矩阵、欧拉角、角轴、反对称阵、四元数等表示法。

Rotation Matrix

SO(3)={RR3×3:det(R)=1,RTR=RRT=I}SO(3)=\{R\in\mathbb{R}^{3\times 3}:det(R)=1,R^TR=RR^T=I\}是所谓的3×33\times 3的特殊正交群(即通俗所说的旋转群),是3×33\times 3一般线性群(可逆矩阵集,GL(3,R)GL(3,\mathbb{R}))的子群:

  • 特殊(Special):指行列式为1。若行列式为-1,其几何含义为旋转和镜像对称的复合。
  • 正交(Orthogonal):指成员都是正交阵(没有行列式约束的3×33\times 3正交群记为O(3)O(3)
  • 群:在矩阵乘法的意义下封闭(很容易验证)。

SO(3)SO(3)中的每个矩阵都描述了三维空间中的一种旋转,其自由度为3。

容易证明:每个旋转对应唯一的一个旋转矩阵。因此旋转矩阵和旋转一一对应。

Active & Passive Transformation

有时需要注意变换的主动/被动问题。”主动“指真真切切地变化了某个物体的位置,”被动“则是指通过把变换施加在坐标系上。二者都使得物体的坐标发生了变化。

以下绝大多数地方,我们都默认使用主动的变换。

Euler Angle

欧拉角的核心想法是:把三维的旋转分解为三个二维的旋转,每次旋转都有不同的转角和转轴。

注意:欧拉角的定义方式很多,使用时一定要确认定义的形式。

一般地,有两种定义的方法:

  • 外部坐标(extrinsic):转角是相对空间原有的固定坐标系而言的。
  • 内部坐标(intrinsic):转角是相对于被转动物体的本地坐标系(会发生变化)而言的。

轴的选择和顺序也有许多种(分为两):

  • Proper(classic) Euler Angles:……
  • Tait-Bryan Angles(yaw,pitch,roll):……

最终,我们就可以将旋转矩阵写成类似R=X(α)Y(β)Z(γ)R=X(\alpha)Y(\beta)Z(\gamma)的形式(可能根据具体的定义不同而不同,但总是能写成三个基本的旋转矩阵之复合)。具体的不同定义下的公式可以通过查阅Wiki等获取。

问题

Angel-axis/Rotation vector

角轴法指用一个单位长的轴ω^\hat{\omega}(模长为1,故自由度为2)和对应的转角θ\theta(自由度为1)描述旋转。

旋转向量法(或称指数坐标(exponential coordinate))和角轴法基本是一样的。旋转向量就是用转角数乘单位长的转轴。可以记为ω=θω^\omega=\theta\hat{\omega}

问题:对同一旋转,角轴法的表示不唯一((ω^,θ),(ω^,θ)(\hat{\omega},\theta),(-\hat{\omega},-\theta)是相同的旋转,同时恒同映射的转轴方向是任意的)。因此通常限定一下θ(0,π])\theta\in(0,\pi])

Skew-symm Matrix

我们定义一个线性映射[]:R3R3×3[]:\mathbb{R}^3\rightarrow\mathbb{R}^{3\times 3},使得叉积可以用线性变换表示,即:

a×b=[a]b,a,bR3a\times b = [a]b,a,b\in \mathbb{R}^3

a=[a1,a2,a3]Ta=[a_1,a_2,a_3]^T,则据此得到:

[a]=[0a3a2a30a1a2a10][a]=\begin{bmatrix} 0 & -a_3 & a_2 \\ a_3 & 0 & -a_1 \\ -a_2 & a_1 & 0 \end{bmatrix}

so(3)={SR3ST=S}so(3)=\{S\in\mathbb{R}^3|S^T=-S\},则so(3)so(3)的每个元素都可以通过上述映射的”逆“映射和某个旋转向量对应,因此用反对称矩阵也能表示旋转。

Quaternion

四元数可以看成推广的复数q=w+xi+yj+zkq=w+xi+yj+zk。称ww为实部,v=(x,y,z)v=(x,y,z)为虚部。

虚部的”基底“i,j,ki,j,k满足:

i2=j2=k2=ijk=1i^2=j^2=k^2=ijk=-1

ij=k=ji,jkk=i=kj,ki=j=ikij=k=-ji,jkk=i=-kj,ki=j=-ik

operation

乘法:q1q2=(w1w2v1Tv2,w1v2+w2v1+v1×v2)q_1q_2=(w_1w_2-v_1^Tv_2,w_1v_2+w_2v_1+v_1\times v_2)

共轭:q=(w,v)q^*=(w,-v)

模方:q2=w2+vTv=qq=qq||q||^2=w^2+v^Tv=qq^*=q^*q

逆:q1=q/q2q^{-1}=q^*/||q||^2

rotation representation

定义用四元数qq旋转三维矢量xx的方法为:

  1. 将三维矢量转换为对应的四元数xq=(0,x)x_q=(0,x)
  2. xq=qxqq1x'_q=qx_qq^{-1}

因此,四元数表示下的旋转的叠加就是四元数之积;四元数乘上实数倍数不改变其表示的旋转,即在某条过原点的直线上的所有四元数(原点除外)表示相同的旋转,且不在同一条这样的直线上的四元数表示的旋转不同。(按:这其实形象化地解释了SO3SO3RP3RP3之间的微分同胚关系

RPnRP^n is formed by taking the quotient of Rn+1\mathbb{R}^{n+1} ∖ {0} under the equivalence relation xλx for all real numbers λ ≠ 0. For all x in ∖Rn+1\mathbb{R}^{n+1} {0} one can always find a λ such that λx has norm 1. There are precisely two such λ differing by sign.

——“Real projective space”,Wiki

如果限定只用单位长的四元数来表示旋转,则每个旋转对应两个互为相反数的四元数(Double-Covering)。

Relationship between representations

Axis-angle -> Matrix

通过几何意义可以构造微分方程解出(构造略):

R=e[ω]=e[θω^]=eθ[ω^]R=e^{[\omega]}=e^{[\theta\hat{\omega}]}=e^{\theta[\hat{\omega}]}

(旋转向量的”指数坐标“之称也是由此而来)

注意到[ω^][\hat{\omega}]的特征多项式det([ω^]λI)=λ3λdet([\hat{\omega}]-\lambda I)=-\lambda^3-\lambda,根据Cayley-Hamilton定理可以直接得到:

[ω^]3=[ω^][\hat{\omega}]^3=-[\hat{\omega}](*)

((*)式也可直接计算得以证明)。由此可知指数展开式可以化为有限项的形式。

R=eθ[ω^]R=e^{\theta[\hat{\omega}]}

=I+θ[ω^]+12!θ2[ω^]2+13!θ3[ω^3]+...=I+\theta[\hat{\omega}]+\frac{1}{2!}\theta^2[\hat{\omega}]^2+\frac{1}{3!}\theta^3[\hat{\omega}^3]+...

=I+[ω^](θθ33!+...)+[ω^]2(θ22!+...)=I+[\hat{\omega}](\theta-\frac{\theta^3}{3!}+...)+[\hat{\omega}]^2(\frac{\theta^2}{2!}+...)

=I+[ω^]sinθ+[ω^]2(1cosθ)=I+[\hat\omega]sin\theta+[\hat\omega]^2(1-cos\theta)

这就是大名鼎鼎的Rodrigues Formula

⚠:注意区分[ω^][\hat\omega][ω][\omega]

Axis-angle -> Quaternion

q=[cos(θ/2),sin(θ/2)ω^]q=[cos(\theta /2),sin(\theta / 2)\hat\omega]

Quaternion -> Axis-angle

θ=2arccos(w)\theta = 2arccos(w)

ω^=1sin(θ/2)v\hat\omega=\frac{1}{sin(\theta/2)}v (当θ\theta非0,否则可以把ω^\hat\omega置为0)

Matrix -> Axis-angle

tr(R)1tr(R)\neq -1

θ=arccos(12(tr(R)1))\theta=arccos(\frac{1}{2}(tr(R)-1))

[ω^]=12sinθ(RRT)[\hat\omega]=\frac{1}{2sin\theta}(R-R^T)

tr(R)=1tr(R)= -1θ=π\theta=\pi

Quaternion -> Axis-angle

E=[v,wI+[v]]E=[-v,wI+[v]]

G=[v,wI[v]]G=[-v,wI-[v]]

R=EGTR=EG^T

More?

可以参考On the continuity of rotation representations in neural network的讨论。其中指出一种6D的旋转表示方法(先33组合为两个矢量并单位化,然后施密特正交化,最后叉积出第三个矢量)实现起来较为方便,可以进行尝试。

欢迎关注我的其它发布渠道