垂直运动传感器

use*_*223 6 android accelerometer motion tilt gyroscope

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

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

其他传感器也是如此.我试图使用方向与陀螺仪结合来制作条件语句,如果音高没有变化,但是x变量上升/下降,那么我们就有垂直运动.这个问题是,如果用户向上移动但略微倾斜,它将不再起作用.我也试过这样做,如果倾斜有变化,那么就没有垂直运动了.但是迭代速度如此之快,以至于倾斜度可能会有1/100秒的变化,但是接下来却没有.

有什么方法我只能读取垂直变化而不是设备间距的变化吗?

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

编辑:

"请提出一个数学上合理的定义,你认为'向上移动'."这是我最初的问题,我如何编写一个函数来定义平板电脑何时向上或向下移动?我认为垂直翻译向上移动.现在我该怎么检测到这个?我根本不知道从哪里开始,谢谢.

Ali*_*Ali 1

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

如果你想检测垂直运动,你只需要线性加速度,设备方向并不重要。看

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

或者

如何计算手机从静止状态到垂直方向的移动量?

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


更新

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

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

rel_z = z/sqrt(x^2+y^2+z^2+1.0e-6)
Run Code Online (Sandbox Code Playgroud)

如果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
Run Code Online (Sandbox Code Playgroud)

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


更新2

我不想要这个,因为将其朝我旋转并不会向上移动

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

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