用安卓手机在空中绘图

8
我正在开发一款用安卓手机可以在空中绘画的应用。由于我的手机有加速度计,所以当我移动手机时,我会获取到每个轴向的加速度ax、ay、az。我感兴趣的是:x、y和z坐标。
从论坛和一些教程中得知,对加速度进行两次积分会产生很大误差。
那么对我来说,最好的解决方案是什么,以便获取关于手机位置变化的信息呢?
谢谢您的帮助。

1
我对Android编程一无所知,但据我所知,集成两次是唯一的数学可能方法来确定手机的位置。 - Juan
如果您将起始位置定义为(0,0,0),并进行一次积分以获得速度,然后在每次加速度计更新时将该速度添加到向量以确定新位置,会怎样呢? - Mitch Lindgren
嗨!这就是我正在尝试做的事情,但加速度计的值变化得太快了,以至于我的绘图变得一团糟! - user1068400
你是如何得到合理的数值的?由于必须使用高通滤波器来消除重力向量,我的积分结果在几分钟内就比光速快,即使我的电话没有移动! - Michael
2个回答

1

不完全符合您的要求:

将方向存储到数组中-并进行比较

跟踪方向效果很好。也许您可以使用加速度计数据做类似的事情(无需任何积分)。

正如您在帖子中提到的那样,两次积分加速度并不能起作用。

更新:

如果精度完全不重要,则双重积分可能会持续几秒钟,但结果非常糟糕。

然而,在我看来,陀螺仪鼠标是更好的选择。请参见
Android设备上的传感器融合:运动处理中的革命 中的37:00-38:25。


你觉得我能用陀螺仪记录手机的运动吗?包括俯仰、翻滚和偏航? - user1068400
目前的传感器无法准确跟踪手机的移动。请参见这里的第6.2.3小节中的误差传播部分。不管是跟踪移动还是方向,您都需要陀螺仪,即使它在SensorManager中很好地隐藏着也是如此。 - Ali
我是学生助理,我的学期作业就是完成这个项目!我现在感到非常有压力,因为我已经卡在这个问题上几个星期了!即使跟踪不准确,我也只是(起初)想制作一个可以绘制一些涂鸦的应用程序!没有什么很精确的要求。你真的认为这是不可能的吗?有一款iPhone应用程序已经实现了它! - user1068400

0

请看:

http://www.youtube.com/watch?v=C7JQ7Rpwn2k

http://www.freescale.com/files/sensors/doc/app_note/AN3397.pdf

我也在做一个类似的项目,我认为你不需要对加速度进行双重积分并计算移动距离。相反,可以直接使用加速度来移动。

但是如果你坚持要使用距离,可以通过在短时间间隔(t0,t1,...,tn)内采样加速度(a0,a1,...,an),并假设这些间隔内的加速度是边界的平均值,你可以得到类似以下的结果:

 Vs=(t1-t0)*(a1+a0)/2 + (t2-t1)*(a2+a1)/2 + ... + (t[n]-t[n-1])(a[n]+a[n-1])/2

 T=t[n]-t[0]

 Xs=Vs*T

这与双重积分有些不同。祝好运。


非常感谢您的建议。您在应用程序中使用什么?我之前提到了距离,因为我认为这可能是检索用户绘图的唯一方法。您所说的“使用加速度本身移动”是什么意思?您是如何做到的? - user1068400
但是如何将这些变化映射到像素上呢? 例如,我的手机向左加速1G,我如何在屏幕上沿着这个方向画一条长度为10像素的线? - user1068400
@kubudi,您所写的是双重积分。您无法通过加速度得出距离,而不进行双重积分。 - Ali
一旦你计算出要绘制多少像素,剩下的就是简单的绘图了。请看: http://developer.android.com/guide/topics/graphics/index.html@Ali 这不是双重积分,而是求和。正如我所说,这有点不同。当你这样做时,你将忽略这段时间内的变化。只有样本才有意义。我希望你能理解其中的区别。 - kubudi
我使用“onSensorChanged”函数,每次传感器变化时存储(ax,ay)。然而,由于“ax”可以很快地从3.65变为-1,所以我得到了非常奇怪的图形!因此,如果我将手机指向右侧,我会得到一条线(例如加速度从1到4),但是当我停止绘制时,加速度会回到0,并且另一条线会被绘制! 你说“将笔向左移动10像素,直到加速度发生变化”,但加速度一直在变化! 虽然在手机上画出了一些东西,但它并不准确,我无法选择我想要绘制的内容! - user1068400
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接