垂直运动传感器
Posted
技术标签:
【中文标题】垂直运动传感器【英文标题】:Vertical movement sensor 【发布时间】:2012-10-23 11:58:47 【问题描述】:我正在开发一个需要检测垂直运动的 android 应用。向上移动平板电脑时,陀螺仪、加速度计和线性加速度传感器会给出相应的值来指示向上或向下运动。
我遇到的问题是,当您将平板电脑向用户倾斜或远离用户倾斜时,这些传感器也会读取向上/向下的运动。例如,陀螺仪中的 x 值代表垂直平面。但是当您将设备向前倾斜时,x 值会发生变化。 当我做出这个动作时,读取垂直运动的同一个传感器会为此读取一个值。
其他传感器也是如此。我尝试使用与陀螺仪结合的方向来制作条件语句,如果音高没有变化,但 x 变量向上/向下,那么我们有垂直运动。这样做的问题是,如果用户将其向上移动但稍微倾斜,它将不再起作用。我也尝试过这样做,所以如果倾斜发生变化,那么就没有垂直运动。但它迭代得如此之快,以至于 1/100 秒的倾斜度可能会发生变化,但下一秒则没有。
有什么方法可以让我只读取垂直变化而不读取设备间距的变化?
这是我要检测的内容:
编辑:
“请对你认为的‘向上移动’提出一个数学上合理的定义。” 这是我最初的问题,我如何编写一个函数来定义平板电脑何时向上或向下移动?我考虑向上移动的垂直平移。现在我该如何检测呢?我根本不知道从哪里开始,谢谢。
【问题讨论】:
当用户倾斜平板电脑时,会出现向上/向下运动。如果您想要在平板电脑保持垂直时检测移动,那么只有在平板电脑从 90º(+-10º 或您想要提供的任何边距)倾斜时才寻找垂直移动。 但如果平板电脑向上移动,但倾斜,那么将没有注册的移动。此外,+-10 度足以影响垂直运动的值。这是我最后的解决方案,我想要更好更可靠的解决方案。 我看到了你的未来。如果用户将平板电脑向前倾斜 90 度(平行于地平线)并在其自己的垂直轴上移动平板电脑(向前/远离用户)会发生什么?如果平板电脑对左撇子来说是“颠倒的”,会发生什么?如果平板电脑保持在 70 度或有点歪斜,会发生什么?所有这些条件以及更多条件都会影响“垂直”读数。上/下运动不仅仅是上/下运动。要在所有/大多数情况下正常工作,需要非常仔细的设计。 我也考虑过其中一些事情。我正在使用此动作来控制相机,因此平板电脑将始终面向用户。我确实认为有一种方法可以使用矢量和触发来实现垂直运动,但我无法进行这些计算。 您可以尝试计算给定时间内每个轴的增量。当垂直轴连续 N 个比其他轴更大的增量增加时,您可以假设垂直移动。 【参考方案1】:好的,尽管这个问题已经相当老了,但我在目前的答案和 cmets 中看到了很多混乱,所以如果有人发现这个问题,我打算澄清一些事情。
陀螺仪
首先,陀螺仪不会按照您的定义测量垂直运动(平移运动)。它测量围绕每个轴的旋转,定义如下图所示。因此,让您向前和向后倾斜设备确实会绕 x 轴旋转,因此您会在陀螺仪传感器的 x 值中看到非零值。
陀螺仪中的x值代表垂直平面。
我不确定“垂直平面”是什么意思,但是 x 值当然不代表平面本身,也不代表设备在平面内的方向。
陀螺仪传感器的 x 值表示设备当前绕 x 轴的角速度(例如旋转的变化)。
但是当您将设备向前倾斜时,x 值会发生变化。当我做出这个动作时,读取垂直动作的同一个传感器会读取一个值。
不太清楚你在这里指的是什么。我假设“读取垂直运动的同一传感器”是陀螺仪,但如前所述,它不会读取垂直运动。它完全按照锡上所说的那样做。
设备坐标系
这更多是对用户 Ali 的回答而不是原始问题,但在任何一种情况下都具有相关性。
线性加速度传感器(或任何其他传感器)的各个输出在设备的坐标系中表示,如上图所示。这意味着如果您稍微旋转设备,输出将不再平行于它们之前重合的任何世界轴。因此,您要么必须强制设备处于应用程序的特定方向,要么将新方向考虑在内。
ROTATION_VECTOR
传感器与四元数数学或getRotationMatrixFromVector()
方法相结合,是一种将测量值从设备坐标转换为世界坐标的方法。还有其他方法可以实现相同的目标,但一旦实现,您握持设备的方式对于测量垂直运动就不再重要了。
在任何一种情况下,您要查找的轴都是 y 轴,而不是 z 轴。
(如果你的意思是“沿设备 y 轴”作为“垂直”,那么忽略所有方向的东西,只使用线性加速度传感器)
噪音
你在问题中提到了一些关于噪音和更新率的问题,所以我在这里只提一下。从经常变化的事物中获取良好、一致的数据的最简单和最常见的方法之一是使用低通滤波器。哪种类型的过滤器最好取决于应用程序,但我发现exponential moving average filter 在大多数情况下是可行的。
整理思路
请注意,如果您适当注意方向,则转换后的线性加速度输出将很好地近似垂直运动(嗯,运动变化),而不会过滤任何噪声。
此外,如果您想测量垂直“运动”,例如速度,您需要集成加速度计输出。出于各种原因,在大多数情况下,这并不是很顺利,尽管它在速度的情况下没有那么严重,而不是尝试测量位置。
【讨论】:
【参考方案2】:好的,我怀疑这只是部分答案。
如果你想检测垂直运动,你只需要线性加速度,设备方向无关紧要。见
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
我不想要这个,因为向我旋转它并没有向上移动它
向上移动:质心向上移动。我的代码行为正确。
请对您认为“向上移动”的内容提出一个数学上合理的定义。
【讨论】:
我不在乎方向。只是当我前后倾斜平板电脑时,上下移动平板电脑的线性加速度值也会发生变化(如图所示)。因此,我无法可靠地判断它何时向上或向下移动,因为用户可能只是将其向前或向后倾斜。我读了关于 coremotion 的帖子,你提到 z 越高 x 和 y 越低意味着垂直运动,你能详细说明一下吗?另外,我读到高通滤波器可能有助于检测突然的运动,这到底是什么以及如何将其应用于加速?谢谢 另外,我担心向前/向后倾斜它可能会导致高 z 值(就像将它向上/向下移动一样),从而使您所说的变得无用。 我想我可能误解了你关于方向的问题。让我解释一下我的项目:我有一个网络摄像机,我正在将视频流式传输到平板电脑。当我移动平板电脑时,相机也会以同样的方式移动。但是如果我向上移动它,同时倾斜设备,它可能会弄乱结果,因为倾斜会改变我读取的向上移动的值。我只想要向上运动。我不希望轻微的倾斜改变我的价值。我不希望音调的变化影响我的数字。 @user1795223 好的,我更新了答案。它需要一些调整,但它应该可以工作。 作为测试,我这样做了:float rel_z = (float) (z/Math.sqrt(xx+ yy+z*z+1.0e-6)) ;值大约为 0.57。 x,y,z 均来自线性加速度传感器。 rel_z 从来没有真正改变,除了从负数到正数以及千分之几位小数。我现在要下班了,但如果可以的话,我想在星期一继续。我这样做很匆忙,所以我可能在某个地方犯了错误,但我不这么认为。谢谢。以上是关于垂直运动传感器的主要内容,如果未能解决你的问题,请参考以下文章