【转】四元数的推导过程

来自:https://blog.csdn.net/qq_28773183/article/details/80083607

四元数旋转推导过程

1.基本概念

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

Rq(p)=qpq−1Rq(p)=qpq−1

其中: 
qq:单位四元数 
q−1q−1:四元数的逆,对于单位四元数,q∗=q−1q∗=q−1 
pp:纯四元数 
Rq(p):也是一个纯四元数Rq(p):也是一个纯四元数


2. 欧拉角的万向锁问题

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

如图所示:XwYwZwXwYwZw是世界坐标系,XiYiZiXiYiZi是机体坐标系,我们先绕XiXi轴旋转30∘30∘,再绕YiYi旋转90∘90∘,如下图所示: 
 
此时我们的XwXw和ZiZi在同一直线上,最后我们再绕ZiZi旋转40∘40∘,如下图所示: 
 
我们会发现一个问题,无论我们怎么旋转,我们的坐标都是(30,90,z),也就是绕z轴的旋转角度我们无法衡量的,这也就是我们的万向锁问题。


3. 四元数推导

复数旋转

首先我们看一个复数p=a+bip=a+bi在复平面的表示: 
现在我们将它旋转角度θθ,先定义另外一个复数q=cosθ+isinθq=cosθ+isinθ,我们发现,复数的乘法表示了一种旋转:

qp=(acosθ−bsinθ)+i(asinθ+bcosθ)qp=(acosθ−bsinθ)+i(asinθ+bcosθ)

这个复数恰好就是pp旋转θθ角度后的值: 

三维复数旋转

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

z1=a1+b1i+c1jz2=a2+b2i+c2jz1=a1+b1i+c1jz2=a2+b2i+c2j

其中i2=j2=−1i2=j2=−1,我们类似的进行复数的乘法,得到:

z1z2=(a1a2−b1b2−c1c2)+(a1b2+a2b1)i+(a1c2+a2c1)j+b1c2ij+b2c1jiz1z2=(a1a2−b1b2−c1c2)+(a1b2+a2b1)i+(a1c2+a2c1)j+b1c2ij+b2c1ji

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

四元数旋转

哈密尔顿引入四维的四元数:q=q0+q1i+q2j+q3k,其中i2=j2=k2=−1q=q0+q1i+q2j+q3k,其中i2=j2=k2=−1,根据向量的叉乘可以定义下列一些关系: 
 
 
 
 
可以得到下列关系:

ij=−ji=kjk=−kj=iki=−ik=ji2=j2=k2=ijk=−1ij=−ji=kjk=−kj=iki=−ik=ji2=j2=k2=ijk=−1

为了方便理解,我们将四元数写成向量的形式:q=[s,v⃗ ]q=[s,v→],我们可以理解为ss为实部,向量v⃗ v→表示的就是三维空间,下面我们看一下四元数的乘法:

qa=[sa,a⃗ ]qb=[sb,b⃗ ]qaqb=[sasb−a⃗ ⋅b⃗ ,sab⃗ +sba⃗ +a⃗ ×b⃗ ]qa=[sa,a→]qb=[sb,b→]qaqb=[sasb−a→⋅b→,sab→+sba→+a→×b→]

由于我们研究的是三维空间,因此我们可以令qaqa为一个纯四元数,即qa=[0,a⃗ ]qa=[0,a→].则可以得到:

qaqb=[−a⃗ ⋅b⃗ ,sba⃗ +a⃗ ×b⃗ ]qaqb=[−a→⋅b→,sba→+a→×b→]

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

qaqb=[0,a⃗ cosθ+a⃗ ×b⃗ sinθ]qaqb=[0,a→cosθ+a→×b→sinθ]

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

p′=qp=[0,2–√|b⃗ |i+2–√|b⃗ |j]p′=qp=[0,2|b→|i+2|b→|j]

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

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

p=[0,2i],q=[fracsqrt22,fracsqrt66(i+j+k)],则q∗=[fracsqrt22,−fracsqrt66(i+j+k)]p=[0,2i],q=[fracsqrt22,fracsqrt66(i+j+k)],则q∗=[fracsqrt22,−fracsqrt66(i+j+k)]

旋转之后的四元数Rq(p)Rq(p):

Rq(p)=[0,2j]Rq(p)=[0,2j]

这里需要注意的一点是,因为经过两次的旋转,所以旋转的角度是2θ2θ,这就是为什么我们常常看到的旋转四元数是一下形式:

q=cosθ2+u⃗ sinθ2,其中|u⃗ |=1

posted on 2018-08-15 17:06 时空观察者9号 阅读(...) 评论(...) 编辑 收藏

【转】四元数的推导过程相关推荐

  1. 1. 简明误差卡尔曼滤波器(ESKF)及其推导过程

    文章目录 1. 简明误差卡尔曼滤波器(`ESKF`)及其推导过程 简介 `ESKF`基本过程及优点 `ESKF`参数含义 连续时间上的 `ESKF`状态方程 误差状态方程推导 误差状态的旋转项 误差状 ...

  2. 手眼标定_全面细致的推导过程

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自 | 新机器视觉 本文解决的问题: 机械手搭载双目相机,手 ...

  3. 关于罗德里格斯公式(Rodrigues‘sFormula)的详细推导过程

    关于罗德里格斯公式[Rodrigues'sFormula]的详细推导过程 1 旋转向量 2 罗德里格斯公式 2.1 罗德里格斯公式定义 2.2 罗德里格斯公式推导 3 旋转矩阵到旋转向量的转换 1 旋 ...

  4. IMU预积分--详细推导过程

    一.提前了解 二.预积分的目的 1.IMU通过加速度计和陀螺仪测出的是加速度和角速度,通过积分获得两帧之间的旋转和位移的变换: 2.在后端非线性优化的时候,需要优化位姿,每次调整位姿都需要在它们之间重 ...

  5. 图像处理——几种简单的旋转变换的超详细推导过程(点在同一坐标系的变换)(一)

    图像处理--几种简单的旋转变换的超详细推导过程(同一坐标系)(一) 本文主要推导了二维和三维坐标系中的绕点和绕轴的旋转变换,推导过程比较详细,希望可以给大家提供一些帮助. 一.绕原点的旋转(二维) 二 ...

  6. 一分钟详解「本质矩阵」推导过程

    文章目录 前言 一 本质矩阵如何推导 二 本质矩阵的意义 三 本质矩阵的求解 四 扩展--基本矩阵 前言 两幅视图存在两个关系:第一种,通过对极几何,一幅图像上的点可以确定另外一幅图像上的一条直线:另 ...

  7. 机器学习——线性回归的原理,推导过程,源码,评价

    https://www.toutiao.com/a6684490237105668620/ 2019-04-27 16:36:11 0.线性回归 做为机器学习入门的经典模型,线性回归是绝对值得大家深入 ...

  8. 变态跳台阶,很难很难,终于想出来了,附推导过程,为自己鼓掌

    https://www.nowcoder.net/practice/22243d016f6b47f2a6928b4313c85387?tpId=13&tqId=11162&tPage= ...

  9. 【数字信号处理】相关函数 ( 卷积与交换性 | 相关函数不具有交换性 | 推导过程 )

    文章目录 一.卷积与交换性 1.卷积概念 2.卷积交换律 二.相关函数交换性 一.卷积与交换性 1.卷积概念 对于 线性时不变系统 ( LTI - Linear time-invariant ) 来说 ...

最新文章

  1. 【高级数据结构】并查集
  2. javascript写坦克大战
  3. [19/04/04-星期四] IO技术_CommonsIO(通用IO,别人造的轮子,FileUtils类 操作文件 IOUtilsl类 操作里边的内容 )...
  4. windows使用Win32DiskImager安装树莓派系统
  5. 【shell】shuf命令,随机排序
  6. 比特币如何达成共识 - 最长链的选择
  7. .NET 应用程序支持直接调用 WebAssembly 模块
  8. Django之URLconf路由
  9. python 打印xml文档树_Python构建XML树结构的方法示例
  10. 编写了html怎么测试,如何将测试结果写入HTMLTestRunner生成的报告标题中
  11. 使用控件设计窗体 上 布局主窗体 添加标签与文本框控件
  12. Verify_Execute 验证SQL语句执行结果
  13. PHP开发从入门到实战教程分享
  14. 教程资源合集(网上搜集整理)
  15. 菜菜的sklearn-01决策树完整版
  16. 盛德奇嘉提醒冬季对爱车养护全攻略:保养洗车均要注意
  17. Requirement already satisfied的解决方案
  18. Kata3.0.0 x LifseaOS x 龙蜥内核三管齐下!带你体验最新的安全容器之旅
  19. 寒假每日一题 2 : 干草堆 java
  20. 2015境外人气餐厅榜单!你吃过几家?

热门文章

  1. Leaflet中原生方式实现测距
  2. HBase Shell常用的命令
  3. Android中应用百度地图API开发地图APP实例-显示百度地图
  4. SpringBoot中配置为开发模式,代码修改后不用重新运行
  5. Pygame实现记录事件到文本中
  6. 【LeetCode】233. 数字1的个数
  7. 3、MySQL 8.0.20在Linux(centos 8)上搭建主从复制
  8. 10、mybatis参数处理
  9. 系统检测到您正在使用网页抓取工具_【安全】58反抓取简介
  10. 合肥学院计算机对口升学2019,15高校招生4340人!2019安徽省对口升学本科招生计划出炉!...