第14章  旋转向量传感器详解
旋转向量传感器也被称为旋转矢量传感器,简称RV-sensor 。旋转矢量代表设备的方向,是一个将坐标轴和角度混合计算得到的数据。本章将详细讲解在Android 设备中使用旋转向量传感器的基本知识,为读者步入本书后面知识的学习打下基础。
在Android 系统中,旋转向量传感器的值是TYPE_ROTATION_VECTOR ,旋转矢量代表设备的方向,是一个将坐标轴和角度混合计算得到的数据。对Android 旋转向量传感器的具体说明如表14-1所示。
表14-1
Android 旋转向量传感器的具体说明
传 感 器
传感器事件数据 说    明
测量单位
android11系统更新包下载SensorEvent.values[0]
旋转向量沿x 轴的部分(x * sin(θ/2)) SensorEvent.values[1] 旋转向量沿y 轴的部分(y * sin(θ/2)) SensorEvent.values[2] 旋转向量沿z 轴的部分(z * sin(θ/2)) TYPE_ROTATION_VECTOR
SensorEvent.values[3]
旋转向量的数值部分((cos(θ/2))1
无 由表14-1可知,RV-sensor 能够输出如下所示的3个数据:  x*sin(θ/2);  y*sin(θ/2);  z*sin(θ/2)。
则sin(theta/2)表示RV 的数量级,RV 的方向与轴旋转的方向相同,这样RV 的3个数值与cos(theta/2)组成一个四元组。而RV 的数据没有单位,使用的坐标系与加速度相同。例如下面的演示代码。
sensors_event_t.data[0] = x*sin(theta/2) sensors_event_t.data[1] = y*sin(theta/2) sensors_event_t.data[2] = z*sin(theta/2) sensors_event_t.data[3] =  cos(theta/2)
GV 、LA 和RV 的数值没有物理传感器可以直接给出,需要G-sensor 、O-sensor 和Gyro-sensor 经过算法计算后得出。
由此可见,旋转向量代表了设备的方位,这个方位结果由角度和坐标轴信息组成,在里面包含了设备围绕坐标轴(x 、y 、z )旋转的角度θ。 例如下面的代码演示了获取默认的旋转向量传感器的方法。
private SensorManager mSensorManager; private Sensor mSensor;
291
14.2  实战演练——确定设备当前的具体方向
...
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mSensor = DefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
在Android 系统中,旋转向量的3个元素等于四元组的后3个部分(cos(θ/2)、x*sin(θ/2)、y*sin(θ/2)、z*sin(θ/2)),没有单位。X 、Y 、Z 轴的具体定义与加速度传感器的相同。旋转向量传感器的坐标系如图14-1所示。
上述坐标系具有如下所示的特点。  X :定义为向量积Y ×Z 。它是以设备当前位置为切点的地球切线,方向朝东。
Y :以设备当前位置为切点的地球切线,指向地磁北极。  Z :与地平面垂直,指向天空。
本实例联合使用了旋转向量传感器、磁场传感器、重力传感器和加速度传感器,功能是获取当前设备的方向。 实例 功能
源码路径
实例14-1
确定设备当前的具体方向
github/gast-lib/gast-lib
本实例的功能是,当设备接近某个位置时实现自动提醒。本实例源码是开源代码,来源于如下地址,读者可以自行登录并下载。
github/gast-lib/gast-lib/
14.2.1  实现主Activity
本实例的主Activity 是DetermineOrientationActivity ,通过布局文件l 实现布局,在屏幕中提供一组单选按钮供用户选择所需要的传感器,并在屏幕下方显示具体的显示传感器返回的数据。布局文件l 的具体实现代码如下所示。
<RelativeLayout xmlns:android="schemas.android/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >
<RadioGroup android:id="@+id/sensorSelector"          android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_alignParentTop="true" >
<RadioButton android:id="@+id/gravitySensor"
android:layout_width="match_parent"            android:layout_height="wrap_content"
android:text="@string/gravitySensorLabel"            android:checked="true"
android:onClick="onSensorSelectorClick" />
<RadioButton android:id="@+id/accelerometerMagnetometer"            android:layout_width="match_parent"            android:layout_height="wrap_content"
android:text="@string/accelerometerMagnetometerLabel"            android:checked="false"
android:onClick="onSensorSelectorClick" />
图14-1  旋转向量传感器的坐标系