来自智能手机的后处理传感器读数 - 从磁力计计算的重力

Posted

技术标签:

【中文标题】来自智能手机的后处理传感器读数 - 从磁力计计算的重力【英文标题】:Post-processing sensor readings from smartphone - gravity calculated from magentometer 【发布时间】:2013-03-18 13:38:42 【问题描述】:

我现在正在尝试从记录加速度计、陀螺仪和磁力计输出的 android 应用程序中提取 Matlab 信息。由于我需要找到线性加速度,我假设我可以从加速度计计算它,并考虑重力。我认为应该可以通过根据磁力计输出(地球磁场)检查手机方向来找到它。但我无法用任何公式得到正确的结果。借助磁力计可以找到重力矢量,我说得对吗?如果是这样,我应该如何解释传感器读数?

【问题讨论】:

我认为您需要某种形式的校准时间。例如已知电话静止的时期。然后你会得到两个向量,一个是重力加速度,一个是磁场引起的磁力计。 但是我有一个实际测量线性加速度的应用程序,它似乎是正确的,无需校准。它是如何做到的? 【参考方案1】:

不,不可能从磁力计中找到重力。


你要找的东西叫做sensor fusion。我已经根据这个手稿为Shimmer platform实现了sensor fusion,它基本上是一个教程:

Direction Cosine Matrix IMU: Theory

我强烈推荐的另一个资源是Sensor fusion on Android devices.

但是你为什么要自己做呢? SensorManager 已经提供了您想要的。

【讨论】:

【参考方案2】:

您可以通过对加速度计值进行低通滤波器以获取重力,然后从重力中减去加速度计值来获得线性加速度。下面的代码来自http://developer.android.com/reference/android/hardware/SensorEvent.html

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

      final float alpha = 0.8;

      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];

      linear_acceleration[0] = event.values[0] - gravity[0];
      linear_acceleration[1] = event.values[1] - gravity[1];
      linear_acceleration[2] = event.values[2] - gravity[2];
 

【讨论】:

以上是关于来自智能手机的后处理传感器读数 - 从磁力计计算的重力的主要内容,如果未能解决你的问题,请参考以下文章

陀螺仪和加速度计的读数和四元数怎么建立关系

使用 adb 从损坏的 android 设备中回收传感器

陀螺仪加速计磁力计等传感器汇总

如何实现 iOS 金属探测器应用程序?

如何在android的驱动程序中对加速度传感器的数据进行方向和坐标的转

来自磁力计数据的方向