垂直运动传感器(Vertical movement sensor)

2019-07-03 13:08发布

我工作的一个Android应用程序,需要垂直运动的检测。 当向上移动平板,陀螺仪,加速度计,和线性加速度传感器得到表示向上或向下运动的对应值。

我的问题是,这些传感器也将读取的向上/向下运动时,你倾斜向平板电脑用户或远离使用者。 例如,在陀螺仪的x值表示垂直平面中。 但是,当你倾斜设备转发,x值将发生变化。 当我使这个运动,其读取垂直运动相同的传感器读取该值。

这同样适用于传感器的其余部分。 我曾尝试使用加上陀螺定向,使条件语句,如果间距不改变,但是X变量会向上/向下,那么我们有垂直运动。 这里的问题是,如果用户移动起来,但稍微倾斜,这将不再起作用。 我也试图使它所以如果有斜度的改变,那么就没有垂直运动。 但是,迭代速度很快,有可能是1/100秒,斜度的改变,但在未来没有。

有没有什么办法可以只读中的设备间距垂直变化,不变化?

下面是我想检测一下:

编辑:

“请拿出你认为是一个数学上声音的清晰度‘向上移动。’”这是我最初的问题,我怎么能写一种功能,当平板向上或向下移动来定义? 我认为垂直平移向上移动。 现在,我怎样检测呢? 我根本不知道从哪里开始,谢谢。

Answer 1:

好吧,尽管这个问题是相当老了,我看到很多本答案和注释混乱的,所以万一有人认为这,我打算清除一些东西了。

陀螺仪

首先,陀螺仪不测量垂直运动按照您的定义(平移运动)。 它测量围绕每个轴,其被定义为在下面的图中的旋转。 因此,具有你倾斜设备向前和向后旋转确实它绕x轴,因此,你会看到在你的陀螺仪传感器的x值的非零值。

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

我不知道什么是“垂直平面”的意思,但是x的值当然并不代表飞机本身,也不是设备的平面内的方位。

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

但是,当你倾斜设备转发,x值将发生变化。 当我使这个运动,其读取垂直运动相同的传感器读取该值。

不太清楚你指的是在这里。 我假定“读取垂直运动的相同的传感器”是陀螺仪,但如先前所述,它不读取垂直运动。 这也正是它在锡说。

设备坐标系

这是更响应用户阿里的回答比原来的问题,但它仍然是在任何情况下有关。

线性加速度传感器的单个输出(或任何其它传感器也如此) 在设备的坐标系中表达,如所示的图像中的上方。 这意味着,如果你稍微旋转装置,输出将不再是平行于任何世界轴与他们之前一致。 因此,您将不得不执行该设备是在一个特定的方向为你的应用程序,或采取新的方向考虑。

ROTATION_VECTOR传感器,与四元数的数学或合并getRotationMatrixFromVector()方法,是从设备坐标到世界坐标翻译您的测量方式之一。 还有其他的方法来达到同样的目的,但一旦实现,你把你的设备的方式并不重要,用于测量垂直运动。

在这两种情况下,你要寻找的轴为Y轴,而不是Z轴。

(万一你指的是“沿装置Y轴”为“垂直的”,那么就忽略所有的取向的东西,只是使用线性加速度传感器)

噪声

你提到关于这个问题的噪音和更新速率一些问题,所以我就提到它在这里。 最简单和更常见的方法可以从一些变化常常是使用低通滤波器获得不错的,一致的数据之一。 什么类型的过滤器是最好的取决于应用程序,但我发现一个指数移动平均过滤器在大多数情况下是可行的。

整理思绪

需要注意的是,如果你走的方向适当的照顾,你的转化线性加速度输出将是垂直运动(当然,在运动变化)的一个很好的近似无过滤任何噪音。

另外,如果你想测量垂直的“运动”,如速度,则需要将加速度计输出整合。 由于种种原因,这并没有真正变成非常清楚在大多数情况下,虽然它在速度的情况不太严重,而不是试图测量位置。



Answer 2:

OK,我怀疑这只是一个局部的答案。

如果要检测垂直运动,你只需要线性加速,设备的方向没有关系。 看到

iOS版-如何判断设备升起/下降(CoreMotion)

要么

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

出于某种原因,你所关心的设备的方向为好,我不知道为什么。 我怀疑你要检测别的东西。 所以,请告诉我们更多,然后我会提高自己的答案。


UPDATE

我读了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

我不希望这样,因为旋转它朝我不向上移动它

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

请拿出你认为是一个数学上的声音定义“向上移动”。



文章来源: Vertical movement sensor