欧拉角、轴角与四元数

2023-05-16

1、欧拉角

欧拉角使用最简单的x,y,z值来分别表示在x,y,z轴上的旋转角度,其取值为0-360(或者0-2pi),一般使用roll,pitch,yaw来表示这些分量的旋转值。需要注意的是,这里的旋转是针对世界坐标系说的,这意味着第一次的旋转不会影响第二、三次的转轴。

欧拉旋转
欧拉旋转的数学实现就是使用矩阵。而最常见的表示方法就是3*3的矩阵。在Wiki里我们可以找到这种矩阵的表示形式,以下以按XYZ的旋转顺序为例,三个矩阵分别表示了:
在这里插入图片描述
万向节锁
虽然欧拉旋转非常容易理解,但它会造成臭名昭著的万向节锁问题。从最简单的矩阵来理解。还是使用XYZ的旋转顺序。当Y轴的旋转角度为90°时,我们会得到下面的旋转矩阵:
在这里插入图片描述
我们对上述矩阵进行左乘可以得到下面的结果:
在这里插入图片描述
可以发现,此时当我们改变第一次和第三次的旋转角度时,是同样的效果,而不会改变第一行和第三列的任何数值,从而缺失了一个维度。
Wiki上写,万向节锁出现的本质原因,是因为从欧拉角到旋转的映射并不是一个覆盖映射,即它并不是在每个点处都是局部同胚的。通俗一下解释,这意味着,从欧拉角到旋转是一个多对一的映射(即不同的欧拉角可以表示同一个旋转方向),而且并不是每一个旋转变化都可以用欧拉角来表示。其他更多的大家去参考wiki吧。

所以欧拉角容易出现的问题是 :
1)不易在任意方向的旋转轴插值;
2)万向节死锁;
3)旋转的次序无法确定。

2、轴角

轴角用一个以单位矢量定义的旋转角,再加上一个标量定义的旋转角来表示旋转。通常的表示[x,y,z,theta],前面三个表示轴,最后一个表示角度。表示非常直观,也很紧凑。

轴角最大的一个局限就是不能进行简单的插值,此外,轴角形式的旋转不能直接施于点或矢量,必转换为矩阵或者四元数。

3、四元数

四元数(Quaternions)是由爱尔兰数学家哈密顿(William Rowan Hamilton,1805-1865)在1843年发明的数学概念。四元数的乘法不符合交换律(commutative law)。

明确地说,四元数是复数的不可交换延伸。如把四元数的集合考虑成多维实数空间的话,四元数就代表着一个四维空间,相对于复数为二维空间。

四元数的基本性质:
四元数就是形如 ai+bj+ck+d 的数,a、b、c、d是实数。
i2=j2=k^2=-1
ij=k、ji=-k、jk=i、kj=-i、ki=j、ik=-j

四元数的乘法定义如下,利用简单的分配律就是了:
q1 * q2 =
(w1w2 - x1x2 - y1y2 - z1z2) +
(w1x2 + x1w2 + y1z2 - z1y2) i +
(w1y2 - x1z2 + y1w2 + z1x2) j +
(w1z2 + x1y2 - y1x2 + z1w2) k

由于q = w + x i + y j + z k中可以分为纯量w与向量x i + y j + z k,所以为了方便表示,将q表示为(S, V),其中S表示纯量w,V表示向量x i + y j + z k,所以四元数乘法又可以表示为:
q1 * q2 = (S1 + V1)(S2 + V2) = S1S2 - V1.V2 + V1XV2 + S1V2 + S2V1

求模:
N(q) = √(x^2 + y^2 + z^2 +w^2)

求共轭:
q*=(w,-x, -y, -z)

求逆:
对于向量逆的定义, q-1 =q*/|q|2
对于单位四元素,分母为1,q-1 =q*=(w,-x, -y, -z)

4、四元数与空间旋转

四元素与轴角的表示很接近,也是使用一个3维向量表示转轴和一个角度分量表示绕此转轴的旋转角度,即(w,x,y,z), 其中:

w = cos(theta/2)
x = ax * sin(theta/2)
y = ay * sin(theta/2)
z = az * sin(theta/2)
四元数对于空间旋转的计算通过一个向量左乘四元数再右乘该四元数的逆得到:
v‘ = qvq-1
例如我有一个向量v(1,0,1),旋转轴p为(0,1,0),我希望v绕着p顺时针旋转180°(注意:在四元数空间中使用右手定则表示旋转方向,也就是逆时针)。
根据上面的式子我们可以得到:

q=(0,0,1,0);
q’=(0,0,-1,0);
将向量改写成四元数的形式:
v=(0,1,0,1)
注:这里令向量的“w”为“0”。
通过四元数的表示方法:

q=j;
q’=-j;
v=i+k;
则v’=qvq’=j(i+k)(-j)
=(ji+jk)(-j)
=(-k+i)(-j)
=kj-ij
=-i-k
写成向量的形式:
v’=(-1,0,-1)
与我们直观上的理解是一样的,只是它通过一个简单的运算能够更快速的算出这个结果。虽然这里举的例子很简单,但是对于更一般的情况下计算方式也是一样的,只是在思维上没有这么直观。

总结一下:感觉四元数与轴角其实很相似,但是表达的方式不一样,轴角无法进行插值运算,但是四元数可以。嗯。。。不是很能理解。另外计算上面似乎四元数也更简单一点。
学习的时候找到了几篇还不错的文章,如果有想深入理解的可以参考一下,非常详细:

5、四元数(Quaternion)与旋转矩阵

5.1 四元数到旋转矩阵

欧拉旋转是有万向节死锁(Gimbal Lock)的问题的。幸好我们有四元数(Quaternion)这种数学工具可以避免这个情况。一般来说,我们都会用单位四元数 来表示旋转,那么给定一个单位四元数,可以构造旋转矩阵(column major):
这里的过程参考于:

1、Henderson, D.M… Euler angles, quaternions, and transformation matrices for space shuttle analysis[C]//NASA, Jun 09, 1977.
2、https://en.wikipedia.org/wiki/Rotation_matrix
3、Tomas K.M. , Eric H., Naty H… Real Time Rendering 3rd Edition , p76-p77, 2008.
4、http://run.usc.edu/cs520-s12/quaternions/quaternions-cs520.pdf

在这里插入图片描述
这个四元数构造的大概思路就是把四元数的旋转操作写成矩阵形式。

5.2 旋转矩阵到四元数

要从旋转矩阵里提取四元数,也是可以像提取欧拉角那样,用参数化过的矩阵的表达式凑出来。参考《Real Time Rendering 3rd edition》Chapter4的思路,我们观察一下用四元数分量进行参数化的矩阵 ,然后经过一顿操作,我们发现:
在这里插入图片描述
于是我们再凑出个实分量w ,就可以把四元数四个分量都用矩阵元素表示出来了。于是我们又机智地发现了一个等式:
在这里插入图片描述
其中tr®是矩阵 R 的迹(trace),也就是矩阵对角元素的和。因为这里用的是3x3矩阵,跟其他资料里面的表示有一点不同。所以我们可以把四元数的四个分量都用矩阵元素凑出来了:
在这里插入图片描述

https://krasjet.github.io/quaternion/quaternion.pdf
https://blog.csdn.net/weixin_38294178/article/details/87872893?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.nonecase
https://blog.csdn.net/weixin_34367257/article/details/93387530?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
https://www.qiujiawei.com/understanding-quaternions/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

欧拉角、轴角与四元数 的相关文章

  • luffy-16/订单表设计,立即付款接口/前端,支付成功get回调用户展示,支付成功post回调修改订单状态

    这里写目录标题 一 昨日回顾二 今日内容1 订单表设计2 立即付款接口 一堆校验 登录后 2 1视图类2 2序列化类2 3自定义异常类2 4配置文件2 5路由 3 立即付款前端4 支付成功get回调用户展示4 1luffycity src
  • luffy-17/上线

    这里写目录标题 一 上节回顾二 今日内容1 购买阿里云服务器2 服务器配置 软件安装2 1更新系统软件包2 2安装mysql2 3安装redis2 4安装python3 62 5配置pip源 xff1a 阿里云不用配置 xff0c 默认配置
  • bs4遍历文档树,搜素文档树,find_all参数,selenium,模拟登陆百度

    这里写目录标题 一 昨日回顾二 今日内容1 bs4遍历文档树2 bs4的搜索文档树3 find all的其他参数4 css选择器5 selenium的介绍6 selenium的使用7 模拟登陆百度8 selenium的其他使用 一 昨日回顾
  • xpath的使用,selenium爬取京东商品信息,scrapy介绍,安装及使用

    这里写目录标题 一 xpath的使用二 selenium爬取京东商品信息三 scrapy的架构3 1scrapy的架构3 2目录介绍 四 scrapy的简单使用 一 xpath的使用 span class token number 1 sp
  • go语言值变量命名规范,定义变量,数据类型,常量,函数基础,函数高级

    这里写目录标题 一 昨日回顾二 今日内容1 变量命名规范2 变量代码演示 3 类型代码演示 4 常量5 函数基础6 函数高级 一 昨日回顾 span class token number 1 span redis高级 span class
  • 串口接收一帧数据及解析

    3 xff0e 下位机中的数据接收和协议解析 下位机接收数据也有两种方式 xff0c 一 等待接收 xff0c 处理器一直查询串口状态 xff0c 来判断是否接收到数据 二 中断接收 两种方法的优缺点在此前的一篇关于串口通信的文章中详细讨论
  • <string>库常用的函数

    include lt string h gt 库包含字符串处理函数 xff0c 常用的有strcpy strcat strcmp strchr等 1 strcpy是字符串赋值函数 char strcpy char target char s
  • APM(Ardupilot)——电机输出流程图

    电机类声明 xff1a system cpp void Copter allocate motors void switch AP Motors motor frame class g2 frame class get if FRAME C
  • C++中的三个特殊宏:__FILE__,__FUNCTION__和__LINE__

    C 43 43 中的三个特殊宏 xff1a FILE xff0c FUNCTION 和 LINE 1 FILE 宏 FILE 宏用于检查当前文件名 xff0c 例如 xff1a include lt cstdio gt using name
  • GD32F10x外部晶振配置108MHz系统时钟

    嵌入式 GD32F10x外部晶振配置108MHz系统时钟 文章目录 嵌入式 GD32F10x外部晶振配置108MHz系统时钟前言一 时钟树与配置思路二 时钟配置过程三 晶振故障排查总结 前言 由于公司更改硬件设计选择使用新的型号兆易创新国产
  • Keil MDK C (error: #29: expected an expression) 错误的解决

    今天 xff0c 自己建了一个EFM32工程模版 xff0c 调试代码时显示 App Panel main c 119 error 29 expected an expression 仔细的检查了半个小时 xff0c 最后解决了 xff01
  • HTTP协议之报文详解

    学习WEB开发需要对HTTP协议熟悉 xff0c 下面直接进入主题 一 什么是报文 报文 xff0c 是网络中交换和传输的数据单元 xff0c 即站点一次性要发送的数据块 报文包含了将要发送的完整的数据信息 xff0c 其长短很不一致 xf
  • linux发送tcp/udp请求

    本文章介绍下通过nc工具 iperf工具和python脚本 xff0c 实现发送tcp udp请求 一 nc工具 xff08 netcat工具 xff09 这个工具linux系统默认是自带的 xff0c 以下是命令的常用参数 1 1 发送t
  • 第一次网页前端培训笔记(HBuilderX)

    一 安装HBuilderX 官网 xff1a HBuilderX 高效极客技巧 dcloud io 二 了解HBuilderX lt DOCTYPE html gt lt html gt lt head gt lt meta charset
  • 第二次网页前端培训笔记(HBuilderX)

    常用标签 一 表单 form标签 xff1a 表单标签 xff0c 块级元素 xff0c 会自动换行 xff1b 将数据传输给服务器 常用属性 xff1a action 表单提交的地址url id 唯一标识 name 名称 target 表
  • 前端第7次培训

    对象 一对象的创建 1 字面量形式创建对象 var对象名 61 xff1b var对象名 61 键 xff1a 值 2 通过new Object创建 var对象名 61 new Object xff08 xff09 3 通过Object对象
  • MPU6050的再次深度学习与实操遇到问题

    数据的处理与实现 xff1a MPU6050芯片提供的数据夹杂有较严重的噪音 xff0c 在芯片处理静止状态时数据摆动都可能超过2 除了噪音 xff0c 各项数据还会有偏移的现象 xff0c 也就是说数据并不是围绕静止工作点摆动 xff0c
  • moderlarts第一次作业

    一 物体检测模型 以口罩检测为例 1 下载OBS 2 打开华为云 xff0c 找到modelarts控制台 xff0c 鼠标移到用户名上 xff0c 点击我的凭证 3 点击访问密钥 gt 新增访问密钥 xff0c 下载 xff0c 然后登陆
  • 培训modelarts 二

    一 进行声音分类 1 下载数据包 xff0c 导入OBS 2 创建声音分类项目 3 标签分类 4 开始训练 5 部署模型 6 预测结果 二 AI gallery 1 下载数据集 2 创建数据集 xff0c 导入外卖评论 3 进行创建文本分类

随机推荐