四元数表示旋转的理解

2023-05-16

哈密尔顿

为了纪念四元数的发明者哈密尔顿,爱尔兰于1943年11月15日发行了下面这张邮票:这里写图片描述
哈密尔顿简直是个天才,哈密尔顿从小到进入大学之前没有进过学校读书,他的教育是靠叔父传授以及自学。他找到了法国数学家克莱罗(Clairaut)写的《代数基础》一书,很快就学会了代数,然后看牛顿写的《数理原理》。在16岁时就读法国著名数学家和天文学家拉普拉斯(Laplace)五册的《天体力学》,他发现拉普拉斯关于力的平行四边形法则的证明的错误.
四元数的概念是由爱尔兰数学家Sir William Rowan Hamilton发明的(1843年,都柏林)。Hamilton当时正和他的妻子前往爱尔兰皇家研究院,当他从Brougham桥通过皇家运河时,他领悟到了一个激动人心的东西,并立刻把它刻在桥的一个石头上:

i2=j2=k2=ijk=1 i 2 = j 2 = k 2 = i j k = − 1

这里写图片描述
关于哈密尔顿的介绍可以看这篇博客: 邮票上的数学家(10)哈密尔顿(爱尔兰)


四元数旋转推导过程

1.基本概念

(1) 四元数的一般形式如下: q=q0+q1i+q2j+q3k q = q 0 + q 1 i + q 2 j + q 3 k
(2) 单位四元数:满足四元数的模为1,即 q02+q12+q22+q32=1 q 0 2 + q 1 2 + q 2 2 + q 3 2 = 1
(3) 四元数的三角形式: q=cosθ2+u⃗ sinθ2 q = c o s θ 2 + u → s i n θ 2
(4)共轭四元数: q=q0q1iq2jq3k q ∗ = q 0 − q 1 i − q 2 j − q 3 k
(5) 纯四元数: q=q1i+q2j+q3k q = q 1 i + q 2 j + q 3 k
(6)四元数与空间旋转:

Rq(p)=qpq1 R q ( p ) = q p q − 1

其中:
q q :单位四元数
q1:四元数的逆,对于单位四元数, q=q1 q ∗ = q − 1
p p :纯四元数
Rq(p):


2. 欧拉角的万向锁问题

先看一个简单的欧拉旋转,如下图所示:欧拉旋转需要先确定旋转顺序,我们可以定义X-Y-Z的顺序(总共有12种旋转顺序),那么什么是万向锁呢,我们可以用手机在桌子上进行旋转,以手机的正面为xy平面,以手机的厚度的方向作为z轴,我们先绕x转一个角度,然后再绕y轴旋转90度,我们会发现一个问题,当我们再绕z轴旋转一个角度,效果等同于我开始绕x轴旋转另外一个角度,再绕y轴旋转90度就行了.
这里写图片描述
我们的欧拉旋转只能表示二维空间了,这是解我们的微分方程会出现退化现象,造成我们的微分方程无法解的情况。这样说似乎还是比较模糊,那么我们举一个例子:
这里写图片描述

如图所示: XwYwZw X w Y w Z w 是世界坐标系, XiYiZi X i Y i Z i 是机体坐标系,我们先绕 Xi X i 轴旋转 30 30 ∘ ,再绕 Yi Y i 旋转 90 90 ∘ ,如下图所示:
这里写图片描述
此时我们的 Xw X w Zi Z i 在同一直线上,最后我们再绕 Zi Z i 旋转 40 40 ∘ ,如下图所示:
这里写图片描述
我们会发现一个问题,无论我们怎么旋转,我们的坐标都是(30,90,z),也就是绕z轴的旋转角度我们无法衡量的,这也就是我们的万向锁问题。


3. 四元数推导

复数旋转

首先我们看一个复数 p=a+bi p = a + b i 在复平面的表示:这里写图片描述
现在我们将它旋转角度 θ θ ,先定义另外一个复数 q=cosθ+isinθ q = c o s θ + i s i n θ ,我们发现,复数的乘法表示了一种旋转:

qp=(acosθbsinθ)+i(asinθ+bcosθ) q p = ( a c o s θ − b s i n θ ) + i ( a s i n θ + b c o s θ )

这个复数恰好就是 p p 旋转θ角度后的值:
这里写图片描述

三维复数旋转

我们看到了二维复数乘法可以表示旋转,那么三维空间呢。按照举一反三的思想,我们会想到再增加一个虚数作为第三个维度,这个就要涉及到我们的向量的叉乘,如下图所示:
这里写图片描述
向量叉乘的结果是两个向量构成平面的垂直向量,那么我们定义两个个三维的复数:

z1=a1+b1i+c1jz2=a2+b2i+c2j z 1 = a 1 + b 1 i + c 1 j z 2 = a 2 + b 2 i + c 2 j

其中 i2=j2=1 i 2 = j 2 = − 1 ,我们类似的进行复数的乘法,得到:
z1z2=(a1a2b1b2c1c2)+(a1b2+a2b1)i+(a1c2+a2c1)j+b1c2ij+b2c1ji z 1 z 2 = ( a 1 a 2 − b 1 b 2 − c 1 c 2 ) + ( a 1 b 2 + a 2 b 1 ) i + ( a 1 c 2 + a 2 c 1 ) j + b 1 c 2 i j + b 2 c 1 j i

我们会发现,如果没有 ijji i j 和 j i 这两项,我们三维的复数旋转也就没问题,那该如何处理呢?

四元数旋转

哈密尔顿引入四维的四元数: q=q0+q1i+q2j+q3k,i2=j2=k2=1 q = q 0 + q 1 i + q 2 j + q 3 k , 其 中 i 2 = j 2 = k 2 = − 1 ,根据向量的叉乘可以定义下列一些关系:
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
可以得到下列关系:

ij=ji=kjk=kj=iki=ik=ji2=j2=k2=ijk=1 i j = − j i = k j k = − k j = i k i = − i k = j i 2 = j 2 = k 2 = i j k = − 1

为了方便理解,我们将四元数写成向量的形式: q=[s,v⃗ ] q = [ s , v → ] ,我们可以理解为 s s 为实部,向量v表示的就是三维空间,下面我们看一下四元数的乘法:
qa=[sa,a⃗ ]qb=[sb,b⃗ ]qaqb=[sasba⃗ b⃗ ,sab⃗ +sba⃗ +a⃗ ×b⃗ ] q a = [ s a , a → ] q b = [ s b , b → ] q a q b = [ s a s b − a → ⋅ b → , s a b → + s b a → + a → × b → ]

由于我们研究的是三维空间,因此我们可以令 qa q a 为一个纯四元数,即 qa=[0,a⃗ ] q a = [ 0 , a → ] .则可以得到:
qaqb=[a⃗ b⃗ ,sba⃗ +a⃗ ×b⃗ ] q a q b = [ − a → ⋅ b → , s b a → + a → × b → ]

从上面可以看到,一个普通的四元数是无法将三维空间映射到三维空间的,我们令向量点乘的部分为零,此时,一个纯四元数就可以旋转为另一个纯四元数.为了表现出旋转,这里我们用四元数的三角表示方式: qb=[cosθ,sinθb⃗ ] q b = [ c o s θ , s i n θ b → ] ,令 a⃗ b⃗ =0 a → ⋅ b → = 0 ,则有:
qaqb=[0,a⃗ cosθ+a⃗ ×b⃗ sinθ] q a q b = [ 0 , a → c o s θ + a → × b → s i n θ ]

我们没有对向量 b⃗  b → 做任何限制,下面来用一个例子说明应当对向量 b⃗  b → 做什么限制.
p=[0,2i],q=[22,22b⃗ ] p = [ 0 , 2 i ] , q = [ 2 2 , 2 2 b → ] ,考虑到 a⃗ b⃗ =0 a → ⋅ b → = 0 ,令 b⃗ =|b⃗ |k b → = | b → | k ,则将 p p 旋转45后得到:
p=qp=[0,2|b⃗ |i+2|b⃗ |j] p ′ = q p = [ 0 , 2 | b → | i + 2 | b → | j ]

旋转之前,纯四元数 p p 的模长为|p|=2,旋转过后,纯四元数 p p ′ 的模长 |p|=2|b⃗ | | p ′ | = 2 | b → | ,所以我们要给旋转四元数又加上一个约束:四元数 q q 的模长为1,即q是一个单位四元数.

但是上面的旋转是有缺点的,因为其限制了我们的旋转轴和需要被旋转的四元数必须是垂直的( a⃗ b⃗ =0 a → ⋅ b → = 0 ),而不能达到任意的旋转.这时,聪明的哈密尔顿发现,一个四元数会把一个纯四元数拉到四维空间,但它的共轭又会把这个四维的空间拉回到三维空间.我们以一个简单的例子来说明这个问题:

p=[0,2i],q=[fracsqrt22,fracsqrt66(i+j+k)],q=[fracsqrt22,fracsqrt66(i+j+k)] p = [ 0 , 2 i ] , q = [ f r a c s q r t 2 2 , f r a c s q r t 6 6 ( i + j + k ) ] , 则 q ∗ = [ f r a c s q r t 2 2 , − f r a c s q r t 6 6 ( i + j + k ) ]

旋转之后的四元数 Rq(p) R q ( p ) :
Rq(p)=[0,2j] R q ( p ) = [ 0 , 2 j ]

这里需要注意的一点是,因为经过两次的旋转,所以旋转的角度是 2θ 2 θ ,这就是为什么我们常常看到的旋转四元数是一下形式:
q=cosθ2+u⃗ sinθ2,|u⃗ |=1 q = c o s θ 2 + u → s i n θ 2 , 其 中 | u → | = 1


Quaternions – Ken Shoemake


参考资料

  1. Understanding Quaternions 中文翻译《理解四元数》
  2. 视觉SLAM中的数学基础 第二篇 四元数
  3. 四元数与空间旋转 – 维基
  4. 四元数 – 维基
  5. Shoemake, Quaternions
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

四元数表示旋转的理解 的相关文章

  • SAP 一句话入门之SD

    SD是Sales and Distribution的简称 在SAP系统中 xff0c 销售与分销模块处在供应链下游 xff0c 关注从客户订单到向客户收款的全过程 SD模块中的Sales好理解 xff0c 而Distribution却容易被
  • realsense-ros安装

    一 realsense ros安装 1 Create a catkin workspace mkdir p realsense rosws src cd realsense rosws src catkin init workspace 2
  • thinkphp页面请求时间超过40S报404错误解决办法

    最近在写一个thinkphp项目的时候 xff0c 发现Ajax从后端请求数据时间比较长 xff0c 大概需要45秒左右 xff0c 但是一旦请求时间超过40s xff0c 页面就会超时404了 xff0c 一开始以为是ajax请求时间不能
  • C语言宏定义详解

    宏定义引入 源程序在编译之前 xff0c 会先进行预处理 预处理并不是C语言编译器的组成部分 xff0c 不能直接对它们进行编译 经过预处理后 xff0c 程序就不再包括预处理命令了 xff0c 最后再由编译程序对预处理之后的源程序进行编译
  • C语言枚举详解

    枚举的引入 枚举是C语言中的一种基本数据类型 xff0c 它可以让数据更简洁 xff0c 更易读 枚举语法定义格式为 xff1a enum 枚举名 枚举元素1 枚举元素2 注意 xff0c 各元素之间用逗号隔开 注意 xff0c 末尾有分号
  • STC-ISP使用指南

    该软件无需安装 xff0c 下载后打开直接用 本软件是专门给STC系列单片机下载烧录程序的 xff0c 并不能适用于ARM系列的单片机 界面介绍 xff1a 打开后的界面如下 xff1a 左边的部分一般是用来下载程序的 xff0c 右面一般
  • STM32前言知识总结

    目录 关于STM32 STM32F1 存储器 位带操作 三种启动模式 低功耗模式 复位 时钟系统 STM32库 仿真器和调试器 注 xff1a 本文大部分内容来自于STMCU官网以及STM32数据手册 STM32使用的是ARM公司的Cort
  • STM32的标准库及其使用

    单片机的开发工作量 xff0c 主要集中在两个地方 xff0c 一是调通各种外设 xff0c 二是实现产品功能 像较高级的语言 xff0c 比如c 43 43 java python等 因为将底层操作进行了封装 xff0c 所以只需要集中关
  • PADS(一)简介、安装与基本使用

    PADS是一款制作PCB板的软件 PADS包括PADS Logic PADS Layout和PADS Router PADSLayout xff08 PowerPCB xff09 提供了与其他PCB设计软件 CAM加工软件 机械设计软件的接
  • 电路中的常见符号总结

    嵌入式如何阅读原理图和数据手册 路溪非溪的博客 CSDN博客 硬件原理图常见缩写 EN xff1a Enable xff0c 使能 CS xff1a Chip Select xff0c 片选 RST xff1a Reset xff0c 重启
  • 嵌入式常见英文2500词总结

    目录 嵌入式硬件常见英文总结 嵌入式软件常见英文总结 电子技术专业英语 嵌入式硬件常见英文总结 block diagram xff0c 框图 figure xff0c 图形 xff0c 图标 processor xff0c 处理器 Mirr
  • 我的2013—弃金融IT,从SAP业务

    我的2013 xff0c 是动荡的一年 xff1b 这一年 xff0c 我跳巢了 xff1b 这一年 xff0c 我换行业了 xff1b 这一年 xff0c 我离开了生活5年的长春 xff0c 来到成都 xff1b 这一年 xff0c 我放
  • STM32实战总结:HAL之电机

    电机基础知识参考 xff1a 51单片机外设篇 xff1a 电机 路溪非溪的博客 CSDN博客 无刷电机和有刷电机 先详细了解有刷电机 xff1a 带你了解 xff08 有刷 xff09 电机工作原理 哔哩哔哩 bilibili 再详细了解
  • F407标准库之时钟系统

    主要参考正点原子数据手册和源码资料等 第19讲 STM32时钟系统精讲 哔哩哔哩 bilibili 此处记录较为重要或者较易出错的一些遗漏之处 xff0c 作为补充 一般而言 xff0c 时钟越高 xff0c 速度越快 xff0c 但同时抗
  • F407标准库之定时器

    主要参考正点原子数据手册和源码资料等 第31 通用定时器基本原理讲解 哔哩哔哩 bilibili 此处记录较为重要或者较易出错的一些遗漏之处 xff0c 作为补充 定时器中断 定时器相关的库函数主要集中在固件库文件 stm32f4xx ti
  • F407标准库之基础知识

    关于STM32的结构体封装 在STM32中 xff0c 有两种容易弄混的结构体封装 第一种是系统对底层寄存器的封装 结构体类型定义好之后 xff0c 是不会分配地址空间的 xff0c 此时只是个类型定义 xff0c 之后使用的时候 xff0
  • c++架构师需要掌握哪些知识

    目录 本文技术梳理主要针对于三类人群的技术需求 c c 43 43 Linux服务器端开发岗位分析 经常被问到的问题 xff1a 技术体系建立的好处 c c 43 43 Linux服务器开发技术学习路径 一 精进基石 二 高性能网络设计 三
  • cmake:使用execute_process调用shell命令或脚本

    CMake可以通过execute process调用shell命令或者脚本 xff0c 其原型如下 xff1a execute process COMMAND lt cmd1 gt args1 COMMAND lt cmd2 gt args
  • 树莓派3B+上安装ubutun mate 18.04.2

    1 准备16G以上储存卡 xff0c 读卡器 2 准备两个软件 xff1a SDCardFormatter Win32DiskImager分别用于储存卡格式化和写入系统文件 链接如下 xff1a 链接 xff1a https pan bai
  • linux应用编程--思维导图

    思维导图软件是xmind 下载源文件点击打开链接

随机推荐

  • 深度学习中Batch、Iteration、Epoch的概念与区别

    在神经网络训练中 xff0c 一般采用小批量梯度下降的方式 Batch Epoch Iteration 就是其中的重要的概念 我们要理解懂得它们都是什么以及它们之间的区别 1 Batch 每次迭代时使用的一批样本就叫做一个Batch xff
  • STM32使用CubeMAX配置的串口中断接收方法

    STM32使用CubeMAX配置的串口中断接收方法 目录 1 定位串口中断发生的地方 2 处理串口中断接收的流程是 xff1a xff08 1 xff09 初始化串口 xff08 2 xff09 在main中第一次调用接收中断函数 xff0
  • SAP 寻找增强点的方法

    SAP中寻找增强的实现方法 SAP 增强已经发展过几代了 xff0c 可参考 SAP 标准教材 BC425 和 BC427 简单的说SAP的用户出口总共有四 代 1 第一代 基于源代码的增强 SAP提供一个空代码的子过程 xff0c 在这个
  • SNMPV3的实现原理

    在snmp发展到V3版本后 xff0c 把snmp的安全性提升到一个新高度 xff0c 这同时也带来了实现上的复杂性 在02年 xff0c 03年我都曾经想进一步的了解它的实现 xff0c 但都没什么进展 这次在实现Csnmp的过程中 xf
  • ubuntu更新错误:dists/artful/main/binary-arm64/Packages 404 Not Found

    Failed to fetch http archive ubuntu com ubuntu dists artful main binary arm64 Packages 404 Not Found IP 91 189 88 162 80
  • 个人公众号开通啦!!!!

    已经开通了个人微信公众号 xff1a 编程时光机 以后会在公众号里和大家分享知识和生吞活 xff0c 欢迎大家关注 xff01 xff01
  • 小白学AI系列(一)-- AI简史

    经过一段时间的酝酿 xff0c 小白学AI系列也正是开始了 xff01 小编将从三个阶段和大家一起入门人工智能 xff0c 掌握常用机器学习算法和数据分析技巧 小编专业为数据融合方向 xff0c 也曾接触过机器学习 xff0c 但由于人工智
  • 小白学AI系列(二) -- Python模块和函数

    原文地址 xff1a 小白学AI系列 xff08 二 xff09 Python模块和函数 今天的内容是带大家学习解释性语言 Python 小编有学过一段时间的C 43 43 和Matlab 相对于二者而言 xff0c Python是作为学习
  • PX4固定翼调试校准流程及实验相关问题记录分析

    pixhawk固定翼调试流程 对于px4固件 xff0c 其对应选择的一般是qgroundcontrol地面站 xff08 APM一般使用Mission Planner xff09 本次调试的固件版本是1 6 5dev xff08 最新的固
  • Ubuntu16.04下PX4环境快速搭建及uORB通信机制

    Ubuntu16 04下的环境搭建 之前搭建PX4环境常常编译不通 xff0c cmake gcc 以及交叉编译器gcc arm none eabi的版本问题导致make固件报错 xff0c 好不容易编译通过了 xff0c 在进行安装jMA
  • PX4固件通过UART连接串口读取超声波,和树莓派3通信

    添加串口读取程序 首先在Firmware msg文件夹下添加rw uart msg span class hljs keyword char span span class hljs number 5 span datastr span c
  • PX4自主飞行相关问题

    调试入坑 赶在回去之前把10月1日新校区试飞相关问题记录一下 首先是调试相关问题 调试具体流程 在校准遥控器时经常出现校准一半就停止的问题 xff0c 期初认为是固件问题 xff0c 换了1 6 5 1 6 3 xff0c 1 5 5三个固
  • PID控制器及其C++实现

    PID控制器原理 PID控制器实际上是对偏差的控制 其原理图如下 其数学的表达如下 u x 61 K p e r r t 43 1 T e r r t d t 43 T D d e r r t d t u x
  • Oracle Systimestamp 函数

    在Oracle PLSQL中 xff0c Systimestamp 函数返回本机数据库上当前系统日期和时间 包括微秒和时区 Systimestamp 函数的语法是 xff1a systimestamp 应用于 xff1a Oracle 9i
  • px4源码解读之fw_att_control

    目录 程序和控制流程源码解读总结 程序和控制流程 个人简单的总结了一下整个程序的流程如下 整个的控制流程图可以在官网中找到 源码解读 在解读源码之前 需要提几个公式 第一个就是协调转弯中的偏航控制 也就是流程图中为什么输入是空速 p 61
  • 安装Mavlink generator出现UnicodeEncodeError错误

    最近在看mavlink 在执行官网的操作时出现了问题 问题如下 span class hljs constant Exception span span class hljs keyword in span span class hljs
  • mc_att_control基础知识:向量运算和罗德里格斯旋转

    向量的叉乘和点乘 在我们的mc att control中有我们的向量的点乘和叉乘 一般遇到的都是三维的运算 S O 3 S O 3 李群 向量点乘 假设向量 a 61 a 1 a 2 a 3
  • 低通滤波器和高通滤波器的程序实现原理推导

    傅立叶变换 拉普拉斯变换和Z变换 对于信号分析而言 傅立叶变换是必不可少的 我们都知道傅立叶变换是把系统从时域变换到频域进行分析 那么拉普拉斯变换和Z变换是干什么的 简单的来说 由于傅里叶变换的收敛有一个狄利克雷条件 xff0c 要求信号绝
  • PX4源码解读之fw_pos_control_l1

    固定翼的位置控制是一个很重要问题 它不同于旋翼的控制 需要对速度和高度进行解耦控制 并且其不能像旋翼那样进行悬停 其转弯的时候有一个转弯半径 本博客不会对源码进行详细的解读 主要是分享一些自己读源码时的资料 自己读的过程中也有注释 想要的同
  • 四元数表示旋转的理解

    哈密尔顿 为了纪念四元数的发明者哈密尔顿 爱尔兰于1943年11月15日发行了下面这张邮票 哈密尔顿简直是个天才 哈密尔顿从小到进入大学之前没有进过学校读书 xff0c 他的教育是靠叔父传授以及自学 他找到了法国数学家克莱罗 xff08 C