旋转的 4 种表示方式
一. 姿态角
即 RPY 角(Roll、Pitch、Yaw)。
俯仰角
(pitch):围绕 Y 轴旋转的角度。 偏航角
(yaw):围绕 Z 轴旋转的角度。 滚转角
(roll):围绕 X 轴旋转的角度。
是一种绕固定坐标系(外旋)的欧拉角,详见下一节。
二. 欧拉角
欧拉角是由 Leonhard Euler 提出的概念, 用来描述刚体/移动坐标系在一个固定坐标系中的姿态。简单的说是使用 XYZ 三个轴的旋转分量, 来描述一个 6 自由度的旋转。
欧拉角一般具有两大类表示方式, 每类按照旋转次序的不同分为 6 小类:
Proper Euler angles (
z-x-z
,x-y-x
,y-z-y
,z-y-z
,x-z-x
,y-x-y
)Tait–Bryan angles (
x-y-z
,y-z-x
,z-x-y
,x-z-y
,z-y-x
,y-x-z
)
每个大类都使用了 3 个变量描述三次旋转过程中的旋转角度, 差别在于 Proper Euler angles 只涉及两个转轴,而 Tait–Bryan angles 涉及三个转轴。
Tait–Bryan angles 也被称为 Cardan angles, nautical angles, (heading, elevation, and bank), (yaw, pitch, and roll). 我们接触的比较多的是 yaw(偏航), pitch(俯仰), roll(横滚).三个变量一般对应(车体, 飞行器的)z, y, x 三个坐标轴。
1. 欧拉角描述旋转
如果给出一组欧拉角(后面都是指 Tait–Bryan angles),绕 x, y, z 三个轴的转角分别为
(1) 旋转顺序
旋转顺序就是我们上文提到的 Tait–Bryan angles (x-y-z
, y-z-x
, z-x-y
, x-z-y
, z-y-x
, y-x-z
)。
对于 x, y, z 三个轴的不同旋转顺序一共有六种组合。我们需要明确旋转顺序, 才能确定欧拉角所指的姿态。
(2) 内旋与外旋
按旋转的坐标系分为 内旋(intrinsic rotation)和 外旋(extrinsic rotation)。
内旋:绕物体自身的坐标系(object-space)旋转。每次旋转都会改变下一次旋转的轴。这种情况下旋转的轴是动态的(moving axis)。
text内旋(intrinsic rotations) = 旋转轴(rotated axis)
外旋:绕惯性系(upright-space)旋转。upright space 指基向量平行于 world-space 或 parent-space,原点与 object-space 的原点重合的空间)。无论是三步旋转中的哪一步,轴都是固定的。
text外旋(extrinsic rotations) = 固定轴(static/fixed axis)
内在旋转与外在旋转的转换关系:互换第一次和第三次旋转的位置则两者结果相同。例如 Z-Y-X 旋转的内部旋转和 X-Y-Z 旋转的外部旋转的旋转矩阵相同。
(a) 绕定轴 X-Y-Z 旋转(RPY 角)(外旋)
假设两个坐标系 A 和 B,二者初始时完全重合。 过程如下:B 绕 A 的 X 轴旋转
每个旋转都是绕着固定参考坐标系{A}的轴。我们规定这种姿态表示法为 X-Y-Z 固定角坐标系。又是把它们定义为 回转角/滚转角(roll)、俯仰角(pitch) 和 偏转角/偏航角(yaw)。
可直接推导等价旋转矩阵
其中
(b) 绕动轴 Z-Y-X 旋转(Euler 角)(内旋)
过程如下:B 绕 B 的 Z 轴旋转
{B}相对于 A 的最终姿态为
这个结果与绕定轴 X-Y-Z 旋转的结果完全相同。也就是说:三次绕固定值旋转的最终姿态和以相反顺序三次绕运动坐标轴旋转的最终姿态相同。
2. 欧拉角表示方式的缺点
欧拉角的表示方式比较直观,但是有几个缺点:
欧拉角的表示方式不唯一。
给定某个起始朝向和目标朝向,即使给定 yaw、pitch、roll 的顺序,也可以通过不同的 yaw/pitch/roll 的角度组合来表示所需的旋转。比如,同样的 yaw-pitch-roll 顺序,(0,90,0)和(90,90,90)会将刚体转到相同的位置。这其实主要是由于万向锁(Gimbal Lock)引起的。
欧拉角的插值比较难。
计算旋转变换时,一般需要转换成旋转矩阵,这时候需要计算很多 sin, cos,计算量较大。
3. 欧拉角-> 旋转矩阵
内旋欧拉角转换为旋转矩阵如下:
(如是外旋欧拉角,则
三. 旋转矩阵
1. 旋转矩阵转欧拉角
旋转矩阵转内旋欧拉角如下:
四. 四元数
参考:
1. 3D 旋转公式(向量型,一般情况)
也叫做 Rodrigue's Rotation Formula:
3D 空间中任意一个
沿着单位向量 旋转 角度之后的 为: math\mathbf{v'} = \cos(\theta)\mathbf{v} + (1-\cos(\theta))(\mathbf{u} \cdot \mathbf{v})\mathbf{u} + \sin(\theta)(\mathbf{u} \times \mathbf{v})
证明略。
2. 四元数(quaternion)
四元数有三个虚部,所有四元数
其中:
向量形式:
此外,我们经常将四元数的实部与虚部分开,并用一个三维向量来表示虚部,将它表示为标量与向量的有序对形式
(1) 性质
模长(范数)
标量向量有序对形式:
加减法
将分量相加减
标量乘法
math\begin{aligned} sq &= s(a + bi + cj + dk) \\ &= sa + sbi + scj + sdk \end{aligned}
满足交换律:$ sq = qs $
四元数乘法
不满足交换律,一般 $ q_1q_2 \ne q_2q_1 $,有左乘与右乘的区别。
- $ q_1q_2
q_2$ 左乘以 」或「 右乘以 」 满足结合律和分配律。
如果有两个四元数
和 ,它们的乘积为:
由于有
,可得如下表格:
矩阵形式
(2) Graßmann 积
如果令
定理: Graßmann 积
对任意四元数
,
该定理是将四元数与 3D 旋转联系起来的关键。
(3) 纯四元数(Pure Quaternion)
如果一个四元数能写成
纯四元数有一个重要特性:
(4) 逆(Inverse)与共轭
右乘
可以利用四元数共轭的一些性质来获得
定义
共轭的性质:
这个特殊的乘法
如果
3. 四元数与 3D 旋转
如果我们需要将一个向量
我们可以将这些向量定义为纯四元数
这样我们就能得到
(1) 的旋转
如果一个向量
我们将它表示成四元数形式。
如果有两个纯四元数
将其代入得到
如果我们将
如果能构造一个
也就是说,如果旋转轴
3D 旋转公式(四元数型,正交情况)
当
正交于旋转轴 时,旋转 角度之后的 $\mathbf{v'_⊥} $ 可以使用四元数乘法来获得. 令 , , 那么
这个四元数
也就是说,我们构造出来的这个
(2) 的旋转
如果一个向量
3D 旋转公式(四元数型,平行情况)
当
平行于旋转轴 时, 旋转 角度之后的 用四元数可以写为:
(3) 的旋转
我们有更好的办法进一步化简它:
引理 1
如果
, 且 为单位向量, 那么
证明略(使用 Graßmann 积和一些三角恒等式即可)。
几何意义:如果绕同一个轴连续旋转
有了这个引理,加上四元数逆的定义
我们还能进一步化简这个公式:
引理 2
假设
是一个纯四元数, 而 , 其中 是一个单位向量, . 在这种条件下, 如果 平行于 , 那么 $qv_∥ = v_∥q $
证明:
等式左边
等式右边
引理 3
假设
是一个纯四元数, 而 , 其中 是一个单位向量, . 在这种条件下, 如果 正交于 , 那么 $qv_⊥ = v_⊥q^* $
证明:
等式左边
等式右边
对之前的公式做出最后的变形
3D 旋转公式(四元数型,一般情况)
任意向量
沿着以单位向量定义的旋转轴 旋转 度之后的 可以使用四元数乘法来获得。令 , , 那么:
它与 Rodrigues' Rotation Formula 完全等价:
证明略(可能会用到
因为所有的旋转四元数的实部都只是一个角度的余弦值,假设有一个单位四元数
如果想要再获得旋转轴,那么只需要将
4. 3D 旋转的矩阵形式
在实际的应用中,我们可能会需要将旋转与平移和缩放进行复合,所以需要用到四元数旋转的矩阵形式。
前面讨论过左乘四元数
右乘
我们可以利用这两个公式将
假设
我们就能得到
因为
因为矩阵的最外圈不会对
3D 旋转公式(矩阵型)
任意向量
沿着以单位向量定义的旋转轴 旋转 度之后的 可以使用矩阵乘法来获得. 令 , , , , 那么:
虽然 3D 旋转的矩阵形式不如四元数形式简单,而且占用更多的空间,但是对大批量的变换,使用 预计算 好的矩阵是比四元数乘法更有效率的。
5. 旋转的复合
四元数的旋转是可以复合的。
引理 4
对于任意四元数
、 :
证明略。
假设有两个表示沿着不同轴,不同角度旋转的四元数
也就是说
这个结果也可以推广到更多个旋转的复合。
6. 双倍覆盖
四元数与 3D 旋转的关系并不是一对一的,同一个 3D 旋转可以使用两个不同的四元数来表示。对任意的单位四元数
所以,这个四元数的旋转角度为
从四元数的旋转公式也能推导出相同的结果
所以,我们经常说单位四元数与 3D 旋转有一个“2 对 1 满射同态”(2-1 Surjective Homomorphism)关系。或者说单位四元数 双倍覆盖(Double Cover)了 3D 旋转。
因为这个映射是满射,我们可以说所有的单位四元数都对应着一个 3D 旋转。或者说,一个四维单位超球面(也叫做
由于旋转矩阵中的每一项都包含了四元数两个分量的乘积,
7. 指数形式
类似于复数的欧拉公式,四元数也有一个类似的公式。如果
也就是说,
有了指数型的表示方式,我们就能够将之前四元数的旋转公式改写为指数形式了:
3D 旋转公式(指数型)
任意向量
沿着以单位向量定义的旋转轴 旋转 角度之后的 可以 使用四元数的指数表示。令 , , 那么:
有了四元数的指数定义,我们就能够定义四元数的更多运算。
自然对数
幂运算
可以看到,一个单位四元数的
8. 四元数插值
假设有两个旋转变换
TODO: ...