安卓坐标系转换之二:旋转角(欧拉角)

49人阅读 评论(0) 收藏 举报
分类:

欧拉角是按照既定的顺序,如依次绕z,y,x分别旋转一个固定角度,使用roll,yaw ,pitch分别表示物体绕,x,y,z的旋转角度,可以完成一个坐标系转换成另一个坐标系。
但是在安卓中,这里的角度定义有所不同,原文如下:

Note: This definition is different from yaw, pitch and roll used in aviation where the X axis is along the long side of the plane (tail to nose).
也就是说,X轴与航空系统所定义的不同。安卓里的X轴是短边。

具体如下图:
mark
注: 图中旋转方向只是示意方向,不是指定的正方向!!!

当手机坐标系与地球坐标系重合时,三个角度都为0。

  • Azimuth:绕z轴旋转,磁北与y轴的夹角,顺时针增大,0到359度。
  • Pitch:绕x轴旋转的角度,即手机上下旋转,y轴往z轴方向为正。-180到180度。
  • Roll:绕y轴旋转的角度, 即手机的左右旋转,顺时针为正,-90到90度。

看一下getgetOrientation()方法,求出手机坐标系相对于世界坐标系三个轴的旋转角。

 public static float[] getOrientation(float[] R, float[] values) {
        /*
         * 4x4 (length=16) case:
         *   /  R[ 0]   R[ 1]   R[ 2]   0  \
         *   |  R[ 4]   R[ 5]   R[ 6]   0  |
         *   |  R[ 8]   R[ 9]   R[10]   0  |
         *   \      0       0       0   1  /
         *
         * 3x3 (length=9) case://上篇文章讲到的旋转矩阵
         *   /  R[ 0]   R[ 1]   R[ 2]  \
         *   |  R[ 3]   R[ 4]   R[ 5]  |
         *   \  R[ 6]   R[ 7]   R[ 8]  /
         *
         */
        if (R.length == 9) {
            values[0] = (float) Math.atan2(R[1], R[4]);//azimuth
            values[1] = (float) Math.asin(-R[7]);//pitch
            values[2] = (float) Math.atan2(-R[6], R[8]);//roll
        } else {
            values[0] = (float) Math.atan2(R[1], R[5]);
            values[1] = (float) Math.asin(-R[9]);
            values[2] = (float) Math.atan2(-R[8], R[10]);
        }
        return values;
    }

这里三个角的计算不大好理解,我画几个示意图大致讲一下我的看法。
还望大家一起讨论。
首先复习一下上一节R矩阵的内容:

R[0] = Hx;     R[1] = Hy;     R[2] = Hz;//【地球坐标系】X方向,指东
R[3] = Mx;     R[4] = My;     R[5] = Mz;//【地球坐标系】Y方向,指北
R[6] = Ax;     R[7] = Ay;     R[8] = Az;//【地球坐标系】Z反方向,向下

首先看azimuth,代码如下:

 values[0] = (float) Math.atan2(R[1], R[4]);

也就是arctan2(Hy,My)。 Hy是【地球坐标系】指向东的单位向量在【手机坐标系】Y轴上的分量。
同样地,My是【地球坐标系】指向北的单位向量在【手机坐标系】Y轴上的分量。
azimuth是绕z轴旋转,磁北与y轴的夹角,顺时针增大,0到359度。这里用了atan2函数,因为atan只可以表示90o90o,atan2可以表示180o180o。具体详细的区别可以看这里
示意图如下:
mark

pitch的代码如下:

values[1] = (float) Math.asin(-R[7]);

也就是arcsin(-Ay).Ay是【地球坐标系】指向下(重力)的单位向量在【手机坐标系】Y轴上的分量。示意图如下:
mark

roll的代码如下:

 values[2] = (float) Math.atan2(-R[6], R[8]);

也就是arctan2(-Ax,Az).Ax【地球坐标系】指向下(重力)的单位向量在【手机坐标系】x轴上的分量。Az是【地球坐标系】指向下(重力)的单位向量在【手机坐标系】z轴上z的分量。
示意图如下:
mark
这里需要指出的是,这个图的俯视方向是沿着y轴的正方向,所以本来是顺时针为正,这里是逆时针为负,所以也要加负号。

查看评论

坐标系及欧拉角

根据学习北航《多旋翼飞行器设计与控制》的课件,结合自己理解、推导写的笔记,以此加深理解,与大家交流。1.坐标系1.1右手定则采用的坐标系和定义的角度正方向沿用右手定则。 1.2惯性坐标系与机体坐标系...
  • libing403
  • libing403
  • 2016-08-21 10:55:04
  • 6441

欧拉角

角位移        角位移(Angular displacement)描述物体转动时位置变化的物理量。        概念:构件内任意一线段(或平面)由原始位置到新位置转过的角度称为该线段(或平面...
  • lmonkey000
  • lmonkey000
  • 2016-03-28 22:09:07
  • 7219

由旋转矩阵求欧拉角

  • 2015年09月06日 20:40
  • 93KB
  • 下载

旋转矩阵、欧拉角、四元数、轴/角之间的转换

在机器人学中,表示旋转的有四种方式。不同的人可能习惯于用不同的方法,现将四种方式之间的转换整理出来如下。 旋转矩阵 旋转矩阵R表示坐标系`O-x'y'z'`中的向量坐标变换为同一向量在坐标...
  • xuehuafeiwu123
  • xuehuafeiwu123
  • 2017-07-12 17:24:16
  • 3770

欧拉角的详解

关于旋转永远是做游戏的难点和混乱点。我们知道表示一个旋转有多种方式,简单的欧拉角,复杂点的四元数,再复杂点的矩阵。之前接触unity可以用四元数和欧拉角两种方式表示旋转,最近一直研究虚幻引擎,目前只看...
  • schrodinger1900
  • schrodinger1900
  • 2016-10-04 17:15:04
  • 3556

欧拉角与旋转

原文地址:http://blog.csdn.net/mysniper11/article/details/8766574 欧拉角是一种常用的描述方位的方法。这项技术是著名数学家Leo...
  • puppet_master
  • puppet_master
  • 2015-11-20 21:09:39
  • 1715

欧拉角 图解释

定义 先引wiki上的定义 欧拉角:由三个角度组成,在特定坐标系下用于描述刚体的orientation. 简单来说,就是绕一个三维坐标系统下的三个基轴旋转三个角度,可以用来表示物体通过各种绕七...
  • linuxheik
  • linuxheik
  • 2017-12-19 14:38:11
  • 197

旋转矩阵R 的构成过程(欧拉角的各种表示方法)

旋转矩阵R 的构成过程 坐标旋转矩阵R构成过程为:首先将坐标轴绕X轴逆时针旋转φ,得旋转矩阵RX;再将坐标轴绕新的Y轴逆时针旋转ψ,得旋转矩阵RY,最后将坐标轴绕新的Z轴逆时针旋转θ,得旋转矩阵RZ...
  • u010177286
  • u010177286
  • 2014-07-09 21:23:02
  • 2901

3d数学基础-欧拉角转换与旋转矩阵或旋转矩阵转换成欧拉角-用C++代码实现

#include #include #include class Matrix4x3; class Vector3; const float kPi = 3.14159...
  • yujingbo1023
  • yujingbo1023
  • 2015-05-30 13:01:42
  • 1446

欧拉角与方向余弦矩阵之间的转换

欧拉角转换成方向余弦矩阵欧拉角有12种旋转顺序分别为 - 1 X-Z-Y - 2 Y-X-Z - 3 Y-Z-X - 4 Z-X-Y - 5 Z-...
  • WhoisPo
  • WhoisPo
  • 2015-08-25 17:05:18
  • 14300
    新家地址
    个人资料
    持之以恒
    等级:
    访问量: 7万+
    积分: 1852
    排名: 2万+
    最新评论