技术标签: 四元数转换为旋转矩阵 数据科学--算法 旋转矩阵 旋转矩阵转换为四元数 计算机视觉 四元数 数据科学--数学基础 opencv 欧拉角
author@jason_ql(lql0716)
http://blog.csdn.net/lql0716
旋转矩阵、欧拉角、四元数主要用于表示坐标系中的旋转关系,它们之间的转换关系可以减小一些算法的复杂度。
本文主要介绍了旋转矩阵、欧拉角、四元数的基本理论及其之间的转换关系。
注:旋转矩阵为正交矩阵 RRT=E R R T = E
欧拉角
。
欧拉角有两种:
静态
:即绕世界坐标系三个轴的旋转,由于物体旋转过程中坐标轴保持静止,所以称为静态。
动态
:即绕物体坐标系三个轴的旋转,由于物体旋转过程中坐标轴随着物体做相同的转动,所以称为动态。
使用动态欧拉角会出现万向锁现象;静态欧拉角不存在万向锁的问题。
对于在三维空间里的一个参考系,任何坐标系的取向,都可以用三个欧拉角来表现。参考系又称为实验室参考系,是静止不动的。而坐标系则固定于刚体,随着刚体的旋转而旋转。
如图1,设定xyz-轴为参考系的参考轴。称xy-平面与XY-平面的相交为交点线,用英文字母(N)代表。zxz顺规的欧拉角可以静态地这样定义:
α α 是x-轴与交点线的夹角,
β β 是z-轴与Z-轴的夹角,
γ γ 是交点线与X-轴的夹角。
图1:
图中三个欧拉角分别为: (α,β,γ) ( α , β , γ ) ;
蓝色的轴为: xyz轴 x y z 轴
红色的轴为: XYZ X Y Z 轴
绿色的线为交线: N N
很可惜地,对于夹角的顺序和标记,夹角的两个轴的指定,并没有任何常规。科学家对此从未达成共识。每当用到欧拉角时,我们必须明确的表示出夹角的顺序,指定其参考轴。
实际上,有许多方法可以设定两个坐标系的相对取向。欧拉角方法只是其中的一种。此外,不同的作者会用不同组合的欧拉角来描述,或用不同的名字表示同样的欧拉角。因此,使用欧拉角前,必须先做好明确的定义。
欧拉角的基本思想是将角位移分解为绕三个互相垂直轴的三个旋转组成的序列。所以,欧拉旋转的三个角,可以对应于三个旋转矩阵。
Yaw(偏航):欧拉角向量的y轴
Pitch(俯仰):欧拉角向量的x轴
Roll(翻滚): 欧拉角向量的z轴
Unity3D中,欧拉旋转是按照ZYX的顺序旋转的。(不同的旋转顺序最终得到的结果是不一样的,要引起重视。给定一组欧拉角角度值,比如yaw=45度,pitch=30度,roll=60度,按照yaw-pitch-roll的顺序旋转和按照yaw-roll-pitch的顺序旋转,最终刚体的朝向是不同的!换言之,若刚体需要按照两种不同的旋转顺序旋转到相同的朝向,所需要的欧拉角角度值则是不同的!)
欧拉角的缺点:
1、 欧拉角的表示方式不唯一。给定某个起始朝向和目标朝向,即使给定yaw、pitch、roll的顺序,也可以通过不同的yaw/pitch/roll的角度组合来表示所需的旋转。这其实主要是由于万向锁(Gimbal Lock)引起的;
2、欧拉角的插值比较难;
3、计算旋转变换时,一般需要转换成旋转矩阵,这时候需要计算很多sin, cos,计算量较大;
设三个轴x,y,z的欧拉角分别为 θx,θy,θz θ x , θ y , θ z ,正弦值、余弦值分别为 sx,cx,sy,cy,sz,cz s x , c x , s y , c y , s z , c z 那么旋转矩阵为:
解方程可得:
注:atan2()为C++中的函数,atan2(y,x) 求的是y/x的反正切,其返回值为[-pi,+pi]之间的一个数。
四元数(Quaternions)是由爱尔兰数学家哈密顿(William Rowan Hamilton)在1843年提出。
三维空间的任意旋转,都可以用绕三维空间的某个轴旋转过某个角度来表示,即所谓的Axis-Angle表示方法。这种表示方法里,Axis可用一个三维向量 (x,y,z) ( x , y , z ) 来表示, θ θ 可以用一个角度值来表示,直观来讲,一个四维向量 (θ,x,y,z) ( θ , x , y , z ) 就可以表示出三维空间任意的旋转。注意,这里的三维向量 (x,y,z) ( x , y , z ) 只是用来表示axis的方向朝向,因此更紧凑的表示方式是用一个单位向量来表示方向axis,而用该三维向量的长度来表示角度值 θ θ 。这样以来,可以用一个三维向量 (θ∗x,θ∗y,θ∗z) ( θ ∗ x , θ ∗ y , θ ∗ z ) 就可以表示出三维空间任意的旋转,前提是其中 (x,y,z) ( x , y , z ) 是单位向量。这就是旋转向量(Rotation Vector)的表示方式,OpenCV里大量使用的就是这种表示方法来表示旋转(见OpenCV相机标定部分的rvec)。
单位向量 (x,y,z) ( x , y , z ) 旋转 θ θ 角度后的四元数:
(cosθ2,x∗sinθ2,y∗sinθ2,z∗sinθ2) ( c o s θ 2 , x ∗ s i n θ 2 , y ∗ s i n θ 2 , z ∗ s i n θ 2 )
对于三维坐标的旋转,可以通过四元数乘法直接操作,与旋转矩阵操作可以等价,但是表示方式更加紧凑,计算量也可以小一些。
四元数的复数定义:
q=q0+q1i+q2j+q3k=[s,v] q = q 0 + q 1 i + q 2 j + q 3 k = [ s , v ]
- 其中 q0,q1,q2,q3 q 0 , q 1 , q 2 , q 3 均为实数, s=q0,v=[q1,q2,q3] s = q 0 , v = [ q 1 , q 2 , q 3 ] , i2=j2=k2=−1 i 2 = j 2 = k 2 = − 1
- 对于 i,j,k i , j , k 本身的几何意义可以理解为一种旋转,其中 i i 代表 轴与 y y 轴相交平面中 轴正向向 y y 轴正向的旋转, 旋转代表 z z 轴与 轴相交平面中 z z 轴正向向 轴正向的旋转, k k 旋转代表 轴与 z z 轴相交平面中 轴正向向 z z 轴正向的旋转, 分别代表 i,j,k i , j , k 的反向旋转。
四元数的模
|q|=q20+q21+q22+q23−−−−−−−−−−−−−−√ | q | = q 0 2 + q 1 2 + q 2 2 + q 3 2
四元数的优点:
- 非奇异表达(和欧拉角之类的表示相比)
- 比矩阵更紧凑(更快速)
- 单位四元数的对可以表示四维空间中的一个旋转
四元数与群
所有单位四元数的集合组成一个三维球S3和在乘法下的一个群(李群)。S3是行列式为1的实正交3x3正交矩阵的群SO(3,R)的双面覆盖,因为每两个单位四元数通过上述关系对应于一个转动。群S3和SU(2)同构,SU(2)是行列式为1的复酉2x2矩阵的群。
设 A={ q=q0+q1i+q2j+q3k|q0,q1,q2,q3均为实数} A = { q = q 0 + q 1 i + q 2 j + q 3 k | q 0 , q 1 , q 2 , q 3 均 为 实 数 } ,则 A A 是一个环,并且是一个格, 中存在24个四元数,而它们是施莱夫利符号为 { 3,4,3} { 3 , 4 , 3 } 的正二十四胞体的顶点。
四元数的运算:
p1=[s1,v1]=(a1b1c1d1)T p 1 = [ s 1 , v 1 ] = ( a 1 b 1 c 1 d 1 ) T
p2=[s2,v2]=(a2b2c2d2)T p 2 = [ s 2 , v 2 ] = ( a 2 b 2 c 2 d 2 ) T
- 四元数的加法
p1+p2=s1+s2+v1+v2=(a1+a2)+(b1+b2)i+(c1+c2)j+(d1+d2)k p 1 + p 2 = s 1 + s 2 + v 1 + v 2 = ( a 1 + a 2 ) + ( b 1 + b 2 ) i + ( c 1 + c 2 ) j + ( d 1 + d 2 ) k
- 四元数的乘法
p1p2=s1s2−v1v2+s1v2+s2v1+v1×v2 p 1 p 2 = s 1 s 2 − v 1 v 2 + s 1 v 2 + s 2 v 1 + v 1 × v 2
p1p2=⎛⎝⎜⎜⎜a1a2−b1b2−c1c2−d1d2a1b2+b1a2+c1d2−d1c2a1c2−b1d2+c1a2+d1b2a1d2+b1c2−c1b2+d1a2⎞⎠⎟⎟⎟ p 1 p 2 = ( a 1 a 2 − b 1 b 2 − c 1 c 2 − d 1 d 2 a 1 b 2 + b 1 a 2 + c 1 d 2 − d 1 c 2 a 1 c 2 − b 1 d 2 + c 1 a 2 + d 1 b 2 a 1 d 2 + b 1 c 2 − c 1 b 2 + d 1 a 2 )注:四元数不满足交换律,故 p1p2≠p2p1 p 1 p 2 ≠ p 2 p 1 ,四元数的乘法不等同于外积。
- 四元数的点积(内积)
点积也叫欧几里得内积,四元数的点积等同于一个四维向量的点积。点积的值是 p1,p2 p 1 , p 2 中相应元素的数值的乘积的和。
p1⋅p2=s1s2+v1⋅v2=a1a2+b1b2+c1c2+d1d2 p 1 ⋅ p 2 = s 1 s 2 + v 1 ⋅ v 2 = a 1 a 2 + b 1 b 2 + c 1 c 2 + d 1 d 2
四元数的外积: Outer(p1,p2) O u t e r ( p 1 , p 2 )
四元数的偶积: Even(p1,p2) E v e n ( p 1 , p 2 )
四元数的叉积: p1×p2 p 1 × p 2
p1×p2=p1p2−p2p22 p 1 × p 2 = p 1 p 2 − p 2 p 2 2
p1×p2=v1×v2 p 1 × p 2 = v 1 × v 2
p1×p2=(c1d2−c2d1)i+(b1d2−b2d1)j+(b1c2−b2c1)k p 1 × p 2 = ( c 1 d 2 − c 2 d 1 ) i + ( b 1 d 2 − b 2 d 1 ) j + ( b 1 c 2 − b 2 c 1 ) k
- 四元数的共轭 q∗ q ∗
q∗=s−v=[s,−v] q ∗ = s − v = [ s , − v ]
qq∗=q20+q21+q22+q23 q q ∗ = q 0 2 + q 1 2 + q 2 2 + q 3 2
- 四元数的逆 q−1 q − 1
qq−1=q−1q=1 q q − 1 = q − 1 q = 1
q−1=q∗||q||2 q − 1 = q ∗ | | q | | 2
- 单位四元数
单位四元数的共轭和逆相等 q−1=q∗ q − 1 = q ∗
四元数乘法的性质:
1、满足结合律
2、不满足交换律
3、乘积的模等于模的乘积
4、乘积的逆等于各个四元数的逆以相反的顺序相乘
方法1:
已知四元数
q=q0+q1i+q2j+q3k=[s,v] q = q 0 + q 1 i + q 2 j + q 3 k = [ s , v ]利用Rodrigues公式可以由四元数求得旋转矩阵 R R :
方法2:
亦可以将四元数转化为轴角 θ θ 与向量 (x,y,z) ( x , y , z ) ,然后再计算旋转矩阵(这样需要多计算一个arccos,不划算)
q=(θxyz)T q = ( θ x y z ) T利用Rodrigues公式可以由单位向量 ω=(x,y,z) ω = ( x , y , z ) 旋转 θ θ 角度后的四元数求得旋转矩阵 R R :
R=⎡⎣⎢cosθ+x2(1−cosθ)zsinθ+xy(1−cosθ)−ysinθ+xz(1−cosθ)−zsinθ+xy(1−cosθ)cosθ+y2(1−cosθ)xsinθ+yz(1−cosθ)ysinθ+xz(1−cosθ)−xsinθ+yz(1−cosθ)cosθ+z2(1−cosθ)⎤⎦⎥ R = [ c o s θ + x 2 ( 1 − c o s θ ) − z s i n θ + x y ( 1 − c o s θ ) y s i n θ + x z ( 1 − c o s θ ) z s i n θ + x y ( 1 − c o s θ ) c o s θ + y 2 ( 1 − c o s θ ) − x s i n θ + y z ( 1 − c o s θ ) − y s i n θ + x z ( 1 − c o s θ ) x s i n θ + y z ( 1 − c o s θ ) c o s θ + z 2 ( 1 − c o s θ ) ]
情况1:
q0=1+r11+r22+r33−−−−−−−−−−−−−−√2 q 0 = 1 + r 11 + r 22 + r 33 2
q1=r32−r234q0 q 1 = r 32 − r 23 4 q 0
q2=r13−r314q0 q 2 = r 13 − r 31 4 q 0
q3=r21−r124q0 q 3 = r 21 − r 12 4 q 0其中要满足 q0≠0 q 0 ≠ 0 , 1+r11+r22+r33>0 1 + r 11 + r 22 + r 33 > 0 ,即 1+tr(R)>0 1 + t r ( R ) > 0
情况2:
如果 q0 q 0 趋近于0, tr(R) t r ( R ) 趋近于-1,则求解四元数的过程为:
2.1 如果 max{ r11,r22,r33}=r11 m a x { r 11 , r 22 , r 33 } = r 11
t=1+r11−r22−r33−−−−−−−−−−−−−−−√ t = 1 + r 1 1 − r 22 − r 33
q0=r32−r23t q 0 = r 32 − r 23 t
q1=t/4 q 1 = t / 4
q2=r13+r31t q 2 = r 13 + r 31 t
q3=r12+r21t q 3 = r 12 + r 21 t
2.2 如果 max{ r11,r22,r33}=r22 m a x { r 11 , r 22 , r 33 } = r 22
t=1−r11+r22−r33−−−−−−−−−−−−−−−√ t = 1 − r 1 1 + r 22 − r 33
q0=r13−r31t q 0 = r 13 − r 31 t
q1=r12+r21t q 1 = r 12 + r 21 t
q2=t/4 q 2 = t / 4
q3=r32+r23t q 3 = r 32 + r 23 t
2.3 如果 max{ r11,r22,r33}=r33 m a x { r 11 , r 22 , r 33 } = r 33
t=1−r11−r22+r33−−−−−−−−−−−−−−−√ t = 1 − r 1 1 − r 22 + r 33
q0=r21−r12t q 0 = r 21 − r 12 t
q1=r13+r31t q 1 = r 13 + r 31 t
q2=r23−r32t q 2 = r 23 − r 32 t
q3=t/4 q 3 = t / 4
文章浏览阅读343次。五种原始的变量类型1.Undefined--未定义类型 例:var v;2.String -- ' '或" "3.Boolean4.Number5.Null--空类型 例: var v=null;Number中:NaN -- not a number非数本身是一个数字,但是它和任何数字都不相等,代表非数,它和自己都不相等判断是不是NaN不能用=_curry函数未定义
文章浏览阅读1.2w次,点赞2次,收藏17次。兑换码编码设计当前各个业务系统,只要涉及到产品销售,就离不开大大小小的运营活动需求,其中最普遍的就是兑换码需求,无论是线下活动或者是线上活动,都能起到良好的宣传效果。兑换码:由一系列字符组成,每一个兑换码对应系统中的一组信息,可以是优惠信息(优惠券),也可以是相关奖品信息。在实际的运营活动中,要求兑换码是唯一的,每一个兑换码对应一个优惠信息,而且需求量往往比较大(实际上的需求只有预期_优惠券编码规则
文章浏览阅读45次。C语言程序设计实训教程教学课件作者周林ch04结构化程序设计课件.ppt* * 4.1 选择结构程序设计 4.2 循环结构程序设计 4.3 辅助控制语句 第四章 结构化程序设计 4.1 选择结构程序设计 在现实生活中,需要进行判断和选择的情况是很多的: 如果你在家,我去拜访你 如果考试不及格,要补考 如果遇到红灯,要停车等待 第四章 结构化程序设计 在现实生活中,需要进行判断和选择的情况..._在现实生活中遇到过条件判断的问
文章浏览阅读999次。幻数使用说明 在驱动程序中实现的ioctl函数体内,实际上是有一个switch{case}结构,每一个case对应一个命令码,做出一些相应的操作。怎么实现这些操作,这是每一个程序员自己的事情。 因为设备都是特定的,这里也没法说。关键在于怎样组织命令码,因为在ioctl中命令码是唯一联系用户程序命令和驱动程序支持的途径 。 命令码的组织是有一些讲究的,因为我们一定要做到命令和设备是一一对应的,利_ioctl-number.txt幻数说明
文章浏览阅读399次。键盘按下“Shift+Ctrl+p” 输入: C++Configurations,选择JSON界面做如下改动:1.首先把 “/usr/include”,放在最前2.查看C++路径,终端输入gcc -v -E -x c++ - /usr/include/c++/5 /usr/include/x86_64-linux-gnu/c++/5 /usr/include/c++/5/backward /usr/lib/gcc/x86_64-linux-gnu/5/include /usr/local/_orb-slam3 include 报错
文章浏览阅读129次。本系列的最后一篇,因未有精力写更多的入门教程,上篇已经抛出书单,有兴趣的朋友可阅读好书来成长,此系列主讲有理由爱Sqlserver的论证性文章,希望读者们看完后,可自行做出判断,Sqlserver是否真的合适自己,目的已达成。渴望自动化及使用场景笔者所最能接触到的群体为Excel、PowerBI用户群体,在Excel中,我们知道可以使用VBA、VSTO来给Excel带来自动化操作..._sqlsever 数据分析
文章浏览阅读294次,点赞6次,收藏4次。教育智脑)建立学校的全连接中台,对学校运营过程中的数据进行处理和标准化管理,挖掘数据的价值。能:一、原先孤立的系统聚合到一个统一的平台,实现单点登录,统一身份认证,方便管理;三、数据共享,盘活了教育大数据资源,通过对外提供数。的方式构建教育的通用服务能力平台,支撑教育核心服务能力的沉淀和共享。物联网将学校的各要素(人、机、料、法、环、测)全面互联,数据实时。智慧校园解决方案,赋能教学、管理和服务升级,智慧教育体系,该数据平台具有以下几大功。教育大数据平台底座:教育智脑。教育大数据平台,以中国联通。_高校智慧大脑
文章浏览阅读9.5k次,点赞2次,收藏27次。分治法,动态规划法,贪心算法这三者之间有类似之处,比如都需要将问题划分为一个个子问题,然后通过解决这些子问题来解决最终问题。但其实这三者之间的区别还是蛮大的。贪心是则可看成是链式结构回溯和分支界限为穷举式的搜索,其思想的差异是深度优先和广度优先一:分治算法一、基本概念在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两_算法概念实例
文章浏览阅读5.6k次。考研篇emmmmm,这是我随笔篇章的第二更,原本计划是在中秋放假期间写好的,但是放假的时候被安排写一下单例模式,做了俩机试题目,还刷了下PAT的东西,emmmmm,最主要的还是因为我浪的很开心,没空出时间来写写东西。 距离我考研结束已经快两年了,距离今年的考研还有90天左右。 趁着这个机会回忆一下青春,这一篇会写的比较有趣,好玩,纯粹是为了记录一下当年考研中发生的有趣的事。 首先介绍..._考研调剂抑郁
文章浏览阅读438次。SpringMVC文章目录SpringMVC1、SpringMVC简介1.1 什么是MVC1.2 什么是SpringMVC1.3 SpringMVC的特点2、HelloWorld2.1 开发环境2.2 创建maven工程a>添加web模块b>打包方式:warc>引入依赖2.3 配置web.xml2.4 创建请求控制器2.5 创建SpringMVC的配置文件2.6 测试Helloworld2.7 总结3、@RequestMapping注解3.1 @RequestMapping注解的功能3._class org.springframework.web.filter.characterencodingfilter is not a jakart
文章浏览阅读4.9k次。gdb 远程调试的一个问题:Don't know how to run. Try "help target".它在抱怨不知道怎么跑,目标是什么. 你需要为它指定target remote 或target extended-remote例如:target extended-remote 192.168.1.136:1234指明target 是某IP的某端口完整示例如下:targ..._don't know how to run. try "help target".
文章浏览阅读85次。习题 11、算法描述主要是用两种基本方法:第一是自然语言描述,第二是使用专用工具进行算法描述2、c 语言程序的结构如下:1、c 语言程序由函数组成,每个程序必须具有一个 main 函数作为程序的主控函数。2、“/*“与“*/“之间的内容构成 c 语言程序的注释部分。3、用预处理命令#include 可以包含有关文件的信息。4、大小写字母在 c 语言中是有区别的。5、除 main 函数和标准库函数以..._c语言语法0x1e