欧拉角与四元数

四元数与旋转

一.四元组基础

Q(x,y,z,w),其中x,y,z用来确定旋转轴,w为旋转的角度

Q=w+xi+yj+zk,i,j,k为三个虚轴的单位分量

I*j=k

J*k=i;

K*i=j;

叉乘:

c=a × b=

| i j k|

|a1 b1 c1|

|a2 b2 c2|

=(b1c2-b2c1,c1a2-a1c2,a1b2-a2b1)

c也为一个向量,且c的长度为|a||b|sin(theta),垂直于a和b所在的平面,方向由右手法则来判定,用右手的四指先表示向量a的方向,然后手指朝着手心的方向摆动到向量b的方向,大拇指所指的方向就是向量c的方向

1. 四元组相乘:

Q1=w1+x1i+y1j+z1k=(w1,v1)

Q2=w2+x2i+y2j+z2k=(w2,v2)

Q1*Q2=(w1*w2-,w1*v2+w2*v1+v1xv2)

( w1+x1i+y1j+z1k)*( w2+x2i+y2j+z2k)

=w1*w2-x1*x2-y1*y2-z1*z2+

(W1*x2+x1*w2+y1*z2-z1-y2)i+

(y1*w2+w1*y2+z1*x2-x1*z2)j+

(w1*z2+z1*w2+x1*y2-y1*x2)k

对于其中的轴部分,假如v1//v2,则有v1 x v2=0(平行向量的叉乘结果为0)

2. 四元组的点乘,点乘积为数值:

Q1.*Q2=w1*w2+=w1*w2+x1*x2+y1*y2+z1*z2;

3. 数乘

s为一实数,q为四元组,则有sq=qs

4. 共轭

p=(w,v),则p*=(w,-v)

(pq)*=q*p*

N(q)=w2+x2+y2+z2

q-1=q*/N(q)---------------显然可得qq-1=(1,0)

二.使用四元数旋转向量

假如有一表示向量的四元组q=(w,v),对其应用旋转量p后的结果为:

q’=pqp-1=(w,v’)

从上可以看出,计算的结果q’的实部和q的实部是相等的,并且有N(v)=N(v’)

如果N(q)=1,则可以令q=(cosa,usina),u也为一个单位向量,则q’是q绕u旋转2a个弧度的结果

假如S(q)表示q的实部,则有2S(q)=q+q*

2S(pqp-1)= pqp-1+( pqp-1)*=pqp*+(pqp*)*=pqp*+pq*p*=p(q+q*)p*=2S(q)

(这里由于p是单位四元数,所以有p-1等于p*)

欧拉角到四元数的转换

定义pitch, yaw, roll分别为绕X轴、Y轴、Z轴的旋转弧度 float p = pitch * PIOVER180 / 2.0;

float y = yaw * PIOVER180 / 2.0;

float r = roll * PIOVER180 / 2.0;

float sinp = sin(p);

float siny = sin(y);

float sinr = sin(r);

float cosp = cos(p);

float cosy = cos(y);

float cosr = cos(r);

this->x = sinr * cosp * cosy - cosr * sinp * siny;

this->y = cosr * sinp * cosy + sinr * cosp * siny;

this->z = cosr * cosp * siny - sinr * sinp * cosy;

this->w = cosr * cosp * cosy + sinr * sinp * siny;

normalise();

三.使用matlab进行相关计算

计算两个向量v1和v2之间的旋转量四元数p,使得v1应用p后到达v2

假如v1转到v2的旋转轴为v,旋转角为theta,则q=[v*cos(theta/2) sin(theta/2)]

Matlab代码: function q=vector2q(v1,v2)

%..normalize....

len1=sqrt(v1*v1');

len2=sqrt(v2*v2');

v1=v1/len1;

v2=v2/len2;

angle=v1*v2';

axis=cross(v1,v2);

alen=sqrt(axis*axis');

axis=axis/alen;

t=acos(angle);

t=t/2;

q(1)=axis(1)*sin(t);

q(2)=axis(2)*sin(t);

q(3)=axis(3)*sin(t);

q(4)=cos(t);

end

计算出了q之后,可以获得对应的旋转矩阵,旋转矩阵的计算

Matlab里面的矩阵是以列为主顺序的

function r=q2rot(q)

w=q(4);

x=q(1);

y=q(2);

z=q(3);

r=zeros(3,3);

r(1,1)=1-2*y*y-2*z*z;

r(1,2)=2*x*y+2*w*z;

r(1,3)=2*x*z-2*w*y;

r(2,1)=2*x*y-2*w*z;

r(2,2)=1-2*x*x-2*z*z;

r(2,3)=2*z*y+2*w*x;

r(3,1)=2*x*z+2*w*y;

r(3,2)=2*y*z-2*w*x;

r(3,3)=1-2*x*x-2*y*y;

r=r';

end

同时,也可以根据四元数来计算欧拉角

function R=q2euler(q)

w=q(4);

x=q(1);

y=q(2);

z=q(3);

t11=2*(w*x+y*z);

t12=1-2*(x*x+y*y);

R(1)=atan2(t11,t12);

t2=2*(w*y-z*x);

R(2)=asin(t2);

t31=2*(w*z+x*y);

t32=1-2*(y*y+z*z);

R(3)=atan2(t31,t32);

end

计算出来的欧拉角rx,ry,rz,分别为绕X轴、Y轴和Z轴的旋转角,假如有:

Rotq=q2rot(q)

R=q2euler(q)

[rotx roty rotz]=Rotation(R)

可以发现Rotq==rotz*roty*rotx

从这里可以看出,上面使用四元数这样计算出来的旋转矩阵的旋转顺序分别是X轴、Y轴和Z轴的

ra=pi/4;

qz=[0 0 -sin(ra) cos(ra)] %绕z旋转-90度

qy=[0 sin(ra) 0 cos(ra) ] %绕y旋转90度

qyz=qmult(qy,qz)

r=q2euler(qyz)

上面的r得出的结果为

r = -1.5708 0.0000 -1.5708

也就是说其几何意义变成先绕X轴旋转-90度,再绕Z轴旋转-90度,而根据qy和qz的相乘我们实际

进行的操作却是先绕Z轴旋转-90度,再绕Y轴旋转90度,但是结果却是这两种操作等价,这说明由四元数到欧拉角可以有多个解

两个四元数,假如它们的方向是相反的,用它们作用于向量得到的新向量的值仍然相等 q1=[0.024666 -0.023954 0.504727 0.862594];

arm=[-8.881719 6.037597 -2.36776];

q2=-q1;

rot1=q2rot(q1);

rot2=q2rot(q2);

v1=rot1*arm'

v2=rot2*arm'

上面计算出来的v1等于v2

四元数的余弦值为它们的内积

假如余弦值小于0,则需要将其中的一个取反,因为上面我们知道一个四元数和它的反方向的四元数对一个向量起相同的作用

四元数的相乘,代表旋转的累积

pq=p*q;

rotp=q2rot(p);

rotq=q2rot(q);

rotpq=q2rot(pq);

rotmul=rotp*rotq;

这里rotpq与rotmul相等

四. OGRE中Quaternion类的几个函数

1. 四元数到旋转向量

2. 旋转量到四元数

根据1中的表格,有:

4 *(1-qx2-qy2-qz2) = 1 + m00 + m11 + m22

又qw2=1-qx2-qy2-qz2,可得

4 *qw2= 1 + m00 + m11 + m22

这里解qw必须保证1 + m00 + m11 + m22>=0,如果不是的话,就构造其他的等式来计算,OGRE中分成两种情况,一种是m00 + m11 + m22>=0,就可以直接先解出qw,否则的采用另外的等式计算

3.Local axis

Vector3 xAixs(void) const;

取得旋转矩阵的第一列,旋转矩阵和一个向量相乘的话,第一列的数据均和向量的x分量相乘

Vecotr3 yAxis(void) const;

取得旋转矩阵的第二列,旋转矩阵和一个向量相乘的话,第二列的数据均和向量的y分量相乘 Vecotr3 zAxis(void) const;

取得旋转矩阵的第三列,旋转矩阵和一个向量相乘的话,第三列的数据均和向量的z分量相乘

四元数与旋转

一.四元组基础

Q(x,y,z,w),其中x,y,z用来确定旋转轴,w为旋转的角度

Q=w+xi+yj+zk,i,j,k为三个虚轴的单位分量

I*j=k

J*k=i;

K*i=j;

叉乘:

c=a × b=

| i j k|

|a1 b1 c1|

|a2 b2 c2|

=(b1c2-b2c1,c1a2-a1c2,a1b2-a2b1)

c也为一个向量,且c的长度为|a||b|sin(theta),垂直于a和b所在的平面,方向由右手法则来判定,用右手的四指先表示向量a的方向,然后手指朝着手心的方向摆动到向量b的方向,大拇指所指的方向就是向量c的方向

1. 四元组相乘:

Q1=w1+x1i+y1j+z1k=(w1,v1)

Q2=w2+x2i+y2j+z2k=(w2,v2)

Q1*Q2=(w1*w2-,w1*v2+w2*v1+v1xv2)

( w1+x1i+y1j+z1k)*( w2+x2i+y2j+z2k)

=w1*w2-x1*x2-y1*y2-z1*z2+

(W1*x2+x1*w2+y1*z2-z1-y2)i+

(y1*w2+w1*y2+z1*x2-x1*z2)j+

(w1*z2+z1*w2+x1*y2-y1*x2)k

对于其中的轴部分,假如v1//v2,则有v1 x v2=0(平行向量的叉乘结果为0)

2. 四元组的点乘,点乘积为数值:

Q1.*Q2=w1*w2+=w1*w2+x1*x2+y1*y2+z1*z2;

3. 数乘

s为一实数,q为四元组,则有sq=qs

4. 共轭

p=(w,v),则p*=(w,-v)

(pq)*=q*p*

N(q)=w2+x2+y2+z2

q-1=q*/N(q)---------------显然可得qq-1=(1,0)

二.使用四元数旋转向量

假如有一表示向量的四元组q=(w,v),对其应用旋转量p后的结果为:

q’=pqp-1=(w,v’)

从上可以看出,计算的结果q’的实部和q的实部是相等的,并且有N(v)=N(v’)

如果N(q)=1,则可以令q=(cosa,usina),u也为一个单位向量,则q’是q绕u旋转2a个弧度的结果

假如S(q)表示q的实部,则有2S(q)=q+q*

2S(pqp-1)= pqp-1+( pqp-1)*=pqp*+(pqp*)*=pqp*+pq*p*=p(q+q*)p*=2S(q)

(这里由于p是单位四元数,所以有p-1等于p*)

欧拉角到四元数的转换

定义pitch, yaw, roll分别为绕X轴、Y轴、Z轴的旋转弧度 float p = pitch * PIOVER180 / 2.0;

float y = yaw * PIOVER180 / 2.0;

float r = roll * PIOVER180 / 2.0;

float sinp = sin(p);

float siny = sin(y);

float sinr = sin(r);

float cosp = cos(p);

float cosy = cos(y);

float cosr = cos(r);

this->x = sinr * cosp * cosy - cosr * sinp * siny;

this->y = cosr * sinp * cosy + sinr * cosp * siny;

this->z = cosr * cosp * siny - sinr * sinp * cosy;

this->w = cosr * cosp * cosy + sinr * sinp * siny;

normalise();

三.使用matlab进行相关计算

计算两个向量v1和v2之间的旋转量四元数p,使得v1应用p后到达v2

假如v1转到v2的旋转轴为v,旋转角为theta,则q=[v*cos(theta/2) sin(theta/2)]

Matlab代码: function q=vector2q(v1,v2)

%..normalize....

len1=sqrt(v1*v1');

len2=sqrt(v2*v2');

v1=v1/len1;

v2=v2/len2;

angle=v1*v2';

axis=cross(v1,v2);

alen=sqrt(axis*axis');

axis=axis/alen;

t=acos(angle);

t=t/2;

q(1)=axis(1)*sin(t);

q(2)=axis(2)*sin(t);

q(3)=axis(3)*sin(t);

q(4)=cos(t);

end

计算出了q之后,可以获得对应的旋转矩阵,旋转矩阵的计算

Matlab里面的矩阵是以列为主顺序的

function r=q2rot(q)

w=q(4);

x=q(1);

y=q(2);

z=q(3);

r=zeros(3,3);

r(1,1)=1-2*y*y-2*z*z;

r(1,2)=2*x*y+2*w*z;

r(1,3)=2*x*z-2*w*y;

r(2,1)=2*x*y-2*w*z;

r(2,2)=1-2*x*x-2*z*z;

r(2,3)=2*z*y+2*w*x;

r(3,1)=2*x*z+2*w*y;

r(3,2)=2*y*z-2*w*x;

r(3,3)=1-2*x*x-2*y*y;

r=r';

end

同时,也可以根据四元数来计算欧拉角

function R=q2euler(q)

w=q(4);

x=q(1);

y=q(2);

z=q(3);

t11=2*(w*x+y*z);

t12=1-2*(x*x+y*y);

R(1)=atan2(t11,t12);

t2=2*(w*y-z*x);

R(2)=asin(t2);

t31=2*(w*z+x*y);

t32=1-2*(y*y+z*z);

R(3)=atan2(t31,t32);

end

计算出来的欧拉角rx,ry,rz,分别为绕X轴、Y轴和Z轴的旋转角,假如有:

Rotq=q2rot(q)

R=q2euler(q)

[rotx roty rotz]=Rotation(R)

可以发现Rotq==rotz*roty*rotx

从这里可以看出,上面使用四元数这样计算出来的旋转矩阵的旋转顺序分别是X轴、Y轴和Z轴的

ra=pi/4;

qz=[0 0 -sin(ra) cos(ra)] %绕z旋转-90度

qy=[0 sin(ra) 0 cos(ra) ] %绕y旋转90度

qyz=qmult(qy,qz)

r=q2euler(qyz)

上面的r得出的结果为

r = -1.5708 0.0000 -1.5708

也就是说其几何意义变成先绕X轴旋转-90度,再绕Z轴旋转-90度,而根据qy和qz的相乘我们实际

进行的操作却是先绕Z轴旋转-90度,再绕Y轴旋转90度,但是结果却是这两种操作等价,这说明由四元数到欧拉角可以有多个解

两个四元数,假如它们的方向是相反的,用它们作用于向量得到的新向量的值仍然相等 q1=[0.024666 -0.023954 0.504727 0.862594];

arm=[-8.881719 6.037597 -2.36776];

q2=-q1;

rot1=q2rot(q1);

rot2=q2rot(q2);

v1=rot1*arm'

v2=rot2*arm'

上面计算出来的v1等于v2

四元数的余弦值为它们的内积

假如余弦值小于0,则需要将其中的一个取反,因为上面我们知道一个四元数和它的反方向的四元数对一个向量起相同的作用

四元数的相乘,代表旋转的累积

pq=p*q;

rotp=q2rot(p);

rotq=q2rot(q);

rotpq=q2rot(pq);

rotmul=rotp*rotq;

这里rotpq与rotmul相等

四. OGRE中Quaternion类的几个函数

1. 四元数到旋转向量

2. 旋转量到四元数

根据1中的表格,有:

4 *(1-qx2-qy2-qz2) = 1 + m00 + m11 + m22

又qw2=1-qx2-qy2-qz2,可得

4 *qw2= 1 + m00 + m11 + m22

这里解qw必须保证1 + m00 + m11 + m22>=0,如果不是的话,就构造其他的等式来计算,OGRE中分成两种情况,一种是m00 + m11 + m22>=0,就可以直接先解出qw,否则的采用另外的等式计算

3.Local axis

Vector3 xAixs(void) const;

取得旋转矩阵的第一列,旋转矩阵和一个向量相乘的话,第一列的数据均和向量的x分量相乘

Vecotr3 yAxis(void) const;

取得旋转矩阵的第二列,旋转矩阵和一个向量相乘的话,第二列的数据均和向量的y分量相乘 Vecotr3 zAxis(void) const;

取得旋转矩阵的第三列,旋转矩阵和一个向量相乘的话,第三列的数据均和向量的z分量相乘


相关文章

  • 多面体欧拉公式的历史和方法论纪念欧拉诞生300周年
  • 南昌教育学院学报 JOURNA L OF NANCHANG COLL EGE OF EDUCATI ON 第22卷第2期Vo. l 22No . 22007 多面体欧拉公式的历史和方法论 ---纪念欧拉诞生300周年 汤彬如 (南昌教育学院 ...查看


  • 一笔画问题(欧拉图)
  • 2010-10-18 17:32 by EricZhang(T2噬菌体), 3556 visits, 网摘, 收藏, 编辑 关于一笔画问题的数学分析(对一道面试题的总结与扩展思考) 摘要 前几天参加了一个公司的面试,其中被问到了一个题.面试 ...查看


  • 多面体欧拉定理
  • 假如我是欧拉„„ --多面体欧拉定理的发现 一.教学目的 1. 了解欧拉公式,并体现公式的发现过程. 2. 进一步让学生体会多面体的三种基本量:点.线.面是立体几何的主要研究对象: 3. 通过体验欧拉公式的发现过程,培养学生自主学习的能力: ...查看


  • 数学手抄报:小欧拉智改羊圈
  • 名人故事:小欧拉智改羊圈 欧拉是数学史上着名的数学家,他在数论.几何学.天文数学.微积分等好几个数学的分支领域中都取得了出色的成就.不过,这个大数学家在孩提时代却一点也不讨老师的喜欢,他是一个被学校除了名的小学生. 事情是因为星星而引起的. ...查看


  • 欧拉法与龙格库塔法比较分析
  • 解微分方程的欧拉法,龙格-库塔法简单实例比较 欧拉方法(Euler method)用以对给定初值的常微分方程(即初值问题)求解分为前EULER法.后退EULER法.改进的EULER法. 缺点: 欧拉法简单地取切线的端点作为下一步的起点进行计 ...查看


  • 七桥问题Seven Bridges Problem
  • 七桥问题Seven Bridges Problem 著名古典数学问题之一.在哥尼斯堡的一个公园里,有七座桥将普雷格尔河中两个岛及岛与河岸连接起来(如图) .问是否可能从这四块陆地中任一块出发,恰好通过每座桥一次,再回到起点? 欧勒于1736 ...查看


  • 多相流模拟介绍
  • 王巍雄--2003-6-19 18. 多相流模拟介绍 自然界和工程问题中会遇到大量的多相流动.物质一般具有气态, 液态和固态三 相, 但是多相流系统中相的概念具有更为广泛的意义. 在多项流动中, 所谓的 "相" 可以定义 ...查看


  • 数学手抄报:著名的数学家
  • 欧拉是数学史上着名的数学家,他在数论.几何学.天文数学.微积分等好几个数学的分支领域中都取得了出色的成就.不过,这个大数学家在孩提时代却一点也不讨老师的喜欢,他是一个被学校除了名的小学生. 事情是因为星星而引起的. 当时,小欧拉在一个教会学 ...查看


  • 多面体欧拉定理5
  • 多面体欧拉定理的发现 温州中学 黄 振 [教学背景] 数学不应看作真理的汇集,而主要的应看成人类活动的一种创造性的活动.因而在教学中,如何积极引导学生主动地探索,深刻剖析知识的产生.形成和发展过程,提高学生发现问题和解决问题的能力,这是我经 ...查看


  • 数学手抄报:欧拉
  • 欧拉(LEONHARD EULER 公元1707-1783年),1707年出生在瑞士的巴塞尔(BASEL)城,13岁就进巴塞尔大学读书,得到当时最有名的数学家约翰·伯努利(JOHANN BERNOULLI,1667-1748年)的精心指导. ...查看


热门内容