三维坐标下的旋转

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

旋转向量

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

旋转矩阵

  旋转矩阵用3x3的矩阵表示,旋转矩阵有一些很好的性质

  • 旋转矩阵的逆矩阵是它的转置,即                   

      

  • 旋转矩阵是正交矩阵,且行列式是单位1                                                                   

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


        int cvRodrigues2( const CvMat* src, CvMat* dst, CvMat* jacobian=0 );
 生成旋转矩阵的一种简单方式是把它作为三个基本旋转的序列复合,如下面要介绍的欧拉角的复合。

欧拉角

  欧拉角度的基本思想是将旋转分解为绕三个互相垂直轴的三个旋转组成的序列。但最有意义的是使用笛卡尔坐标系并按照一定顺序所组成的旋转序列。使用欧拉角,就要指明坐标系系统。最常用的约定,即所谓“heading-pitch-bank”约定。在这个系统中,一个方位被定义为一个heading角,一个pitch角,和一个bank角。它的基本思想就是让物体开始于“标准”方位——就是物体坐标轴和惯性坐标轴对齐。在标准方位上,让物体作heading,pitch,bank旋转,最后物体到达我们想要描述的方位。

具体解释一下heading,pitch,bank三个角度,规定使用左手坐标系,+x向右,+y向上,+z向前。heading为绕y轴的旋转量,向右旋转为正,旋转正方向是顺时针方向,经过heading旋转之后,pitch为绕x轴的旋转量,注意是物体坐标系的x轴,不是原惯性坐标系的x轴,依然遵守左手法则,向下旋转为正。最后,经过了heading,pitch后,bank为绕z轴的旋转量,依然是物体坐标系的z轴。

当我们说到旋转的顺序是heading-pitch-bank时,是指从惯性坐标系到物体坐标系,如果从物体坐标系到惯性坐标系则相反。旋转可以理解为将惯性坐标系和物体坐标系对齐的一个过程,即通过将惯性坐标系旋转heading,pitch,bank,使惯性坐标系与物体坐标系重合。heading-pitch-bank系统还有另外一个名称roll-pitch-yaw,其中的roll对应与bank,yaw对应于heading,Yaw(偏航):绕欧拉角向量的y轴旋转,Pitch(俯仰):绕欧拉角向量的x轴旋转,Roll(翻滚): 绕欧拉角向量的z轴旋转

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

    ,,

  要计算最终的旋转,只需按一定的顺序将Rx(θ),Ry(θ),Rz(θ)做矩阵乘法,所以顺序不同,最终的旋转矩阵结果也不同。如果规定了坐标系以及旋转顺序,那么旋转矩阵是惟一的。在heading-pitch-bank系统中,旋转矩阵与欧拉角之间的转换关系:

                    

  其中,sa = sin(attitude),ca = cos(attitude),sb = sin(bank),cb = cos(bank),sh = sin(heading),ch = cos(heading)

 

可以参考http://www.euclideanspace.com/maths/geometry/rotations/conversions/eulerToMatrix/

欧拉角表示的旋转会造成万向节锁(Gimbal Lock)的现象。所谓万向节锁简单的说在指某种状态下我们无论怎么旋转(当然还是要原先的顺序)都不可   能得到某些想要的旋转效果,除非我们打破原先的旋转顺序或者同时旋转3个坐标轴,由于万向节锁的存在,欧拉旋转无法实现球面平滑插值。

   旋转矩阵转成欧拉角:

  • heading = atan2(-m20,m00)
  • attitude = asin(m10)
  • bank = atan2(-m12,m11)

    两种特殊情况除外:M10=1时,heading = atan2(M02,M22),bank = 0;M10=-1时,heading = atan2(M02,M22),bank = 0

四元数:一个四元数可以表示为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],其中

           

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

,或

   旋转矩阵转换为四元数:

      

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

四元数转换为欧拉角:

    首先定义

     Roll – : rotation about the X-axis

Pitch – : rotation about the Y-axis

Yaw – : rotation about the Z-axis

则对应的转换为

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

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

 

时间: 2024-09-30 00:27:28

三维坐标下的旋转的相关文章

三维坐标下判断P点是否在三角形ABC中

在网上找的都是二位坐标下的,我写个三维的吧 1.面积法 同二位坐标下一样,只需要判断三角形ABC的面积是否等于S_ABP+S_BCP+S_ACP.当然此方法需要开好几个根,不仅效率很低,还会损失精度,所以我使用的输入类型是int,并把误差控制到10E(-8).里面还用到了一点向量的知识,但很好理解.代码如下: 1 #include<iostream> 2 #include<cmath> 3 #include<stdlib.h> 4 using namespace std

【转】【矩阵】三维坐标旋转矩阵算法

3D数学 ---- 矩阵和线性变换 一般来说,方阵能描述任意线性变换.线性变换保留了直线和平行线,但原点没有移动.线性变换保留直线的同时,其他的几何性质如长度.角度.面积和体 积可能被变换改变了.从非技术意义上说,线性变换可能“拉伸”坐标系,但不会“弯曲”或“卷折”坐标系. 矩阵是怎样变换向量的 向量在几何上能被解释成一系列与轴平行的位移,一般来说,任意向量v都能写成“扩展”形式: 另一种略有差别的形式为: 注意右边的单位向量就是x,y,z轴,这里只是将概念数学化,向量的每个坐标都表明了平行于相

三维坐标变换矩阵的推导过程

在3D计算机图形学中,我们经常需要使用多个坐标系,因此我们需要知道如何从一个坐标系转到另一个坐标系.在3D计算机图形学中,点(Point)和向量(Vector)的变换是不同的,所以需要分别讨论. 1.向量的变换 如图所示,有两个坐标系A.B和一个向量p.假设我们已经知道了p在坐标系A下的坐标为pA = (x,y);现在我们要求p在坐标系B下的坐标,pB = (x',y') .也就是说,给定一个坐标系下的向量p,如何计算p在另一个坐标系下的坐标呢? 显然,在坐标系A下,p = x*u + y*v;

基于OpenCV的立体相机标定StereoCalibration与目标三维坐标定位

说明:以下涉及到的一些公式以及图片来自于Learning OpenCV. 做了快2个月的立体相机标定,遇到了一些问题,也有了一些体会,在这里记下来. 1.在做立体相机标定的时候,标定板的规范与否直接影响到最后标定的结果,进而会影响目标3D坐标重建. 这里说的规范指的是,打印的棋盘格(或者圆点)需要保证每个square都是严格大小一致的,即打印出来后每个棋盘格大小应一样:打印出来的棋盘格要尽量平整的附在某一平面或者玻璃板上,然后才能用来拍摄标定图像:测量squareSize的时候,要尽可能的精确,

利用MATLAB计算三维坐标序列距离误差程序

1.三维坐标储存在文件中,格式如下: 各坐标间的距离真值是一定值,计算相邻距离的标准差. 2.MATLAB程序如下: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 名称:caculateAccuracy.m % 功能:读取三维世界坐标,计算精度 % 作者:LYC % 单位:中科院苏州医工所 % 日期:2014.5.5 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Swift - 获取屏幕点击坐标下所有对象(SpriteKit游戏开发)

对于场景内对象元件的点击响应,我们可以在场景的touchesBegan()方法中内统一处理. SKScene中touchesBegan()是响应屏幕点击的方法,在这里面我们可以先获取点击位置下所有的对象,然后筛选出需要的对象再调用该对象的方法. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 import SpriteKit class GameScene: SKScene {          //

摄像机标定用于机械臂抓举等(利用标定将图像上的点映射为三维坐标)

在实验室或者是工程上,我们常常需要将拍摄到的图像的二维图像坐标来计算三维坐标. 如上图所示,我们有上图这样的一副图片.我们需要将物体和机械臂的三维位置算出来,使得机械臂能够精确的抓住物体. 我们采用张正友标定的方法标定出内外参数,利用其内参与外参数算出其对应的三维坐标.具体公式略!可以参考张PAMI的论文. /*/ //author:YeahPingYE //function: //time:2014/11/25 // // // // // //*/ #include<highgui.h>

UVA 152-Tree&#39;s a Crowd(暴力求解三维坐标求最短距离)

Tree's a Crowd Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Description  Tree's a Crowd  Dr William Larch, noted plant psychologist and inventor of the phrase ``Think like a tree--Think Fig'' has invented a new

Three.js 学习笔记(1)--坐标体系和旋转

前言 JavaScript 3D library The aim of the project is to create an easy to use, lightweight, 3D library. The library provides <canvas>, <svg>, CSS3D and WebGL renderers.(该项目的目标是创建一个易于使用,轻量级的3D库.该库提供了<canvas>,<svg>,CSS3D和WebGL渲染器.) 示例