概述
这一部分我们讨论Android的姿态传感器中对于三轴角度的数据读取与应用。
1.初始化
//初始化姿态传感器
private void init_sensor(){
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
//加速度传感器和地磁传感器
acc_sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mag_sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
//给传感器注册监听:
sensorManager.registerListener(this, acc_sensor, SensorManager.SENSOR_DELAY_GAME);
sensorManager.registerListener(this, mag_sensor,SensorManager.SENSOR_DELAY_GAME);
}
这里注意,三轴角度是不能直接读出来的,需要结合加速度传感器和地磁传感器计算得到,所以这里进行两个传感器的初始化工作。
2.回调方法
//传感器状态改变时的回调方法
@Override
public void onSensorChanged(SensorEvent event) {
if(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){
accValues=event.values.clone();//这里是对象,需要克隆一份,否则共用一份数据
}
else if(event.sensor.getType()==Sensor.TYPE_MAGNETIC_FIELD){
magValues=event.values.clone();//这里是对象,需要克隆一份,否则共用一份数据
}
/**public static boolean getRotationMatrix (float[] R, float[] I, float[] gravity, float[] geomagnetic)
* 填充旋转数组r
* r:要填充的旋转数组
* I:将磁场数据转换进实际的重力坐标中 一般默认情况下可以设置为null
* gravity:加速度传感器数据
* geomagnetic:地磁传感器数据
*/
SensorManager.getRotationMatrix(r, null, accValues, magValues);
/**
* public static float[] getOrientation (float[] R, float[] values)
* R:旋转数组
* values :模拟方向传感器的数据
*/
SensorManager.getOrientation(r, values);
//将弧度转化为角度后输出
/*
values[0] :方向角,但用(磁场+加速度)得到的数据范围是(-180~180),也就是说,0表示正北,90表示正东,180/-180表示正南,-90表示正西。而直接通过方向感应器数据范围是(0~359)360/0表示正北,90表示正东,180表示正南,270表示正西。
values[1] pitch 倾斜角 即由静止状态开始,前后翻转,手机顶部往上抬起(0~-180),手机尾部往上抬起(0~180)
values[2] roll 旋转角 即由静止状态开始,左右翻转,手机左侧抬起(0~180),手机右侧抬起(0~-180)
*/
for(int i=0;i<3;i++){
values[i]=(float) Math.toDegrees(values[i]);
}
}
这里需要借助旋转数组(矩阵)进行计算,通过get方法结合传感器数据得到。然后得到方向传感器的数据(三轴角度),最后转化为角度,当然这个角度的定义是有规定的,具体如上面的注释所说。
之后就可以使用value的值了,可以发现转动手机时候,三轴角度都是实时变化的~
最后
以上就是害羞雨为你收集整理的梅特勒杯创新大赛(二):Android姿态传感器-三轴角度1.初始化2.回调方法的全部内容,希望文章能够帮你解决梅特勒杯创新大赛(二):Android姿态传感器-三轴角度1.初始化2.回调方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复