- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个从 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];
}
}
最佳答案
三个传感器 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 就会实现它。
关于android - SENSOR_TYPE_GRAVITY获取其数据的工作机制是什么? - 安卓,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17102831/
我是一名优秀的程序员,十分优秀!