欧拉角、四元数、旋转矩阵推导及相互关系

2023-11-11

Tags: SLAM


一、旋转与旋转矩阵

1.2D旋转

如下图所示,在坐标系O-xy中有一点P,已知坐标为(x,y),向量OP与X轴的夹角为β。将点P绕坐标原点O旋转了α角到P’。这里规定与右手系旋转方向相同的为旋转正方向,对于2D情况而言即逆时针旋转为旋转正方向。但在摄影测量中一般规定的是顺时针旋转方向为正方向。因此在应用时需要注意正方向的问题。正方向不同最终会导致的结果是旋转矩阵中sinα的符号是相反的。设P’点的坐标为(x’,y’)。点P、P’在x、y轴上的垂足分别为A、B、C、D。试用P点坐标表示P’点坐标。

首先由于旋转,所以OP=OP’,设其长度为r。有如下公式。

r=x2+y2‾‾‾‾‾‾‾√

而且,在三角形OPA中,有

cosβ=xrsinβ=yr

也即

x=rcosβy=rsinβ

基于上面的已知条件,在三角形OP’C中,x’可以如下表示

x′=r⋅cos(α+β)=r⋅(cosαcosβ−sinαsinβ)=cosαcosβ⋅r−sinαsinβ⋅r=cosα⋅x−sinα⋅y

同理y’如下

y′=r⋅sin(α+β)=r⋅(sinαcosβ+cosαsinβ)=sinαcosβ⋅r+cosαsinβ⋅r=sinα⋅x+cosα⋅y

因此将上面的式子写成矩阵相乘的形式如下

(x′y′)=(cosαsinα−sinαcosα)(xy)

这个公式便是二维平面内旋转前后的坐标关系。

2.3D旋转

在推得上面2D旋转的公式之后,3D旋转公式就相对简单了。例如某个点绕Z轴旋转α角,也就是说旋转后的Z坐标是不变的,变化的只是X、Y坐标。因此甚至可以基于2D公式,不用推导的写出下面这个式子,因为为了满足相等关系,必须补充系数矩阵元素。

⎛⎝⎜⎜⎜x′y′z⎞⎠⎟⎟⎟=⎛⎝⎜⎜cosαsinα0−sinαcosα0001⎞⎠⎟⎟⎛⎝⎜⎜xyz⎞⎠⎟⎟

而这个式子中的系数矩阵可以记为如下形式

RZ(α)=⎛⎝⎜⎜cosαsinα0−sinαcosα0001⎞⎠⎟⎟

便把R称为旋转矩阵。同时依据绕哪个轴旋转其坐标不变这个性质可以从形式上很快写出绕X、Y轴的旋转矩阵。但这里千万要注意并不是简单的把sin、cos挪个位置而已。因为涉及到旋转后的横、纵轴问题。例如以Y轴为转轴进行旋转,那么横轴应该是原坐标系的Z轴,纵轴应该是原坐标系的X轴。这一点一定要注意,否则会出错。也就是说最后的旋转矩阵中sin会相差一个负号,进而导致后续运算的出错。如下图。

为了简单记住到底旋转后把谁当作横轴谁当作纵轴,总结了一个简单的小方法。即以哪个轴旋转,就用手握住这个轴,然后逆时针转动,最先碰到的那个轴作为横轴,剩下的那个作为纵轴,如下图。

据此,可得到绕各轴旋转的旋转矩阵

RX(α)=⎛⎝⎜⎜1000cosαsinα0−sinαcosα⎞⎠⎟⎟RY(α)=⎛⎝⎜⎜cosα0−sinα010sinα0cosα⎞⎠⎟⎟RZ(α)=⎛⎝⎜⎜cosαsinα0−sinαcosα0001⎞⎠⎟⎟

二、欧拉角

欧拉角用于描述某个物体在坐标系中的姿态。假设一个物体的前方(朝向我们的方向)为X轴,右侧为Y轴,上方为Z轴。那么可以定义翻滚、俯仰和偏航如下。

翻滚,Roll,绕X轴

俯仰,Pitch,绕Y轴

偏航,Yaw,绕Z轴

这样对于任何一个姿态,我们可以利用Roll-Pitch-Yaw三个角依次旋转从而还原和表述物体的姿态了,形象而且直观。

但是这里有个很重要的问题,即绕谁旋转。每次是绕固定轴旋转还是绕旋转之后的轴旋转的,这会导致不一样的结果。也就是说 描述坐标系{B}相对于参考坐标系{A}的姿态有两种方式。

第一种是绕固定(参考)坐标轴旋转:假设开始两个坐标系重合,先将{B}绕{A}的X轴旋转γ,然后绕{A}的Y轴旋转β,最后绕{A}的Z轴旋转α,就能旋转到当前姿态。在整个过程中,坐标系{A}都没有发生变动。

另一种姿态描述方式是绕自身坐标轴旋转:假设开始两个坐标系重合,先将{B}绕自身的Z轴旋转α,然后绕Y轴旋转β,最后绕X轴旋转γ,就能旋转到当前姿态。

虽然两种旋转方式不同,但可以发现这两种描述方式得到的旋转矩阵是一样的,即绕固定坐标轴X-Y-Z旋转(γ,β,α)和绕自身坐标轴Z-Y-X旋转(α,β,γ)的最终结果一样,只是描述的方法有差别而已。

R=RZ(α)RY(β)RX(γ)=⎛⎝⎜⎜cosαcosβsinαcosβ−sinβcosαsinβsinγ−sinαcosγcosαcosγ+sinαsinβsinγcosβsinγcosαsinβcosγ+sinαsinγsinαsinβcosγ−sinγcosαcosβcosγ⎞⎠⎟⎟

三、四元数

一个四元数的定义如下

q=q0+q1i+q2j+q3k

一个四元数拥有一个实部和三个虚部,三个虚部之间满足如下关系。

⎧⎩⎨⎪⎪⎪⎪i2=j2=k2=−1ij=k,ji=−kjk=i,kj=−iki=j,ik=−j

有时四元数也定义成(w,x,y,z)的形式,q0对应w,x、y、z依次对应q1、q2、q3。四元数的定义有了,那么如何用四元数表示旋转呢?如某次旋转是绕某一向量K=(Kx,Ky,Kz)进行了角度为θ的旋转,那么利用四元数就可以表示这个旋转:

x=Kxsinθ2y=Kysinθ2z=Kzsinθ2w=cosθ2

而且满足条件

x2+y2+z2+w2=1

四、相互转换

1.四元数转旋转矩阵

设四元数为:

q=q0+q1i+q2j+q3k

则其对应的旋转矩阵R为:

R=⎛⎝⎜⎜⎜1−2(q22+q23)2(q1q2+q0q3)2(q1q3−q0q2)2(q1q2−q0q3)1−2(q21+q23)2(q2q3+q0q1)2(q1q3+q0q2)2(q2q3−q0q1)1−2(q21+q22)⎞⎠⎟⎟⎟

2.旋转矩阵转四元数

已知旋转矩阵如下

R=⎛⎝⎜⎜r11r21r31r12r22r32r13r23r33⎞⎠⎟⎟

其对应的四元数为

⎧⎩⎨⎪⎪⎪⎪⎪⎪q0=tr(R)+1√2q1=r23−r324q0q2=r31−r134q0q3=r12−r214q0

其中tr(R)表示R矩阵的迹,也即矩阵R的主对角线(从左上方至右下方的对角线)上各个元素的总和。

3.欧拉角转旋转矩阵

某次旋转绕固定坐标轴X-Y-Z旋转(γ,β,α)或者说绕自身坐标轴Z-Y-X旋转(α,β,γ),对应的旋转矩阵如下

R=RZ(α)RY(β)RX(γ)=⎛⎝⎜⎜cosαcosβsinαcosβ−sinβcosαsinβsinγ−sinαcosγcosαcosγ+sinαsinβsinγcosβsinγcosαsinβcosγ+sinαsinγsinαsinβcosγ−sinγcosαcosβcosγ⎞⎠⎟⎟

4.旋转矩阵转欧拉角

有旋转矩阵

R=⎛⎝⎜⎜r11r21r31r12r22r32r13r23r33⎞⎠⎟⎟

可求出各轴的旋转角为

θZ=atan2(r21,r11)θY=atan2(−r31,r231+r233‾‾‾‾‾‾‾‾√)θX=atan2(r32,r33)

atan2为C++中函数,atan2(y,x)的做法:当 x 的绝对值比 y 的绝对值大时使用 atan(y/x);反之使用 atan(x/y)。这样就保证了数值稳定性。需要注意的是,旋转顺序必须要是Z、Y、X。

5.欧拉角转四元素

将Z-Y-X欧拉角(或RPY角:绕固定坐标系的X-Y-Z依次旋转α,β,γ角)转换为四元数:

q=⎛⎝⎜⎜⎜⎜q0q1q2q3⎞⎠⎟⎟⎟⎟=⎛⎝⎜⎜⎜⎜⎜⎜cos(α2)cos(β2)cos(γ2)+sin(α2)sin(β2)sin(γ2)sin(α2)cos(β2)cos(γ2)−cos(α2)sin(β2)sin(γ2)cos(α2)sin(β2)cos(γ2)+sin(α2)cos(β2)sin(γ2)cos(α2)cos(β2)sin(γ2)−sin(α2)sin(β2)cos(γ2)⎞⎠⎟⎟⎟⎟⎟⎟

6.四元数转欧拉角

由四元数q=(q0,q1,q2,q3)或q=(w,x,y,z)到欧拉角的转换为

α=arctan(2(q0q1+q2q3)1−2(q21+q22))β=arcsin(2(q0q2−q1q3))γ=arctan(2(q0q3+q1q2)1−2(q22+q23))

由于arctan和arcsin的取值范围在−π/2 - π/2之间,只有180°,而绕某个轴旋转时范围是360°,因此要使用atan2函数代替arctan函数。

α=atan2(2(q0q1+q2q3),1−2(q21+q22))β=arcsin(2(q0q2−q1q3))γ=atan2(2(q0q3+q1q2),1−2(q22+q23))

最后这个网站(https://quaternions.online/) 可以动态展示四元数与欧拉角的对应关系和变化情况,便于理解。

五、参考资料

  • https://blog.csdn.net/u012423865/article/details/78219787?locationNum=9&fps=1
  • https://www.cnblogs.com/21207-iHome/p/6894128.html
  • https://blog.csdn.net/csxiaoshui/article/details/65446125
  • https://www.cnblogs.com/singlex/p/RotateMatrix2Euler.html
  • https://blog.csdn.net/xuehuafeiwu123/article/details/74942989
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

欧拉角、四元数、旋转矩阵推导及相互关系 的相关文章

  • 浏览器(Microsoft Edge)主页被360劫持的终极解决办法

    今天开启Microsoft Edge发现主页变成了360搜索的主页 心里很膈应 我的电脑里没有安装任何360的软件 不知道是怎么被改动了 可能是装其他软件时被篡改了 尝试一 更改edge浏览器的设置 即使设置了打开特定网址 再次打开依然是3
  • 笔记本电脑亮度突然无法用快捷键调节

    重装系统后 笔记本的亮度无法调节始终为最高亮度 一度以为是系统问题 重装了显卡驱动也无效 该问题困扰了我半年之久 今天终于解决了 1 故障现象 笔记本的屏幕亮度无法调节 快捷键 失效 重装显卡驱动 无效 2 原因分析 这是因为电脑安装了某个
  • char和varchar简单比较

    区别 char varchar 最大长度 255字符 65535字符 长度设置 定长 变长 空间使用 浪费空间 节省空间 查找效率 较高 较低 解读varchar 20 字段最多存放20个字符 varchar 20 和varchar 200
  • 基于http协议的Web服务器

    原理 由HTTP客户端发起一个请求 建立一个到服务器指定端口 默认端口 80 的TCP连接 HTTP在此端口监听客户端发送过来的请求 一旦收到请求 服务器向客户端回复一个状态行 比如 HTTP 1 0 200 OK 和响应消息 HTTP协议
  • 微服务项目实战 - 电商平台 项目框架及多模块开发

    本项目会被分为多个文章去讲解实现 目录 1 项目简介 项目模式 1 B2B模式 B2B Business to Business 2 B2C 模式 B2C Business to Consumer 3 C2B模式 C2B Customert
  • 【Word】学习笔记|批量解决文档中公式编号不居中的问题

    1 问题描述 当你将一个Word中内容 包含公式 复制到另外一个Ward里 发现MathType公式编号未居中 如上图所示 如果你公式较少 可以参考官方教程解决 就是将段落 中文版式 文本对齐方式中设置为居中就行 官方解决方法 MathTy
  • 一个Chen系统的激活控制同步——MATLAB实现

    对于 C h e n Chen Chen系统 驱动系统定义为
  • Linux下lt8911exb调试总结

    调试lt8911exb花了两天时间 总结下 ic功能介绍 mipi转eDP http cn lontiumsemi com UploadFiles pdf LT8911EXB Product Brief pdf github下有驱动源码 可
  • c++11~c++20 -05-thread_local

    目录 一 thread local简介 二 示例 2 1 全局变量 2 2 局部变量 2 3 类对象 2 4 类成员变量 一 thread local简介 thread local变量是C 11新引入的一种存储类型 它会影响变量的存储周期
  • 深入了解Java队列接口

    队列接口 队列接口是 Java 集合框架的一个重要部分 它扩展了 Collection 接口 队列接口表示遵循 先进先出 FIFO 原则的元素集合 队列允许存储重复值 队列的基本特征是元素按特定顺序存储 类似于等待轮流的人群 主要通过添加元
  • 服务器文件怎么删,怎么删除服务器文件

    怎么删除服务器文件 内容精选 换一换 执行chmod R 777 导致CentOS云服务器根目录权限设置成777 系统中的大部分服务以及命令无法使用 此时可通过系统自带的getfacl命令来拷贝和还原系统权限 本节操作介绍误操作导致根目录设
  • Android 12应用适配指南

    Android 12应用适配指南 1 Android 12上的主要变更 1 1 兼容性 1 1 1 前台服务启动限制 1 1 2 前台服务通知延迟 1 1 3 待处理 intent 必须声明可变性 1 1 4 非SDK接口名单更新 1 2
  • vue 通过逻辑控制el-dropdown组件展开和收起

    el dropdown在element ui中应用场景并不少 有些时候 我们下拉的内容并不是他本来的选项 用户选择后就没有关闭 这个时候 就需要我们在逻辑层开启或关闭他的菜单
  • 通过JVM深入理解Java异常机制

    JVM内部结构 要深入理解JVM异常处理机制 需要从JVM内部结构开始 下图描述的主要是Java程序在执行时 由JVM管理的运行时数据区 包括方法区 Java堆 Java虚拟机栈 PC寄存器 本地方法栈 还有常量池 它们又被分为两大类 线程
  • matlab-基础 plot xlabel 图像加上x,y轴的标签

    2019独角兽企业重金招聘Python工程师标准 gt gt gt matlab R2018a 64bit OS Windows 10 x64typesetting Markdown blog my oschina net zhicheng
  • 2014百度校招笔试题之动态链接库&静态链接库详解

    1 什么是静态连接库 什么是动态链接库 静态链接库用通俗的话讲 静态库就是将代码编译到一个二进制文件下 通常扩展名为 LIB 然后客户端调用程序 只需要包含相关的 h文件及LIB库文件一起链接到exe文件中 可执行程序发布后 不再需要该 l
  • cookie默认有效期多长_惊艳面试官的 Cookie 介绍

    关注在看 以后更多干货分享在头条 Cookie 是什么 Cookie 是用户浏览器保存在本地的一小块数据 它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上 Cookie 主要用于以下三个方面 会话状态管理 如用户登录状态 购物
  • 亲测GO环境搭建,理解go build、go install、go get

    前言 秉承着作为一个新人 要有着 指哪打哪 的觉悟 在老大的需求下 顶上前端的空缺先干阵子前端 当然 在工作之余还是要好好朝着既定的方向努力的 实习结束后还了电脑 这次毕业再来换了新Mac 重新搭下Go的环境 顺便好好总结下 以后随着学习的
  • VMware虚拟机安装教程

    虚拟机 Virtual Machine 是通过软件模拟的完整计算机系统 在实体计算机中能够完成的工作在虚拟机中都能够实现 在计算机中创建虚拟机时 需要将实体机的部分硬盘和内存容量作为虚拟机的硬盘和内存容量 每个虚拟机都有独立的CMOS 硬盘
  • vue使用three.js并导入.obj模型

    下载three js等依赖 npm install three js data下面定义的 canvasDom null renderer null scene null camera null controls null 在需要用到thre

随机推荐

  • android 日历控件_UI界面开发工具Calendar日历插件示例合集

    适用于Visual C MFC ActiveX COM的Calendar控件为Windows开发人员提供了Outlook样式的日历和日期选择组件 您可以轻松创建日历 可以管理按日 周 工作周或月安排的约会 并提供了多个选项供您选择 包括集成
  • 离线安装Nginx(rpm方式)

    环境 centos7 9 下面将展示通过rpm方式安装Nginx 1 官方下载Nginx rpm包 下载地址 http nginx org packages 下载版本根据操作系统版本进行选择 本次操作系统是centos7 9 64位系统 所
  • dbcp

    initialSize 10 初始化连接 连接池启动时创建的初始化连接数量 默认值为0 maxActive 80 最大活动连接 连接池中可同时连接的最大的连接数 默认值为8 minIdle 10 最小空闲连接 连接池中最小的空闲的连接数 低
  • 30个Python极简代码

    Python 是机器学习最广泛采用的编程语言 它最重要的优势在于编程的易用性 如果读者对基本的 Python 语法已经有一些了解 那么这篇文章可能会给你一些启发 作者简单概览了 30 段代码 它们都是平常非常实用的技巧 我们只要花几分钟就能
  • webpack 模块加载兼打包工具——入门或进阶

    一 说点废话 1 webpack 是以 commonJS 的形式来书写脚本滴 但对 AMD CMD 的支持也很全面 方便旧项目进行代码迁移 2 能被模块化的不仅仅是 JS 了 3 开发便捷 能替代部分 grunt gulp 的工作 比如打包
  • 【Linux】Linux编程之 mmap解析

    前言 虚拟内存系统通过将虚拟内存分割为称作虚拟页 Virtual Page VP 大小固定的块 一般情况下 每个虚拟页的大小默认是4096字节 同样的 物理内存也被分割为物理页 Physical Page PP 也为4096字节 一 mma
  • Nuxt脚手架nuxi初始化失败原因&解决方法

    起因 前几天终于把毕业设计的开题报告整完了 有了一点时间干自己的事 于是就想着学学nuxt3 结果发现跟着官方教程敲的第一行命令就出现了问题 npx nuxi init nuxt3 app 这行代码是nuxt的脚手架 会生成一个最简单的模板
  • 连接器链调用---Spring源码从入门到精通(二十三)

    上篇文章主要介绍了methodInterceptor拦截器吧增强组件返回的过程 获取拦截器链MethodInterceptor Spring源码从入门到精通 二十二 这篇文章主要介绍拦截器链如何触发 一 拦截器链的触发过程 1 首先第一个判
  • 比Mojo慢68000倍,Python性能差的锅该给GIL吗?

    关注并星标腾讯云开发者 每周1 鹅厂工程师带你审判技术 第3期 李志瑞 天使还是魔鬼 聊聊 Python GIL 9 月 7 日 新兴编程语言 Mojo 正式发布 Mojo 的最初设计目标是比 Python 快 35000 倍 近期该团队表
  • Unity Hub登录无响应

    以下是我遇到的问题以及解决方案 在此之前这篇博文说的也很不错 可以参考一下 Unity Hub 3 登录无响应 无法登录 解决方式 主要是看能不能弹出来登录窗口 找了半天的解决方案 最终发现是默认浏览器的锅 去设置里改一下web浏览器 我用
  • web性能测试

    专业的软件测试工程师至少要掌握一到两种测试工具 而作为普通软件开发者 或多或少掌握一些测试方法和技巧 随着用户对科技产品用户体验度的上升 产品发布前的测试工作变得尤为重要 工欲善其事必先利其器 下面本文就推荐五款非常流行的Web性能测试工具
  • 对126邮箱进行自动化测试

    打开126邮箱页面 输入邮箱和密码 并点击企业邮箱 from selenium import webdriver import time dr webdriver Chrome dr get https mail 126 com time
  • [日记]LeetCode算法·二十五——二叉树⑤ AVL树(插入+删除)附代码实现

    本章的代码实现基于上一篇BST与优先队列的基类进行平衡二叉树 即AVL树 文章目录 AVL的概念 AVL查询效率 AVL的插入 1 插入节点 2 更新平衡因子BF 3 旋转调整树的结构 3 1 LL 右旋 3 2 RR 左旋 3 3 LR
  • 分布式系统数据同步问题

    分布式系统 通过数据冗余 来保证数据的安全 要写一个分布式系统 一道绕不过去的坎 那就是数据同步 同步 这两个字 折磨死了很多人 是同步 还是异步 是push 还是pull 谁是master 谁是slave 下线会怎样 上线了又会怎样 中心
  • 11个值得珍藏的4K高清壁纸网站推荐

    前言 由于前几天因需求须找一些视觉素材 翻来覆去整了一些 整理了10个图片素材网站可以给大家收藏使用 作为打开电脑 or 手机第一眼就看到的桌面 给它设置一个赏心悦目的桌面壁纸还是必不可少的 下面分享了 10 个值得珍藏的高清桌面壁纸网站
  • Solidworks渲染技巧如何不显示边线--显示样式设定

    如上图是带边线的显示 如果要出ps效果图 这样的边线存在会让效果图显得难看 因为默认是选定了带边线上色的显示样式 只要改成 上色 第二种的显示样式 即可不会带边线 另外如果想得到纯白色的背景色 选择应用布景选单白色 快速选择渲染颜色的技巧
  • protobuf安装教程

    protobuf安装 一 Windows下安装 下载protobuf 配置环境变量 检查是否安装成功 二 Linux下安装 下载protobuf 安装protobuf 检查是否安装成功 一 Windows下安装 下载protobuf 下载地
  • 在浏览器加载完毕后,自动播放视频:出现play() failed because the user didn't interact with the document first.错误

    问题 test html 30 Uncaught in promise DOMException play failed because the user didn t interact with the document first ht
  • 查看nginx版本号的几种方法

    1 查看服务器上安装的nginx版本号 主要是通过nginx的 v或 V选项 查看方法如下图所示 v 显示 nginx 的版本 V 显示 nginx 的版本 编译器版本和配置参数 root zq nginx V nginx version
  • 欧拉角、四元数、旋转矩阵推导及相互关系

    Tags SLAM 一 旋转与旋转矩阵 1 2D旋转 2 3D旋转 二 欧拉角 三 四元数 四 相互转换 1 四元数转旋转矩阵 2 旋转矩阵转四元数 3 欧拉角转旋转矩阵 4 旋转矩阵转欧拉角 5 欧拉角转四元素 6 四元数转欧拉角 五 参