四元数快速入门【Quaternion】

news2024/11/21 0:39:29

四元数(Quaternion)是用于旋转和拉伸向量的数学运算符。 本文提供了一个概述,以帮助理解在空间导航等应用程序中对四元数的需求。

在这里插入图片描述

推荐:用 NSDT场景设计器 快速搭建3D场景。

可以通过多种方式在空间中准确定位、移动和旋转物体。 更熟悉和更容易可视化的滚动(Roll)、俯仰(Pitch)和偏航(Yaw)表示是有局限性的,在某些情况下应该用更强大的四元数代替。 随着对象的位置和方向发生变化,称为四元数的数学工具可用于旋转和缩放原始矢量。

三维空间中的物体可以定位在一个坐标系中,三个数从坐标系的原点延伸到空间中的一点,创建一个位置 r=(x,y,z) 向量。 如果对象的位置发生变化,向量将位于新的位置并且可能具有新的长度。 我们需要一种方法来测量或计算两个向量之间的变化。

1、Roll/Pitch/Yaw表示法的问题

大多数读者可能都知道,在空间中旋转的物体可以用它们沿三个轴的旋转角度来描述。 空间中的任何旋转都可以用这些旋转的组合来描述。
在这里插入图片描述

万向节提供偏航、滚动和俯仰运动。

旋转轴并不总是独立的,解也不总是唯一的。 两个万向节的平面可能会对齐,并且会发生称为万向节锁定(gimbal lock)的情况。 在万向节锁定中,三个万向节中的两个是平行或非常接近平行的,最初的三个自由度(偏航、俯仰和滚动)减少到两个自由度——两个旋转轴可以描述相同的旋转运动。 同时,失去了一个自由度,信息也消失了。 一旦发生万向节锁定,就不可能在没有外部参考的情况下重新定向轴。

在这里插入图片描述

当绿色圆圈与红色圆圈对齐或接近对齐时发生万向节锁定

你可能还记得在有关阿波罗 13 号任务的电影中听到过万向节锁定这个词。 如果万向节锁定发生在爆炸之后,宇航员的惯性测量装置将无法追踪他们在天球中的位置,从而对他们本已绝望的处境产生负面影响。

现在来看看万向节锁背后的数学原理。

读者须知:为了保持在小型设备上的可读性,cos(x) 的所有实例都已替换为 Cx,sin(x) 的所有实例均已替换为 Sx。

围绕单个轴旋转一个矢量 r=(x,y,z) 需要一个旋转矩阵。 上图的三轴云台有三个轴对应三个旋转矩阵。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

上面的三个矩阵分别表示:绕x 轴 旋转角度 γ,绕y 轴 旋转角度 β,绕z 轴旋转角度 α 。

在这里插入图片描述

上面显示的是三个独立的 3×3 变换矩阵。 (围绕 z-y-z 旋转 α、β、γ 角度的变换)

从数学上讲,3×3 旋转矩阵是三个连续旋转的乘积。
在这里插入图片描述

3×3 矩阵连续相乘时会产生一个 3×3 矩阵。 上面显示的是围绕 z-y-z 旋转角度 α、β、γ 。

存在多个转换矩阵,它们可以以各种顺序应用。 十二个旋转序列可以分为两类:

  • 欧拉角:其中一个旋转轴重复(x-z-x,x-y-x,y-x-y,y-z-y,z-y-z,z-x-z)
  • 泰特-布赖恩角,围绕所有轴(x-z-y, x-y-z、y-x-z、y-z-x、z-y-x、z-x-y)旋转

我任意选择了 z-y-x 变换矩阵来处理下面的示例。

在这里插入图片描述

上图是围绕α、β、γ旋转z-y-x的变换矩阵。

当使用 β =π/2 代入 z-y-x 变换矩阵时,万向节锁在我们的示例矩阵中在数学上变得明显(其他变换矩阵在不同条件下失败)。随着角度 β →π /2 以及 sin(β)→0 ,您可以在下面看到对矩阵的简化效果。
在这里插入图片描述

上面的矩阵中将π /2 带入β ,得到
在这里插入图片描述

可以看到,当 β 接近 π/2 时, cos(π/2) 导致矩阵中的几项变为零。

另一种看待问题的方法是采用原始变换矩阵(我再次选择 z-y-x)并使用三角恒等式将三角函数内的变量聚集在一起。 注意角度的初始相互依赖性。
在这里插入图片描述

替换后,角度之间唯一存在的关系是 α + γ 。
在这里插入图片描述

通过固定 β = π/2 ,我们已经消除了 α−γ 的所有情况,牺牲一定程度的自由度。

虽然很容易想象滚动、俯仰和偏航,但如果你正在设计一个能够自由指向空间中任何方向的系统,最终会遇到万向节锁定。

2、四元数

威廉·汉密尔顿于 1843 年发明了四元数,作为一种允许他对向量进行乘法和除法、旋转和拉伸的方法。

我在下面提出的内容旨在说明,但绝不是数学上严格的。 它应该足以让你在计算机科学和工程环境的入门级理解四元数。 对于数学课来说,这并不意味着就足够了。 如果你需要更深入的信息,加利福尼亚州立大学富勒顿分校物理学和数学教授 Alfonso Agnew 博士推荐了以下有关该主题的书籍:

  • 四元数和旋转序列:在轨道、航空航天和虚拟现实中的应用入门 (Kupiers)
  • Clifford 代数和旋量 (Lounesto)
  • 可视化四元数 (Hanson)

汉密尔顿的发现是,虽然没有明显的方法可以将两组三个数字相乘并除以得到三个数字(可能代表坐标的向量),但可以将两组四个数字相乘并相除并得到四个 数字。 四元数是两组四个数的商,由一个标量和一个向量组成。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

其中,
在这里插入图片描述

为实数,且
在这里插入图片描述

为四元数单位。

任意两点之间的方向可以用三个数表示,这三个数分别位于 (-1,1) 范围内,其总大小为 (-1 ≤ x ≤1, -1 ≤ y ≤ 1, -1 ≤ z ≤ 1)并且 √x2+y2+z^2 = 1 。这四个数字一起创建了一个描述旋转和距离的四元数。
在这里插入图片描述

四元数提供旋转向量所需的信息,只需四个数字而不是旋转矩阵所需的九个数字。

如果你熟悉数学和矩阵符号,请跳至下面的四元数数学,并跳过接下来两节中复数和矩阵数学的复习。

3、复数

参见 AAC 教科书第 2 卷 — 第 2 章。

发明复数是为了解决没有实数解的问题。 在发明 √-1 之前 , x^2 = -1这类问题始终无解。 复数可以想象成位于一个平面上,数的实部沿水平轴表示,数的虚部沿垂直轴表示。 在笛卡尔坐标中,它们通常以类似于 x+yi 或 (x,y) 的形式表示。 两个复数可以相加、相减、相乘和相除。

相加:
在这里插入图片描述

相减:

在这里插入图片描述

相乘:
在这里插入图片描述

相除:
在这里插入图片描述

无缩放旋转:

在这里插入图片描述

一个例子是 2+3i 逆时针旋转π/2 可以通过与 0+i 相乘得到:
在这里插入图片描述
在这里插入图片描述

欧拉开发了一种在复数极平面中旋转复数的方法,汉密尔顿以此为基础建立了他的想法。
在这里插入图片描述

虽然这远非对复数主题的完整处理,但它通过以下方式为四元数提供了一个垫脚石:

  • 复数可以很容易地进行加、减、乘和除,而无需使用三角函数(尽管复数可以用极坐标形式表示或从极坐标形式分别用 cos 和 sin 分解为实部和虚部)。
  • 将复数乘以虚数单位“i”产生四分之一圈。 与四元数类似,将任意两个四元数单位相乘将导致围绕垂直于两个初始轴的轴旋转。

4、矩阵数学

  • 标量

标量是表示沿公共比例尺或轴的位置的数字。 标量变量没有应用于它们的特殊格式。

  • 向量

向量是一个有序数字的列表,描述了在特定方向上沿尺度的位置。 它被可视化为具有长度和方向的直线。 本文中矢量变量以粗体 r 显示,偶尔会使用上标箭头。 向量可以有两个或更多元素。
在这里插入图片描述
在这里插入图片描述

多个向量通过不同的变量名或下标来区分。

在这里插入图片描述

或者

在这里插入图片描述

  • 叉积

在这里插入图片描述

  • 点积

在这里插入图片描述

  • 长度

矢量的长度是从起点到终点的直线距离。 在数学上,它是单个元素平方和的平方根。

在这里插入图片描述

  • 矩阵

矩阵是单个元素的数组,可以乘以向量以对其进行转换。 矩阵可以平移、旋转和缩放向量。 下面显示的是一个通用的 3×3 矩阵

在这里插入图片描述

  • 矩阵应用于向量

在这里插入图片描述

  • 旋转矩阵

旋转矩阵可以改变向量指向的方向,在空间中重新定向它们。 以下矩阵围绕笛卡尔轴旋转向量而不缩放它们。

在这里插入图片描述在这里插入图片描述

在这里插入图片描述

  • 矩阵A与B相乘

在这里插入图片描述

本节简要回顾向量和矩阵数学,并与下面的四元数规则进行对比。

5、四元数

如前所述,四元数由一个标量和一个向量组成。

在这里插入图片描述

由于标量和向量都存在于四元数中,因此用于处理它们的数学规则是标量和向量数学的组合。
在这里插入图片描述

  • (非交换)四元数乘法

两个四元数相乘的结果是一个新的四元数。

在这里插入图片描述

  • 四元数内积

四元数内积是两个四元数对应的实系数相乘得到的标量。
在这里插入图片描述

  • 四元数共轭(Conjugate)

每个四元数都有一个相反数,可以通过仅对四元数的向量部分的系数求反来找到。
在这里插入图片描述

  • 四元数范数(Norm)

四元数通常应始终位于单位球面上。 范数应等于 1。如果你的四元数偏离单位球体,可以将四元数的每个元素除以范数以返回单位球体。

在这里插入图片描述

  • 四元数转旋转矩阵

在这里插入图片描述

6、结束语

四元数是使用一组有序的四个数字来描述 3D 空间中的方向或旋转的另一种方法。 它们能够唯一地描述围绕任意轴的任何三维旋转,并且不会受到万向节锁定的影响。 如果你的应用程序中的传感器或物体能够在 3D 空间中的任何位置移动,那么它们在跟踪物体方面优于欧拉角。


原文链接:四元数快速指南 - BimAnt

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

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

相关文章

U盘在电脑上读不出来怎么办?详细解决方法在这!

案例:u盘在电脑上读不出来 【不知道为什么,我把u盘插入电脑后电脑完全读不出。我也不知道到底哪里出现了问题,有人可以帮我解答一下吗?】 U盘作为我们生活中经常使用的存储工具,其能帮我们存储大量的文件&#xff0c…

BM54-三数之和

题目 给出一个有n个元素的数组S,S中是否有元素a,b,c满足abc0?找出数组S中所有满足条件的三元组。 数据范围:0≤n≤1000,数组中各个元素值满足 ∣val∣≤100。 空间复杂度:O(n^2),时间复杂度 O(n^2)。 注…

React 第三方插件 —— Cron 表达式生成器(qnn-react-cron)

qnn-react-cron 可以看做 react-cron-antd 的升级版(具体“渊源”可见文档),现有功能如下: 🎉 全面支持 cron:秒、分、时、日、月、周、年 🎉 日及周条件互斥,自动改变响应值 &…

8年测试开发,写给1-3年功能测试的几点建议,满满硬货指导

从15年毕业到现在也从业八年了,普通本科毕业,现在一家互联网公司担任测试部门总监,摸爬打滚,坑坑洼洼也经历了不少。思绪很久决定还是写下这篇,希望对后进的小伙子少走一点弯路。 很多人把职场想得太美好,其…

学node写接口!!!

fs 可以读取文档 fs.readFild() 用于读取文件 第一个参数 路径 第二个参数 "utf8"(默认值) 第三个参数 函数 function(err , dataStr ){ 第一个参数是错误, 第二个参数是正确的可以拿到读取文件里面的值 } fs.writeFile() 用于创建文件添加内容 …

【LeetCode中等】1419.数青蛙

给你一个字符串 croakOfFrogs,它表示不同青蛙发出的蛙鸣声(字符串 “croak” )的组合。由于同一时间可以有多只青蛙呱呱作响,所以 croakOfFrogs 中会混合多个 “croak” 。 请你返回模拟字符串中所有蛙鸣所需不同青蛙的最少数目。…

如何根据参考文献查找原文及详细的文献信息

当我们已知参考文献想要查看下载原文以及相关信息时可以用下面的方法: 例如这篇参考文献:Alsamhi S H, Almalki F, Ma O, et al. Predictive estimation of optimal signal strength from drones over IoT frameworks in smart cities[J]. IEEE Transac…

FPGA实现SDI视频解码PCIE传输 提供工程源码和QT上位机源码加技术支持

目录 1、前言2、我已有的SDI编解码方案3、我已有的PCIE方案4、总体设计思路和方案SDI摄像头Gv8601a单端转差GTX解串SDI解码VGA时序恢复YUV转RGB图像缓存PCIE发送通路SDI同步输出通路 5、vivado工程详解6、驱动安装7、QT上位机软件8、上板调试验证SDI同步HDMI输出验证PCIE输出验…

neo4j结合gds实现最短路径算法

背景:Neo4j自带的cypher语句中的 shortestpath allShortestPaths 返回值内容非常有限,不易处理, 在实际生产环境中可用性极低, 且若带where条件查询时,查询效率极低 因此,使用Neo4j自带的插件如apoc来进行最短路径查询…

使用@Autowired、@Qualifier、@Primary注解自动装配组件

1.Autowired、Qualifier、Primary注解 1.1.Autowired注解 Autowired注解可以对类成员变量、方法和构造函数进行标注,完成自动装配的工作。 package org.springframework.beans.factory.annotation;import java.lang.annotation.Documented; import java.lang.ann…

hexo stellar主题添加运行时间-利用不蒜子

在网站的页脚想添加博客运行的时间以及,查了一下资料,根据下面的这个博主的代码进行了修改。 打造一个舒服的写作环境(Hexo) 下面我们开始修改: stellar/layout/_partial/main/footer.ejs 找到//footer的 这一段 // …

基于logback 实现springboot的日志配置

目录 一、前言 二、使用详解 2.1、打印到文件中 2.2、打印级别控制 2.3、logback 详细配置 2.4、logback 配置文件的组成 2.4.1、<root>标签 2.4.2、<contextName>标签 2.4.3、<property>标签 2.4.4、<appender>标签 2.4.5、<logger&g…

Mysql索引(2):索引结构

1 概述 MySQL的索引是在存储引擎层实现的&#xff0c;不同的存储引擎有不同的索引结构&#xff0c;主要包含以下几种&#xff1a; 索引结构描述BTree索最常见的索引类型&#xff0c;大部分引擎都支持 B 树索引 Hash索引 底层数据结构是用哈希表实现的, 只有精确匹配索引列的…

ShardingProxy分库分表实战

目录 ShardingProxy简述 快速使用 ShardingProxy部署 ShardingProxy使用 ShardingProxy的服务治理 Shardingproxy的其他功能 ShardingProxy的SPI扩展 ShardingSphere总结 ShardingProxy简述 ShardingProxy的功能同样是分库分表&#xff0c;但是他是一个独立部署的服务…

林曦讲座 | 关于“无用之美”的11个闪光

林曦老师的新书《无用之美》即将和大家见面啦~    究竟什么是“无用之美”呢&#xff1f;早在2013年&#xff0c;林曦老师就曾在“一席”做过一场关于“无用之美”的分享。2019年又在微软做过一次《中国人的闲情逸致——无用之美》的演讲。这次将两次演讲的内容精华整理出来…

【LeetCode】14. 最长公共前缀

1. 问题 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 “”。 示例 1 输入&#xff1a;strs [“flower”,“flow”,“flight”] 输出&#xff1a;“fl” 示例 2 输入&#xff1a;strs [“dog”,“racecar”,“car”] 输出…

虹科动态 | 2023成都国际工业博览会精彩瞬间回顾

2023成都国际工业博览会&#xff08;CDIIF&#xff09;于中国国际西部博览城圆满落下帷幕。本届成都工博会紧紧围绕“工业引领&#xff0c;赋能产业新发展”主题&#xff0c;聚焦工业自动化、数控机床与金属加工、机器人、新一代信息技术与应用、工业互联网、新材料、节能与工业…

在VMware上对于CentOS虚拟机的克隆

一. 执行克隆操作 对已有的虚拟机右键&#xff0c;找到克隆操作&#xff0c;选择完整克隆&#xff0c;之后修改一下虚拟机名称和位置&#xff0c;点击完成即可。 克隆之后还需要修改一些东西&#xff0c;以防止运行期间的 ip 浮动之类的问题。 二. 修改配置 先关闭原来的虚拟…

三菱GOT2000人机界面设置用户报警和系统报警弹出报警显示的具体方法

三菱GOT2000人机界面设置用户报警和系统报警弹出报警显示的具体方法 弹出报警显示功能可以将用户报警、系统报警直接显示再各窗口上起到提示作用,在不切换窗口的情况下直观的提示客户当前设备报警信息。 该功能可以实现将当前发生的用户和系统报警,显示在各个窗口的指定位置(…

Springboot整合Jasypt实战

Springboot整合Jasypt实战 引入依赖 <dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.5</version> </dependency>配置jasypt # 配置jasypt相关信息…