Android Gserson 重力传感器校准

sancaiodm Android应用 2022-06-15 1162 0

     在MTK平台 开机时同时按住:音量减键+开机键 即可进入工厂模式,在工厂模式内有一个gsensor calibration,该功能就是去G-Serson重力传感器(也叫加速度传感 器)校准的,

请注意区分 工厂模式与工程模式APP

工程模式APP:  alps\vendor\mediatek\proprietary\packages\apps\EngineerMode

使用 SensorManager 获取到全部的传感器

List<Sensor> sensorList = mSensorManager.getSensorList(Sensor.TYPE_ALL)

sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY);


SensorEventListener 说明

当传感器数据发生变化的时候,Android 传感器框架构建了一个事件(SensorEvent),我们可以使用 SensorEventListener 接口来监听数据变化,并在 onSensorChanged()回调中处理新数据

SensorEventListener 包括两个回调函数,我们能够在其中处理传感器数据

onSensorChanged() : 当传感器数据时可用的,我们可以在这里处理我们 APP 中的新传感器数据

onAccuracyChanged(): 当传感器精确度改变后,我们的 APP 能够响应这个变化


如下:当设备运动或者旋转的时候,这些坐标轴是不会改变的,即它们是跟随手机的

计算每个坐标轴上的实际量程和理论量程的比例关系scale

计算每个坐标轴上的零点偏移offset

android加速度校准.png

对原始数据进行校准调整

android serson校准.png


Accelerometer 加速度传感器

加速度传感器又叫G-sensor,返回x、y、z三轴的加速度数值。

该数值包含地心引力的影响,单位是m/s^2。

将手机平放在桌面上,x轴默认为0,y轴默认0,z轴默认9.81。 将手机朝下放在桌面上,z轴为-9.81。 将手机向左倾斜,x轴为正值。 将手机向右倾斜,x轴为负值。 将手机向上倾斜,y轴为负值。 将手机向下倾斜,y轴为正值。


 使用方式

第一步:获取SensorManager对象

第二步:获取Sensor对象

第三步:注册Sensor对象

第四步:重写onAccuracyChanged,onSensorChanged这两个方法

第五步:注销Sensor对象

public class SensorActivity extends Activity implements SensorEventListener {
  private SensorManager mSensorManager;
  private Sensor mSensor;
  @Override
  public final void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    //第一步:通过getSystemService获得SensorManager实例对象
    mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    //第二步:通过SensorManager实例对象获得想要的传感器对象:参数决定获取哪个传感器
    mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
  }
  //第四步:必须重写的两个方法:onAccuracyChanged,onSensorChanged
  /**
   * 传感器精度发生改变的回调接口
   */
  @Override
  public final void onAccuracyChanged(Sensor sensor, int accuracy) {
    //TODO 在传感器精度发生改变时做些操作,accuracy为当前传感器精度
  }
  /**
   * 传感器事件值改变时的回调接口:执行此方法的频率与注册传感器时的频率有关
   */
  @Override
  public final void onSensorChanged(SensorEvent event) {
    // 大部分传感器会返回三个轴方向x,y,x的event值,值的意义因传感器而异
    float x = event.values[0];
    float y = event.values[1];
    float z = event.values[2];
    //TODO 利用获得的三个float传感器值做些操作
  }
  /**
   * 第三步:在获得焦点时注册传感器并让本类实现SensorEventListener接口
   */
  @Override
  protected void onResume() {
    super.onResume();
    /*
     *第一个参数:SensorEventListener接口的实例对象
     *第二个参数:需要注册的传感器实例
     *第三个参数:传感器获取传感器事件event值频率:
   *              SensorManager.SENSOR_DELAY_FASTEST = 0:对应0微秒的更新间隔,最快,1微秒 = 1 % 1000000秒
   *              SensorManager.SENSOR_DELAY_GAME = 1:对应20000微秒的更新间隔,游戏中常用
   *              SensorManager.SENSOR_DELAY_UI = 2:对应60000微秒的更新间隔
   *              SensorManager.SENSOR_DELAY_NORMAL = 3:对应200000微秒的更新间隔
   *              键入自定义的int值x时:对应x微秒的更新间隔
     *
     */
    mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL);
  }
  /**
   * 第五步:在失去焦点时注销传感器
   */
  @Override
  protected void onPause() {
    super.onPause();
    mSensorManager.unregisterListener(this);
  }
}


网文:

https://blog.csdn.net/qq_23452385/article/details/106485863

https://blog.csdn.net/hjwang1/article/details/106949028


评论