好的,尽管这个问题已经相当老了,但我在目前的答案和评论中看到了很多混乱,所以如果有人发现这个问题,我打算澄清一些事情。
陀螺仪
首先,陀螺仪不会根据您的定义测量垂直运动(平移运动)。它测量围绕每个轴的旋转,这些轴的定义如下图所示。因此,让您向前和向后倾斜您的设备确实会围绕 x 轴旋转它,因此您将在陀螺仪传感器的 x 值中看到非零值。
陀螺仪中的 x 值代表垂直平面。
我不确定“垂直平面”是什么意思,但是 x 值当然不代表平面本身,也不代表设备在平面内的方向。
陀螺仪传感器的 x 值表示设备绕 x 轴的当前角速度(例如旋转的变化)。
但是当您将设备向前倾斜时,x 值会发生变化。当我做出这个动作时,读取垂直运动的同一个传感器会为此读取一个值。
不太清楚你在这里指的是什么。我假设“读取垂直运动的同一传感器”是陀螺仪,但如前所述,它不会读取垂直运动。它完全按照锡上所说的那样做。
设备坐标系
这更多是对用户 Ali 的回答,而不是原始问题,但在任何一种情况下都具有相关性。
线性加速度传感器(或任何其他传感器)的各个输出在设备的坐标系中表示,如上图所示。这意味着如果您稍微旋转设备,输出将不再平行于它们之前重合的任何世界轴。因此,您要么必须强制设备处于应用程序的特定方向,要么将新方向考虑在内。
ROTATION_VECTOR
传感器与四元数数学或getRotationMatrixFromVector()
方法相结合,是将您的测量值从设备坐标转换为世界坐标的一种方法。还有其他方法可以实现相同的目标,但一旦实现,您握持设备的方式对于测量垂直运动将不再重要。
无论哪种情况,您要查找的轴都是 y 轴,而不是 z 轴。
(如果你的意思是“沿着设备 y 轴”作为“垂直”,那么只需忽略所有方向的东西,只使用线性加速度传感器)
噪音
您在问题中提到了一些关于噪音和更新率的问题,所以我在这里只提一下。从经常变化的事物中获取良好、一致的数据的最简单和最常见的方法之一是使用低通滤波器。哪种类型的滤波器最好取决于应用程序,但我发现指数移动平均滤波器在大多数情况下是可行的。
整理思绪
请注意,如果您适当注意方向,则转换后的线性加速度输出将很好地近似垂直运动(嗯,运动变化),而不会过滤任何噪声。
此外,如果要测量垂直“运动”,例如速度,则需要集成加速度计输出。出于各种原因,在大多数情况下,这并不是真的很好,尽管它在速度的情况下不太严重,而不是尝试测量位置。