【发布时间】: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