旋转矩阵、欧拉角、四元数理论及其转换关系

author@jason_ql(lql0716) 
http://blog.youkuaiyun.com/lql0716

1、概述
旋转矩阵、欧拉角、四元数主要用于表示坐标系中的旋转关系,它们之间的转换关系可以减小一些算法的复杂度。

本文主要介绍了旋转矩阵、欧拉角、四元数的基本理论及其之间的转换关系。

2、原理
2.1 旋转矩阵
对于两个三维点 p1(x1,y1,z1)p1(x1,y1,z1),p2(x2,y2,z2)p2(x2,y2,z2),由点 p1p1 经过旋转矩阵 RR 旋转到 p2p2,则有:
R=⎡⎣⎢r11r21r31r12r22r32r13r23r33⎤⎦⎥
R=[r11r12r13r21r22r23r31r32r33]
⎡⎣⎢x2y2z2⎤⎦⎥=R⎡⎣⎢x1y1z1⎤⎦⎥
[x2y2z2]=R[x1y1z1]
注:旋转矩阵为正交矩阵RRT=ERRT=E
绕x轴旋转:
Rx(θ)=⎡⎣⎢1000cosθsinθ0−sinθcosθ⎤⎦⎥
Rx(θ)=[1000cosθ−sinθ0sinθcosθ]
绕y轴旋转:
Ry(θ)=⎡⎣⎢cosθ0−sinθ010sinθ0cosθ⎤⎦⎥
Ry(θ)=[cosθ0sinθ010−sinθ0cosθ]
绕z轴旋转:
Rz(θ)=⎡⎣⎢cosθsinθ0−sinθcosθ0001⎤⎦⎥
Rz(θ)=[cosθ−sinθ0sinθcosθ0001]
任意旋转矩阵: 
任何一个旋转可以表示为依次绕着三个旋转轴旋三个角度的组合。这三个角度称为欧拉角。 
三个轴可以指固定的世界坐标系轴,也可以指被旋转的物体坐标系的轴。三个旋转轴次序不同,会导致结果不同。
Rx(−θ1)Ry(−θ2)Rz(θ)Ry(θ2)Rx(θ1)
Rx(−θ1)Ry(−θ2)Rz(θ)Ry(θ2)Rx(θ1)
2.2 欧拉角
欧拉角有两种: 
静态:即绕世界坐标系三个轴的旋转,由于物体旋转过程中坐标轴保持静止,所以称为静态。 
动态:即绕物体坐标系三个轴的旋转,由于物体旋转过程中坐标轴随着物体做相同的转动,所以称为动态。 
使用动态欧拉角会出现万向锁现象;静态欧拉角不存在万向锁的问题。

对于在三维空间里的一个参考系,任何坐标系的取向,都可以用三个欧拉角来表现。参考系又称为实验室参考系,是静止不动的。而坐标系则固定于刚体,随着刚体的旋转而旋转。

如图1,设定xyz-轴为参考系的参考轴。称xy-平面与XY-平面的相交为交点线,用英文字母(N)代表。zxz顺规的欧拉角可以静态地这样定义:

αα 是x-轴与交点线的夹角, 
ββ 是z-轴与Z-轴的夹角, 
γγ 是交点线与X-轴的夹角。

图1: 
 
图中三个欧拉角分别为:(α,β,γ)(α,β,γ); 
蓝色的轴为:xyz轴xyz轴 
红色的轴为:XYZXYZ轴 
绿色的线为交线:NN 
α∈[0,2π],β∈[0,π],γ∈[0,2π]α∈[0,2π],β∈[0,π],γ∈[0,2π]
很可惜地,对于夹角的顺序和标记,夹角的两个轴的指定,并没有任何常规。科学家对此从未达成共识。每当用到欧拉角时,我们必须明确的表示出夹角的顺序,指定其参考轴。

实际上,有许多方法可以设定两个坐标系的相对取向。欧拉角方法只是其中的一种。此外,不同的作者会用不同组合的欧拉角来描述,或用不同的名字表示同样的欧拉角。因此,使用欧拉角前,必须先做好明确的定义。

欧拉角的基本思想是将角位移分解为绕三个互相垂直轴的三个旋转组成的序列。所以,欧拉旋转的三个角,可以对应于三个旋转矩阵。 
Yaw(偏航):欧拉角向量的y轴 
Pitch(俯仰):欧拉角向量的x轴 
Roll(翻滚): 欧拉角向量的z轴

Unity3D中,欧拉旋转是按照ZYX的顺序旋转的。(不同的旋转顺序最终得到的结果是不一样的,要引起重视。给定一组欧拉角角度值,比如yaw=45度,pitch=30度,roll=60度,按照yaw-pitch-roll的顺序旋转和按照yaw-roll-pitch的顺序旋转,最终刚体的朝向是不同的!换言之,若刚体需要按照两种不同的旋转顺序旋转到相同的朝向,所需要的欧拉角角度值则是不同的!)

欧拉角的缺点:

1、 欧拉角的表示方式不唯一。给定某个起始朝向和目标朝向,即使给定yaw、pitch、roll的顺序,也可以通过不同的yaw/pitch/roll的角度组合来表示所需的旋转。这其实主要是由于万向锁(Gimbal Lock)引起的;

2、欧拉角的插值比较难;

3、计算旋转变换时,一般需要转换成旋转矩阵,这时候需要计算很多sin, cos,计算量较大;

2.2.1 由欧拉角求旋转矩阵
设三个轴x,y,z的欧拉角分别为θx,θy,θzθx,θy,θz,正弦值、余弦值分别为sx,cx,sy,cy,sz,czsx,cx,sy,cy,sz,cz那么旋转矩阵为:

R(θx,θy,θz)=Rz(θz)Ry(θy)Rx(θx)=⎡⎣⎢cyczcysz−syczsxsy−cxszcxcz+sxsyszcysxsxsz+cxczsycxsysz−czszcxcy⎤⎦⎥
R(θx,θy,θz)=Rz(θz)Ry(θy)Rx(θx)=[cyczczsxsy−cxszsxsz+cxczsycyszcxcz+sxsyszcxsysz−czsz−sycysxcxcy]
2.2.2 由旋转矩阵求欧拉角
R=⎡⎣⎢r11r21r31r12r22r32r13r23r33⎤⎦⎥=⎡⎣⎢cyczcysz−syczsxsy−cxszcxcz+sxsyszcysxsxsz+cxczsycxsysz−czszcxcy⎤⎦⎥
R=[r11r12r13r21r22r23r31r32r33]=[cyczczsxsy−cxszsxsz+cxczsycyszcxcz+sxsyszcxsysz−czsz−sycysxcxcy]
解方程可得:

θx=atan2(r32,r33)
θx=atan2(r32,r33)
θy=atan2(−r31,r232+r233−−−−−−−√)
θy=atan2(−r31,r322+r332)
θz=atan2(r21,r11)
θz=atan2(r21,r11)
注:atan2()为C++中的函数,atan2(y,x) 求的是y/x的反正切,其返回值为[-pi,+pi]之间的一个数。

2.3 四元数
四元数(Quaternions)是由爱尔兰数学家哈密顿(William Rowan Hamilton)在1843年提出。

三维空间的任意旋转,都可以用绕三维空间的某个轴旋转过某个角度来表示,即所谓的Axis-Angle表示方法。这种表示方法里,Axis可用一个三维向量(x,y,z)(x,y,z)来表示,θθ可以用一个角度值来表示,直观来讲,一个四维向量(θ,x,y,z)(θ,x,y,z)就可以表示出三维空间任意的旋转。注意,这里的三维向量(x,y,z)(x,y,z)只是用来表示axis的方向朝向,因此更紧凑的表示方式是用一个单位向量来表示方向axis,而用该三维向量的长度来表示角度值θθ。这样以来,可以用一个三维向量(θ∗x,θ∗y,θ∗z)(θ∗x,θ∗y,θ∗z)就可以表示出三维空间任意的旋转,前提是其中(x,y,z)(x,y,z)是单位向量。这就是旋转向量(Rotation Vector)的表示方式,OpenCV里大量使用的就是这种表示方法来表示旋转(见OpenCV相机标定部分的rvec)。

单位向量(x,y,z)(x,y,z)旋转θθ角度后的四元数:

(cosθ2,x∗sinθ2,y∗sinθ2,z∗sinθ2)
(cosθ2,x∗sinθ2,y∗sinθ2,z∗sinθ2)
对于三维坐标的旋转,可以通过四元数乘法直接操作,与旋转矩阵操作可以等价,但是表示方式更加紧凑,计算量也可以小一些。

2.3.1 四元数基本概念
四元数的复数定义:

q=q0+q1i+q2j+q3k=[s,v]
q=q0+q1i+q2j+q3k=[s,v]
其中 q0,q1,q2,q3q0,q1,q2,q3均为实数, s=q0,v=[q1,q2,q3]s=q0,v=[q1,q2,q3],i2=j2=k2=−1i2=j2=k2=−1
对于 i,j,ki,j,k 本身的几何意义可以理解为一种旋转,其中 ii 代表 xx 轴与 yy 轴相交平面中 xx 轴正向向 yy 轴正向的旋转, jj 旋转代表 zz 轴与 xx 轴相交平面中 zz 轴正向向 xx 轴正向的旋转, kk 旋转代表 yy 轴与 zz 轴相交平面中 yy 轴正向向 zz 轴正向的旋转, −i,−j,−k−i,−j,−k 分别代表 i,j,ki,j,k 的反向旋转。
四元数的模

|q|=q20+q21+q22+q23−−−−−−−−−−−−−√
|q|=q02+q12+q22+q32
四元数的优点:

非奇异表达(和欧拉角之类的表示相比)
比矩阵更紧凑(更快速)
单位四元数的对可以表示四维空间中的一个旋转
四元数与群

所有单位四元数的集合组成一个三维球S3和在乘法下的一个群(李群)。S3是行列式为1的实正交3x3正交矩阵的群SO(3,R)的双面覆盖,因为每两个单位四元数通过上述关系对应于一个转动。群S3和SU(2)同构,SU(2)是行列式为1的复酉2x2矩阵的群。

设A={q=q0+q1i+q2j+q3k|q0,q1,q2,q3均为实数}A={q=q0+q1i+q2j+q3k|q0,q1,q2,q3均为实数},则AA是一个环,并且是一个格,AA中存在24个四元数,而它们是施莱夫利符号为{3,4,3}{3,4,3}的正二十四胞体的顶点。

四元数的运算:

p1=[s1,v1]=(a1b1c1d1)T
p1=[s1,v1]=(a1b1c1d1)T
p2=[s2,v2]=(a2b2c2d2)T
p2=[s2,v2]=(a2b2c2d2)T
四元数的加法
p1+p2=s1+s2+v1+v2=(a1+a2)+(b1+b2)i+(c1+c2)j+(d1+d2)k
p1+p2=s1+s2+v1+v2=(a1+a2)+(b1+b2)i+(c1+c2)j+(d1+d2)k
四元数的乘法
p1p2=s1s2−v1v2+s1v2+s2v1+v1×v2
p1p2=s1s2−v1v2+s1v2+s2v1+v1×v2

p1p2=⎛⎝⎜⎜⎜a1a2−b1b2−c1c2−d1d2a1b2+b1a2+c1d2−d1c2a1c2−b1d2+c1a2+d1b2a1d2+b1c2−c1b2+d1a2⎞⎠⎟⎟⎟
p1p2=(a1a2−b1b2−c1c2−d1d2a1b2+b1a2+c1d2−d1c2a1c2−b1d2+c1a2+d1b2a1d2+b1c2−c1b2+d1a2)
注:四元数不满足交换律,故 p1p2≠p2p1p1p2≠p2p1,四元数的乘法不等同于外积。

四元数的点积(内积) 
点积也叫欧几里得内积,四元数的点积等同于一个四维向量的点积。点积的值是p1,p2p1,p2中相应元素的数值的乘积的和。
p1⋅p2=s1s2+v1⋅v2=a1a2+b1b2+c1c2+d1d2
p1⋅p2=s1s2+v1⋅v2=a1a2+b1b2+c1c2+d1d2
四元数的外积:Outer(p1,p2)Outer(p1,p2)
四元数的偶积:Even(p1,p2)Even(p1,p2)
四元数的叉积:p1×p2p1×p2
p1×p2=p1p2−p2p22
p1×p2=p1p2−p2p22
p1×p2=v1×v2
p1×p2=v1×v2
p1×p2=(c1d2−c2d1)i+(b1d2−b2d1)j+(b1c2−b2c1)k
p1×p2=(c1d2−c2d1)i+(b1d2−b2d1)j+(b1c2−b2c1)k
四元数的共轭 q∗q∗
q∗=s−v=[s,−v]
q∗=s−v=[s,−v]
qq∗=q20+q21+q22+q23
qq∗=q02+q12+q22+q32
四元数的逆 q−1q−1
qq−1=q−1q=1
qq−1=q−1q=1
q−1=q∗||q||2
q−1=q∗||q||2
单位四元数 
单位四元数的共轭和逆相等 q−1=q∗q−1=q∗
四元数乘法的性质:

1、满足结合律 
2、不满足交换律 
3、乘积的模等于模的乘积 
4、乘积的逆等于各个四元数的逆以相反的顺序相乘

2.3.2 四元数求旋转矩阵
方法1:

已知四元数 
q=q0+q1i+q2j+q3k=[s,v]
q=q0+q1i+q2j+q3k=[s,v]
利用Rodrigues公式可以由四元数求得旋转矩阵RR: 
R=⎡⎣⎢⎢1−2q22−2q232q1q2+2q0q32q1q3−2q0q22q1q2−2q0q31−2q21−2q232q2q3+2q0q12q1q3+2q0q22q2q3−2q0q11−2q21−2q22⎤⎦⎥⎥
R=[1−2q22−2q322q1q2−2q0q32q1q3+2q0q22q1q2+2q0q31−2q12−2q322q2q3−2q0q12q1q3−2q0q22q2q3+2q0q11−2q12−2q22]
方法2:

亦可以将四元数转化为轴角 θθ 与向量 (x,y,z)(x,y,z),然后再计算旋转矩阵(这样需要多计算一个arccos,不划算) 
q=(θxyz)T
q=(θxyz)T
利用Rodrigues公式可以由单位向量ω=(x,y,z)ω=(x,y,z)旋转θθ角度后的四元数求得旋转矩阵RR:

R=eωθ=I+ω×sinθ+ω2×(1−cosθ)=I+⎡⎣⎢0z−y−z0xy−x0⎤⎦⎥sinθ+⎡⎣⎢−y2−z2xyxzxy−x2−z2yzxzyz−x2−y2⎤⎦⎥(1−cosθ)=⎡⎣⎢1zsinθ−ysinθ−zsinθ1xsinθysinθ−xsinθ1⎤⎦⎥+⎡⎣⎢−y2−z2xyxzxy−x2−z2yzxzyz−x2−y2⎤⎦⎥(1−cosθ)=⎡⎣⎢1−(y2+z2)(1−cosθ)zsinθ+xy(1−cosθ)−ysinθ+xz(1−cosθ)−zsinθ+xy(1−cosθ)1−(x2+z2)(1−cosθ)xsinθ+yz(1−cosθ)ysinθ+xz(1−cosθ)−xsinθ+yz(1−cosθ)1−(x2+y2)(1−cosθ)⎤⎦⎥=⎡⎣⎢cosθ+x2(1−cosθ)zsinθ+xy(1−cosθ)−ysinθ+xz(1−cosθ)−zsinθ+xy(1−cosθ)cosθ+y2(1−cosθ)xsinθ+yz(1−cosθ)ysinθ+xz(1−cosθ)−xsinθ+yz(1−cosθ)cosθ+z2(1−cosθ)⎤⎦⎥
R=eωθ=I+ω×sinθ+ω×2(1−cosθ)=I+[0−zyz0−x−yx0]sinθ+[−y2−z2xyxzxy−x2−z2yzxzyz−x2−y2](1−cosθ)=[1−zsinθysinθzsinθ1−xsinθ−ysinθxsinθ1]+[−y2−z2xyxzxy−x2−z2yzxzyz−x2−y2](1−cosθ)=[1−(y2+z2)(1−cosθ)−zsinθ+xy(1−cosθ)ysinθ+xz(1−cosθ)zsinθ+xy(1−cosθ)1−(x2+z2)(1−cosθ)−xsinθ+yz(1−cosθ)−ysinθ+xz(1−cosθ)xsinθ+yz(1−cosθ)1−(x2+y2)(1−cosθ)]=[cosθ+x2(1−cosθ)−zsinθ+xy(1−cosθ)ysinθ+xz(1−cosθ)zsinθ+xy(1−cosθ)cosθ+y2(1−cosθ)−xsinθ+yz(1−cosθ)−ysinθ+xz(1−cosθ)xsinθ+yz(1−cosθ)cosθ+z2(1−cosθ)]
R=⎡⎣⎢cosθ+x2(1−cosθ)zsinθ+xy(1−cosθ)−ysinθ+xz(1−cosθ)−zsinθ+xy(1−cosθ)cosθ+y2(1−cosθ)xsinθ+yz(1−cosθ)ysinθ+xz(1−cosθ)−xsinθ+yz(1−cosθ)cosθ+z2(1−cosθ)⎤⎦⎥
R=[cosθ+x2(1−cosθ)−zsinθ+xy(1−cosθ)ysinθ+xz(1−cosθ)zsinθ+xy(1−cosθ)cosθ+y2(1−cosθ)−xsinθ+yz(1−cosθ)−ysinθ+xz(1−cosθ)xsinθ+yz(1−cosθ)cosθ+z2(1−cosθ)]
2.3.3 旋转矩阵求四元数
情况1:

q0=1+r11+r22+r33−−−−−−−−−−−−−−√2
q0=1+r11+r22+r332
q1=r32−r234q0
q1=r32−r234q0
q2=r13−r314q0
q2=r13−r314q0
q3=r21−r124q0
q3=r21−r124q0
其中要满足 q0≠0q0≠0,1+r11+r22+r33>01+r11+r22+r33>0,即 1+tr(R)>01+tr(R)>0
情况2: 
如果q0q0趋近于0,tr(R)tr(R)趋近于-1,则求解四元数的过程为:

2.1 如果max{r11,r22,r33}=r11max{r11,r22,r33}=r11

t=1+r11−r22−r33−−−−−−−−−−−−−−−√
t=1+r11−r22−r33
q0=r32−r23t
q0=r32−r23t
q1=t/4
q1=t/4
q2=r13+r31t
q2=r13+r31t
q3=r12+r21t
q3=r12+r21t
2.2 如果max{r11,r22,r33}=r22max{r11,r22,r33}=r22

t=1−r11+r22−r33−−−−−−−−−−−−−−−√
t=1−r11+r22−r33
q0=r13−r31t
q0=r13−r31t
q1=r12+r21t
q1=r12+r21t
q2=t/4
q2=t/4
q3=r32+r23t
q3=r32+r23t
2.3 如果max{r11,r22,r33}=r33max{r11,r22,r33}=r33

t=1−r11−r22+r33−−−−−−−−−−−−−−−√
t=1−r11−r22+r33
q0=r21−r12t
q0=r21−r12t
q1=r13+r31t
q1=r13+r31t
q2=r23−r32t
q2=r23−r32t
q3=t/4
q3=t/4
参考资料
相关文章

机器学习、深度学习、计算机视觉、自然语言处理及应用案例——干货分享(持续更新……)
相机标定(Camera calibration)原理、步骤
1、三维旋转:旋转矩阵,欧拉角,四元数

2、欧拉角、四元数和旋转矩阵

3、欧拉角和旋转矩阵的转换

4、三维空间中的旋转:旋转矩阵、欧拉角

5、旋转矩阵、欧拉角、四元数比较

6、刚体在三维空间的旋转(关于旋转矩阵、DCM、旋转向量、四元数、欧拉角)

7、3D计算机图形学-变换矩阵、欧拉角、四元数

8、欧拉角

9、四元数

10、【泡泡机器人SLAM原创专栏-四元数运动学】一:四元数和旋转

11、3D图形:矩阵、欧拉角、四元数与方位的故事
--------------------- 
作者:jason_ql 
来源:优快云 
原文:https://blog.youkuaiyun.com/lql0716/article/details/72597719 
版权声明:本文为博主原创文章,转载请附上博文链接!

### 旋转矩阵欧拉角四元数关系转换方法 #### 一、基本概念 旋转矩阵 \(R\) 是一种用于描述三维空间中刚体姿态的工具,它是一个正交矩阵且行列式为1。欧拉角是一种通过依次绕三个不同轴旋转来表示物体方向的方法,通常分为内在旋转(Z-Y-X顺序)或外在旋转(X-Y-Z顺序)。四元数则是一种扩展实数系统的代数结构,常用来高效表达三维空间中的旋转变换。 #### 二、从旋转矩阵四元数转换 给定一个标准形式的3×3旋转矩阵\(R=[r_{ij}]\),可以按照以下方式将其转化为单位四元数\(q=(w, x, y, z)\)[^1]: - 首先定义变量\(\text{tr}\)作为矩阵迹(trace):\[ \text{tr}=r_{00}+r_{11}+r_{22} \] - 如果\(\text{tr}>0\),那么:\[ w=\frac{\sqrt{\text{tr}+1}}{2},\quad x=\frac{(r_{21}-r_{12})}{4w},\quad y=\frac{(r_{02}-r_{20})}{4w},\quad z=\frac{(r_{10}-r_{01})}{4w}. \] - 若某个对角线元素较大,则可利用其他路径计算以提高数值稳定性。例如当\(r_{00}\geq r_{11}\)且\(r_{00}\geq r_{22}\): \[ x=\frac{\sqrt{1+r_{00}-r_{11}-r_{22}}}{2}, \] 其余分量依此类推。 #### 三、从四元数转至欧拉角 假设已知四元数\(q=(w,x,y,z)\),可以通过下面公式求得对应的滚转(roll),俯仰(pitch)与偏航(yaw)角度: 对于Tait-Bryan angles (即XYZ intrinsic rotations): -\(yaw (\psi)=atan2(2(wx+yz),(w^2-x^2-y^2+z^2))\), -\(pitch (\theta)=arcsin(-2(xy-wz))\), -\(roll (\phi)=atan2(2(wy+xz),(w^2+x^2-y^2-z^2))\). 注意这里采用的是弧度制而非度数制,并需考虑反正切函数返回值范围可能带来的歧义处理问题. #### 四、从欧拉角构建旋转矩阵欧拉角分别为\((\alpha,\beta,\gamma)\)(对应于绕固定框架下的xyz轴转动的角度序列),其合成后的整体变换可用如下连乘积形式给出旋转矩阵\(R\): 如果遵循 ZYX convention: \[ R_z(\alpha) = \begin{bmatrix} cos(\alpha)& -sin(\alpha) & 0\\ sin(\alpha) & cos(\alpha) & 0 \\ 0& 0 & 1 \end{bmatrix}; R_y(\beta) = \begin{bmatrix} cos(\beta) & 0 & sin(\beta)\\ 0 & 1 & 0\\ -sin(\beta) & 0 & cos(\beta) \end{bmatrix}; R_x(\gamma) = \begin{bmatrix} 1 & 0 & 0\\ 0 & cos(\gamma) & -sin(\gamma)\\ 0 & sin(\gamma) & cos(\gamma) \end{bmatrix} \] 最终得到总旋转矩阵为\(R=R_z(\alpha)*R_y(\beta)*R_x(\gamma)\)[^3]. ```python import numpy as np def euler_to_rotation_matrix(alpha,beta,gamma): Rx=np.array([[1,0,0],[0,np.cos(gamma),-np.sin(gamma)],[0,np.sin(gamma),np.cos(gamma)]]) Ry=np.array([[np.cos(beta),0,np.sin(beta)],[0,1,0],[-np.sin(beta),0,np.cos(beta)]]) Rz=np.array([[np.cos(alpha),-np.sin(alpha),0],[np.sin(alpha),np.cos(alpha),0],[0,0,1]]) return np.dot(Rz,np.dot(Ry,Rx)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值