引言
四元数作为数学领域的重要工具,自 1843 年由威廉·罗恩·哈密顿发现以来,已广泛应用于计算机图形学、机器人学、航空航天、物理模拟和图像处理等多个领域。其独特的数学结构和运算规则,使其在处理三维空间旋转和变换方面具有显著优势。本文将深入探讨四元数的理论基础、运算方式、几何意义以及实际应用,并提供完整的 Python 代码实现。
四元数的数学基础
四元数是由一个标量部分和一个向量部分组成的数系,其一般形式为:
q = a + b i + c j + d k q = a + bi + cj + dk q=a+bi+cj+dk
其中, a 、 b 、 c 、 d a、b、c、d a、b、c、d 是实数,而 i 、 j 、 k i、j、k i、j、k 是虚数单位,满足以下乘法规则:
i 2 = j 2 = k 2 = − 1 i^2 = j^2 = k^2 = -1 i2=j2=k2=−1
i j = k , j i = − k ij = k, \quad ji = -k ij=k,ji=−k
j k = i , k j = − i jk = i, \quad kj = -i jk=i,kj=−i
k i = j , i k = − j ki = j, \quad ik = -j ki=j,ik=−j
四元数的加法、减法、乘法和共轭运算具有如下性质:
加法与减法
四元数的加法和减法通过将对应的实部和虚部分别相加或相减来完成,即对于四元数 q 1 = a 1 + b 1 i + c 1 j + d 1 k q_1 = a_1 + b_1i + c_1j + d_1k q1=a1+b1i+c1j+d1k 和 q 2 = a 2 + b 2 i + c 2 j + d 2 k q_2 = a_2 + b_2i + c_2j + d_2k q2=a2+b2i+c2j+d2k,有:
q 1 + q 2 = ( a 1 + a 2 ) + ( b 1 + b 2 ) i + ( c 1 + c 2 ) j + ( d 1 + d 2 ) k q_1 + q_2 = (a_1 + a_2) + (b_1 + b_2)i + (c_1 + c_2)j + (d_1 + d_2)k q1+q2=(a1+a2)+(b1+b2)i+(c1+c2)j+(d1+d2)k
q 1 − q 2 = ( a 1 − a 2 ) + ( b 1 − b 2 ) i + ( c 1 − c 2 ) j + ( d 1 − d 2 ) k q_1 - q_2 = (a_1 - a_2) + (b_1 - b_2)i + (c_1 - c_2)j + (d_1 - d_2)k q1−q2=(a1−a2)+(b1−b2)i+(c1−c2)j+(d1−d2)k
乘法
四元数乘法遵循分配律和上述虚数单位的乘法规则,但不满足交换律。其乘法结果为:
q 1 q 2 = ( a 1 a 2 − b 1 b 2 − c 1 c 2 − d 1 d 2 ) + ( a 1 b 2 + b 1 a 2 + c 1 d 2 − d 1 c 2 ) i + ( a 1 c 2 − b 1 d 2 + c 1 a 2 + d 1 b 2 ) j + ( a 1 d 2 + b 1 c 2 − c 1 b 2 + d 1 a 2 ) k q_1 q_2 = (a_1 a_2 - b_1 b_2 - c_1 c_2 - d_1 d_2) + (a_1 b_2 + b_1 a_2 + c_1 d_2 - d_1 c_2)i + (a_1 c_2 - b_1 d_2 + c_1 a_2 + d_1 b_2)j + (a_1 d_2 + b_1 c_2 - c_1 b_2 + d_1 a_2)k q1q2=(a1a2−b1b2−c1c2−d1d2)+(a1b2+b1a2+c1d2−d1c2)i+(a1c2−b1d2+c1a2+d1b2)j+(a1d2+b1c2−c1b2+d1a2)k
共轭与模长
四元数 q = a + b i + c j + d k q = a + bi + cj + dk q=a+bi+cj+dk 的共轭定义为:
q ∗ = a − b i − c j − d k q^* = a - bi - cj - dk q∗=a−bi−cj−dk
四元数的模长(或范数)为:
∣ q ∣ = a 2 + b 2 + c 2 + d 2 |q| = \sqrt{a^2 + b^2 + c^2 + d^2} ∣q∣=a2+b2+c2+d2
四元数的模长具有以下性质:
∣ q 1 q 2 ∣ = ∣ q 1 ∣ ∣ q 2 ∣ |q_1 q_2| = |q_1| |q_2| ∣q1q2∣=∣q1∣∣q2∣
四元数的几何意义
四元数在三维空间中具有深刻的几何意义,尤其在旋转和变换方面表现出色。一个单位四元数可以表示三维空间中的旋转,其形式为:
q = cos ( θ 2 ) + sin ( θ 2 ) ( x i + y j + z k ) q = \cos\left(\frac{\theta}{2}\right) + \sin\left(\frac{\theta}{2}\right)(xi + yj + zk) q=cos(2θ)+sin(2θ)(xi+yj+zk)
其中, θ \theta θ 是旋转角度,而 x i + y j + z k xi + yj + zk xi+yj+zk 是旋转轴的单位向量。
与欧拉角相比,四元数避免了万向节锁问题,能更自然地描述旋转,使模型在旋转时更加流畅和稳定。此外,四元数通过球面线性插值(Slerp)可以在两个旋转状态间平滑过渡,制作角色旋转动画、摄像机运动路径等,让动画更加自然、逼真。
Python 中的四元数处理
在 Python 中,可以使用 SymPy 和 NumPy 库来处理四元数。SymPy 提供了四元数类,可进行四则运算等;NumPy 则通过第三方库 numpy-quaternion
支持四元数运算,也可手动通过数组实现四元数运算。
使用 SymPy 处理四元数
import sympy as sp
from sympy.algebras.quaternion import Quaternion# 创建四元数
q1 = Quaternion(1, 2, 3, 4) # 表示1 + 2i + 3j + 4k
q2 = Quaternion(5, 6, 7, 8)# 四则运算
q_add = q1 + q2
q_sub = q1 - q2
q_mul = q1 * q2
q_div = q1 * q2.inverse()# 其他操作
q_conj = q1.conjugate()
q_mod = q1.norm()
q_inv = q1.inverse()
q_pow = q1**3print(f"q1 + q2 = {q_add}")
print(f"q1 - q2 = {q_sub}")
print(f"q1 * q2 = {q_mul}")
print(f"q1 / q2 = {q_div}")
print(f"共轭(q1) = {q_conj}")
print(f"模长(q1) = {q_mod}")
print(f"逆(q1) = {q_inv}")
print(f"q1^3 = {q_pow}")
使用 NumPy 和 numpy-quaternion
库
import numpy as np
import quaternion# 创建四元数
q1 = np.quaternion(1, 2, 3, 4)
q2 = np.quaternion(5, 6, 7, 8)# 四则运算
q_add = q1 + q2
q_sub = q1 - q2
q_mul = q1 * q2
q_div = q1 / q2print(f"q1 + q2 = {q_add}")
print(f"q1 - q2 = {q_sub}")
print(f"q1 * q2 = {q_mul}")
print(f"q1 / q2 = {q_div}")# 使用 NumPy 数组手动表示和运算
q1_array = np.array([1, 2, 3, 4], dtype=float)
q2_array = np.array([5, 6, 7, 8], dtype=float)# 加法
q_add_array = q1_array + q2_array# 减法
q_sub_array = q1_array - q2_array# 乘法(按四元数乘法规则实现)
def quaternion_mul(q1, q2):w1, x1, y1, z1 = q1w2, x2, y2, z2 = q2w = w1 * w2 - x1 * x2 - y1 * y2 - z1 * z2x = w1 * x2 + x1 * w2 + y1 * z2 - z1 * y2y = w1 * y2 - x1 * z2 + y1 * w2 + z1 * x2z = w1 * z2 + x1 * y2 - y1 * x2 + z1 * w2return np.array([w, x, y, z])q_mul_array = quaternion_mul(q1_array, q2_array)# 求共轭
q_conj_array = q1_array * np.array([1, -1, -1, -1])# 求模
q_mod_array = np.sqrt(np.sum(q1_array ** 2))# 求逆(模的平方不为零时)
q_inv_array = q_conj_array / np.sum(q1_array ** 2)print(f"q1 + q2 (array) = {q_add_array}")
print(f"q1 - q2 (array) = {q_sub_array}")
print(f"q1 * q2 (array) = {q_mul_array}")
print(f"共轭(q1) (array) = {q_conj_array}")
print(f"模长(q1) (array) = {q_mod_array}")
print(f"逆(q1) (array) = {q_inv_array}")
四元数与旋转
import numpy as np
from scipy.spatial.transform import Rotation as R# 定义四元数(scipy中四元数顺序为 [x, y, z, w])
qx = 0.0
qy = 0.0
qz = 0.70710678
qw = 0.70710678
r = R.from_quat([qx, qy, qz, qw])# 旋转点
point = np.array([1, 0, 0])
rotated_point = r.apply(point)
print(f"旋转后的点: {rotated_point}")# 获取旋转矩阵
rotation_matrix = r.as_matrix()
print(f"旋转矩阵:\n{rotation_matrix}")# 获取欧拉角
euler_angles = r.as_euler('xyz', degrees=True)
print(f"欧拉角 (度): {euler_angles}")
四元数的实际应用
计算机图形学
在计算机图形学中,四元数用于实现三维模型的旋转和变换。与欧拉角相比,四元数避免了万向节锁问题,能更自然地描述旋转,使模型在旋转时更加流畅和稳定。例如,在游戏开发中,四元数用于实现角色的旋转动画,使角色的运动更加自然和逼真。此外,四元数插值(如球面线性插值)可在两个旋转状态间平滑过渡,制作角色旋转动画、摄像机运动路径等,让动画更加自然、逼真。
机器人学
在机器人学中,四元数用于描述机器人的姿态和运动。通过四元数,可以精确地确定机器人关节的角度和末端执行器的朝向,从而实现精准的运动规划和姿态控制。例如,在工业机器人的操作和装配过程中,四元数用于规划机器人的运动路径,确保机器人能够准确地完成任务。此外,四元数在机器人的逆运动学计算中也发挥着重要作用,帮助求解关节角度,实现末端执行器的精准定位。
航空航天
在航空航天领域,四元数用于飞行器的姿态控制和轨道机动。通过四元数,可以精确地表示飞行器的姿态,实现飞行器的稳定飞行和精确姿态保持。例如,在无人机和卫星的姿态控制中,四元数用于调整飞行器的朝向,确保其在飞行过程中的稳定性。在航天器的轨道控制和姿态调整中,四元数能够高效地描述和计算复杂的旋转运动,帮助实现轨道转移、姿态定向等任务。
物理模拟
在物理模拟中,四元数用于描述刚体的旋转运动和流体中物体的旋转行为。在刚体动力学中,四元数为刚体的姿态提供了一种有效的表示方法,能够更准确地计算刚体的动力学行为,如碰撞响应、旋转惯性等。在流体动力学中,四元数用于分析流体对旋转物体的作用力和力矩,以及研究流体的涡旋等现象。
图像处理
在图像处理领域,四元数用于实现图像的快速旋转和颜色空间转换。通过四元数,可以避免万向锁问题,保持图像的完整性和清晰度。在医学图像处理和遥感图像分析中,四元数用于实现图像的旋转和变换。此外,四元数在颜色空间的研究中也有应用,能够建立不同颜色通道之间的联系,实现颜色空间的转换和分析,为图像增强、色彩校正等提供新的思路和方法。
结论
四元数作为一种强大的数学工具,其在多个领域的广泛应用证明了其在解决复杂问题方面的优势。从计算机图形学中的三维模型变换到机器人学中的姿态控制,从航空航天中的飞行器姿态调整到物理模拟中的刚体动力学分析,再到图像处理中的图像旋转和颜色空间转换,四元数都发挥着不可替代的作用。通过 Python 中的 SymPy 和 NumPy 库,我们可以方便地处理四元数运算,将其应用于实际问题的解决中,进一步推动相关领域的发展和创新。