我正在开发一款需要检测垂直运动的Android应用程序。向上移动平板电脑时,陀螺仪,加速度计和线性加速度传感器会给出相应的值,表示向上或向下运动。
我遇到的问题是,当您将平板电脑向用户倾斜或远离用户时,这些传感器也会读取向上/向下的动作。例如,陀螺仪中的x值表示垂直平面。但是当您向前倾斜设备时,x值将会改变。 当我做这个动作时,读取垂直运动的同一个传感器为此读取一个值。
其他传感器也是如此。我试图使用方向与陀螺仪结合来制作条件语句,如果音高没有变化,但是x变量上升/下降,那么我们就有垂直运动。这个问题是,如果用户向上移动但略微倾斜,它将不再起作用。我也试过这样做,如果倾斜有变化,那么就没有垂直运动了。但是迭代速度如此之快,以至于倾斜度可能会有1/100秒的变化,但下一次却没有。
有什么方法可以只读取垂直变化,而不是设备间距的变化吗?
编辑:
“请提出一个数学上合理的定义,你认为'向上移动'。” 这是我最初的问题,如何编写一个函数来定义平板电脑何时向上或向下移动?我认为垂直翻译向上移动。现在我该怎么检测到这个?我根本不知道从哪里开始,谢谢。
答案 0 :(得分:2)
好的,虽然这个问题相当陈旧,但我在目前的答案和评论中看到了很多混淆,所以如果有人发现这一点,我打算清除一些事情。
首先,陀螺仪不能根据您的定义(平移运动)测量垂直运动。它测量每个轴的旋转 ,如下图所示。因此,让您向前和向后倾斜设备确实围绕x轴旋转,因此您将在陀螺仪传感器的x值中看到非零值。
陀螺仪中的x值代表垂直平面。
我不确定"垂直平面"是什么意思,但x值当然不代表平面本身,也不代表平面内设备的方向。
陀螺仪传感器的x值表示设备围绕x轴的当前角速度(例如,旋转的变化)。
但是当你向前倾斜设备时,x值会改变。当我做这个动作时,读取垂直运动的同一个传感器为此读取一个值。
不太清楚你在这里指的是什么。 "读取垂直运动的相同传感器"我假设是陀螺仪,但如前所述,它不会读取垂直运动。它完全符合它在锡上的说法。
这更像是回答用户阿里的回答,而不是原始问题,但在任何一种情况下都是相关的。
线性加速度传感器(或任何其他传感器)的各个输出以设备的坐标系表示,如上图所示。这意味着如果稍微旋转设备,输出将不再平行于之前与之重合的任何世界轴。因此,您必须强制设备处于应用程序的特定方向,或考虑新的方向。
ROTATION_VECTOR
传感器结合四元数数学或getRotationMatrixFromVector()
方法,是将测量值从设备坐标转换为世界坐标的一种方法。还有其他方法可以实现相同的目标,但一旦实现,您握住设备的方式对于测量垂直运动无关紧要。
在任何一种情况下,您要查找的轴都是y轴,而不是z轴。
(如果你的意思是"沿着设备y轴""垂直",那么只需忽略所有方向的东西,只使用线性加速度传感器)
你在问题中提到了一些有关噪音和更新率的问题,所以我在这里只提一下。从经常变化的事物中获取漂亮,一致的数据的最简单和最常见的方法之一是使用低通滤波器。什么类型的过滤器最好取决于应用程序,但我发现在大多数情况下exponential moving average filter是可行的。
请注意,如果您正确考虑方向,您的变换后的线性加速度输出将很好地近似垂直运动(好的,运动变化),而不会滤除任何噪音。
此外,如果您想测量垂直"运动",如在速度中,您需要集成加速度计输出。出于各种原因,在大多数情况下,这并不是很好,尽管在速度的情况下它不那么严重,而不是试图测量位置。
答案 1 :(得分:1)
好的,我怀疑这只是部分答案。
如果要检测垂直移动,只需要线性加速度,设备方向无关紧要。参见
iOS - How to tell if device is raised/dropped (CoreMotion)
或
how to calculate phone's movement in the vertical direction from rest?
出于某种原因,您也关注设备方向,我不知道为什么。我怀疑你想要发现别的东西。所以请告诉我们更多,然后我会改进我的答案。
<强>更新强>
我阅读了关于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
我不想要这个,因为向我旋转它不会向上移动
向上移动:质心向上移动。我的代码有正确的行为。
请提出一个数学上合理的定义,即你认为“向上移动”。