三维坐标下的旋转

摘要:
欧拉角 欧拉角度的基本思想是将旋转分解为绕三个互相垂直轴的三个旋转组成的序列。使用欧拉角,就要指明坐标系系统以及旋转顺序。  欧拉角表示的旋转会造成万向节锁的现象。所谓万向节锁简单的说是指物体的两个旋转轴指向同一个方向,从而失去一维自由度,接下来无论如何也旋转不出某种状态。由于万向节锁的存在,欧拉旋转无法实现球面平滑插值。

  三维坐标的旋转有以下几种常见的表示形式:旋转向量,旋转矩阵,欧拉角,四元数,下面对这四种表示形式及其之间的转换进行介绍

旋转向量

  通常为3x1的列向量,向量方向即为旋转轴,向量的模表示绕轴逆时针旋转的角度,如旋转向量v=[a,b,c],那么旋转角度theta=sqrt(a2+b2+c2),旋转轴z=[a/theta, b/theta, c/theta]

旋转矩阵

  旋转矩阵用3x3的矩阵表示,旋转矩阵是正交矩阵,且行列式是单位1          

      旋转矩阵性质

       det(R)=1   

  旋转向量与旋转矩阵可以通过罗德里格斯(Rodrigues)变换进行转换。opencv实现Rodrigues变换的函数是:

        intcvRodrigues2(constCvMat*src,CvMat*dst,CvMat*jacobian=0);

生成旋转矩阵的一种简单方式是把它作为三个基本旋转的序列复合,如下面要介绍的欧拉角的复合。

欧拉角

 欧拉角度的基本思想是将旋转分解为绕三个互相垂直轴的三个旋转组成的序列。使用欧拉角,就要指明坐标系系统以及旋转顺序。最常用的约定,即所谓“roll-pitch-yaw”系统。偏航角——Yaw,俯仰角——Pitch,翻滚角——Rool

  下面讨论欧拉角与旋转矩阵之间的转换,绕x,y,或z轴旋转θ的矩阵为:

    三维坐标下的旋转第2张

  要计算最终的旋转,只需按一定的顺序将Rx(θ),Ry(θ),Rz(θ)做矩阵乘法,所以顺序不同,最终的旋转矩阵结果也不同。如果规定了坐标系以及旋转顺序,那么旋转矩阵是惟一的。

  欧拉角表示的旋转会造成万向节锁(Gimbal Lock)的现象。所谓万向节锁简单的说是指(经过绕某个轴的旋转后)物体的两个旋转轴指向同一个方向,从而失去一维自由度,接下来无论如何也旋转不出某种状态。由于万向节锁的存在,欧拉旋转无法实现球面平滑插值。

四元数

  一个四元数可以表示为q = w + xi + yj + zk,i、j、k是一种特殊的虚数单位(类比虚数表示中的i,j),并有以下运算规则:i0=j0=k0=1,i2=j2=k2=-1, |q|2=w2+x2+y2+z2=1,四元数的其他性质不在一一叙述。

四元数指明了旋转的角度和旋转轴,如旋转轴的方向余弦为(cosβx,cosβy,cosβz),旋转角为α,则对应的四元数q=[q0,q1,q2,q3],其中

三维坐标下的旋转第3张

  四元数与旋转矩阵之间的转换关系(注意利用模为1的性质有一下两种表示方法)

R = egin{bmatrix} 1- 2(q_2^2 + q_3^2) & 2(q_1 q_2 - q_0 q_3) & 2(q_0 q_2 + q_1 q_3) \ 2(q_1 q_2 + q_0 q_3) & 1 - 2(q_1^2 + q_3^2) & 2(q_2 q_3 - q_0 q_1) \ 2(q_1 q_3 - q_0 q_2) & 2( q_0 q_1 + q_2 q_3) & 1 - 2(q_1^2 + q_2^2) end{bmatrix}R = egin{bmatrix} q_0^2 + q_1^2 - q_2^2 - q_3^2 & 2(q_1 q_2 - q_0 q_3) & 2(q_0 q_2 + q_1 q_3) \ 2(q_1 q_2 + q_0 q_3) & q_0^2 - q_1^2 + q_2^2 - q_3^2 & 2(q_2 q_3 - q_0 q_1) \ 2(q_1 q_3 - q_0 q_2) & 2( q_0 q_1 + q_2 q_3) & q_0^2 - q_1^2 - q_2^2 + q_3^2 end{bmatrix}

   旋转矩阵转换为四元数:

      三维坐标下的旋转第6张

    mij表示旋转矩阵中第i行k列的元素

四元数转换为欧拉角:

    首先定义

    Roll –phi: rotation about the X-axis

Pitch – heta: rotation about the Y-axis

Yaw –psi: rotation about the Z-axis

则对应的转换为

egin{bmatrix} phi \ heta \ psi end{bmatrix} = egin{bmatrix} mbox{atan2} (2(q_0 q_1 + q_2 q_3),1 - 2(q_1^2 + q_2^2)) \ mbox{arcsin} (2(q_0 q_2 - q_3 q_1)) \ mbox{atan2} (2(q_0 q_3 + q_1 q_2),1 - 2(q_2^2 + q_3^2)) end{bmatrix}

如果已知欧拉角求四元数,可以先将欧拉角转化为旋转矩阵,再由旋转矩阵求四元数

原创文章,转载请注明出处

  • 相关阅读:
    关于导出数据库提示 outfile disabled的解决方案
    mysql的日志管理
    Node.js aitaotu图片批量下载Node.js爬虫1.00版
    Node.js umei图片批量下载Node.js爬虫1.00
    Node.js abaike图片批量下载Node.js爬虫1.01版
    JS 数字左补零函数
    Node.js 向一个文件添加内容
    JS 取得当前日期时间(文本形式)
    Node.js abaike图片批量下载Node.js爬虫1.00版
    Node.js nvshens图片批量下载爬虫 1.00
  • 原文地址:https://www.cnblogs.com/xtl9/p/5445353.html
  • 免责声明:文章转载自《三维坐标下的旋转》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

    上篇如何删除本地项目文件中的.svn文件Java连接MySQL数据库实现用户名密码的验证方法 Java语句中sql查询语句'' ""作用下篇

    宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

    相关文章

    QT-2D编程

      QT-【转】2D编程 Qt中提供了强大的2D绘图系统,可以使用相同的API在屏幕上和绘图·设备上进行绘制,主要基于QPainter、QPainterDevice和QPainterEngine这3个类。 1、QPainter执行绘图操作,QPainter可以绘制一切简单的图形,从简单的一条直线到任何复杂的图形。QPainter类可以在一切继承QPaint...

    iOS将image转90,180,270度的方法

    http://blog.sina.com.cn/s/blog_6602ffbc0101ckx3.html 这里要分享的是将image旋转,而不是将imageView旋转,原理就是使用quartz2D来画图片,然后使用ctm变幻来实现旋转。 注:quartz2D的绘图左边和oc里面的绘图左边不一样,导致绘画出的图片是反转的。所以一上来得使它转正再进行进一步的...

    数字图像处理_图像基本运算

    图像基本运算 1点运算  线性点运算是指输入图像的灰度级与输出图像呈线性关系。s=ar+b  (r为输入灰度值,s为相应点的输出灰度值)。  当a=1,b=0时,新图像与原图像相同;  当a=1,b≠0时,新图像是原图像所有像素的灰度值上移或下移,是整个图像在显示时更亮或更暗;  当a>1时,新图像对比度增加;  当a<1时,新图像对比度降低;  当a<0...

    Unity 重要基础知识点

    这是两个月前的学习记录,发出来了下,如果有误欢迎大家指出: 脚本生命周期 //每当脚本被加载时调用一次 // 1.   在Awake中做一些初始化操作 void Awake(){ //初始化public成员 } // 2.   在每次激活脚步时调用 void OnEnable(){} //在第一次调用Update之前调用一次Start,即使取消激活,再激...

    android绘图—Paint path 旋转

    http://meteor6789.blog.163.com/blog/static/35040733201111193535153/ Piant 看一段代码: mPaint = new Paint();mPaint.setAntiAlias(true);//锯齿mPaint.setDither(true);//mPaint.setColor(0xFF3...

    基于CSS3的3D旋转效果

    自从有了html5和css3,好多以前只能想想的华丽效果都可以上手实现了。3D 转换(个人认为3D变换更贴切^)就是其中之一。关于3D转换,可以阅读CSS3 3D transform变换,不过如此,文中对3D转换进行了形象、生动、详细的阐述。在这里,只和大家讨论怎么利用3D转换来实现立体及其旋转效果,例如: 好吧,废话不多说,上代码! 1.页面代码 1...