如果您查看文档,您将看到SensorEvent返回一个表示所有力的向量的数组.

http://developer.android.com/reference/android/hardware/SensorEvent.html#values

这是加速分量如何分解成每个轴:

values[0] //acceleration on x axis

values[1] //acceleration on y axis

values[2] //acceleration on z axis

您需要找到重力在哪个方向上运行,然后将其分解成其组成部分.重力的大小总是为9.8,但是方向,从而如何分解成零件,将会发生变化.假设我们可以获得重力的值并将该矢量存储在像重力的阵列中[3]:

gravity[0] //gravity x axis

gravity[1] //gravity y axis

gravity[2] //gravity z axis

手机上的总加速度T为T = g a.要得到一个我们需要一个= T – g:

linear_acceleration[0] = event.values[0] - gravity[0];

linear_acceleration[1] = event.values[1] - gravity[1];

linear_acceleration[2] = event.values[2] - gravity[2];

请注意,由于它是向量操作,它如何逐个元素地逐项计算.

棘手的部分是发现重力,因为在手机中只有一个加速度计同时测量重力和其他力.我们有两个不同的力量,我们想从一个传感器找到.如果我们只能在一个孤立的时间点看待力量,我们将无法提取信息.但是,我们可以在一段时间内获取样本,并且通过查看力量如何随着时间的推移而改变,我们可以提取信息.

这意味着我们需要根据这些力量变化的速度来筛选来自该源的结果.重力加速度的大小不会很快改变,因为它根本没有改变.重力是一个恒定的力量.但其他力量会随着时间的推移而改变.如果我们通过使用高通滤波器来滤除像重力那样的缓慢变化的力,剩余的力就是像施加到手机上的力那样快速变化的力.这就是为什么使用高通滤波器.

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐