获取手机方位 传感器

来源:互联网 发布:angularjs json.parse 编辑:程序博客网 时间:2024/05/03 00:20
获取手机方位的几种方式(传感器)

1、TYPE_ORIENTATION


TYPE_ORIENTATION sensor is missing

故方向传感器一般不推荐使用了。

2、TYPE_GRAVITY(重力传感器)

API level 9 以上

对于判断设备的朝上、朝下是非常容易,但是具体的方位信息不容易判断。

每个设备中都存在重力传感器

地球:9.8m/sec^2

设备朝上:Z轴  9.8m/sec^2
设备朝下:Z轴 -9.8m/sec^2

重力传感器容易受噪声影响,故使用该传感器的时候,就要考虑到这个因素。
另外由于硬件的原因,由重力传感器采集到的数据可能存在偏移误差。




3、TYPE_ACCELEROMETER + TYPE_MAGNETIC_FIELD (加速度传感器、磁场传感器)


步骤:
    步骤1:采集两个传感器的数据,调用SensorManager.getRotationMatrix(),联合产生一个旋转矩阵。
    步骤2:用上诉步骤产生的旋转矩阵,将其作为参数传递给SensorManager.getOrientation(),从而计算出手机方位信息。
    
代码:
    public void onSensorChanged(SensorEvent event) {
        // TODO Auto-generated method stub
        int type = event.sensor.getType();
        if (type == Sensor.TYPE_ACCELEROMETER) {
            if (data_acc == null)
                data_acc = new float[event.values.length];
            
            data_acc = event.values;
            
        } else if (type == Sensor.TYPE_MAGNETIC_FIELD) {
            if (data_mag == null)
                data_mag = new float[event.values.length];
            
            data_mag = event.values;
        }
        
        SensorManager.getRotationMatrix(R, null, data_acc, data_mag);
        SensorManager.getOrientation(R, orientation);
    }

orientation数据分析:
    orientation[0]:方位,围绕Z轴旋转
    orientation[1]:俯仰,围绕X轴旋转
    orientation[2]:翻滚, 围绕Y轴旋转
    
    绕Z轴:以正北方向为基准。逆时针旋转:0 —— pi —— -pi —— 0。
    绕X轴:设备正着竖起来的时候,orientation[1] = pi/2;反之,设备倒着竖起来的时候,orientation[1] = -pi/2。
    绕Y轴:当设备的左边垂直水平面的时候,orientation[2] = pi/2;反之,当设备的右边垂直水平面的时候,orientation[2] = -pi/2。
    
重力传感器容易受噪声影响,故使用该传感器的时候,就要考虑到这个因素。
另外,取加速度传感器数据的时候,最好是相对静止的状态,故而要避免剧烈摇换手机等操作。




4、TYPE_GRAVITY + TYPE_MAGNETIC_FIELD (重力传感器、磁场传感器)

与上述利用加速度、磁场传感器获取手机方位的方法类似。

两者不同之处:
    【1】重力传感器中获取的值被传递到SensorManager.getRotationMatrix()调用,而不是来自加速度计值。
    【2】不用考虑手机的剧烈摇晃等操作。
    



5、TYPE_ROTATION_VECTOR(旋转向量传感器)


综合使用加速度、磁场、陀螺仪传感器来确定手机方位信息。

步骤:
    步骤1:采集旋转向量传感器的数据,调用SensorManager.getRotationMatrixFromVector(),产生一个旋转矩阵。
    步骤2:步骤2:用上诉步骤产生的旋转矩阵,将其作为参数传递给SensorManager.getOrientation(),从而计算出手机方位信息。

代码:
    public void onSensorChanged(SensorEvent event) {
        // TODO Auto-generated method stub
        int type = event.sensor.getType();
        if (type == Sensor.TYPE_ROTATION_VECTOR) {
            if (data_rot == null)
                data_rot = new float[event.values.length];
            
            data_rot = event.values;
        }
        
        SensorManager.getRotationMatrixFromVector(R, data_rot);
        SensorManager.getOrientation(R, orientation);
    }
    
orientation数据解析如上

与上述利用加速度、磁场传感器获取手机方位的方法相比,这个方法是非常简单的。故而通常优先采用这个方法。

0 0
原创粉丝点击