传感器数据采样率控制

一般情况下,不需要太高的传感器数据采样率,采样太快,对设备有一定的耗电影响。

1.传感器的种类

SENSOR_TYPE_ACCELEROMETER 1 //加速度
SENSOR_TYPE_MAGNETIC_FIELD 2 //磁力
SENSOR_TYPE_ORIENTATION 3 //方向
SENSOR_TYPE_GYROSCOPE 4 //陀螺仪
SENSOR_TYPE_LIGHT 5 //光线感应
SENSOR_TYPE_PRESSURE 6 //压力
SENSOR_TYPE_TEMPERATURE 7 //温度 
SENSOR_TYPE_PROXIMITY 8 //接近
SENSOR_TYPE_GRAVITY 9 //重力
SENSOR_TYPE_LINEAR_ACCELERATION 10//线性加速度
SENSOR_TYPE_ROTATION_VECTOR 11//旋转矢量

2.SensorManager提供的采样率

在SensorManager这个类中提供了四种采样频率,分别如下:

SENSOR_DELAY_NOMAL     (200000微秒)             200ms
SENSOR_DELAY_UI        (60000微秒)              60ms
SENSOR_DELAY_GAME      (20000微秒)              20ms
SENSOR_DELAY_FASTEST   (0微秒)                  0ms

3.获取指定数量的采样数据

虽然在SensorManager中提供了几种采样率,并且也可以自定义时间控制采样率,比如说1秒中采用6次
加速度传感器的数据。

Sensor accelerometerSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(mSensorEventListener,accelerometerSensor,167000);

但是由于采样数据并不是平均出来的,经过测试发现有可能某一秒只采取了5次数据。并不满足实际需求。
所以改采用另外的方式,即提高采样率为每秒十次左右,然后在线中定时去取数据,具体实现代码片段如下。

mAccThread = new HandlerThread("ACCELEROMETER_THREAD");
mAccThread.start();
mAccHandler = new Handler(mAccThread.getLooper(), accCallback);

*注册加速度传感器监听*
Sensor accelerometerSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(mSensorEventListener,accelerometerSensor,100000);
*数据回调*
SensorEventListener mSensorEventListener = new SensorEventListener() {
		@Override
		public void onAccuracyChanged(Sensor sensor, int accuracy) {

		}

		@Override
		public void onSensorChanged(SensorEvent event) {
			if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
                float x = Math.abs(event.values[0]);
                float y = Math.abs(event.values[1]);
                float z = Math.abs(event.values[2]);
                sendDataMessage(x, y, z);
			}
		}
	};
*传输数据*
private void sendDataMessage(float x, float y, float z) {
     Message msg = mAccHandler.obtainMessage();
     msg.what = MSG_ASENSOR;
     Bundle bundle = new Bundle();
     bundle.putFloat("x", x);
     bundle.putFloat("y", y);
     bundle.putFloat("z", z);
     msg.setData(bundle);
     mAccHandler.sendMessage(msg);
}
*定时采取数据*
private Handler.Callback accCallback = new Handler.Callback() {
		@Override
		public boolean handleMessage(Message msg) {
			int what = msg.what;
			switch (what) {
				case MSG_ASENSOR:
					float ax = msg.getData().getFloat("x");
					float ay = msg.getData().getFloat("y");
					float az = msg.getData().getFloat("z");
					break;
			}
			try {
				Thread.sleep(167);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			return false;
		}};

这样就能够实现需求1秒采取6次传感器数据啦。

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值