四元数学习总结(1)

导语:相比矩阵,用四元数处理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.mzph.cn/pingmian/15197.shtml

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

相关文章

SQLiteOpenHelper数据库帮助器

SQLiteOpenHelper数据库帮助器是Android提供的数据库辅助工具。 1、继承SQLiteOpenHelper类&#xff0c;需要重写onCreate和onUpgrade两个方法 案例&#xff1a;实现增删改查 package com.example.databases_text;import android.app.PictureInPictureParams; import androi…

FPGA 纯逻辑arinc818 ip core

1、 符合FC-FS、FC-AV、FC-ADVB协议规范&#xff1b; 2、符合ARINC818协议规范&#xff1b; 3、支持光纤通信Class1、Class3服务&#xff1b; 5、可动态配置光纤端口速率&#xff0c;支持1.0625Gbps、2.125Gbps、3.1875Gbps、4.25Gbps可配置&#xff1b; 6、DDR控制接口简洁…

企业级架构及本体论最新进展

本文主要探讨了企业级架构和本体论的新兴趋势&#xff0c;特别是DoDAF、IDEAS、UAF和NAF的发展历程、理论基础、模型构建以及与ArchiMate和语义网技术的关联。原文: The emerging landscape of Enterprise Architecture and Ontology 导言 动机和采用的方法 关注我的人都知道我…

如何修复 System has not been booted with systemd 报错信息?

如何修复 System has not been booted with systemd 报错信息&#xff1f; 一、问题描述&#xff1a; 我们在学习 linux 系统时&#xff0c;使用 systemd 命令&#xff08;比如 sudo systemctl status ssh&#xff09;&#xff0c;可能会遇到一个报错信息&#xff1a; System…

【图论】最短路(一)

发现之前做的题很乱&#xff0c;用小笔记把看过的博客和题目分类记录一下&#xff0c; 代码参考了很多佬&#xff0c;是标注出来的链接&#xff0c;若不同意我就删掉&#xff08;鞠躬&#xff09; 找了几张好点的&#xff0c;图来源图中的id和acwing 1.dijkstra 依次找到距…

KubeKey 安装 K8s

官网教程 在 Linux 上以 All-in-One 模式安装 KubeSphere 步骤 1&#xff1a;准备 Linux 机器 若要以 All-in-One 模式进行安装&#xff0c;您仅需参考以下对机器硬件和操作系统的要求准备一台主机。 硬件推荐配置 操作系统最低配置Ubuntu 16.04, 18.04, 20.04, 22.042 核 …

windows服务器安装TortoiseSVN教程

TortoiseSVN也称小乌龟~ 下载链接&#xff1a; https://www.liqucn.com/rj/91608.shtml 下载完成后&#xff0c;先安装TortoiseSVN&#xff0c;安装完成后&#xff0c;根据需要安装中文包 安装比较简单直接下一步即可&#xff0c;注意安装路径根据需要调整到非c盘。 安装中…

超详细的前后端实战项目(Spring系列加上vue3)前端篇+后端篇(三)(一步步实现+源码)

好了&#xff0c;兄弟们&#xff0c;继昨天的项目之后&#xff0c;开始继续敲前端代码&#xff0c;完成前端部分&#xff08;今天应该能把前端大概完成开启后端部分了&#xff09; 昨天补充了一下登录界面加上了文章管理界面和用户个人中心界面 完善用户个人中心界面 修改一…

新手做抖音小店应该注意哪些问题?怎么正确的做抖音小店?

大家好&#xff0c;我是电商花花。 我们想做好一家抖音小店&#xff0c;想长期持久的做好一家抖店&#xff0c;一定要注意下面这些问题&#xff0c;只有避开这些做店的坑&#xff0c;我们才能稳稳的出单&#xff0c;稳稳的赚钱。 做抖音小店不能无脑铺货&#xff0c;要做精细…

【正点原子Linux连载】 第四十七章 音频驱动实验摘自【正点原子】ATK-DLRK3568嵌入式Linux驱动开发指南

1&#xff09;实验平台&#xff1a;正点原子ATK-DLRK3568开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id731866264428 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/docs/boards/xiaoxitongban 第四十…

qt5core.dll怎么下载,qt5core.dll下载安装详细教程

不知道大家有没有遇到过qt5core.dll丢失这个问题&#xff1f;目前这个问题还是比较常见的&#xff0c;一般使用电脑比较多的的人&#xff0c;有很大几率遇到这种qt5core.dll丢失的问题。今天主要针对这个问题&#xff0c;来给大家讲解一下一键修复qt5core.dll的方法。 Qt5Core.…

清理安卓手机广告

保存脚本另存为 Fuck_AD.sh&#xff0c;在手机执行后体验效果。 echo ""echo " " echo " - 开始执行清理广告库文件" sleep 3files(/data/app/*/*/lib/arm64/libpangleflipped.so/data/app/*/*/lib/arm64/libzeus_direct_dex.so/data/app/*/*/l…

Django 安装步骤

步骤如下 打开cmd输入命令行 pip install django上图代表已经安装好了。但是里面的warning必须得将路径弄好&#xff0c;不然是运行不了 创建django项目 去到VS Code里&#xff0c;进入Terminal 页面&#xff0c;运行下面的命令 django-admin startproject [自己项目名称]就…

Python 小游戏——贪吃蛇

Python 小游戏——贪吃蛇 文章目录 Python 小游戏——贪吃蛇项目介绍环境配置代码设计思路1. 初始化和变量定义2. 创建游戏窗口和FPS控制器3. 初始化贪吃蛇和食物的位置4. 控制贪吃蛇的方向和分数5. 主游戏循环 难点分析源代码呈现代码结果 项目介绍 贪吃蛇游戏是一款通过上下…

智研未来,直击 AI DevOps,阿里云用户交流日杭州站来啦!

在这个技术日新月异的时代&#xff0c;云上智能化 DevOps 正以前所未有的速度推动企业创新边界&#xff0c;重塑软件开发的效率与品质。 为深入探索这一变革之路&#xff0c;诚邀您参与我们的专属闭门技术沙龙&#xff0c;携手开启一场关于云上智能化 DevOps 的挑战、实践与未…

深度学习设计模式之桥接模式

文章目录 前言一、介绍二、详细分析1.核心组成2.实现步骤3.代码示例4.优缺点优点缺点 5.使用场景 总结 前言 桥接模式是将抽象部分与实现部分分离&#xff0c;使它们都可以独立的变化。 一、介绍 桥接模式是结构型设计模式&#xff0c;主要是将抽象部分与实现部分分离&#x…

PostgreSQL基础(二):PostgreSQL的安装与配置

文章目录 PostgreSQL的安装与配置 一、PostgreSQL的安装 二、PostgreSQL的配置 1、远程连接配置

【老王最佳实践-6】Spring 如何给静态变量注入值

有些时候&#xff0c;我们可能需要给静态变量注入 spring bean&#xff0c;尝试过使用 Autowired 给静态变量做注入的同学应该都能发现注入是失败的。 Autowired 给静态变量注入bean 失败的原因 spring 底层已经限制了&#xff0c;不能给静态属性注入值&#xff1a; 如果我…

pr视频旋转90°

1.找到视频特效“运动” 2.旋转270 3.找到“序列”---“序列设置”&#xff0c;更改画面大小 成品展示&#xff1a;