6

我正在开发一个需要检测垂直运动的 android 应用程序。向上移动平板电脑时,陀螺仪、加速度计和线性加速度传感器会给出相应的值来指示向上或向下运动。

我遇到的问题是,当您将平板电脑向用户倾斜或远离用户倾斜时,这些传感器也会读取向上/向下的运动。例如,陀螺仪中的 x 值代表垂直平面。但是当您将设备向前倾斜时,x 值会发生变化。当我做出这个动作时,读取垂直运动的同一个传感器会为此读取一个值。 在此处输入图像描述

其余传感器也是如此。我尝试使用与陀螺仪结合的方向来制作条件语句,如果音高没有变化,但 x 变量向上/向下,那么我们有垂直运动。这样做的问题是,如果用户将其向上移动但稍微倾斜,它将不再起作用。我也尝试过这样做,所以如果倾斜发生变化,那么就没有垂直运动。但它迭代得如此之快,以至于倾斜可能会在 1/100 秒内发生变化,但下一秒则没有。

有什么方法可以让我只读取垂直变化而不读取设备间距的变化?

这是我要检测的内容: 在此处输入图像描述

编辑:

“请对你认为的‘向上移动’提出一个数学上合理的定义。”这是我最初的问题,我如何编写一个函数来定义平板电脑何时向上或向下移动?我考虑向上移动的垂直平移。现在我该如何检测呢?我根本不知道从哪里开始,谢谢。

4

2 回答 2

2

好的,尽管这个问题已经相当老了,但我在目前的答案和评论中看到了很多混乱,所以如果有人发现这个问题,我打算澄清一些事情。

陀螺仪

首先,陀螺仪不会根据您的定义测量垂直运动(平移运动)。它测量围绕每个轴的旋转,这些轴的定义如下图所示。因此,让您向前和向后倾斜您的设备确实会围绕 x 轴旋转它,因此您将在陀螺仪传感器的 x 值中看到非零值。

设备轴

陀螺仪中的 x 值代表垂直平面。

我不确定“垂直平面”是什么意思,但是 x 值当然不代表平面本身,也不代表设备在平面内的方向。

陀螺仪传感器的 x 值表示设备绕 x 轴的当前角速度(例如旋转的变化)。

但是当您将设备向前倾斜时,x 值会发生变化。当我做出这个动作时,读取垂直运动的同一个传感器会为此读取一个值。

不太清楚你在这里指的是什么。我假设“读取垂直运动的同一传感器”是陀螺仪,但如前所述,它不会读取垂直运动。它完全按照锡上所说的那样做。

设备坐标系

这更多是对用户 Ali 的回答,而不是原始问题,但在任何一种情况下都具有相关性。

线性加速度传感器(或任何其他传感器)的各个输出在设备的坐标系中表示,如上图所示。这意味着如果您稍微旋转设备,输出将不再平行于它们之前重合的任何世界轴。因此,您要么必须强制设备处于应用程序的特定方向,要么将新方向考虑在内。

ROTATION_VECTOR传感器与四元数数学或getRotationMatrixFromVector()方法相结合,是将您的测量值从设备坐标转换为世界坐标的一种方法。还有其他方法可以实现相同的目标,但一旦实现,您握持设备的方式对于测量垂直运动将不再重要。

无论哪种情况,您要查找的轴都是 y 轴,而不是 z 轴。

(如果你的意思是“沿着设备 y 轴”作为“垂直”,那么只需忽略所有方向的东西,只使用线性加速度传感器)

噪音

您在问题中提到了一些关于噪音和更新率的问题,所以我在这里只提一下。从经常变化的事物中获取良好、一致的数据的最简单和最常见的方法之一是使用低通滤波器。哪种类型的滤波器最好取决于应用程序,但我发现指数移动平均滤波器在大多数情况下是可行的。

整理思绪

请注意,如果您适当注意方向,则转换后的线性加速度输出将很好地近似垂直运动(嗯,运动变化),而不会过滤任何噪声。

此外,如果要测量垂直“运动”,例如速度,则需要集成加速度计输出。出于各种原因,在大多数情况下,这并不是真的很好,尽管它在速度的情况下不太严重,而不是尝试测量位置。

于 2015-07-01T12:55:58.733 回答
1

好的,我怀疑这只是部分答案。

如果要检测垂直运动,只需要线性加速度,设备方向无关紧要。看

iOS - 如何判断设备是否被抬起/放下(CoreMotion)

或者

如何计算手机从静止垂直方向的运动?

出于某种原因,您也关心设备方向,我不知道为什么。我怀疑你想检测别的东西。所以请告诉我们更多,然后我会改进我的答案。


更新

我读了关于 coremotion 的帖子,你提到 z 越高 x 和 y 越低意味着垂直运动,你能详细说明一下吗?

我将用伪代码编写。您测量了(x, y, z)线性加速度矢量。计算

rel_z = z/sqrt(x^2+y^2+z^2+1.0e-6)

如果rel_z > 0.9那么朝 z 方向的加速度占主导地位(垂直运动)。请注意,常数0.9是任意的,可能需要调整(应该是小于 1 的正数)。是为了1.0e-6避免意外被零除。

您可能必须添加另一个z足够大的约束。我不知道你的设备,它测量重力是 1 还是 9.81。我假设它测量为 1。

总而言之:

if (rel_z > 0.9 && abs(z) > 0.1) { // we have vertical movement

同样,常数0.1是任意的,可能需要调整。它应该是积极的。


更新 2

我不想要这个,因为向我旋转它并没有向上移动它

它正在向上移动:质心正在向上移动。我的代码具有正确的行为。

请对您认为“向上移动”的内容提出一个数学上合理的定义。

于 2012-11-02T21:50:25.417 回答