3D视觉(二)四元数简要说明
来源:互联网 发布:caffe cn 编辑:程序博客网 时间:2024/05/20 10:13
在知乎里有个帖子叫:如何形象地理解四元数? 本篇简要说说~_~
四元数的历史来源:
爱尔兰数学家Hamilton有段时间致力于寻求一种将复数从2D转换到3D中的方法,苦思不得,有一次在去演讲的路上,突发灵感,将复数引入三个虚部,并将定义这种新的复数类型的等式写在了Broome桥上(一座桥因为一个人成名的典型例子),等式如下:
什么是四元数:
四元数本质上是一种在四维空间高阶复数,一般复数为二维空间。四元数的虚部包含了三个虚数单位:i、j、k,即一个四元数可以表示为:
x = a + bi + cj + dk。
由于i,j,k的性质和笛卡尔坐标系三个轴叉乘的性质很像,所以可以将四元数写成一个向量和一个实数组合的形式:
四元数的运算性质包括:
四元数的点积
∗
四元数与欧拉角、旋转矩阵:
既然四元数被创造出来了,那它一定是用来解决实际问题的,否则数学家岂不是被人怼吃饱了没事干吗?其中,四元数的应用之一就是解决3D视觉中的旋转问题。
旋转的表示方法有:矩阵旋转法和欧拉角旋转法。其中矩阵旋转是使用了一个4*4大小的矩阵来表示绕任意轴旋转的变换矩阵,而欧拉角方法是按照一定的坐标轴顺序(例如先x、后y、最后z)、每个轴旋转一定角度来变换坐标或向量。那为什么还需要四元数呢?肯定现有的方法有不足呗。。。
旋转矩阵:
旋转矩阵乘以点P的齐次坐标,得到旋转后的点P',因此旋转矩阵可以描述旋转,
绕x,y,或z轴旋转θ的矩阵为:
- 优点:旋转轴可以是任意向量;
- 缺点:
- 旋转其实只需要知道一个向量+一个角度信息,但矩阵法却使用了16个元素;
- 做乘法操作时会增加计算量,造成了空间和时间上的浪费;
欧拉角旋转
欧拉角也可以描述三维刚体旋转,它将刚体绕过原点的轴(i,j,k)旋转θ,分解成三步(蓝色是起始坐标系,而红色的是旋转之后的坐标系。)。
1. 绕z轴旋转α,使x轴与N轴重合,N轴是旋转前后两个坐标系x-y平面的交线
2. 绕x轴(也就是N轴)旋转β,使z轴与旋转后的z轴重合
3. 绕z轴旋转γ,使坐标系与旋转后的完全重合
按照旋转轴的顺序,该组欧拉角被称为是“zxz顺规”的。对于顺规的次序,学术界没有明确的约定。
欧拉角的旋转矩阵为:
- 优点:
- 很容易理解,形象直观;
- 表示方便,只需要3个对应x、y、z轴的旋转角度值;
- 缺点:
- 按照一个固定的坐标轴的顺序旋转,不同的顺序会造成不同的结果;
- 会造成万向节锁(Gimbal Lock)的现象。这种现象的发生就是由于上述固定坐标轴旋转顺序造成的。理论上,欧拉旋转可以靠这种顺序让一个物体指到任何一个想要的方向,但如果在旋转中不幸让某些坐标轴重合就会发生万向节锁,这时就会丢失一个方向上的旋转能力,也就是说在这种状态下我们无论怎么旋转都不可能得到某些想要的旋转效果。这里有个视频可以直观的理解下,或者参见:http://www.ceeger.com/Unity/Doc/2011/Gimbal_Lock.html
- 由于万向节锁的存在,欧拉旋转无法实现球面平滑插值;
四元数旋转:
四元数可用来刻画三维空间中的旋转,例如坐标系中的点p(P,0)(写成四元数的形式)绕单位向量(x,y,z)表示的轴旋转θ:
旋转后的坐标p'为:
具体推导可以查看参考1,2,4。
另外,在参考5里给出了C++的四元数类实现。
参考:
- https://www.3dgep.com/understanding-quaternions/ (英文版)
- http://www.qiujiawei.com/understanding-quaternions/ (中文译文)
- http://blog.csdn.net/silangquan/article/details/50390570 (C++四元数类)
- http://blog.csdn.net/youngpan1101/article/details/71086851
- http://www.mi2think.com/2017/01/%E6%88%91%E6%89%80%E7%90%86%E8%A7%A3%E7%9A%84%E5%9B%9B%E5%85%83%E6%95%B01/
- 3D视觉(二)四元数简要说明
- JMS入门(二)Chat示例简要说明
- 3D计算机视觉
- Tuxedo 的配置管理简要说明(二)
- 简要说明python的一些基本知识(二)
- k-d树查询算法的简要说明:
- 视觉里程计(二)
- 计算机视觉(二)
- 3D视觉原理之深度暗示(即立体感)
- 学习-机器视觉(3D采集重建)
- 3D视觉原理之深度暗示(即立体感)
- 德州仪器(TI)3D机器视觉参考设计
- 3D视觉(一)三维数学基础教程和SLAM
- 3D视觉(三)刚体运动及matlab实现
- 3D视觉摄像机标定(张氏标定法)
- 操作系统简要笔记(二)
- mysql数据库简要(二)
- iOS开发-3D Touch简要总结
- BlockingQueue在任务调度中的精彩应用
- 【HDU 6217 2017ACM/ICPC亚洲区沈阳站】BBP Formula
- Windows下安装TensorFlow快速教程
- 栈的动态实现
- Unity3D -Queue的简单实用
- 3D视觉(二)四元数简要说明
- largest-rectangle-in-histogram Java code
- Mybatis基于注解形式的sql语句生成
- HTML5新特性-时间表示
- 多个模式合作
- Java作业-三角形判断(异常处理)
- 【HDU 6227 2017ACM/ICPC亚洲区沈阳站】Rabbits
- A Fine Match
- Xss攻击与防止