如何实现Android传感器TYPE_LINEAR_ACCELERATION和TYPE_ROTATION_VECTOR?

时间:2017-03-02 10:06:03

标签: android sensor android-sensors android-hardware sensor-fusion

我一直在寻找安静的时间,因为Android API使用的算法融合了来自不同传感器的原始数据,以生成虚拟传感器。

他们是如何实施的? 源代码在某处可用吗?

2 个答案:

答案 0 :(得分:0)

  

源代码在某处可用吗?

不幸的是,融合位置提供程序API不是Android开放源代码项目的一部分,而是作为Google Play服务的一部分实现的,这是一种专有的Google软件,其源代码不公开。实际上,FusedLocationProviderApi.java接口实现是有目的地混淆的,例如:

public class zzd implements FusedLocationProviderApi {
    public zzd() {
    }

    public Location getLastLocation(GoogleApiClient var1) {
        zzl var2 = LocationServices.zzj(var1);

        try {
            return var2.getLastLocation();
        } catch (Exception var4) {
            return null;
        }
    }
...
  

它们是如何实施的?

由于源不可用,我们可能只会推测其实现方式。

答案 1 :(得分:-3)

您必须获得传感器管理器的实例

private SensorManager mSensorManager;
private Sensor mSensor;
  ...
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

之后,您可以访问加速度计数据,如下所示:

public void onSensorChanged(SensorEvent event){
  // In this example, alpha is calculated as t / (t + dT),
  // where t is the low-pass filter's time-constant and
  // dT is the event delivery rate.

  final float alpha = 0.8;

  // Isolate the force of gravity with the low-pass filter.
  gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
  gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
  gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];

  // Remove the gravity contribution with the high-pass filter.
  linear_acceleration[0] = event.values[0] - gravity[0];
  linear_acceleration[1] = event.values[1] - gravity[1];
  linear_acceleration[2] = event.values[2] - gravity[2];
}

有关详细信息,请阅读developer.android Page