当前位置: 首页 > news >正文

数学基础---四元数

四元数(Quaternion)是1843年由爱尔兰数学家威廉·罗恩·哈密顿(William Rowan Hamilton)发明的数学工具,最初用于解决三维空间中旋转表示的“维度困境”——它通过4个参数(1个实部+3个虚部)描述三维旋转,既规避了欧拉角的“万向锁”问题,又比旋转矩阵(9个参数)更简洁。

我们在三维空间中看到的单位球代表着四维超球在球极投影到我们空间中时不变的那部分

一、四元数的数学定义与本质

1. 基础定义:实部与虚部的组合

四元数是复数的“三维扩展”,但不同于复数仅有1个虚单位i(满足i²=-1),四元数引入了3个正交的虚单位i、j、k,其标准形式为:
q=q0+q1i+q2j+q3k\mathbf{q} = q_0 + q_1\mathbf{i} + q_2\mathbf{j} + q_3\mathbf{k} q=q0+q1i+q2j+q3k
其中:

  • 实部q0q_0q0( scalar part ),对应旋转的“角度信息”;
  • 虚部q1i+q2j+q3kq_1\mathbf{i} + q_2\mathbf{j} + q_3\mathbf{k}q1i+q2j+q3k( vector part ),可视为三维向量q⃗=[q1,q2,q3]T\vec{q} = [q_1, q_2, q_3]^Tq=[q1,q2,q3]T,对应旋转的“轴信息”;
  • 虚单位规则:i2=j2=k2=ijk=−1\mathbf{i}^2 = \mathbf{j}^2 = \mathbf{k}^2 = \mathbf{ijk} = -1i2=j2=k2=ijk=1,且乘法不满足交换律(如ij=k\mathbf{ij} = \mathbf{k}ij=k,但ji=−k\mathbf{ji} = -\mathbf{k}ji=k)。

为了简化表示,四元数常写成“实部+向量”的紧凑形式:q=[q0,q⃗]T\mathbf{q} = [q_0, \vec{q}]^Tq=[q0,q]Tq=(q0,q1,q2,q3)\mathbf{q} = (q_0, q_1, q_2, q_3)q=(q0,q1,q2,q3)

2. 核心分类:单位四元数是旋转的“载体”

并非所有四元数都能表示旋转——只有“单位四元数”(Unit Quaternion) 具备旋转表示能力,其定义为“模长(Norm)等于1的四元数”。
四元数的模长计算如下:
∥q∥=q02+q12+q22+q32\|\mathbf{q}\| = \sqrt{q_0^2 + q_1^2 + q_2^2 + q_3^2} q=q02+q12+q22+q32
单位四元数需满足 ∥q∥=1\|\mathbf{q}\| = 1q=1,此时其几何意义可明确对应三维旋转:

  • 实部 q0=cos⁡(θ/2)q_0 = \cos(\theta/2)q0=cos(θ/2),其中θ\thetaθ是绕旋转轴的旋转角度;
  • 虚部向量 q⃗=n⃗⋅sin⁡(θ/2)\vec{q} = \vec{n} \cdot \sin(\theta/2)q=nsin(θ/2),其中n⃗=[nx,ny,nz]T\vec{n} = [n_x, n_y, n_z]^Tn=[nx,ny,nz]T单位旋转轴向量(满足∥n⃗∥=1\|\vec{n}\|=1n=1)。

这一对应关系是四元数与旋转绑定的核心,也是后续所有应用的数学基础。

二、四元数的核心运算:从基础到旋转逻辑

四元数的运算规则是理解其应用的关键,尤其是“非交换乘法”,直接决定了旋转组合的顺序逻辑。

1. 基础运算:加法与数乘

  • 加法:同维度分量相加,满足交换律和结合律:
    q1=[q10,q11,q12,q13]\mathbf{q}_1 = [q_{10}, q_{11}, q_{12}, q_{13}]q1=[q10,q11,q12,q13]q2=[q20,q21,q22,q23]\mathbf{q}_2 = [q_{20}, q_{21}, q_{22}, q_{23}]q2=[q20,q21,q22,q23],则
    q1+q2=[q10+q20,q11+q21,q12+q22,q13+q23]\mathbf{q}_1 + \mathbf{q}_2 = [q_{10}+q_{20}, q_{11}+q_{21}, q_{12}+q_{22}, q_{13}+q_{23}] q1+q2=[q10+q20,q11+q21,q12+q22,q13+q23]

  • 数乘:标量与每个分量相乘,满足分配律:
    kkk为实数,则
    kq=[kq0,kq1,kq2,kq3]k\mathbf{q} = [kq_0, kq_1, kq_2, kq_3] kq=[kq0,kq1,kq2,kq3]

2. 关键运算:哈密顿积(旋转组合的核心)

四元数的乘法称为“哈密顿积(Hamilton Product)”,是其区别于复数的核心特征,不满足交换律,直接对应“旋转的先后顺序”。
对于两个四元数 q1=[q10,q⃗1]\mathbf{q}_1 = [q_{10}, \vec{q}_1]q1=[q10,q1]q2=[q20,q⃗2]\mathbf{q}_2 = [q_{20}, \vec{q}_2]q2=[q20,q2],其哈密顿积公式为:
q1⊗q2=[q10q20−q⃗1⋅q⃗2,q10q⃗2+q20q⃗1+q⃗1×q⃗2]\mathbf{q}_1 \otimes \mathbf{q}_2 = \left[ q_{10}q_{20} - \vec{q}_1 \cdot \vec{q}_2,\ q_{10}\vec{q}_2 + q_{20}\vec{q}_1 + \vec{q}_1 \times \vec{q}_2 \right] q1q2=[q10q20q1q2, q10q2+q20q1+q1×q2]
其中:

  • q⃗1⋅q⃗2\vec{q}_1 \cdot \vec{q}_2q1q2 是向量点积(结果为标量);
  • q⃗1×q⃗2\vec{q}_1 \times \vec{q}_2q1×q2 是向量叉积(结果为三维向量)。

工程意义:若q1\mathbf{q}_1q1表示“先绕轴n⃗1\vec{n}_1n1θ1\theta_1θ1”,q2\mathbf{q}_2q2表示“再绕轴n⃗2\vec{n}_2n2θ2\theta_2θ2”,则总旋转对应的四元数为 qtotal=q2⊗q1\mathbf{q}_{total} = \mathbf{q}_2 \otimes \mathbf{q}_1qtotal=q2q1(注意顺序:后旋转的四元数在左)。这是因为四元数旋转本质是“共轭变换”,顺序会直接影响结果。

3. 特殊运算:共轭、逆与规范化

这三个运算直接服务于旋转的“逆操作”和“数值稳定性”。

  • 共轭四元数:将虚部符号取反,记为q∗\mathbf{q}^*q
    q∗=[q0,−q1,−q2,−q3]=[q0,−q⃗]\mathbf{q}^* = [q_0, -q_1, -q_2, -q_3] = [q_0, -\vec{q}] q=[q0,q1,q2,q3]=[q0,q]
    几何意义:共轭四元数对应“原旋转的逆旋转”(绕同一轴转−θ-\thetaθ)。

  • 逆四元数:满足 q⊗q−1=q−1⊗q=[1,0,0,0]\mathbf{q} \otimes \mathbf{q}^{-1} = \mathbf{q}^{-1} \otimes \mathbf{q} = [1, 0, 0, 0]qq1=q1q=[1,0,0,0](单位元),计算式为:
    q−1=q∗∥q∥2\mathbf{q}^{-1} = \frac{\mathbf{q}^*}{\|\mathbf{q}\|^2} q1=q2q
    对于单位四元数,因∥q∥=1\|\mathbf{q}\|=1q=1,故q−1=q∗\mathbf{q}^{-1} = \mathbf{q}^*q1=q,极大简化了逆旋转计算。

  • 规范化:将非单位四元数转换为单位四元数(保证旋转表示的有效性),公式为:
    q^=q∥q∥=[q0∥q∥,q1∥q∥,q2∥q∥,q3∥q∥]\hat{\mathbf{q}} = \frac{\mathbf{q}}{\|\mathbf{q}\|} = \left[ \frac{q_0}{\|\mathbf{q}\|}, \frac{q_1}{\|\mathbf{q}\|}, \frac{q_2}{\|\mathbf{q}\|}, \frac{q_3}{\|\mathbf{q}\|} \right] q^=qq=[qq0,qq1,qq2,qq3]
    工程必要性:数值计算中(如IMU姿态融合),四元数的模长可能因误差累积偏离1,需定期规范化以保证旋转精度。

三、四元数与三维旋转:从表示到转换

四元数的核心价值是“高效表示三维旋转”,需掌握其与“轴角”“旋转矩阵”“欧拉角”的转换关系——这是工程应用中数据交互的基础。

1. 轴角→四元数:旋转的“初始化”

“轴角(Axis-Angle)”是最直观的旋转表示(绕单位轴n⃗\vec{n}nθ\thetaθ),其转换为单位四元数的公式直接源于四元数的几何意义:
q=[cos⁡(θ/2),nxsin⁡(θ/2),nysin⁡(θ/2),nzsin⁡(θ/2)]\mathbf{q} = \left[ \cos(\theta/2),\ n_x \sin(\theta/2),\ n_y \sin(\theta/2),\ n_z \sin(\theta/2) \right] q=[cos(θ/2), nxsin(θ/2), nysin(θ/2), nzsin(θ/2)]
示例:绕x轴转90°(θ=π/2\theta=\pi/2θ=π/2n⃗=[1,0,0]\vec{n}=[1,0,0]n=[1,0,0]),则q=[cos⁡(π/4),sin⁡(π/4),0,0]=[2/2,2/2,0,0]\mathbf{q} = [\cos(\pi/4), \sin(\pi/4), 0, 0] = [\sqrt{2}/2, \sqrt{2}/2, 0, 0]q=[cos(π/4),sin(π/4),0,0]=[2/2,2/2,0,0]

2. 四元数→旋转矩阵:与线性代数的衔接

旋转矩阵(3×3)是线性代数中表示旋转的标准工具,四元数转换为旋转矩阵的公式如下(q\mathbf{q}q为单位四元数):
R(q)=[1−2q22−2q322q1q2−2q0q32q1q3+2q0q22q1q2+2q0q31−2q12−2q322q2q3−2q0q12q1q3−2q0q22q2q3+2q0q11−2q12−2q22]R(\mathbf{q}) = \begin{bmatrix} 1-2q_2^2-2q_3^2 & 2q_1q_2-2q_0q_3 & 2q_1q_3+2q_0q_2 \\ 2q_1q_2+2q_0q_3 & 1-2q_1^2-2q_3^2 & 2q_2q_3-2q_0q_1 \\ 2q_1q_3-2q_0q_2 & 2q_2q_3+2q_0q_1 & 1-2q_1^2-2q_2^2 \end{bmatrix} R(q)=12q222q322q1q2+2q0q32q1q32q0q22q1q22q0q312q122q322q2q3+2q0q12q1q3+2q0q22q2q32q0q112q122q22
作用:当需要用矩阵乘法实现“点的旋转”时(如3D模型顶点变换),可将四元数转为旋转矩阵,再通过Rv⃗R\vec{v}Rv计算旋转后的点v⃗\vec{v}v

3. 四元数→欧拉角:与直观操作的衔接

欧拉角(如Roll-Pitch-Yaw,即滚转-俯仰-偏航)是人类直观理解的旋转(如飞机姿态),但存在万向锁问题。单位四元数转换为Z-Y-X顺序欧拉角(Yaw: ψ\psiψ,Pitch: θ\thetaθ,Roll: ϕ\phiϕ)的公式为:
{ϕ=arctan⁡2(2(q0q1+q2q3),1−2(q12+q22))θ=arcsin⁡(2(q0q2−q3q1))ψ=arctan⁡2(2(q0q3+q1q2),1−2(q22+q32))\begin{cases} \phi = \arctan2(2(q_0q_1 + q_2q_3), 1-2(q_1^2 + q_2^2)) \\ \theta = \arcsin(2(q_0q_2 - q_3q_1)) \\ \psi = \arctan2(2(q_0q_3 + q_1q_2), 1-2(q_2^2 + q_3^2)) \end{cases} ϕ=arctan2(2(q0q1+q2q3),12(q12+q22))θ=arcsin(2(q0q2q3q1))ψ=arctan2(2(q0q3+q1q2),12(q22+q32))
注意:欧拉角的顺序(如Z-Y-X、X-Y-Z)会改变转换公式,工程中需明确“旋转顺序”。

4. 四元数旋转点:共轭变换的应用

若要将三维点v⃗=[x,y,z]T\vec{v} = [x, y, z]^Tv=[x,y,z]T绕单位四元数q\mathbf{q}q表示的旋转轴/角度旋转,需先将v⃗\vec{v}v转换为“纯虚四元数”v=[0,x,y,z]\mathbf{v} = [0, x, y, z]v=[0,x,y,z],再通过共轭变换计算旋转后的点:
v′=q⊗v⊗q−1\mathbf{v}' = \mathbf{q} \otimes \mathbf{v} \otimes \mathbf{q}^{-1} v=qvq1
旋转后的点v⃗′\vec{v}'v对应v′\mathbf{v}'v的虚部(实部为0)。
工程优势:相比旋转矩阵(9次乘法+6次加法),四元数旋转(15次乘法+10次加法)在低算力设备(如嵌入式机器人)上更高效。

旋转矩阵:需要存储 9 个浮点数(3x3 矩阵),占用内存是四元数的 2.25 倍;
四元数:仅需存储 4 个浮点数(x,y,z,w),且满足 x²+y²+z²+w²=1 的约束(可通过归一化维护)。

四、四元数的插值:平滑旋转的关键

在动画、机器人轨迹规划等场景中,需要在两个旋转姿态间实现“平滑过渡”,四元数的球面线性插值(SLERP) 是解决这一问题的最优方案。

1. 为什么不用线性插值(LERP)?

若直接对两个单位四元数q1\mathbf{q}_1q1q2\mathbf{q}_2q2做线性插值(q(t)=(1−t)q1+tq2\mathbf{q}(t) = (1-t)\mathbf{q}_1 + t\mathbf{q}_2q(t)=(1t)q1+tq2),会导致:

  • 插值结果的模长偏离1(需重新规范化);
  • 旋转角速度不均匀(视觉或运动上出现“卡顿”)。
    根本原因:四元数的空间是“四维单位球面”,线性插值会偏离球面,而SLERP则在球面上保持均匀插值。

2. SLERP的原理与公式

SLERP的核心是“在四维单位球面上,沿q1\mathbf{q}_1q1q2\mathbf{q}_2q2之间的最短圆弧插值”,公式为:
q(t)=sin⁡((1−t)ω)sin⁡ωq1+sin⁡(tω)sin⁡ωq2\mathbf{q}(t) = \frac{\sin((1-t)\omega)}{\sin\omega} \mathbf{q}_1 + \frac{\sin(t\omega)}{\sin\omega} \mathbf{q}_2 q(t)=sinωsin((1t)ω)q1+sinωsin(tω)q2
其中:

  • t∈[0,1]t \in [0,1]t[0,1]:插值参数(t=0t=0t=0时为q1\mathbf{q}_1q1t=1t=1t=1时为q2\mathbf{q}_2q2);
  • ω\omegaωq1\mathbf{q}_1q1q2\mathbf{q}_2q2的夹角,由点积计算:cos⁡ω=q1⋅q2=q10q20+q11q21+q12q22+q13q23\cos\omega = \mathbf{q}_1 \cdot \mathbf{q}_2 = q_{10}q_{20} + q_{11}q_{21} + q_{12}q_{22} + q_{13}q_{23}cosω=q1q2=q10q20+q11q21+q12q22+q13q23

优化细节:若cos⁡ω<0\cos\omega < 0cosω<0(表示圆弧大于180°),需将q2\mathbf{q}_2q2取反(−q2\mathbf{-q}_2q2),因为q\mathbf{q}q−q\mathbf{-q}q表示同一旋转,取反后可沿更短圆弧插值。

五、四元数的优缺点与工程应用

1. 核心优势:为何替代欧拉角与旋转矩阵?

对比维度四元数(单位)欧拉角旋转矩阵
参数数量439
万向锁问题有(特定角度)
插值平滑性优(SLERP)差(易卡顿)差(需矩阵插值)
旋转组合效率高(15次乘法)中(依赖转换)低(27次乘法)
数值稳定性高(需规范化)低(万向锁)中(需正交化)

核心结论:四元数是“存储效率”“无万向锁”“平滑插值”的最优平衡。

2. 主要缺点:工程中需规避的问题

  • 不直观性:四元数的4个参数无法直接对应人类理解的“角度”,需转换为欧拉角或轴角才能解读;
  • 符号冗余q\mathbf{q}q−q\mathbf{-q}q表示同一旋转(如[0.707,0.707,0,0][0.707, 0.707, 0, 0][0.707,0.707,0,0][−0.707,−0.707,0,0][-0.707, -0.707, 0, 0][0.707,0.707,0,0]均表示绕x轴转90°),需在数据传输中统一规则;
  • 数值漂移:长时间计算(如IMU融合)会导致模长偏离1,需定期规范化(通常每帧或每周期执行)。

3. 典型工程应用场景

  • 计算机图形学:3D模型(如游戏角色、动画角色)的姿态旋转与平滑过渡,依赖SLERP实现流畅动画;
  • 机器人学:机器人末端执行器的姿态控制、IMU(惯性测量单元)的姿态融合(如无人机、自动驾驶车的姿态估计);
  • 航空航天:飞行器(飞机、卫星)的姿态表示与控制,需无万向锁的高精度旋转描述;
  • VR/AR设备:头显、手柄的姿态跟踪,通过四元数实时更新设备在三维空间中的位置,保证虚拟与现实的对齐。

四元数的本质是“用四维数学工具解决三维旋转问题”,其核心价值在于:以少量参数(4个)实现无万向锁的旋转表示,同时支持高效的组合与平滑插值

这个视频可以快速直观地对四元数有个理解快速理解四元数
这个视频详细清晰的可视化了四元数,有耐心的可以观看四元数的可视化
最好推荐大佬联合做的可交互的一个讲解,非常的牛!交互四元数旋转讲解

http://www.dtcms.com/a/588914.html

相关文章:

  • 《jQuery Prettydate》深入解析与应用
  • 开发公司自己买自己的商品房西安seo外包机构
  • 【数据结构】单调栈(模板 + 练习)
  • 整体设计 全面梳理复盘 之26 九宫格框架与一体化开发 编程 之5
  • LeetCode算法学习之有效的字母异位词
  • 【算法】递归算法的深度实践:深度优先搜索(DFS)从原理到LeetCode实战
  • BFS 图论【各种题型+对应LeetCode习题练习】
  • 威联通怎么建设网站人类命运共同体
  • 【ElasticSearch实用篇-05】基于脚本script打分
  • 微前端框架选型
  • Java 17 密封类(Sealed Classes)实战:从类型安全到架构解耦的范式升级
  • 保健品网站模板wordpress简约主题分享
  • 前端低代码平台
  • 八字排盘原理
  • 40.交叉编译
  • RT-Thread Studio开发环境搭建
  • jdbc基础(连接篇)
  • 免费云服务器网站有哪些为什么手机进网站乱码
  • 从入门到精通 LlamaIndex RAG 应用开发
  • 算法基础篇:(五)基础算法之差分——以“空间”换“时间”
  • 潍坊中企动力做的网站怎么样wordpress显示摘要
  • leetcode1771.由子序列构造的最长回文串长度
  • 【JUnit实战3_31】第十九章:基于 JUnit 5 + Hibernate + Spring 的数据库单元测试
  • 双11释放新增量,淘宝闪购激活近场潜力
  • MySQL快速入门——内置函数
  • 中小网站建设都有哪些网易企业邮箱申请
  • 预测电流控制在光伏逆变器中的低延迟实现:华为FPGA加速方案与并网稳定性验证
  • C语言--文件读写函数的使用
  • 网站的网站维护的原因可以做公众号的网站
  • 使用waitpid回收多个子进程