三维重建面试3:旋转矩阵-病态矩阵、欧拉角-万向锁、四元数
摘抄部分有意思的链接,如有不适,请移步原文。
参考知乎上的文章链接:如何形象地理解四元数?
四元数由汉密尔顿发明,这一发明起源于十九世纪的某一天。在这一天早上,汉密尔顿下楼吃早饭。这时他的儿子问他,“爸爸,我们能够对三元数组(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:旋转矩阵-病态矩阵、欧拉角-万向锁、四元数相关推荐
- 旋转矩阵|万向锁|四元数
文章目录 旋转公式 2D 3D 万向锁 四元数 3D旋转公式 Reference 旋转公式 2D 矩阵形式 v′=[cos(θ)−sin(θ)sin(θ)cos(θ)]vv' = \begin{bma ...
- 三维重建3:旋转矩阵-病态矩阵、欧拉角-万向锁、四元数
摘抄部分有意思的链接,如有不适,请移步原文. 参考知乎上的文章链接:如何形象地理解四元数? :一个详尽的可作为教程的翻译:理解四元数的中文翻译... : 英文原文:http://www.3dgep. ...
- 旋转矩阵欧拉角万向锁详解
物体的姿态描述 物体的姿态可由固定于此物体的坐标系描述,为了规定空间某刚体B的姿态,设置一直角坐标系{B}与此刚体固接.用坐标系{B}的三个单位主矢量{Xb,Yb,Zb}相对于参考坐标系{A}的方向余 ...
- unity 旋转欧拉角 万向锁 解释
万向锁 一直困惑我很久....原因出在这里,我以为欧拉角旋转是以模型坐标(齐次坐标系)为旋转轴.问题就来了,无论旋转那个轴,其它两个轴也会相应的变化,下面看图: 根据上面的说明两个旋转面(圆圈)怎么会 ...
- 【OpenGL_02】欧拉角、万向锁、四元数
文章目录 欧拉角 万向锁 四元数 四元数的矩阵乘法及其可易性 蜕变矩阵 四元数的矩阵乘法 欧拉角 引用博客欧拉角与旋转矩阵的转换关系 欧拉角就是我们日常生活中常用的表示旋转的三维向量的乘积. 在Uni ...
- 车辆姿态表达:旋转矩阵、欧拉角、四元数的转换以及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. ...
- 万向锁的理解 欧拉角 四元数
1 欧拉角&万向锁 欧拉角和万向锁 视频资料理解万向锁 核心是嵌套 以一个三自由度的机械臂为例,三个旋转轴互相垂直,相当于x,y,z轴 三个机械臂通过旋转关节依次串联,定义第一个关节旋转轴为J ...
- 旋转矩阵、欧拉角、万向锁详解
旋转矩阵.欧拉角.万向锁详解 一:物体的姿态描述 物体的姿态可由固定于此物体的坐标系描述,为了规定空间某刚体B的姿态,设置一直角坐标系{B}与此刚体固接.用坐标系{B}的三个单位主矢量{Xb,Yb,Z ...
- 旋转矩阵、欧拉角,万向锁的危害
1. 万向锁会带来什么危害? 最近看了很多万向锁的文章,大家都集中于讲述万向锁的成因,最后都会加上句"导致缺失一个方向的自由度",但是万向锁现象到底会给实际工作带来什么问题?具体点 ...
最新文章
- Delphi 之Copyrect的使用
- SAP MM ME21N 创建PO时报错 - Net price in CNY becomes too large – 之原因分析
- python中 是什么类型_浅谈python中的变量默认是什么类型
- M-JPEG、MPEG4、H.264都有何区别 依维安防论坛
- HTTP最常见的请求头
- 完美的xslt数值函数与字符串函数
- spring处理循环依赖时序图_spring--解决循环依赖
- 中国顶级程序员有多牛?一个弄哭韩国,一个堪称阿里“扫地僧”
- mongodb python 大于_菜鸟成长记--如何根据关键词爬取微博内容?(scrapy+mongodb)
- 别再为了this发愁了:JS中的this机制
- Java进阶之路,Java程序员职业发展规划
- 计算机一级中替换,08年计算机一级辅导:实战WPS转义符在查找替换中的应用
- HTML中背景图片如何自适应屏幕
- 4选1数据选择器程序及testbench文件,给出仿真波形,分析
- 细则从哈利·波特与来自您好麻雀船长
- PiaolinPlatformV2.0.0 - 获取手机或电脑GPS位置信息(定位平台)
- 一则软件需求有关的漫画
- 对HANA的认识与相关测试案例
- 启动Tomcat服务器报错
- python制作英汉词典_Python基于有道实现英汉字典功能
热门文章
- 揭开ESP8266神秘的面纱
- uniapp车牌号组件
- python调用htk工具箱_HTK学习笔记(一)在win32(win7)下安装HTK详细体验教程
- Ubuntu系统下查看摄像头参数并基于OpenCV调用
- Oracle Drop误删表、Delete误删表数据后恢复方法
- heidisql linux 安装_CentOS mysql GUI图形化数据库管理工具Heidisql的安装Navicat
- Contiki入门学习【摘录】
- contiki学习笔记03
- 【掘金小报】第十二期 一起来做个微信群管理机器人
- Python 3.0中ACCESS学习(三) 打开记录集并输出数据