4

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

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

我注意到在 Android 中,有一种方法可以在手机坐标系而不是世界坐标系的上下文中获取重力矢量。通过简单地使用 sensor type 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];
    }

}
4

1 回答 1

5

三个传感器 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 就会实现它。

于 2013-06-14T07:56:13.080 回答