梅特勒杯创新大赛(二):Android姿态传感器-三轴角度

这一部分我们讨论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的值了,可以发现转动手机时候,三轴角度都是实时变化的~
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值