【问题标题】:What is the working mechanism of SENSOR_TYPE_GRAVITY to get its data? - AndroidSENSOR_TYPE_GRAVITY 获取其数据的工作机制是什么? - 安卓
【发布时间】:2013-06-14 07:00:42
【问题描述】:

我有一个从 Android 手机加速度计获得的 3-D 加速度矢量(a、b、c)。

我希望计算这个向量 (a, b, c) 和重力向量之间的角度,它正好指向下方。

我注意到在 Android 中,有一种方法可以在手机坐标系而不是世界坐标系的上下文中获取重力矢量。通过简单地使用传感器类型SENSOR_TYPE_GRAVITY,我可以获得 3-D 重力矢量 (d, e, f)。由于两个向量都在同一个坐标系下,即电话坐标系。通过简单的向量内积,可以很容易地找到它们的角度。

找到这个角度后,即使我们从手机坐标系移动到现实世界坐标系,这个角度也保持不变。

我的问题:

SENSOR_TYPE_GRAVITY背后的工作机制是什么?

我认为没有其他硬件可以测量重力。因此,只有加速度计测量重力。重力是如何从合成的加速中提取出来的?

我问是因为我担心这种获取重力的方法的准确性。

如果不准确,我可以自己实现一个 LPF 来过滤直流分量,即重力。我不确定从SENSOR_TYPE_GRAVITY 获取它是否比我自己做的更准确。

===================================更新============ =============================

澄清一下,我可以使用以下代码正确获取加速度和重力数据吗?

正确地说,我的意思是加速度和重力是否属于同一个特定时刻?我需要在一个瞬间使用这些值。因此,加速度为时间=13:12:00 而重力为稍后时间的情况,比如时间=13:12:01 是不希望的。

public void onSensorChanged(SensorEvent event) { 

    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { 
        acceleration[0] = event.values[0];
        acceleration[1] = event.values[1];
        acceleration[2] = event.values[2];
    }

    if (event.sensor.getType() == Sensor.TYPE_GRAVITY) {
        gravity[0] = event.values[0];
        gravity[1] = event.values[1];
        gravity[2] = event.values[2];
    }

}

【问题讨论】:

  • LPF 不如使用 SENSOR_TYPE_GRAVITY 准确。我认为 SENSOR_TYPE_GRAVITY 是通过对加速度计值使用卡尔曼滤波器获得的。
  • @HoanNguyen 感谢您的评论。但是为什么这里可以使用卡尔曼滤波器呢?
  • 使用陀螺仪融合。您可以在github.com/android/platform_frameworks_base/tree/ics-mr1/…阅读源代码。

标签: android android-sensors gravity


【解决方案1】:

Sensor.TYPE_ACCELEROMETER、Sensor.TYPE_GRAVITY 和 Sensor.TYPE_LINEAR_ACCELERATION 这三个传感器由等式关联

"Sensor.TYPE_ACCELEROMETER" =  "Sensor.TYPE_GRAVITY" + "Sensor.TYPE_LINEAR_ACCELERATION"

如果您注册所有三个的更新,您会发现 Sensor.TYPE_ACCELEROMETER 总是先到达,然后是 Sensor.TYPE_GRAVITY 和 Sensor.TYPE_LINEAR_ACCELERATION,并且这些值始终满足该等式。在内部,Android 正在使用过滤,特别是卡尔曼过滤器,将两者分开。

低通滤波器是一种做类似事情的简单方法。不过,Android 机制会考虑很多问题,所以我敢肯定,如果低通滤波器更好,那么 Android 就会实现它。

【讨论】:

  • 太棒了!谢谢!那我可以再问你一件事吗?如果如你所说,那我可以说一旦 Sensor.TYPE_ACCELEROMETER 的数据发生变化,那么 Sensor.TYPE_GRAVITY 的数据也一定会发生变化吗?即我只需要一个条件:if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) 来检查来自所有 3 个传感器的数据是否发生了变化。
  • 除非设备放在桌子上(或类似的),在这种情况下值为零,值将一直在变化。加速度是速度的变化,任何运动(无论多么小)都会被拾起。所以不要指望这些值中的任何一个是稳定的。但是,对您的问题的简单回答是“是”,如果您收到 Sensor.TYPE_ACCELEROMETER 的 onSensorChanged 事件,那么 Sensor.TYPE_GRAVITY 和 Sensor.TYPE_LINEAR_ACCELERATION 也发生了变化,并且几乎立即就会有两个对 @ 的进一步调用987654324@,每个传感器一个。
  • 您能否参考我更新的问题帖子来帮助澄清这一点?上面的代码是否按预期工作?
  • 您将看到对onSensorChanged 的两次调用,但它们都与来自加速度计的相同基础读数相关,所以是的,我认为代码可以工作。另外,如果您添加代码来监控Sensor.TYPE_LINEAR_ACCELERATION,那么您可以检查我自己说的话。请记住,首先看到的是Sensor.TYPE_ACCELEROMETER
  • @SharkAlley 很多 android 源代码都是开源的,所以大概在 source.android.com 的某个地方。但如果你真的需要答案,我建议你发布一个关于这个的新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-22
  • 2017-01-12
  • 1970-01-01
  • 2013-04-26
  • 1970-01-01
  • 2018-12-19
相关资源
最近更新 更多