四元数学习总结(1)

news2025/6/7 3:06:34

导语:相比矩阵,用四元数处理3D旋转的优势是毋庸置疑的,但由于概念复杂,难于理解,一直令我摸不着头脑。最近学习更是发现在机器人、无人机、SLAM等先进领域,四元数被当成实数、整数这样的基础,所以决定努力补一补这块的知识点。全部内容都来自B站/知乎上的大佬们,这只是本人学习有所感悟后,梳理出来的总结。

一、四元数是如何诞生的?

可能四元数的由来大家都看过很多遍。四元数(Quaternions),是由爱尔兰数学家哈密顿(William Rowan Hamilton,1805-1865)提出的,他最初的想法是:即然在实数上再扩展一个虚数,就能表示二维平面上所有的点,那么再扩展一个虚数是不是就可以表示三维空间上所有的点?这个想法简单写下来就是这样:z = a + b·i + c·j

但是用这个(三元数)方式去表示三维坐标,那么相乘的结果会得出一项  i · j ,两个不同维度的相乘是多少?如果 i · j 直接等于 -1,那么  i · i = -1, j · j = -1,那岂不是 i = j?

就上面这个问题,哈密顿思考了很久。有一天这位学者行走在大桥上,看着过往船只,突然灵光一闪,两个虚数不够,那就再多加一个!他立刻在桥边石碑上洋洋洒洒刻上几行大字,四元数就此诞生!

z = a + b·i + c·j + d·k

i ² = j ² = k ² = i·j·k = -1 

===============================片段分割线===============================

二、如何理解四元数映射到三维空间?

那么为什么是四元数呢,该如何理解四元数呢?我们注意它的唯一约束:

i ² = j ² = k ² = i·j·k = -1 

如何理解这组约束呢?一开始我不理解四元数的时候,只有死记硬背这 i·j·k = -1 ,前三个i ² = j ² = k ² = -1 这部分会被当成原来的虚数的概念去理解记忆。但其实四元数的关键就在于 ijk 如何通过 -1 与 i ² = j ² = k ²相关联

因为 i·j·k = -1,两边左乘一个 i,得 i ² ·j·k = -i,即-1·j·k = -i,即 j·k = i

同理可推:

i · j = k ,两边左乘 i,推得 -j =  i · k

j · k = i ,两边左乘 j,推得 -k = j · i

k · i = j ,两边左乘 k,推得 -i = k · j

上面的这些推导公式说明什么?暂时不能说明什么,因为还需要“上帝”来指引我们

e^ i·π = -1

没错,就是欧拉恒等式,它代表什么?它所表达的意思就是:如果我们在一个数字上乘以-1,实际上把这个数字在实轴上旋转了180°(想想实轴上的数字1,旋转π后,是不是停留在-1的位置上)那么如果不是旋转180°呢?那也没问题,把公式中的π换成θ,就可以得出数学历史上最著名的欧拉公式。

e^ i·θ = cos(θ) + i sin(θ)

欧拉公式很好的应用于二维平面上的旋转,那自然就会有人想:有没有可能用欧拉公式来表示三维空间的旋转呢?那么就要思考,在三维空间里的虚数是什么样子的?如果能找到一个三维空间的虚数,再应用于欧拉公式上不就可以了?

欸!三维虚数,是不是四元数里的三个虚部?还真没错,三维空间里的虚数 I₃ 如下表示:

 I₃ = a·i + b·j + c·k

三维欧拉公式

e^ i·θ = cos(θ) + sin(θ)·( a·i + b·j + c·k)

i ² = j ² = k ² = i·j·k = -1 

其中三维虚数还是满足 i ² = j ² = k ² = i·j·k = -1 这一组约束,也就是满足i · j = k那一组推导公式。三维虚数可以直接用三维的xyz坐标系去一一对应。那和原来的三维坐标系欧拉角又有什么不一样呢?关键来了:当上述约束的ijk映射三维坐标系的xyz轴,那么整个坐标系就自带旋转的属性了。如何理解这话?因为虚数的乘法对应几何就是旋转!秘密就在于上面(i · j = k)那六个推导公式。如下图所示,沿着 i 逆时针旋转90°就是 -k 了,即  j · i = -k,此时终于搞清楚了上述约束&推导式的伟大之处!

那如果不是90°的旋转呢?套用欧拉公式呗。比如现在要单位矢量 在ij轴所构成的平面上,沿着k轴旋转,如下图所示。那我们就可以利用欧拉公式:j · e^ k·θ

 j · e^ k·θ

= j · (cos(θ) + k · sin(θ))

= cos(θ) · j + sin(θ) · i

我们继续深入,上面的举例还是简单,因为旋转的只是一个单一的单位方向向量,正常情况都是三维表示法,也就是上面的 j 替换成 (i+j+k) 那会怎样呢?

 (i+j+k) · e^ k·θ

=  (i+j+k) · (cos(θ) + k · sin(θ))

= i·cos(θ) + i·k·sin(θ) + j·cos(θ) + j·k·sin(θ) + k·cons(θ) + k·k·sin(θ)

= (cos(θ)+sin(θ))·i + (cos(θ)-sin(θ))·j + cos(θ)·k - sin(θ)

注意运算的结果,出现了一项不带任何维度矢量的实数项,我比较菜,不理解这一项的关键点,但是在那些大数学家看来,这是一个非常危险的项啊!想想在一个三维空间上多出了一项值,它并不在这三维空间上的任意维度上,那它表示什么,第四维?暂时按下不表,接着往下。

===============================片段分割线===============================

三、几何层面的四元数。

经过上一节的概述,我们可以理解到四元数的性质非常有利于表达三维空间的旋转,所以了解四元数的性质要先于了解四元数在旋转中的应用。所以前两节的内容主要是阐述复数与四元数之间的关系,在深入探讨四元数的内核前,我觉得有必要先搞明白以下几个比较抽象的概念。

  • 空间中的子空间:一般而言,空间(维度>2)都存在更低维的子空间,比如二维空间中一维子空间,也就是直线;三维空间中的一维子空间和二维子空间,也就是直线和面。当超过三维的概念我们就很难去想象是什么样子,但四维空间一定会存在三维子空间或二维子空间。我们这里会加一个前缀超(hyper)来形容这些空间,比如高维空间中的平面我们称为超平面。
  • 空间和子空间的映射:我们将二维空间表示为(x,y),当y=0时,其实可以看成是一维的,只不过它表示成(x,0)这种形式。推到四维,(w,x,y,z),当w=0时,(0,x,y,z)就是一个三维子空间,这也是为什么我们可以用单位四元数对三维向量进行操作,其实我们是将三维向量映射到四维的三维子空间(w=0,这种形式也成纯四元数),然后对其进行旋转,最终得到的向量结果依然是这个三维子空间中的,因而可以映射回三维空间。
  • 广义球:这里的球是广义上的。我们在二维平面上,广义球其实指代circle,三维空间上就是我们认知上的球,称为two-sphere,而四维空间中广义球其实是一个超球(hyper-sphere),又称为three-sphere。
  • 约束与特征向量:空间中的一点由x, y, z等参数来表示,一般来说参数的数量与维数相等,二维空间的点用{x, y}参数,四维空间的点用{x, y, z, w}参数。但是对于空间的点加以约束,则该会减少参数的数量,比如三维空间的点在某一单位球面上,原本三个参数{x, y, z}才能表达的点现在只需要两个参数{u, v}就可以表达。如果{u, v}是单位向量,也可以称{u, v}是{x, y, z}的特征向量。

上述概念给了大家一个思路,四元数这样一个东西并不是一蹴而就的,从空间来说,它与我们熟知的低维空间本质上是没有区别的,或者说是有很大共性的。四元数的很多特性都是从低维拓展而来的,更具体的说是从复数这一概念拓展的。

结合第二节内容,现在可以归纳总结出以下四元数的特性:

  1. 单位四元数是四维空间中一个超球上面的点,满足w²+x²+y²+z²=1;而纯四元数是四维空间在w=0时的一个子空间的点,形式为{0, q},特别注意的是纯四元数与四元数是不同的概念。再展开来说:
    1.1:单位四元数(Unit Quaternion)是一个四元数,其模(或称为范数)等于1。四元数通常用于表示三维空间中的旋转角度,它可以避免万向锁问题,并且能提供平滑的插值方法。
    1.2:纯四元数(Pure Quaternion)是四元数的一个子集,它的实部为0,即其一般形式可以表示为 Q = 0 + xi + yj + zk = {0, q},其中 x、y、z 是实数,而 i、j、k 是四元数的虚部单位。纯四元数在几何上可以被视为三维空间中的向量,其中 x、y、z 分别代表向量的三个分量。
  2. 四元数是复数虚部扩展的结果,复数的虚部为1个,而四元数虚部有3个,且两两互相正交,其中实部是cosθ/2,而虚部为一个単位轴乘以sinθ/2。
  3. 四元数自由度并没有四个维度,由于存在w²+x²+y²+z²=1这个约束,它的自由度其实只有3,且每个四元数可以对应一个特征向量,即n。但请记住四元数并不是与特征向量一一对应的,后文会有说。

这里先举个例子,三维的球用代数表示为x²+y²+z²=1,虽然球上面的点是由x,y,z三个参数来确定,但实际上我们只需要两个。假设取x和z表示,其中y可以通过x和z进行求解。那么,我们将y轴信息给隐去,只看投影平面,如下图所示。这张图的意思是,整个球在XOZ平面上投影是一个圆,当球面一点投影在圆上时,y=0;投影的位置位于圆内时,则分别两种情况,y>0处于北半球,y<0处于南半球。所以我们仅通过投影后的圆即可还原出整个球体。

让我们推广到四维,w²+x²+y²+z²=1中取x、y和z来表示超球。如下图所示,四维空间投影到三维超平面(w=0)可能是一个two-sphere。当投影点在整个two-sphere的边缘时,w一定为0,值得一提的是在这个空间内的四元数是一个纯四元数。当投影点落在two-sphere的内部时,也分为两种情况,w>0和w<0。但是我们可以发现这两种情况下对应的特征向量是一样的,所以我们将旋转矩阵向四元数转换时,是有两个对应值的,四元数的范围是2倍覆盖于3D旋转(2:1 mapping)。上面写的相对来说比较隐晦,但我觉得可以对理解四维空间和四元数相当有帮助。本文表述能力有限,如果实在看不懂的,可以翻阅《Visualizing Quaternions》第八章,个人觉得这是书中最为精彩的部分之一。

现在回头看第二节最后例子,我们甚至可以推广到任意三维向量绕任意轴进行旋转的基本通式:

三维任意向量:Q = 0 + xi + yj + zk = {0, q}

旋转轴:P = w + xi + yj + zk = {s, p}
即: {0, q} · e^{s, p}θ

但此时发现,三维虚数版本的欧拉公式适应不了单位四元数的运算,那要如何处理呢?请看下一篇详细探讨四元数的乘法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1694896.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jmeter安装SSH插件

安装SSH插件 下载jar包&#xff1a; ApacheJMeter-ssh-1.2.0.jar jsch-0.1.55.jar jar包放在jmeter安装路径 lib下和lib/ext文件夹下&#xff1a; 重启jmeter即可&#xff1a;

BGP选路实验

BGP 选路实验 一、实验拓扑 二、实验要求及分析 实验要求&#xff1a; 1、使用preva1策略&#xff0c;确保R4通过R2到达192.168.10.0/24 2、使用AS_Path策略&#xff0c;确保R4通过R3到达192.168.11.0/24 3、配置MED策略&#xff0c;确保R4通过R3到达192.168.12.0/24 4、…

软考-必须要背的内容

一、设计模式 1、创建型 抽象工厂&#xff1a;提供一个接口&#xff0c;创建一系列的相关相互依赖的对象&#xff0c;无需指定具体的类&#xff1b; eg&#xff1a;系统软件&#xff0c;支持多种数据库 生成器&#xff1a;将一个复杂类的表示与构造相分离&#xff0c;使得相…

PX4使用yolo仿真环境搭建

文章目录 前言一、修改机架sdf文件二、安装yolo三、运行 前言 ubuntu20.04 PX4 1.13.3 已配置好PX4 ROS gazebo环境 一、修改机架sdf文件 将双目相机加到仿真的iris机架上 修改下图文件 添加如下&#xff1a; <include><uri>model://stereo_camera</uri>…

D - AtCoder Wallpaper(abc)

思路&#xff1a;f(c, d) f(a, b) - f(a, d) - f(c, b) 代码&#xff1a; int f(int x, int y){if(y % 2 0){y y / 2;int ans y * (x / 4) * 8;x % 4;if(x 1){ans y * 3;}else if(x 2){ans y * 6;}else if(x 3){ans y * 7;}return ans;}else{y / 2;int ans y * (x…

从零开始搭建Springboot项目脚手架4:保存操作日志

目的&#xff1a;通过AOP切面&#xff0c;统一记录接口的访问日志 1、加maven依赖 2、 增加日志类RequestLog 3、 配置AOP切面&#xff0c;把请求前的request、返回的response一起记录 package com.template.common.config;import cn.hutool.core.util.ArrayUtil; import cn.hu…

Go语言的内存泄漏如何检测和避免?

文章目录 Go语言内存泄漏的检测与避免一、内存泄漏的检测1. 使用性能分析工具2. 使用内存泄漏检测工具3. 代码审查与测试 二、内存泄漏的避免1. 使用defer关键字2. 使用垃圾回收机制3. 避免循环引用4. 使用缓冲池 Go语言内存泄漏的检测与避免 在Go语言开发中&#xff0c;内存泄…

SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?

尼恩&#xff1a;LLM大模型学习圣经PDF的起源 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;经常性的指导小伙伴们改造简历。 经过尼恩的改造之后&#xff0c;很多小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试机会&#x…

力扣刷题---961. 在长度 2N 的数组中找出重复 N 次的元素【简单】

题目描述&#x1f357; 给你一个整数数组 nums &#xff0c;该数组具有以下属性&#xff1a; nums.length 2 * n. nums 包含 n 1 个 不同的 元素 nums 中恰有一个元素重复 n 次 找出并返回重复了 n 次的那个元素。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3,3] 输…

智能猫眼锁核心解决方案以及芯片简介SSD222

书接上回&#xff0c;前篇文章我们诠释了IP 网络摄像系统的定义以及组成部分的功能&#xff0c;也大概的讲了一下所针对的市场以及举例介绍了一款相关芯片&#xff0c;详情可点击下面卡片浏览高集成IP摄像SOC处理方案简介https://blog.csdn.net/Chipsupply/article/details/139…

XILINX FPGA DDR 学习笔记(一)

DDR 内存的本质是数据的存储器&#xff0c;首先回到数据的存储上&#xff0c;数据在最底层的表现是地址。为了给每个数据进行存放并且在需要的时候读取这个数据&#xff0c;需要对数据在哪这个抽象的概念进行表述&#xff0c;我们科技树发展过程中把数据在哪用地址表示。一个数…

【C++】<知识点> 标准模板库STL(上)

文章目录 一、STL---string类 1. 常用构造函数 2. 常用操作 3. 字符串流处理 二、STL---容器 1. STL及基本概念 2. 顺序容器简介 3. 关联容器简介 4. 容器适配器简介 5. 常用成员函数 三、STL---迭代器 1. 普通迭代器 2. 双向、随机访问迭代器 3. 不同容器的迭代器…

项目思考-编辑器

1、文本生成编辑器 2、图片合成编辑器&#xff08;未完待续&#xff09; 3、文字和图像版本的技术要点&#xff0c;区别&#xff08;未完待续&#xff09; 4、编辑器的人员配置考虑&#xff0c;技术难点分析&#xff08;未完待续&#xff09; 1、文本生成编辑器

AI爆文写作:如何找对标账号的文章?告诉你一个秘密:找低粉爆款的抄!这样风险最小!

一、注册新号来训练推荐爆款的素材 首先第一点:强烈推荐注册一个专用个人微信号,通过阅读,点赞和在看等动作,训练算法为我们推荐爆款素材。 二、为什么要对标低分爆款? 2.1 什么是低粉爆款? 就是粉丝量很少,但却有很高阅读量,甚至10万+阅读的文章。 对标账号的文章…

从零开始学逆向,js逆向启蒙:有道翻译

语言&#xff1a;js、python 工具&#xff1a;pycharm、chrome浏览器F12调试、chatgpt&#xff08;补充js第三方库&#xff0c;转python&#xff09;、node.js(js运行)&#xff08;必须&#xff09; 目标&#xff1a;学习掌握基本js逆向知识。 对象&#xff1a; 有道翻译 &a…

Nginx - 安全基线配置与操作指南

文章目录 概述中间件安全基线配置手册1. 概述1.1 目的1.2 适用范围 2. Nginx基线配置2.1 版本说明2.2 安装目录2.3 用户创建2.4 二进制文件权限2.5 关闭服务器标记2.6 设置 timeout2.7 设置 NGINX 缓冲区2.8 日志配置2.9 日志切割2.10 限制访问 IP2.11 限制仅允许域名访问2.12 …

移动硬盘难题:不显示容量与无法访问的解决策略

在使用移动硬盘的过程中&#xff0c;有时会遇到一些棘手的问题&#xff0c;比如移动硬盘不显示容量且无法访问。这种情况让人十分头疼&#xff0c;因为它不仅影响了数据的正常使用&#xff0c;还可能导致重要数据的丢失。接下来&#xff0c;我们就来详细探讨一下这个问题及其解…

java 子类继承父类

为什么需要继承 我现在要有两个类一个 一个是小学生&#xff0c;一个是大学生 代码 小学生 package b; public class encapsulatio{public String name;public int age;public double score;public void setscore (double score) {this.scorescore;}public void testing() {S…

AI预测福彩3D采取888=3策略+和值012路一缩定乾坤测试5月25日预测第1弹

上一套算法采用了88723的容差策略&#xff0c;关于容差策略相信大家都比较清楚&#xff1a;容差可以最大限度的保证初始大底中包含中奖号码&#xff0c;然后再通过设置一些杀号条件进行缩水。比如&#xff0c;我对我的各种模型算法近30期的预测结果进行了统计&#xff0c;如果采…

行车安全:UWB模块的智能化在车辆安全系统中的作用

随着交通车辆数量的不断增加和道路交通拥堵的加剧&#xff0c;车辆安全问题日益引起人们的关注。在这种背景下&#xff0c;超宽带&#xff08;UWB&#xff09;技术作为一种新兴的定位技术&#xff0c;正逐渐应用于车辆安全系统中&#xff0c;为提高车辆行车安全性提供了新的解决…