运动传感器的可能架构因传感器类型而异:
- 重力、线性加速度、旋转矢量、有效运动、计步器和步测器传感器可能基于硬件,也可能基于软件(处理过的数据,可能为多个传感器数据的融合)。
- 加速度计传感器和陀螺仪传感器始终基于硬件。
一、安卓运动传感器
大多数 Android 设备都配有加速度计,而现在许多设备都带有陀螺仪。基于软件的传感器的可用性更具可变性,因为其通常依赖一个或多个硬件传感器来获取其数据。根据设备的不同,这些基于软件的传感器可以从加速度计和磁力计或陀螺仪中获取其数据。
运动传感器在监控设备运动方面(例如倾斜、晃动、旋转或摆动)非常有用。所有运动传感器都为每个 SensorEvent返回传感器值的多维数组。例如,在单个传感器事件期间,加速度计返回三个坐标轴的加速力数据,而陀螺仪返回三个坐标轴的旋转速率数据。这些数据值与其他 SensorEvent参数一起在 float
数组中(values)返回。(详细参考:运动传感器)
二、传感器数据使用
使用不同传感器的方法大致相同,通过调用系统API就可以实现。分为以下几步:
1.获取SensorManager
2.使用SensorManager获取加速度传感器
3.创建自定义的传感器监听函数,并注册
4.相对应的,在合适位置实现注销监听器的调用
三、线性加速度传感器
线性加速传感器为您提供了一个三维矢量,表示沿着每个设备轴的加速度(不包括重力)。您可以使用此值执行手势检测。该值还可以用作惯性导航系统的输入值,该系统使用航位推测法。以下代码展示如何获取默认线性加速传感器的实例:
private SensorManager sensorManager;
private Sensor sensor;
...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);
四、旋转矢量传感器
旋转矢量将设备的屏幕方向表示为角度和轴的组合,其中设备已围绕轴(x、y 或 z)旋转了 θ 度,SensorEvent默认返回四元数。以下代码展示如何获取默认旋转矢量传感器的实例:
private SensorManager sensorManager;
private Sensor sensor;
...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
五、四元数的使用
暂且不想去理解,等后续需要使用并计算时候再去看看相关概念和用法,有一个B站up主的视频不错:四元数的可视化。
六、开发注意事项
有的手机没有陀螺仪,不利于做惯导实验。
七、关键代码
同时监听线性加速度与旋转矢量,在监听函数onSensorChanged里面需要添加条件判断。
public class MainActivity extends AppCompatActivity implements SensorEventListener{
private SensorManager sensorManager;
private Sensor linear;
private Sensor rotation;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
linear = sensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);
rotation = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
}
@Override
public final void onAccuracyChanged(Sensor sensor, int accuracy) {
// Do something here if sensor accuracy changes.
}
@Override
public final void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_LINEAR_ACCELERATION) {
// 获取加速度传感器的三个参数
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
LogUtil.i("LINEAR", "onSensorChanged: " + x + ", " + y + ", " + z);
}
if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) {
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
float w = event.values[3];
LogUtil.i("ROTATION", "onSensorChanged: " + x + ", " + y + ", " + z + "," + w);
}
}
@Override
protected void onResume() {
super.onResume();
// 注册传感器监听函数
sensorManager.registerListener(this, linear, SensorManager.SENSOR_DELAY_NORMAL);
sensorManager.registerListener(this, rotation, SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onPause() {
super.onPause();
// 注销监听函数
sensorManager.unregisterListener(this);
}
}