四元数(Quaternion)的一些性质

        四元数(Quaternion)是用于三维旋转和定向的四部分组成的超复数,超复数简单理解就是比a+bi这样的复数更复杂的复数,其中a+bi这样的复数我们也可以叫做二元数,表示复平面的一点,对于熟悉欧拉公式的朋友就知道,也可以看成是平面上的旋转。
由于二元数是在二维平面的旋转,于是哈密顿就在想是否可以找到一个表示三维空间旋转的复数呢?于是这个四元数就诞生了。
四元数的表示形式为:a +bi+cj+dk(或者w+xi+yj+zk),其中a、b、c、d是实数,i、j、k是三个虚数单位,满足 i² = j² = k² = ijk =−1,每个四元数都是a和i, j, k的线性组合。
因为四元数非常适合表示三维空间的旋转,跟旋转矩阵相比,四元数是没有奇异点的,也就是说两个不同的旋转是不可能存在同样的四元数,这样就避免了机器人中的“万向节死锁”的问题,万向节死锁的本质就是少了一个自由度,比如两个轴重合了,这样就无论怎么旋转都达不到预期了,而四元数不会出现这样的情况,所以特别好使。

1、概述

我们来看下i、j、k的旋转对应着XYZ的哪根轴旋转。
RPY分别表示翻滚角(Roll)、俯仰角(Pitch)、偏航角(Yaw),这几个很好理解,比如开飞机的时候,战斗机在空中旋转,如果是绕X轴旋转,就叫做翻滚;如果是绕Y轴旋转,比如起飞降落这样的情况就叫做俯仰;偏航角就是绕Z轴旋转,这个很简单,就是左右打方向盘。

i旋转代表Z轴与Y轴相交平面中Z轴正向向Y轴正向的旋转。两条轴就是两条直线,就确定一个面,所以就是Z轴向Y轴旋转,那本质就是绕X轴旋转,对应着Roll翻滚角。
j旋转代表X轴与Z轴相交平面中X轴正向向Z轴正向的旋转,就是绕Y轴旋转,对应着Pitch俯仰角。
k旋转代表Y轴与X轴相交平面中Y轴正向向X轴正向的旋转,就是绕Z轴旋转,对应着Yaw偏航角。
简单来说ijk对应着rpy

2、四元数性质

我们先来熟悉四元数具备哪些性质:

i² = j² = k² = ijk =−1
ij = k
ji = -kjk = i,kj = -i
ki = j,ik = -j

这个很好理解,跟刚学习时的虚数i的计算是一样的,但是请注意,四元数是没有乘法交换律的,所以上面的ij≠ji,这个跟矩阵类似,A*B和B*A是不一样的。
四元数的L2范数:a²+b²+c²+d²,四个平方和的平方根,也就是它的模。

加减乘除
我们来计算两个四元数的加减乘除:

% 定义四元数
x=quaternion(3,1,0,0);
% 3 + 1i + 0j + 0k
y=quaternion(0,5,1,-2);
% 0 + 5i + 1j - 2k% x取模(L2范数)
x.norm() 或者 norm(x)
% 3.1623
% x的共轭四元数
x.conj()
% 3 - 1i + 0j + 0k
y.conj()
% 0 - 5i - 1j + 2k

共轭复数就是实部不变,虚部是相反数。

%加法
x+y
% 3 + 6i + 1j - 2k
%减法
x-y
% 3 - 4i - 1j + 2k%计算x*y
x*y
% -5 + 15i +  5j -  5k
% 乘法不遵循交换律
y*x
% -5 + 15i +  1j -  7k%除法分为左除和右除
%左除
x.\y
% 0.5 + 1.5i + 0.1j - 0.7k
%右除
x./y
% 0.16667 -     0.5i - 0.16667j + 0.16667k

3、四元数构造

我们先来熟悉如何自己来构造四元数:

a=1;b=2;c=3,d=4;
quat = quaternion(a,b,c,d);
% 1 + 2i + 3j + 4k
%虽然这里我是用的是整数,但四元数的类型是double型
classUnderlying(quat)
% 'double'

也可以使用四元数组来构造:

A = [1.1;1.2];
B = [2.1;2.2];
C = [3.1;3.2];
D = [4.1;4.2];
quaternion(A,B,C,D)
%得到2x1的四元数组
1.1 + 2.1i + 3.1j + 4.1k
1.2 + 2.2i + 3.2j + 4.2kA = [1.1,1.3;1.2,1.4];
B = [2.1,2.3; 2.2,2.4];
C = [3.1,3.3; 3.2,3.4];
D = [4.1,4.3; 4.2,4.4];
quatMatrix=quaternion(A,B,C,D)
%得到2x2的四元数矩阵
1.1 + 2.1i + 3.1j + 4.1k     1.3 + 2.3i + 3.3j + 4.3k
1.2 + 2.2i + 3.2j + 4.2k     1.4 + 2.4i + 3.4j + 4.4k
%转成Nx4的系数矩阵
compact(quatMatrix)
1.1000    2.1000    3.1000    4.1000
1.2000    2.2000    3.2000    4.2000
1.3000    2.3000    3.3000    4.3000
1.4000    2.4000    3.4000    4.4000

还可以构造Nx1的随机四元数矩阵

quaternion(randn(5,4))
%结果类似
1.4384 -   0.10224i -  0.030051j -   0.86365k
0.32519 -   0.24145i -   0.16488j +  0.077359k
-0.75493 +   0.31921i +   0.62771j -    1.2141k
1.3703 +   0.31286i +    1.0933j -    1.1135k
-1.7115 -   0.86488i +    1.1093j - 0.0068493k

4、旋转向量与四元数

旋转向量包括旋转角度或者弧度,它们之间的相互转换如下:

% 绕X轴旋转60°
d1 = [60,0,0];
quat = quaternion(d1,'rotvecd')
%0.86603 +    0.5i +      0j +      0k
% 绕Y轴旋转60°
d2 = [0,60,0];
quat = quaternion(d2,'rotvecd')
%0.86603 +      0i +    0.5j +      0k
% 绕Z轴旋转60°
d3 = [0,0,60];
quat = quaternion(d3,'rotvecd')
%0.86603 +      0i +      0j +    0.5k
d4 = [60,60,60];
quat = quaternion(d4,'rotvecd')
%0.61619 + 0.45472i + 0.45472j + 0.45472k

到d4的时候,这个结果是怎么来的,就有了疑问,我们来看下计算过程。
三维旋转向量为:v=[vx,vy,vz],θ=||v||,于是就得到公式如下:
四元数=(cos(θ/2),sin(θ/2)*vx/θ,sin(θ/2)*vy/θ,sin(θ/2)*vz/θ)
还是画一张图来更直观的了解下其推导过程:

从图中我们通过复平面的欧拉公式,可以很容易地将旋转向量转换成为一个四元数,其中角度拆分成一半,这样就算是180度重合,也是没有问题的,可能也有基于这个原因的考虑吧。
示例:

%旋转角度(60°,30°,90°),为便于计算,我们先转换成弧度:
v=[pi/3,pi/6,pi/2];
theta=norm(v); %1.9591
%四元数实部
a=cos(theta/2); %0.5574
%四元数虚部
b=sin(theta/2)*v(1)/theta %0.4438
c=sin(theta/2)*v(2)/theta %0.2219
d=sin(theta/2)*v(3)/theta %0.6657
或者
sin(theta/2)*[v/theta] %0.4438    0.2219    0.6657
所以这个四元数a+bi+cj+dk的结果为:0.5574+0.4438i+0.2219j+0.6657k
%四元数转换成旋转向量
rotvecd(quat)%弧度,rotvecd修改为rotvec即可
rotationVector = [pi/3,pi/6,pi/2];
quat = quaternion(rotationVector,'rotvec')
%0.55738 + 0.44379i + 0.22189j + 0.66568k
rotvec(quat)
%1.0472    0.5236    1.5708

这里相当于也再次验证上面的推导,我们来看下旋转矩阵和欧拉角的转换

5、旋转矩阵与四元数

%旋转矩阵转换成四元数
M = [1 0 0; 0 sqrt(3)/2 0.5; 0 -0.5  sqrt(3)/2];
quat = quaternion(M,'rotmat','frame')
%0.96593 + 0.25882i +       0j +       0k
%quaternion(M,'rotmat','point')
rotmat(quat,'frame')
ans =1.0000         0         00    0.8660    0.50000   -0.5000    0.8660

6、欧拉角与四元数

%欧拉角转换成四元数
E = [pi/2,0,pi/4];
quat = quaternion(E,'euler','ZYX','frame')
%0.65328 +  0.2706i +  0.2706j + 0.65328k
%quaternion(E,'euler','ZYX','point')
%四元数转换成欧拉角
euler(quat,'ZYX','frame')
ans =1.5708         0    0.7854

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

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

相关文章

LeetCode 每日一题 Day 95-101

2917. 找出数组中的 K-or 值 给你一个整数数组 nums 和一个整数 k 。让我们通过扩展标准的按位或来介绍 K-or 操作。在 K-or 操作中,如果在 nums 中,至少存在 k 个元素的第 i 位值为 1 ,那么 K-or 中的第 i 位的值是 1 。 返回 nums 的 K-o…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的田间杂草检测系统(深度学习模型+UI界面+Python代码+训练数据集)

摘要:开发用于田间杂草识别的系统对提高农业运营效率和提升作物产出至关重要。本篇文章详尽阐述了如何应用深度学习技术开发一个用于田间杂草识别的系统,并附上了完备的代码实现。该系统基于先进的YOLOv8算法,并对比了YOLOv7、YOLOv6、YOLOv5…

【c 语言 】位操作符详解

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:C语言 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步&…

20240312-1-Graph(图)

Graph(图) 在面试的过程中,一般不会考到图相关的问题,因为图相关的问题难,而且描述起来很麻烦. 但是也会问道一下常见的问题,比如,最短路径,最小支撑树,拓扑排序都被问到过. 图常用的表示方法有两种: 分别是邻接矩阵和邻接表. 邻接矩阵是不错的一种图存储结构,对于边数相对顶点…

【机器学习300问】33、决策树是如何进行特征选择的?

还记得我在【机器学习300问】的第28问里谈到的,看决策树的定义不就是if-else语句吗怎么被称为机器学习模型?其中最重要的两点就是决策树算法要能够自己回答下面两问题: 该选哪些特征 特征选择该选哪个阈值 阈值确定 今天这篇文章承接上文&…

学习 考证 帆软 FCP-FineBI V6.0 考试经验

学习背景: 自2024年1月起,大部分时间就在家里度过了,想着还是需要充实一下自己,我是一个充满热情的个体。由于之前公司也和帆软结缘,无论是 Fine-Report 和 Fine-BI 都有接触3年之久,但是主要做为管理者并…

第四弹:Flutter图形渲染性能

目标: 1)Flutter图形渲染性能能够媲美原生? 2)Flutter性能优于React Native? 一、Flutter图形渲染原理 1.1 Flutter图形渲染原理 Flutter直接调用Skia 1)Flutter将一帧录制成SkPicture(skp&#xff…

55. 跳跃游戏(力扣LeetCode)

文章目录 55. 跳跃游戏贪心每一次都更新最大的步数 取最大跳跃步数(取最大覆盖范围) 55. 跳跃游戏 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后…

【案例】IPC 中的WinCC RT Advanced PC项目,如何下载及开机自动启动?

导读:TIA WinCC Advanced (高级版)V17项目如何下载到目标计算机(需要运行项目的电脑)? 01WinCC RT Adv项目下载 1、在计算机开始菜单中点击“运行”或通过Win键R调出运行窗口,并输入 CMD 然后回车: 打开 W…

漏洞发现-漏扫项目篇NucleiYakitGobyAfrogXrayAwvs联动中转被动

知识点 1、综合类-Burp&Xray&Awvs&Goby 2、特征类-Afrog&Yakit&Nuclei 3、联动类-主动扫描&被动扫描&中转扫描 章节点: 漏洞发现-Web&框架组件&中间件&APP&小程序&系统 扫描项目-综合漏扫&特征漏扫&被动…

LED基础知识分享(一)

大家好,我是砖一。 今天给大家分享一下,LED的基础知识,有照明行业,或者对LED感兴趣的朋友,可以学习一下,希望对你有用~ 一,什么是LED (Light Emitting Diode)? 1,LED是一种发出某…

使用Flask快速搭建轻量级Web应用【第127篇—Flask】

使用Flask快速搭建轻量级Web应用 在Web开发领域,选择适合项目需求的框架至关重要。Flask,一个轻量级的Python Web框架,以其简洁、灵活和易扩展的特性而备受开发者青睐。本文将介绍如何使用Flask迅速搭建一个轻量级的Web应用,并通过…

【测试开发学习历程】Linux用户管理+文件权限管理

目录 一、用户管理 (一)用户和用户组的基本概念 1.概念 2.设置原因 3.用户与用户组的关系 4.用户类型 (二)用户的创建、修改属性和删除用户 1.用户信息文件 2.创建用户 3.修改用户密码 4.修改用户信息 5.用户查询 6.…

Hive面经

hive原理 Hive 内部表和外部表的区别Hive 有索引吗运维如何对 Hive 进行调度ORC、Parquet 等列式存储的优点数据建模用的哪些模型?1. 星型模型2. 雪花模型3. 星座模型 为什么要对数据仓库分层?使用过 Hive 解析 JSON 串吗sort by 和 order by 的区别数据…

Windows®、Linux® 和 UNIX® 系统都适用的远程桌面工具 OpenText ETX

Windows、Linux 和 UNIX 系统都适用的远程桌面工具 OpenText ETX 为 Windows、Linux 和 UNIX 实施精益、经济高效的虚拟化;提供完整的远程 Windows 可用性;以类似本地的性能远程工作;安全地保护系统和知识产权(IP)&am…

PFMEA的输入输出和特殊特性

DFMEA輸入:技术条件、市场需求 DFMEA輸出:产品特殊特性、试验、样件CPPFMEA輸入:过往经验、流程图、DPMEA PFMEA輸出:CP、过程特殊特性、SIP、SOP1. PFMEA的输入包括:()过程流程图、DFMEA 、图样…

ElasticSearch 底层读写原理

ElasticSearch 底层读写原理 ​ 写请求是写入 primary shard,然后同步给所有的 replica shard;读请求可以从 primary shard 或 replica shard 读取,采用的是随机轮询算法。 1、ES写入数据的过程 1.选择任意一个DataNode发送请求&#xff0c…

Linux-gdb调试

文章目录 前言查看(显示)源代码 list/l运行程序run/r打断点b查看断点删除断点打开/关闭断点逐过程 逐语句查看变量常显示continuefinishuntil修改指定变量退出gdb 前言 GDB,即GNU调试器(GNU Debugger),是G…

云仓酒庄最新动态:渠道商小沙龙活动持续开展 业务持续稳健发展

原标题:2024年云仓酒庄小沙龙活动持续开展 业务持续稳健发展 在风起云涌的酒类市场中,云仓酒庄以其独特的经营模式和优质的服务,赢得了广大消费者的青睐。而在这背后,云仓酒庄各地小沙龙活动的频繁开展,无疑为其业务的…

命名空间多线程计时(C++基础)

命名空间 不要在头文件内使用using namespace,一定要确保实在一个足够小的作用域下使用,在哪个范围内,比如函数、if语句等,但一定不要在头文件中使用!!! 上述示例中,会调用orange中…