三维旋转的矩阵、欧拉角、角轴、反对称阵、四元数等表示法。
Rotation Matrix
SO(3)={R∈R3×3:det(R)=1,RTR=RRT=I}是所谓的3×3的特殊正交群(即通俗所说的旋转群),是3×3一般线性群(可逆矩阵集,GL(3,R))的子群:
- 特殊(Special):指行列式为1。若行列式为-1,其几何含义为旋转和镜像对称的复合。
- 正交(Orthogonal):指成员都是正交阵(没有行列式约束的3×3正交群记为O(3))
- 群:在矩阵乘法的意义下封闭(很容易验证)。
SO(3)中的每个矩阵都描述了三维空间中的一种旋转,其自由度为3。
容易证明:每个旋转对应唯一的一个旋转矩阵。因此旋转矩阵和旋转一一对应。
有时需要注意变换的主动/被动问题。”主动“指真真切切地变化了某个物体的位置,”被动“则是指通过把变换施加在坐标系上。二者都使得物体的坐标发生了变化。
以下绝大多数地方,我们都默认使用主动的变换。
Euler Angle
欧拉角的核心想法是:把三维的旋转分解为三个二维的旋转,每次旋转都有不同的转角和转轴。
注意:欧拉角的定义方式很多,使用时一定要确认定义的形式。
一般地,有两种定义的方法:
- 外部坐标(extrinsic):转角是相对空间原有的固定坐标系而言的。
- 内部坐标(intrinsic):转角是相对于被转动物体的本地坐标系(会发生变化)而言的。
轴的选择和顺序也有许多种(分为两组):
- Proper(classic) Euler Angles:……
- Tait-Bryan Angles(yaw,pitch,roll):……
最终,我们就可以将旋转矩阵写成类似R=X(α)Y(β)Z(γ)的形式(可能根据具体的定义不同而不同,但总是能写成三个基本的旋转矩阵之复合)。具体的不同定义下的公式可以通过查阅Wiki等获取。
问题:
Angel-axis/Rotation vector
角轴法指用一个单位长的轴ω^(模长为1,故自由度为2)和对应的转角θ(自由度为1)描述旋转。
旋转向量法(或称指数坐标(exponential coordinate))和角轴法基本是一样的。旋转向量就是用转角数乘单位长的转轴。可以记为ω=θω^。
问题:对同一旋转,角轴法的表示不唯一((ω^,θ),(−ω^,−θ)是相同的旋转,同时恒同映射的转轴方向是任意的)。因此通常限定一下θ∈(0,π])
Skew-symm Matrix
我们定义一个线性映射[]:R3→R3×3,使得叉积可以用线性变换表示,即:
a×b=[a]b,a,b∈R3
设a=[a1,a2,a3]T,则据此得到:
[a]=⎣⎢⎡0a3−a2−a30a1a2−a10⎦⎥⎤
记so(3)={S∈R3∣ST=−S},则so(3)的每个元素都可以通过上述映射的”逆“映射和某个旋转向量对应,因此用反对称矩阵也能表示旋转。
Quaternion
四元数可以看成推广的复数q=w+xi+yj+zk。称w为实部,v=(x,y,z)为虚部。
虚部的”基底“i,j,k满足:
i2=j2=k2=ijk=−1
ij=k=−ji,jkk=i=−kj,ki=j=−ik
operation
乘法:q1q2=(w1w2−v1Tv2,w1v2+w2v1+v1×v2)
共轭:q∗=(w,−v)
模方:∣∣q∣∣2=w2+vTv=qq∗=q∗q
逆:q−1=q∗/∣∣q∣∣2
rotation representation
定义用四元数q旋转三维矢量x的方法为:
- 将三维矢量转换为对应的四元数xq=(0,x)
- xq′=qxqq−1
因此,四元数表示下的旋转的叠加就是四元数之积;四元数乘上实数倍数不改变其表示的旋转,即在某条过原点的直线上的所有四元数(原点除外)表示相同的旋转,且不在同一条这样的直线上的四元数表示的旋转不同。(按:这其实形象化地解释了SO3和RP3之间的微分同胚关系)
RPn is formed by taking the quotient of Rn+1 ∖ {0} under the equivalence relation x ∼ λx for all real numbers λ ≠ 0. For all x in ∖Rn+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θ[ω^]
(旋转向量的”指数坐标“之称也是由此而来)
注意到[ω^]的特征多项式det([ω^]−λI)=−λ3−λ,根据Cayley-Hamilton定理可以直接得到:
[ω^]3=−[ω^](*)
((*)式也可直接计算得以证明)。由此可知指数展开式可以化为有限项的形式。
R=eθ[ω^]
=I+θ[ω^]+2!1θ2[ω^]2+3!1θ3[ω^3]+...
=I+[ω^](θ−3!θ3+...)+[ω^]2(2!θ2+...)
=I+[ω^]sinθ+[ω^]2(1−cosθ)
这就是大名鼎鼎的Rodrigues Formula。
⚠:注意区分[ω^]和[ω]
Axis-angle -> Quaternion
q=[cos(θ/2),sin(θ/2)ω^]
Quaternion -> Axis-angle
θ=2arccos(w)
ω^=sin(θ/2)1v (当θ非0,否则可以把ω^置为0)
Matrix -> Axis-angle
当tr(R)=−1:
θ=arccos(21(tr(R)−1))
[ω^]=2sinθ1(R−RT)
当tr(R)=−1:θ=π
Quaternion -> Axis-angle
E=[−v,wI+[v]]
G=[−v,wI−[v]]
R=EGT
More?
可以参考On the continuity of rotation representations in neural network的讨论。其中指出一种6D的旋转表示方法(先33组合为两个矢量并单位化,然后施密特正交化,最后叉积出第三个矢量)实现起来较为方便,可以进行尝试。