现在的位置: 首页 > 综合 > 正文

Android设备中实现Orientation Sensor(图)兼谈陀螺仪

2013年09月17日 ⁄ 综合 ⁄ 共 5431字 ⁄ 字号 评论关闭

 

设备中的三自由度Orientation Sensor就是一个可以识别设备相对于地面,绕x、y、z轴转动角度的感应器(自己的理解,不够严谨)。智能手机,平板电脑有了它,可以实现很多好玩的应用,比如说指南针等。

 

我们可以用一个磁场感应器(magnetic sensor)来实现。

 

磁场感应器是用来测量磁场感应强度的。一个3轴的磁sensor IC可以得到当前环境下X、Y和Z方向上的磁场感应强度,对于Android中间层来说就是读取该感应器测量到的这3个值。当需要时,上报给上层应用程序。磁感应强度的单位是T(特斯拉)或者是Gs(高斯),1T等于10000Gs。

 

先来看看android定义的坐标系,在/hardware/libhardware/include/hardware/sensors.h中有个图。

Android 坐标系定义

图中表示设备的正上方是y轴方向,右边是x轴方向,垂直设备屏幕平面向上的是Z轴方向,这个很重要。因为应用程序就是根据这样的定义来写的,所以我们报给应用的数据要跟这个定义符合。还需要清楚磁sensor芯片贴在板上的坐标系。我们从芯片读出数据后要把芯片的坐标系转换为设备的实际坐标系。除非芯片贴在板上刚好跟设备的x、y、z轴方向刚好一致(去感谢你的硬件工程师吧)。

 

Orientation Sensor的实现是根据磁场感应强度的3个值计算出另外3个值。当需要时,我们计算出这3个值上报给应用程序,Orientation Sensor的功能就实现了。

这3个值具体含义和计算方法是:

 

1. azimuth 方位角:就是绕z轴转动的角度,0度=正北,(假设Y轴指向地磁正北方,直升机正前方的方向如下图)

正北

 

90度=正东,

正东

 

180度=正南,

正南

 

270度=正西。

正西

 

求x和y方向的磁感应强度的反正切,就可以得到方位角(算法看后面poll函数中的代码)。要实现指南针,只需要这个就可以了(不考虑设备非水平的情况);

 

2. pitch 仰俯:绕X轴转动的角度 (-180<=pitch<=180), 如果设备水平放置,前方向下俯就是正,如图:

pitch 正值

 

前方向上仰就是负值;

pitch 负值

求磁sensor的y和z反正切可得到此角度值。

 

3. roll 滚转:绕Y轴转动(-90<=roll<=90),向左翻滚是正值

roll正值

 

向右翻滚是负值;

roll负值

 

求z和x的反正切可得到此值。

 

 

sensors.h中还定义了其他各种sensor。要实现的就是这两个:

#define SENSOR_TYPE_MAGNETIC_FIELD      2

#define SENSOR_TYPE_ORIENTATION         3

 

在/hardware/sensors/sensors.cpp 中添加对MAGNETIC_FIELD和ORIENTATION 的支持

 

简单的说一下怎样添加,下面的代码不完整,请参考/sdk/emulator/sensors/sensors_qemu.c

 

 

写好后可以用一个叫做sensorlist的程序先测试一下,看报上去的数据是否正常。然后可以试试一个叫做Pacific Navy Fighter 的游戏来爽一爽了。

 

由于涉及到很多方面的内容,错误难免,敬请指正。

 =====================

补充:我之前搞错了,我以为Orientation Sensor就叫做陀螺仪。谢谢syz85。

之后我又看了一下Android中对陀螺仪(gyroscope Sersor)的定义,是指在上述定义的x y x三个方向的转速,单位是radians/second,正负遵循右手规则。

想一想实现应该也不难,把从Orientation Sensor两次得到的 x y z角度变化除以时间就可以得到转速。

(其实真正的陀螺仪包括Orientation Sensor和gyroscope Sersor这两个功能)

但转速对于手机或其他消费类电子有意义是什么呢?谁指点我一下,gyroscope 会带来什么好玩的应用。

 

抱歉!评论已关闭.