android 简易指南针

最近学习了一下android的程序设计,这里学习android传感器的使用 于是想做一个简单的指南针。(需要有地磁感应器和加速度感应器的支持)

基本原理很简单,只要通过计算获得当前手机的方位角即可。

###接下来记录一下基本的流程:

####1.获取SensorManager

:::java
mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
SensorManager用来管理各种传感器

####2.获取需要的传感器

:::java
//获取加速度传感器
Sensor sensorAcc=sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
//获取地磁传感器
Sensor sensorMag=sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);

####3.注册

:::java
sensorManager.registerListener(listener,sensorAcc,SensorManager.SENSOR_DELAY_GAME);
sensorManager.registerListener(listener,sensorMag,SensorManager.SENSOR_DELAY_GAME);

将一个SensorEventListener实例注册到对应的传感器上,第一个参数是一个SensorEventListener对象(见4)

第二个参数是需要注册到的传感器,第三个参数则指定了传感器的采样的速率,共有四种级别

SENSOR_DELAY_GAME 响应最快,相应的最耗电.

SENSOR_DELAY_UI 相应的最节能,但是响应很慢。响应的快慢也是相对的,至于选择哪一种,需要根据需求选择

####4.实现SensorEventListener接口

实现SensorEventListener接口,完成对传感器各事件的监听并实现以下两个方法

:::java
public void onSensorChanged(SensorEvent event)

当传感器数据改变时会调用此方法,其中传感器读到数据会保存在event.values中

这是一个float型数组,保存着xyz三个方向上地磁强度或加速度大小

:::java
public void onAccuracyChanged(Sensor sensor, int accuracy) 

当传感器的精度信息改变时会调用次方法,这里我们不需要

####5.获得方位角

方位角的获取,这里使用了SDK中提供的API就可以了

:::java
getRotationMatrix(float[] R, float[] I, float[] gravity, float[] geomagnetic)

通过上面方法获得旋转矩阵,第一个参数表示求得的旋转矩阵,第二个参数是获得的倾角矩阵, 第三个参数是加速度传感器采集的数据,第四个则是地磁传感器采集到的数据

在获得了旋转矩阵之后,就可以求得各个方向,方位角的弧度值

:::java
SensorManager.getOrientation(R,values);

所得到的结果保存在values数组中,values[0]便是水平的方位角,注意所得到的角度的范围是 -180度到180度

####6.电子罗盘的控制

得到方位角之后,便可以实现罗盘的指向。你可以自己画图,也可以用RotateAnimation 去实现

####7.问题及解决

基本按照以上流程就可以完成一个简单的指南针的功能了,但是在实际的使用过程中, 由于传感器实时得到的数据受各种因素的影响,如果对传感器采集的数据不做处理,那 么罗盘会用较严重的抖动。这里较简单的一种做法是多次采样取一个权值。这样得到的数据 会相对准确一点

发表于: 2014年2月19日 16时0分