三维空间中刚体旋转实质是对所定义的刚体坐标系的旋转,如相机坐标系的旋转。目前,刚体旋转的表示有轴角(旋转向量)、四元数、欧拉角、旋转矩阵等方法。本文主要阐述这些表示方法以及优缺点。
01旋转向量对于坐标系的旋转,任意旋转都可以采用一个旋转轴(单位向量)n 和一个旋转角 θ 表示,称之为轴角法。那么,三维空间坐标系的旋转可以描述为一个三维向量,即旋转向量。如向量 a :
a =[ a1, a2, a3 ]
其中,向量方向(单位向量)即旋转轴,向量大小即旋转角度。
优缺点:
1)同轴的两次旋转可直接相加等效为一次旋转,但两次不同轴的连续旋转的等效则需要通过其它旋转表示(四元数)进行辅助计算;
2)旋转角度为 0 时,旋转轴可以任意表示,无法满足一一对应关系;
0 2四元数四元数是简单的超复数,由一个实部 s 和三个虚部 i、j、k 组成,如四元数 q 可表示为:
q=s+xi+yj+zk
也可写成标量 s 和向量 v 的形式:
q=[ s, v ]
其中, s 是四元数的实部,v 是四元数虚部构成的三维向量
旋转表示中,单位四元数可以表示三维空间中的任意一个旋转。对于绕旋转轴(单位向量)n 旋转 θ 度的旋转向量,其相应的四元数形式是:
q=[cosθ/2, nxsinθ/2, nysinθ/2,nzsinθ/2]
其中
θ = 2arccos ( s )
[nx, ny, nz]T = [x, y, z]T/sinθ/2
特别的,由于旋转 θ+2π 与旋转 θ 是相同旋转,因而任意旋转可以表示成两个互为相反数的四元数。推导过程如下:
q=
=[cos(θ/2+π),nxsin(θ/2+π), nysin(θ/2+π),nzsin(θ/2+π)]
=[-cosθ/2,-nxsinθ/2, -nysinθ/2,-nzsinθ/2]
=-q
上述说明了四元数的数学形式以及其旋转含义。那么对于三维空间中点 p 是如何利用四元数 q 求解旋转后的坐标 p' 呢?计算过程如下:
首先写出空间点 p 的四元数形式,
p=xi+yj+zk
然后通过如下公式可以求解旋转后 p' 的四元数形式:
p'=qpq-1
其中,p' 为纯虚四元数(无实部),其虚部值即为旋转后的坐标值
优缺点:
1)当旋转角为 0 时,此时轴角法无法明确旋转轴,但是有固定的四元数与之对应,即:
q=[ ±1, 0, 0, 0 ]
2)任意两次旋转q1、q2等效为一次旋转 q’
q’=q1∗q2
0 3欧拉角上述旋转向量和四元数均可以理解为通过一次旋转表示姿态(按某个旋转轴转动一定角度),欧拉角则是通过绕三个确定轴进行三次独立旋转来表示姿态。欧拉角共有24种,其具体划分如下:
1)根据绕轴数量和顺序不同可以划分为12种:
绕轴数量为 2 时,有如下 6 种顺序:
z-x-z, z-y-z, x-y-x
x-z-x, y-x-y, y-z-y
绕轴数量为 3 时,有如下 6 种顺序:
x-y-z, x-z-y, y-x-z
y-z-x, z-x-y, z-y-x
2)根据绕轴种类不同可以划分为 2 种:
固定轴(外旋):绕轴为初始轴(第一次旋转前的坐标轴)
运动轴(内旋):绕轴为每次旋转后的坐标轴
因而结合上述两大类,欧拉角共有 24 种
通常不同的应用领域都有其默认的欧拉角定义方式。在这里我们只指出一种常见的欧拉角旋转方式,即外旋 z-y-x。具体如下:
首先绕 z 轴旋转,常称为偏航角(yaw角)
再绕旋转后的 y 轴旋转,常称为俯仰角(pitch角)
在绕第二次旋转后的x轴旋转,常称为滚转角(roll角)
优缺点:
1)简单直观、能够比划出旋转结果
2)万向节死锁,旋转过程中存在两个坐标轴平行的现象。如绕 Z 轴(黑色) 旋转 α ,绕旋转后 Y 轴(红色)旋转 β=90°,此时, X 轴(黄色)和未旋转时 Z 轴(黑色)重合,若再绕 X 轴(黄色)旋转,其实与先前绕 Z 轴(黑色)旋转雷同, 导致绕两个轴的单独旋转和绕Z轴(黑色)的单次旋转等效,缺少了一个自由度。
3)无法进行旋转叠加,通过旋转矩阵辅助计算
0 4旋转矩阵旋转矩阵是大小为 3x3 的标准正交矩阵 R ,其为欧拉角提供了数学方法,使其能够进行加减。对三维空间中点 p 可通过如下计算方法获得旋转后的的坐标 p'。
p' = R p
优缺点:
1)同一姿态的旋转矩阵是唯一的
2)可直接进行叠加运算
3)相比于四元数,计算更加明了
4)含有9个变量,但自由度为3,因而冗余度较大
05相互关系刚体旋转的四种表示之间能够相互转换,在这只描述常用的转换关系:通过罗德里格斯公式实现轴角(旋转向量)向旋转矩阵的转换
R = cosθ I + (1-cosθ) n n T+sinθ n^
其中,R 是旋转矩阵, I 是单位向量,n 是旋转向量的单位向量(即旋转轴),θ 是旋转向量的模(即旋转角度)。
END
扫码关注我们 臭皮匠快速编程