获取手机方位 传感器
来源:互联网 发布: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数据解析如上
与上述利用加速度、磁场传感器获取手机方位的方法相比,这个方法是非常简单的。故而通常优先采用这个方法。
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
- 获取手机方位 传感器
- 手机方位传感器的使用经历
- 获取手机传感器
- 方位传感器(重力小球)
- 方位传感器Sensor.TYPE_ORIENTATION
- android传感器学习之获取手机传感器
- android传感器学习之获取手机传感器
- Android 获取手机传感器信息
- IOS10 无法获取手机传感器
- Android 方位传感器 (传感器编程合集)
- 获取Android手机设备中的传感器
- Android学习之手机传感器的获取
- 浏览器获取地理方位
- Android开发者指南-方位传感器-Position Sensor
- Android开发者指南-方位传感器-Position Sensor
- 手机传感器
- 手机传感器
- 手机传感器
- 1. 对象导论
- Java的Http通信
- [计算机体系]操作系统
- Linux下安装PhpStorm
- Android自定义DataTimePicker(日期选择器)
- 获取手机方位 传感器
- C/C++连接MySql数据库
- 【Android Studio】AS使用小技巧,拷贝module到另一个项目
- Castle ActiveRecord 获取nh的ISession
- 音乐播放器之--在线音乐播放
- python:判断一个对象是否可迭代 的方法
- 【JavaScript】学后总结
- Lipshitz Sequence Codeforces Round #333 (Div. 1) B(单调栈)
- 第14周项目5 二叉树排序树中查找的路径