Android 传感器\类型\重力获取数据的工作机制是什么?-安卓

Android 传感器\类型\重力获取数据的工作机制是什么?-安卓,android,android-sensors,gravity,Android,Android Sensors,Gravity,我有一个3-D加速度矢量(a,b,c),它是从安卓手机的加速计上获得的 我想计算这个向量(a,b,c)和重力向量之间的角度,重力向量正好向下 我注意到,在Android中,有一种方法可以在手机坐标系而不是世界坐标系下获取重力向量。只需使用传感器类型传感器类型\u重力,我就可以得到三维重力矢量(D,e,f)。由于两个矢量位于同一坐标系下,因此电话坐标系为。通过简单的向量内积,可以很容易地找到它们的角度 找到这个角度后,即使我们从手机坐标系移动到现实世界坐标系,角度也保持不变 我的问题: 传感器类型

我有一个3-D加速度矢量(a,b,c),它是从安卓手机的加速计上获得的

我想计算这个向量(a,b,c)和重力向量之间的角度,重力向量正好向下

我注意到,在Android中,有一种方法可以在手机坐标系而不是世界坐标系下获取重力向量。只需使用传感器类型
传感器类型\u重力
,我就可以得到三维重力矢量(D,e,f)。由于两个矢量位于同一坐标系下,因此电话坐标系为。通过简单的向量内积,可以很容易地找到它们的角度

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

我的问题:

传感器类型的重力
背后的工作机制是什么

我认为没有其他硬件可以测量重力。因此,测量重力的只是加速度计。重力是如何提取我们的加速度的

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

如果它是不准确的,我可以实现一个LPF来过滤直流分量,重力,由我自己。我不确定从
传感器\u TYPE\u重力
获取的数据是否比我自己获取的更准确

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

为了澄清一下,我能用以下代码正确地获得加速度和重力数据吗

正确地说,我的意思是,加速度和重力属于同一个特定的时刻吗?我需要在同一时刻使用这些值。因此,加速度为时间=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_加速计、Sensor.TYPE_重力和Sensor.TYPE_线性_加速度通过以下等式关联

"Sensor.TYPE_ACCELEROMETER" =  "Sensor.TYPE_GRAVITY" + "Sensor.TYPE_LINEAR_ACCELERATION"
如果您注册所有三个的更新,您会发现Sensor.TYPE_加速计总是首先到达,然后是Sensor.TYPE_重力和Sensor.TYPE_线性_加速度,并且这些值总是满足该等式。在内部,Android正在使用过滤,特别是Kalman过滤器来分离这两者


低通滤波器是做类似事情的一种简单方法。然而,安卓系统的机制会有很多想法,因此我确信如果低通滤波器更好,安卓系统就会实现这一点。

LPF不如使用传感器类型重力精确。我认为传感器类型重力是通过对加速度计值使用卡尔曼滤波器获得的。@HoanNguyen感谢您的评论。但为什么这里可以使用卡尔曼滤波器呢?它是用陀螺融合的。您可以在上阅读源代码。太棒了!谢谢那我可以问你另一件事吗?如果是如您所说的,那么我可以说,一旦Sensor.TYPE_加速计的数据发生变化,Sensor.TYPE_重力的数据也必须发生变化吗?i、 e.我只需要一个条件:如果(event.sensor.getType()==sensor.TYPE\u Accelerator)检查来自所有3个传感器的数据是否发生变化。除非设备位于桌子上(或类似位置),在这种情况下,值为零,否则值将一直在变化。加速度是速度的变化,任何运动(无论多么小)都会被拾取。所以不要期望这些值中的任何一个是稳定的。但是,您的问题的简单答案是“是”,如果您得到Sensor.TYPE\u加速计的
onSensorChanged
事件,那么Sensor.TYPE\u重力和Sensor.TYPE\u线性加速度也发生了变化,并且几乎立即会有两个调用
onSensorChanged
,每个传感器一个。你能参考我更新的问题帖子来帮助澄清这一点吗?上面的代码是否按预期工作?您将看到两个调用
onSensorChanged
,但它们都与来自加速计的相同底层读数相关,因此是的,我认为代码可以工作。此外,如果您向监视器
传感器添加代码。键入\u LINEAR\u ACCELERATION
,则您可以自己检查我所说的内容。记住,首先看到的是
传感器。TYPE_加速计
。@SharkAlley很多android源代码都是开源的,所以很可能它就在上面的某个地方。但是如果你真的需要一个答案,我建议你发布一个关于这个的新问题。