导语:相比矩阵,用四元数处理3D旋转的优势是毋庸置疑的,但由于概念复杂,难于理解,一直令我摸不着头脑。最近学习更是发现在机器人、无人机、SLAM等先进领域,四元数被当成实数、整数这样的基础,所以决定努力补一补这块的知识点。全部内容都来自B站/知乎上的大佬们,这只是本人学习有所感悟后,梳理出来的总结。
上接四元数学习总结(1)的内容。
四元数的乘法
1、复数乘法和二维旋转
通过上一篇的内容,我们了解到四元数和复数的某些关联性质,还有两个几何特性:
1、纯四元数(Pure Quaternion)P = 0 + xi + yj + zk = {0, p},其中 x、y、z 是实数,而 i、j、k 是四元数的虚部单位。纯四元数在几何上可以被视为三维空间中的向量,其中 x、y、z 分别代表向量的三个分量。
2、单位四元数(Unit Quaternion)Q = s + xi + yj + zk = {s, q},其模(或称为范数)等于1。单位四元数通常用于表示三维空间中的旋转轴向量,它可以避免万向锁问题,并且能提供平滑的插值方法。
那么如何利用四元数的乘法运算去表示三维的旋转?我们不妨先来回顾复数和二维旋转。复数乘以i可以逆时针(朝+i方向)旋转90°,乘以-i可以顺时针旋转90°。写成矩阵乘法如下所示
其中推导公式中暗含了一个欧拉公式,包含sinθ和cosθ的矩阵就是我们常见的二维旋转矩阵。可以发现二维旋转矩阵其实也对应着一个类似四元数的一个向量表达形式,就是复数。我们对旋转矩阵进行求逆发现其实对应的就是复数的共轭形式。(数学功底差的同学可以看看下面文心一言的数学解析)
也就是说cosθ+i·sinθ是正旋转θ,而cosθ-i·sinθ是逆旋转θ。也就是对应着单位复数的求逆就是等于其共轭(数学差生看下面证明)这些特性用在四元数和三维旋转矩阵中优势就更明显了。
这里有一个问题需要拿出来阐述,为什么二维旋转可以交换?在三维旋转中先绕x旋转,在绕y旋转和先绕y旋转,在绕x旋转肯定是不一样的,具体看下图。那我们在二维旋转中先转90°再转45°肯定和先转45°再转90°是一样的。究其根本,是二维旋转它首先就隐藏了一个非常重要的因素,就是旋转轴永远是垂直于二维平面的,也是固定的,在二维中无论怎么旋转,都是共面的。放到三维空间,旋转之所以存在次序性,之所以不能交换,是旋转轴可以跟向量成任意角度。如果你放到一个二维子空间里面去旋转,你依然可以满足交换性。
(数学差的同学还是得注意,旋转矩阵的左乘和右乘的区别)
左乘:
- 坐标系(或参考系)不动,点(或向量)动。这可以理解为在原始坐标系(或称为世界坐标系)下,点(或向量)绕原点进行了旋转。左乘的结果是旋转后的点(或向量)相对于原始坐标系的位置。
- 在二维或三维空间中,如果绕静坐标系(如世界坐标系)旋转,通常采用左乘的方式。这相当于将旋转变换矩阵乘以坐标矩阵。
右乘:
- 点(或向量)不动,坐标系(或参考系)动。这可以理解为点(或向量)保持不变,但坐标系进行了旋转,因此点(或向量)在新坐标系下的坐标发生了变化。右乘的结果是原始点(或向量)相对于新坐标系(或称为旋转后的坐标系)的坐标。
- 如果绕动坐标系(即自身建立一个坐标系)旋转,通常采用右乘的方式。这相当于将坐标矩阵乘以变换矩阵。
2、三维旋转
首先,我们又扯到上篇文章说的two-sphere,也就是通常意义上的球体。轴角一般表示为旋转轴和角度,单看旋转轴,归一化后的旋转轴其实就是球体上面的一个点。那我们用极坐标来表示(cosα·sinβ,sinα·sinβ,cosβ)。
然后,我们就要去旋转角度了。欧拉角是一种应用很广但其实很有缺陷的旋转表现形式,那为啥有缺陷还应用广泛呢?主要原因就是简单。我们绕着单位轴旋转(譬如绕z轴旋转)比绕任意方向轴要简单许多,那么处理轴角的思路就是把轴旋转到单位轴譬如z,进行旋转后再还原到原来位置(具体轴角公式如下,证明暂时放一放)
先对旋转矩阵 𝑅 进行转置得到 𝑅T,然后再右乘向量 𝑣,即 𝑣·𝑅T,具有特定的几何意义。
坐标系变换:首先,旋转矩阵 𝑅 表示将一个坐标系内的点或向量旋转到另一个坐标系。当我们对 𝑅 进行转置得到 𝑅T 时,我们实际上是在逆转这个旋转操作,即从目标坐标系变回原始坐标系。
逆变换:转置的旋转矩阵 𝑅T 可以视为逆变换,它将经过 𝑅 旋转后的坐标变回原始坐标。因此,𝑅T 代表了原始旋转的逆操作。
右乘:当我们右乘 𝑣·𝑅T 时,我们实际上是在将坐标系逆旋转,而不是旋转向量 𝑣。这相当于将向量 𝑣 从目标坐标系变回原始坐标系。
3、四元数乘法
首先要说说四元数的乘法定义,网络上普遍归纳的是两个纯四元数的乘法通式为 -点乘 +叉乘,即:
p * q = - p · q + p x q
详细的说,p = (x₁i + y₁j + z₁k),q = (x₂i + y₂j + z₂k),执行代数乘法得:
-(x₁x₂+y₁y₂+z₁z₂) + (y₁z₂ - z₁y₂)i + (x₁z₂ - z₁x₂)j + (x₁y₂ - y₁x₂)k
但其实对于一般的四元数而言,其乘法通式应该是如下图所示:
因为纯四元数的实部为0,也就是p₀ q₀等于0,所以上面2个四元数的乘法通式是一样的意思。
说回正题。单位四元数用作表示旋转,纯四元数表示旋转轴的三维向量,这一点毋庸置疑。那么我们可以用如下的四元数乘法来计算三维旋转:
三维任意向量:q = 0 + x₁i + y₁j + z₁k
旋转角:p = w + x₂i + y₂j + z₂k
四元数乘法计算三维旋转表达式:pqp^-1
(单位复数的求逆就是等于其共轭,推广到单位四元数也成立)
可以稍微试着用第2节的思想去理解这里的左乘p右乘p-1。这里举个很简单的例子,譬如一个表达三维向量的四元数 v = i + k,我们给它左乘一个j,右乘一个-j,即:
j · ( i + k) · -j
= ( j·i + j·k ) · -j
= ( -k + i) · -j
= k·j - i·j
= -i - k
这意思就是说,四元数 v 代表的三维向量,沿着 j 轴旋转了180° 但这里其实还是不对,因为我们原本只想 pq 运算的几何意义只是 沿着 j 轴旋转一次,旋转90°就可以了。但是这个方法左乘一次,右乘一次,实际上是旋转了两次,所以用四元数的数学乘法计算的时候,对应旋转角的四元数一定要取期望角度的一半。
2024.05.23 暂时写到这,有问题在补充。