摘抄部分有意思的链接,如有不适,请移步原文。

参考知乎上的文章链接:如何形象地理解四元数?

四元数由汉密尔顿发明,这一发明起源于十九世纪的某一天。在这一天早上,汉密尔顿下楼吃早饭。这时他的儿子问他,“爸爸,我们能够对三元数组(triplet,可以理解为三维向量)做乘法运算么?”汉密尔顿说“不行,我只能加减它们。”

这时来自21世纪的旁白旁先生说,“大家快来看十九世纪的数学家有多二,连内积和外积都不是知道。”

十九世纪的汉密尔顿也许确实不知道内积和外积,但是他知道,他想要的三维向量乘法要比内积和外积运算“高大上”很多。这一乘法运算要满足下列四条性质:
1.运算产生的结果也要是三维向量
2.存在一个元运算,任何三维向量进行元运算的结果就是其本身
3.对于任何一个运算,都存在一个逆运算,这两个运算的积是元运算
4.运算满足结合律

换而言之,汉密尔顿想定义的不是一个简单的映射关系,而是一个群!(后来我们知道四元数所在群为S3,而四元数所代表的三维旋转是SO(3),前者是后者的两倍覆盖)内积连性质1都不满足,外积不满足性质3。

汉密尔顿先生就这么被自己儿子提出的问题难倒了。经历了无数个日日夜夜,他绞尽脑汁也没想明白这个问题。终于有一天(1843年的一天),汉密尔顿先生终于意识到了,自己所需要的运算在三维空间中是不可能实现的,但在四维空间中是可以的,他是如此的兴奋,以至于把四元数的公式刻在了爱尔兰的一座桥上。

旁白:“WTF,我让你讲三维物体的旋转,你给我扯到四维空间上去。”

(不加说明,以下所说四元数全为单位四元数)
        其实,四元数有四个变量,完全可以被看作一个四维向量。单位四元数(norm=1)则存在于四维空间的一个球面上。,四元数乘以四元数其实看作(1)对进行左旋转,或者(2)对进行右旋转。所以从始至终,四元数定义的都是四维旋转,而不是三维旋转!任意的四维旋转都可以唯一的拆分为一个左旋转和一个右旋转,表达出来就是。这里,我们对四元数(四维向量)进行了一个左旋转和一个右旋转。结果当然是一个四元数,符合性质1。这个运算也同时符合性质2,3,4。

好了,说完了四维旋转,我们终于可以说说三维旋转了。说白了,三维旋转就是四维旋转的一个特例,就像二维旋转是三维旋转的一个特例一样。说是特例其实不准确,准确的说是一个子集或者subgroup。为了进行三维旋转运算,汉密尔顿首先在四维空间里划出了一块三维空间。汉密尔顿定义了一种纯四元数(pure quaternion),其表达式为。纯四元数第一项为零,它存在于四维空间的三维超平面上,与三维空间中的三维向量一一对应。然后,就有了我们常见的这种左乘单位四元数,右乘其共轭的表达式。我真心不知道汉密尔顿是怎么想出来的,不过回过头来看,这个运算形式是为了限制其运算结果所在的空间。简单的说,当对一个三维向量进行三维旋转后,我们希望得到的是一个三维向量。(如果你真能得到一个四维向量,就不敢自己在家转圈圈了吧,转着转着,就进入四次元了!)那么这个左乘单位四元数,右乘其共轭的运算保证了结果是一个在三维超平面上中的纯四元数。

把左乘和右乘表达为矩阵形式会让我们看的更清楚一些。依照的定义,的矩阵形式为

很明显,前面的矩阵虽然是一个4x4的四维旋转矩阵,但是它只是在右下角3x3的区域内和一个单位矩阵有所不同。所以说,它是一个限制在三维超平面上的四维旋转。如果表达式右边不是共轭,而是任意四元数,那么我们所作的就是一个很普通的四维旋转。如果只是左乘一个单位四元数,右边什么都不乘,那么我们得到的是四维旋转的一个子集,这个子集并不能保证结果限制在三维超平面上。如果只右乘,不左乘也是一样一样的。

说了这么多,对于坚持到最后的你,上图一幅,以表感谢。
       

其实这张图解释了一个长久的疑问。为什么四元数里用的是而不是。这是因为做的就是一个的旋转,而也做了一个的旋转。我们进行了两次旋转,而不是一次,这两次旋转的结果是一个旋转角为的旋转。

后记

各种位姿变换都有其特定的缺陷,使用旋转矩阵在变换角为0或者pi/2时会出现病态矩阵,使用欧拉角容易出现万向锁,使用四元数可以降低位姿变换-旋转平移运算的计算量。

比如:两个正交旋转矩阵的复合需要27次乘法和18次加法,而通过四元数的形式只需要16次乘法和12次加法,降低1/3的计算量。但是四元数的不可交换性,往往导致令人意外的结果,例如四元数的 n-阶多项式能有多于 n 个不同的根。

转载于:https://www.cnblogs.com/wishchin/p/9199942.html

三维重建面试3:旋转矩阵-病态矩阵、欧拉角-万向锁、四元数相关推荐

  1. 旋转矩阵|万向锁|四元数

    文章目录 旋转公式 2D 3D 万向锁 四元数 3D旋转公式 Reference 旋转公式 2D 矩阵形式 v′=[cos(θ)−sin(θ)sin(θ)cos(θ)]vv' = \begin{bma ...

  2. 三维重建3:旋转矩阵-病态矩阵、欧拉角-万向锁、四元数

    摘抄部分有意思的链接,如有不适,请移步原文. 参考知乎上的文章链接:如何形象地理解四元数?  :一个详尽的可作为教程的翻译:理解四元数的中文翻译... : 英文原文:http://www.3dgep. ...

  3. 旋转矩阵欧拉角万向锁详解

    物体的姿态描述 物体的姿态可由固定于此物体的坐标系描述,为了规定空间某刚体B的姿态,设置一直角坐标系{B}与此刚体固接.用坐标系{B}的三个单位主矢量{Xb,Yb,Zb}相对于参考坐标系{A}的方向余 ...

  4. unity 旋转欧拉角 万向锁 解释

    万向锁 一直困惑我很久....原因出在这里,我以为欧拉角旋转是以模型坐标(齐次坐标系)为旋转轴.问题就来了,无论旋转那个轴,其它两个轴也会相应的变化,下面看图: 根据上面的说明两个旋转面(圆圈)怎么会 ...

  5. 【OpenGL_02】欧拉角、万向锁、四元数

    文章目录 欧拉角 万向锁 四元数 四元数的矩阵乘法及其可易性 蜕变矩阵 四元数的矩阵乘法 欧拉角 引用博客欧拉角与旋转矩阵的转换关系 欧拉角就是我们日常生活中常用的表示旋转的三维向量的乘积. 在Uni ...

  6. 车辆姿态表达:旋转矩阵、欧拉角、四元数的转换以及eigen、matlab、pathon方法实现

    目录 1 概述 2 原理 2.1 旋转矩阵 2.1.1 绕x轴旋转 2.1.2 绕y轴旋转 2.1.3 绕z轴旋转 2.2 欧拉角 2.2.1 基本思想 2.2.2 欧拉角的缺点 2.3 四元数 2. ...

  7. 万向锁的理解 欧拉角 四元数

    1 欧拉角&万向锁 欧拉角和万向锁 视频资料理解万向锁 核心是嵌套 以一个三自由度的机械臂为例,三个旋转轴互相垂直,相当于x,y,z轴 三个机械臂通过旋转关节依次串联,定义第一个关节旋转轴为J ...

  8. 旋转矩阵、欧拉角、万向锁详解

    旋转矩阵.欧拉角.万向锁详解 一:物体的姿态描述 物体的姿态可由固定于此物体的坐标系描述,为了规定空间某刚体B的姿态,设置一直角坐标系{B}与此刚体固接.用坐标系{B}的三个单位主矢量{Xb,Yb,Z ...

  9. 旋转矩阵、欧拉角,万向锁的危害

    1. 万向锁会带来什么危害? 最近看了很多万向锁的文章,大家都集中于讲述万向锁的成因,最后都会加上句"导致缺失一个方向的自由度",但是万向锁现象到底会给实际工作带来什么问题?具体点 ...

最新文章

  1. Delphi 之Copyrect的使用
  2. SAP MM ME21N 创建PO时报错 - Net price in CNY becomes too large – 之原因分析
  3. python中 是什么类型_浅谈python中的变量默认是什么类型
  4. M-JPEG、MPEG4、H.264都有何区别 依维安防论坛
  5. HTTP最常见的请求头
  6. 完美的xslt数值函数与字符串函数
  7. spring处理循环依赖时序图_spring--解决循环依赖
  8. 中国顶级程序员有多牛?一个弄哭韩国,一个堪称阿里“扫地僧”
  9. mongodb python 大于_菜鸟成长记--如何根据关键词爬取微博内容?(scrapy+mongodb)
  10. 别再为了this发愁了:JS中的this机制
  11. Java进阶之路,Java程序员职业发展规划
  12. 计算机一级中替换,08年计算机一级辅导:实战WPS转义符在查找替换中的应用
  13. HTML中背景图片如何自适应屏幕
  14. 4选1数据选择器程序及testbench文件,给出仿真波形,分析
  15. 细则从哈利·波特与来自您好麻雀船长
  16. PiaolinPlatformV2.0.0 - 获取手机或电脑GPS位置信息(定位平台)
  17. 一则软件需求有关的漫画
  18. 对HANA的认识与相关测试案例
  19. 启动Tomcat服务器报错
  20. python制作英汉词典_Python基于有道实现英汉字典功能

热门文章

  1. 揭开ESP8266神秘的面纱
  2. uniapp车牌号组件
  3. python调用htk工具箱_HTK学习笔记(一)在win32(win7)下安装HTK详细体验教程
  4. Ubuntu系统下查看摄像头参数并基于OpenCV调用
  5. Oracle Drop误删表、Delete误删表数据后恢复方法
  6. heidisql linux 安装_CentOS mysql GUI图形化数据库管理工具Heidisql的安装Navicat
  7. Contiki入门学习【摘录】
  8. contiki学习笔记03
  9. 【掘金小报】第十二期 一起来做个微信群管理机器人
  10. Python 3.0中ACCESS学习(三) 打开记录集并输出数据