所以,我一直在努力解决这个问题,并且没有任何运气可以利用互联网的智慧和相关的SO帖子。
我正在编写一款使用无处不在的加速度计的Android应用程序,但即使在休息时我似乎也会得到令人难以置信的“噪音”,并且似乎无法弄清楚如何处理它,因为我的读数需要要比较准确。我想也许我的手机(HTC Incredible)功能失调,但传感器似乎与我玩过的其他游戏和应用程序配合得很好。
我试过使用各种“过滤器”,但我似乎无法围绕它们。我知道引力必须以某种方式处理,也许这就是我出错的地方。目前我尝试过这个,改编自SO answer,它引用了iPhone SDK的一个例子:
accel[0] = event.values[0] * kFilteringFactor + accel[0] * (1.0f - kFilteringFactor);
accel[1] = event.values[1] * kFilteringFactor + accel[1] * (1.0f - kFilteringFactor);
double x = event.values[0] - accel[0];
double y = event.values[1] - accel[1];
海报上写着“玩”kFilteringFactor值(示例中为kFilteringFactor = 0.1f),直到满意为止。不幸的是,我似乎仍然得到很多噪音,所有这一切似乎都是让读数以微小的小数形式出现,这对我没有多大帮助,而且它似乎只是让传感器不那么敏感。我的大脑的数学中心也因多年的疏忽而萎缩,所以我不完全理解这个过滤器是如何工作的。
有人可以详细解释如何从加速度计中获取有用的读数吗?一个简洁的教程将是一个令人难以置信的帮助,因为我没有找到一个非常好的教程(至少针对我的知识水平)。我感到沮丧,因为我觉得所有这一切对我来说都应该更加明显。任何帮助或方向将不胜感激,当然,如果需要,我可以从我的代码中提供更多样本。
我希望我不会要求过多的勺子喂食;我不会问,除非我一直想把它弄清楚。看起来其他SO成员也有一些兴趣。
答案 0 :(得分:5)
部分答案:
准确度。如果您正在寻找高精度,那么您在手机中找到的便宜的加速度计将不会削减芥末。相比之下,适用于工业或科学用途的三轴传感器仅需1,500美元即可用于传感器;添加硬件为其供电并将其读数转换为计算机可以使用的价格的两倍。手机中的传感器数量远低于5美元。
噪音。便宜的传感器不准确,不准确会转化为噪音。不移动的不准确传感器将不会始终显示零,它将在某个范围内显示任一侧的值。关于您可以做的最好的事情是在静止时表征传感器以了解它是多么嘈杂,并使用它来根据预期的误差将测量结果舍入到不太精确的比例。 (换句话说,如果它在± x m / s ^ 2之内,可以肯定地说传感器没有移动,但你不能确切地确定它,因为它可能移动得非常慢。你必须在每台设备上都这样做,因为它们并非都使用相同的加速度计,而且它们的行为都不一样。我猜这是iPhone的一个优点:硬件几乎是同质的。
重力。 SensorEvent
documentation中有关于加速度计所说的重力因素的讨论。你会注意到它与你发布的代码有很多相似之处,除了它更清楚它正在做什么。 : - )
HTH。
答案 1 :(得分:4)
要从加速度计获得正确的读数,您需要使用方程式speed = SQRT(x * x + y * y + z * z)。使用它,当手机静止时,速度将是重力 - 9.8m / s。因此,如果您减去(SensorManager.GRAVITY_EARTH),那么当手机处于静止状态时,您将获得0 m / s的读数。至于噪音,Blrfl对于便宜的加速度计可能是正确的,即使我的手机处于静止状态,它也会持续闪烁每秒几分之一米。您可以设置一个小的阈值,例如0.4m / s,如果速度没有超过那个,那么它就处于静止状态。
答案 2 :(得分:1)
你如何处理抖动?您平滑数据。不是将传感器的值序列视为您的值,而是持续对它们进行平均,并且形成的新序列将成为您使用的值。这使每个抖动值更接近移动平均值。平均值必然会消除相邻值的快速变化..这也是人们使用术语低(频率)通过滤波的原因,因为每个样本(或单位时间)最初可能变化很大的数据现在变化得更慢。
例如,您可以通过多种方式对这些值进行平均,而不是使用值10 6 7 11 7 10。例如,我们可以使用下一个原始数据点从运行平均值(即最后处理的数据点)的相等权重计算下一个值。使用50-50混合以获得上述数字,我们得到10,8,7.5,9.25,8.125,9.0675。这个新序列,即我们处理过的数据,将用于代替噪声数据。当然,我们可以使用不同的混合比50-50。作为类比,假设您仅使用视力报告某个人所在的位置。你可以很好地了解更广阔的景观,但这个人却被迷雾笼罩。你会看到引起你注意的身体碎片......左手移动,右脚移动,擦掉眼镜等,这些都是紧张不安的,但每个值都非常接近真实的质心。如果我们运行某种运行平均值,那么当它在雾中移动时,我们会得到接近目标质心的值,并且实际上比我们(传感器)报告的值更准确。雾。
现在看来我们正在失去潜在的有趣数据以获得无聊的曲线。虽然这很有道理。如果我们试图重建雾中人物的准确图像,首要任务是获得质心的良好平滑近似。然后,我们可以从互补传感器/测量过程中添加数据。例如,一个不同的人可能接近这个目标。那个人可能会提供非常准确的身体动作描述,但可能会在浓雾中,并且不知道目标最终的位置。这是我们最初得到的补充位置 - 第二个数据准确地给出了细节而没有大致的位置感。这两个数据将被拼接在一起。我们低通第一组(就像你在这里提出的问题一样),以获得无噪音的一般位置。我们高通第二组数据以获得详细信息,而不会对一般位置产生不必要的误导性贡献。我们使用高质量的全球数据和高质量的本地数据,每组都以互补的方式进行优化,不会破坏另一组(通过2次过滤)。
具体来说,我们将陀螺仪数据混合在一起 - 数据在“树木”的局部细节中是准确的,但在森林中漂移(漂移) - 这里讨论的数据(来自加速度计)看到的森林很好但不是树木。
总而言之,我们从传感器中传递低通数据,但仍然接近“质心”。我们将这个基本平滑值与在细节上精确但漂移的数据相结合,因此第二组是高通滤波的。当我们处理每组数据以清除不正确的方面时,我们将获得两全其美。对于加速度计,我们通过在其测量值上运行一些运行平均值的变化来有效地平滑/低通数据。如果我们正在处理陀螺仪数据,我们会做有效保持细节(接受增量)的数学,同时拒绝最终会增长并破坏加速度计平滑曲线的累积误差。怎么样?基本上,我们使用实际的陀螺仪值(不是平均值),但在得出总的最终清洁值时,使用少量样本(增量)。使用少量增量保持整体平均曲线大部分沿着低通阶段(通过平均加速度计数据)跟踪的相同平均值,这构成了每个最终数据点的大部分。