zoukankan      html  css  js  c++  java
  • 进阶篇-安卓系统:4.安卓手机动作传感器

          动作传感器对于监测设备的移动非常有用,例如:倾斜、震动、旋转和摆动都属于动作传感器的监测范围。设备的移动通常是对用户输入的直接反应。

          所有动作传感器都会返回三个浮点数的值,对于不同的传感器,这三个值的意义不同。例如,对于加速度传感器,会返回三个坐标轴的加速数据。对于陀螺仪传感器,会返回三个坐标周的旋转角速度。

    动作传感器的使用与数据返回:加速度传感器

    如果单纯的使用加速度传感器传回的数据,会发现Z轴的的加速度是9.8多。所以看来安卓是把静止的手机竖直加速度默认为重力加速度,并且XY轴的数据也不是很准确。这并不是我们要的效果。所以需要借助重力传感器的数据来调整加速的的传感器,使其的数据更加精确。

    import android.hardware.Sensor;
    import android.hardware.SensorEvent;
    import android.hardware.SensorEventListener;
    import android.hardware.SensorManager;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    
    import java.util.List;
    
    public class MainActivity extends AppCompatActivity implements SensorEventListener{
        private SensorManager mSensorManager;
        private float[] gravity = new float[3];
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
    
    
    
        }
    
        @Override
        public void onSensorChanged(SensorEvent sensorEvent) {  //this method will be called when the sensor accuracy changed
            switch (sensorEvent.sensor.getType()){
                case Sensor.TYPE_ACCELEROMETER:
                    final float alpha = (float) 0.8;
                    gravity[0] = alpha * gravity[0] + (1 - alpha) * sensorEvent.values[0];
                    gravity[1] = alpha * gravity[1] + (1 - alpha) * sensorEvent.values[1];
                    gravity[2] = alpha * gravity[2] + (1 - alpha) * sensorEvent.values[2];
                    String data = "Acceleration:
    "+"X:"+(sensorEvent.values[0] - gravity[0])+"
    "+"Y:"+(sensorEvent.values[1] - gravity[1])+"
    "+"Z:"+(sensorEvent.values[2] - gravity[2])+"
    ";
                    System.out.println(data);
                    //System.out.println(sensorEvent.values[2] - gravity[2]);
                    break;
                case Sensor.TYPE_GRAVITY:
                    gravity[0]=sensorEvent.values[0];
                    gravity[1]=sensorEvent.values[1];
                    gravity[2]=sensorEvent.values[2];
                    break;
            }
        }
    
        @Override
        public void onAccuracyChanged(Sensor sensor, int i) {//this method will be called when the sensor data changed
    
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            mSensorManager.registerListener(this,mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_UI);
            mSensorManager.registerListener(this,mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY),SensorManager.SENSOR_DELAY_FASTEST);
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            mSensorManager.unregisterListener(this);
        }
    }

    我们在onResume方法中注册传感器。在onPause方法中解除注册传感器。

    视频里面并没有讲为什么这么处理数据能减小误差。我看了半天也没有看出来——!所以这个笔记就记下来这个减小误差的方法吧。

    输出结果:

    07-15 20:49:12.663 28389-28389/bhu.com.myapplication I/System.out: Acceleration:
    07-15 20:49:12.673 28389-28389/bhu.com.myapplication I/System.out: X:0.010284543
    07-15 20:49:12.683 28389-28389/bhu.com.myapplication I/System.out: Y:7.79517E-4
    07-15 20:49:12.683 28389-28389/bhu.com.myapplication I/System.out: Z:0.010925293
    07-15 20:49:12.723 28389-28389/bhu.com.myapplication I/System.out: Acceleration: 07-15 20:49:12.733 28389-28389/bhu.com.myapplication I/System.out: X:-0.10639935 07-15 20:49:12.733 28389-28389/bhu.com.myapplication I/System.out: Y:0.017798994 07-15 20:49:12.733 28389-28389/bhu.com.myapplication I/System.out: Z:0.018583298
    07-15 20:49:12.793 28389-28389/bhu.com.myapplication I/System.out: Acceleration: 07-15 20:49:12.793 28389-28389/bhu.com.myapplication I/System.out: X:0.04853201 07-15 20:49:12.793 28389-28389/bhu.com.myapplication I/System.out: Y:-0.03271977 07-15 20:49:12.793 28389-28389/bhu.com.myapplication I/System.out: Z:0.04224682

    看来这个加速度传感器还是很敏感的。微小的震动也能精确的测量出来。

  • 相关阅读:
    TopCoder<SRM>上的一道1100分的题目解析附代码
    《算法导论》思考题15-2 整齐打印
    《算法导论》思考题15-1 双调欧几里得旅行商问题(动态规划)
    <ReversingEngineering>关于windows32位系统下的dll注入技术经验汇
    实现一个EventEmitter类,这个类包含以下方法: on/ once/fire/off
    [Jquery 插件]活动倒计时,可同步服务器时间,倒计时格式随意设置
    阻止a标签跳转四种方法 兼容各大浏览器(包括IE)
    git常用操作 配置用户信息、拉取项目、提交代码、分支操作、版本回退...
    nrm npm源管理利器
    Element UI 框架搭建
  • 原文地址:https://www.cnblogs.com/androidNot/p/5674752.html
Copyright © 2011-2022 走看看