四元数 旋转 旋转矩阵 欧拉角互相转换

2023-11-08

四元数的作用

表达旋转。

旋转的表达方式有很多种,有欧拉角,旋转矩阵,轴角,四元数(unit quaternion),unit quaternion是一种表达旋转的方式。


不同的旋转表达方式概览

(1)欧拉角:

欧拉角使用最简单的x,y,z值来分别表示在x,y,z轴上的旋转角度,其取值为0-360(或者0-2pi),一般使用roll,pitch,yaw来表示这些分量的旋转值。

优缺点:

这里的旋转是针对世界坐标系说的,这意味着第一次的旋转不会影响第二、三次的转轴。

1)不易在任意方向的旋转轴插值; 2)万向节死锁;3)旋转的次序无法确定。


(2)轴角:

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

优缺点:

表示非常直观,也很紧凑。
轴角最大的一个局限就是不能进行简单的插值,此外,轴角形式的旋转不能直接施于点或矢量,必转换为矩阵或者四元素。


四元数与轴角转化

旋转轴向量为: v=(vx,vy,vz) ,旋转角度为 \theta

那么与此相对应的四元数

注意:
对一个格式形如[ w,(x,y,z)]的quaternion,对quaternion最大的误解在于认为w表示旋转角度,V表示旋转轴。正确的理解应该是w与旋转角度有关,v与旋转轴有关

四元数的常用运算应用
(1)求一个点w=(wx,wy,wz)在这个四元数q下,旋转后的新的坐标w^{'}
1.定义纯四元数
qw=(0,wx,wy,wz)=0+wx*i+wy*j+wz*k
2.进行四元数运算
qw^{'} =q*qw*q^{-1}
3.产生的 qw^{'} 一定是纯四元数,也就是说它的第一项为0,有如下形式:
qw^{'} =(0,wx^{'},wy^{'},wz^{'})=0+wx^{'}*i+wy^{'}*j+wz^{'}*k
4. qw^{'} 中的后三项 (wx^{'},wy^{'},wz^{'}) 就是 w^{'}
w^{'} =(wx^{'},wy^{'},wz^{'})
这样,就完成了一次四元数旋转运算。

同理,如果你有一个四元数:
q=(q1,q2,q3,q4)=(cos(\frac{\theta }{2} ),sin(\frac{\theta }{2} )*vx,sin(\frac{\theta }{2} )*vy,sin(\frac{\theta }{2} )*vz)
那么,它对应一个以向量 v=(vx,vy,vz) 为轴旋转 \theta 角度的旋转操作(右手法则的旋转)。
(2)两个四元数的旋转合成

给定两个四元数p和q,分别代表旋转P和Q,则乘积pq表示两个旋转的合成(即旋转了Q之后再旋转P),并不是用加法。四元数的乘法定义如下,利用简单的分配律就是了:

q1 * q2 =
(w1*w2 - x1*x2 - y1*y2 - z1*z2) +
(w1*x2 + x1*w2 + y1*z2 - z1*y2) i +
(w1*y2 - x1*z2 + y1*w2 + z1*x2) j +
(w1*z2 + x1*y2 - y1*x2 + z1*w2) 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) = S1*S2 - V1.V2 + V1XV2 + S1*V2 + S2*V1


四元数与其他形式的各种转化:

四元素转欧拉角


欧拉角转四元素


四元素转旋转矩阵

R(q)=12(y2+z2)2(xy+zw)2(xzyw)2(xyzw)12(x2+z2)2(yz+xw)2(xz+yw)2(yzxw)12(x2+y2)

[cpp]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. Matrix4x4(  
  2.         1.0f - 2.0f*y*y - 2.0f*z*z, 2.0f*x*y - 2.0f*z*w, 2.0f*x*z + 2.0f*y*w, 0.0f,  
  3.         2.0f*x*y + 2.0f*z*w, 1.0f - 2.0f*x*x - 2.0f*z*z, 2.0f*y*z - 2.0f*x*w, 0.0f,  
  4.         2.0f*x*z - 2.0f*y*w, 2.0f*y*z + 2.0f*x*w, 1.0f - 2.0f*x*x - 2.0f*y*y, 0.0f,  
  5.         0.0f, 0.0f, 0.0f, 1.0f  
  6.         )  

欧拉角转旋转矩阵




Reference:

如何形象地理解四元数? - 回答作者: Yang Eninala http://zhihu.com/question/23005815/answer/33971127 (想看更多?下载 @知乎 App:http://weibo.com/p/100404711598 )

http://blog.csdn.net/silangquan/article/details/39008903#comments

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

四元数 旋转 旋转矩阵 欧拉角互相转换 的相关文章

随机推荐

  • WEB前端后端简单区别,通俗理解

    前端开发和后台开发是有区别的 工作的内容和负责的东西是完全的不同的 以下以网站的开发为例 1 前端开发 前端开发现在一般指的就是web前端开发工程师 其负责是网站前端页面也就是网页的页面开发 简单的说网站前端负责是东西是网站用户可见的东西
  • 解决 Agent admitted failure to sign using the key 问题 with ssh

    配置ssh 之前要在本机上装上ssh 可以通过sudo apt get install ssh来安装 如果没有进行配置的话 登录到本机或者远程主机需要该主机的密码才行 下面进行无密码登录的配置 很简单 执行ssh keygen t rsa命
  • VM虚拟机中如何设置ip地址

    当我们在windows环境下 在cmd命令行中输入ipconfig可以看到我们的主机ip地址 但是我们创建了一台虚拟机 并且装好系统时 输入ifconfig 这里和windows下命令不一样 不要搞混了 时 会发现得不到ip地址 下面就说一
  • 删除数组中小于平均值的数

    利用指向一维数组的指针 将一个含有m m lt 10 个整数的一维数组中小于平均值的所有元素顺次删除掉 例如 原数组为3 5 7 4 1 删除后的数组应为5 7 4 提示 先输入数组元素个数 再依次输入数组元素的值 include
  • 吊打面试官:2023最新安全渗透面试题。

    安全渗透面试题 1 引言 2 安全渗透面试题 2 1 什么是渗透测试 2 2 你能提供一些常见的渗透测试工具和技术吗 2 3 在渗透测试中 如何利用SQL注入攻击 2 4 在渗透测试中 如何利用XSS攻击 2 5 在渗透测试中 如何利用代码
  • 编译busybox报错:scripts/Makefile.build:192: recipe for target 'loginutils/passwd.o' failed

    ubuntu18 04上编译busybox 提示上图中的错误 如何解决 修改busybox中的源码 include libbb h 中 增加一行 include
  • 已解决:H5移动端网页实现录音功能,js实现录音功能,包括安卓webview接口也可以使用

    遇到一个需求 需要做一个手机网页录音的功能 嵌入到webview中去 用安卓原生录音倒是可以 但是想着尽量去安卓化开发 就想着用纯的js前端代码去实现录音功能 在 Web 应用程序中 JavaScript 是运行在浏览器中的客户端脚本语言
  • Android自定义蒙层

    在开发过程中有时候会遇到特定情况下显示蒙层的需求 比如在点击某个Edittext搜索框时 部分界面出现浅透明蒙层 自定义蒙层 class MongolianView context Context attrs AttributeSet Li
  • 华为p20nfc怎么复制门禁卡_华为手机怎么绑定门禁卡

    绑定门禁卡的功能在华为手机的 钱包 应用内 点击 门钥匙 的选项 选择 添加 就可以将门禁卡贴近NFC功能进行自动读取 添加需要验证华为账号 使用的时候在钱包中选择门禁卡验证指纹之后 靠近读卡机即可 以下是详细介绍 1 打开华为 钱包 应用
  • 第5章 基础——5.3. C++项目组成

    回到目录 白话C 5 3 C 项目组成 首先我们知道了 写一个C 程序 可能需要多个源文件 比如a cpp b cpp 有没有可能只用一个源文件呢 似乎是可以的 比如我们之前写的 Hello world 经典版等项目 不就只有一个main
  • Web前端学习上----(案例实现)

    前言 前言 很多事情先有念头 后来才有了行动 只要坚持 总会在这个过程中收获很多 博客质量也会慢慢提升 我知道想要达到高级的水平 需要不断的学习 在这个过程会吸收大量知识 而人的记忆是有限的 所以每隔一段时间 将学习的东西整理出来 发表成博
  • pcl经典算法60例——所有代码参考链接(开源)

    pcl经典算法60例大集合 方法名称 开源链接 1 打开点云 MFC显示点云 柯西等式的博客 CSDN博客 2 显示法线 PCL计算点云的法线 pcl 法线 Tom Hardy的博客 CSDN博客 3 三角化 PCL学习笔记 点云曲面重建
  • 服务器提示临时文件已满,win10系统提示”由于临时文件夹已满而导致“磁盘空间不足”错误的解决办法_win10教程_uc电脑园...

    如果你已使用 磁盘清理 释放设备上的空间 然后看到 磁盘空间不足 错误 这可能是因为你的临时文件夹正在被 Microsoft Store 使用的应用程序 appx 文件快速占用所致 今天小编就给大家带来win10系统提示由于临时文件夹已满而
  • Mysql读写锁保姆级图文教程

    准备 创建 mylock 表 CREATE TABLE mylock id int 11 NOT NULL AUTO INCREMENT name varchar 20 DEFAULT NULL PRIMARY KEY id ENGINE
  • 抖音最新抓包方案

    可以通过hook java层如下图所示的地方 dy默认走的是quick协议 但是为了兼容更多版本的手机 有一个降级操作 毕竟担心cronet低版本适配不好 所以可以通过hook这个方法来使其强制降级到Http协议 frida脚本 1 2 3
  • JDBC获取数据库连接

    要素一 Driver接口实现类 1 Driver接口介绍 1 1java sql Driver 接口是所有 JDBC 驱动程序需要实现的接口 这个接口是提供给数据库厂商使用的 不同数据库厂商提供不同的实现 1 2在程序中不需要直接去访问实现
  • Git 工作区、暂存区和版本库

    基本概念 我们等来理解下Git工作区 暂存区和版本库概念 工作区 就是你在电脑里能看到的目录 强烈推荐git新手阅读 暂存区 英文叫stage 或index 一般存放在igt 目录下的index文件 git index 中 所以我们把暂存区
  • STM32初学者项目一:点亮第一颗LED灯(基于地址操作)

    步骤1 在SYSTEM创建相应的外设文件夹以及对应的 c h源文件 具体可参考之前写的创建基本工程文件 基于STM32官方库如何独立创建一个标准的STM32F103X的标准工程文件 是浩吉呀哈的博客 CSDN博客 步骤2 将对应的源文件加入
  • PHP登录注册页面

    注册 html 注册1 php
  • 四元数 旋转 旋转矩阵 欧拉角互相转换

    四元数的作用 表达旋转 旋转的表达方式有很多种 有欧拉角 旋转矩阵 轴角 四元数 unit quaternion unit quaternion是一种表达旋转的方式 不同的旋转表达方式概览 1 欧拉角 欧拉角使用最简单的x y z值来分别表