android - TYPE_ACCELEROMETER 去掉重力,t/(t+dT)的意思

标签 android

Android 开发者示例:

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

alpha = 0.8 算出什么样的数值? 我想问一下t和dT的具体值。

最佳答案

为了回答您的问题,我将不得不深入研究低通滤波器,因为 alpha 几乎是我们获得的最后一个值。

低通滤波器通常按以下顺序构建:

  1. cutoff Frequency fc 以赫兹为单位,你要削减(这里的重力是持续的,所以该值应该在 1Hz 左右)
  2. Time-constant τ (tau) τ = 1/(2 * π * fc)
  3. 时间增量 Δt 以秒为单位。 ∆t = t2 - t1
  4. 平滑因子 α,在本例中为 α = τ/(τ + Δt)
  5. 以前的输出和新的输入以获得新的输出。

alpha 的作用是赋予一个值或多或少的重要性。为了工作,过滤器需要一个介于 0 和 1 之间的 alpha。在这种情况下,先前的输出(重力)权重占新输出的 80%,新输入(event.values)权重占 20% => new gravity = 80% 旧重力 + 20% 加速度

Δt 由传感器的实现给出。通常为 SENSOR_DELAY_NORMAL是0.2s。

τ 由 α = 0.8 和 ∆t = 0.2s 计算

从 α 中提取 τ 将给出:

τ = (∆t * α) / (1 - α)

并且有了之前的值,你会发现

τ  = 0.2 * 0.8 / (1 - 0.8) = 0.8

使用 τ,您可以计算 fc:

fc = 1 / (2 * π * τ) = 1/( 2 * 3.14 * 0.8) = 0.2Hz.

关于android - TYPE_ACCELEROMETER 去掉重力,t/(t+dT)的意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35190839/

相关文章:

android - 使用 Android Monkey 进行测试.. 停留在首选项屏幕上?

java - Firebase 获取所有子值并将其存储在数组中

android - android SearchView 的搜索类型是什么?

安卓 : Magento 2 e-commerce Website not Working in android Webview

android - 改造 2 : Get JSON from Response body

安卓子网扫描

Eclipse 的 Android 问题

android - 在 Android 上收听连接变化

Android Espresso 不等待 UI 完成

android - 在fragment中使用TabLayout和ViewPager