如何使用加速度计检测iPhone在空间中的移动?

Tho*_*ert 13 iphone drawing accelerometer

我正在尝试制作一个应用程序来检测您使用加速度计使用iPhone制作的形状.例如,如果您用手拿着iPhone绘制一个圆圈,该应用程序将能够在屏幕上重绘它.这也适用于正方形,甚至更复杂的形状.我见过这样做的唯一应用示例是AirPaint(http://vimeo.com/2276713),但它似乎无法实时完成.

我的第一个尝试是对加速度计的X和Y参数应用低通滤波器,并使指针移动到这些值,与屏幕的大小成比例.但这显然没有用,我的精度非常低,如果我摇动设备它也会使指针移动......

关于那个的任何想法?您认为加速度计数据是否应该这样做?或者我应该考虑使用其他数据,例如指南针?

提前致谢 !

Tho*_*ert 10

好的我找到了似乎有用的东西,但我仍然有一些问题.以下是我的工作方式(承认设备是垂直的):

1 - 我有我的默认x,y和z值.
2 - 我使用低通滤波器从该数据中提取重力矢量.
3 - 我从每个x,y和z中减去归一化的重力矢量,并得到运动加速度.
4 - 然后,我将这个加速度值与时间相结合,所以我得到了速度.
5 - 我再次将这个速度与时间相结合,找到一个位置.

以下所有代码都在加速度计中:didAccelerate:我的控制器的委托.我试图根据我发现的位置移动球.这是我的代码:

NSTimeInterval interval = 0;
NSDate *now = [NSDate date];
if (previousDate != nil)
{
    interval = [now timeIntervalSinceDate:previousDate];
}
previousDate = now;

//Isolating gravity vector
gravity.x = currentAcceleration.x * kFileringFactor + gravity.x * (1.0 - kFileringFactor);
gravity.y = currentAcceleration.y * kFileringFactor + gravity.y * (1.0 - kFileringFactor);
gravity.z = currentAcceleration.z * kFileringFactor + gravity.z * (1.0 - kFileringFactor);
float gravityNorm = sqrt(gravity.x * gravity.x + gravity.y * gravity.y + gravity.z * gravity.z);

//Removing gravity vector from initial acceleration
filteredAcceleration.x = acceleration.x - gravity.x / gravityNorm;
filteredAcceleration.y = acceleration.y - gravity.y / gravityNorm;
filteredAcceleration.z = acceleration.z - gravity.z / gravityNorm;

//Calculating velocity related to time interval
velocity.x = velocity.x + filteredAcceleration.x * interval;
velocity.y = velocity.y + filteredAcceleration.y * interval;
velocity.z = velocity.z + filteredAcceleration.z * interval;

//Finding position
position.x = position.x + velocity.x * interval * 160;
position.y = position.y + velocity.y * interval * 230;
Run Code Online (Sandbox Code Playgroud)

如果我执行此操作,我会得到相当好的值,我的意思是我可以根据我的动作看到加速度变为正值或负值.但是当我尝试将这个位置应用到我的球视图中时,我可以看到它正在移动,但是在一个方向上比另一个方向更加擅长.这意味着,例如,如果我用我的设备绘制圆圈,我将看到球描述朝向屏幕左上角的曲线.类似的东西:http://img685.imageshack.us/i/capturedcran20100422133.png/

你对发生的事情有什么想法吗?提前致谢 !


Ian*_*Ian 7

问题是你无法将加速度两次整合到位置.不知道初始位置和速度.还记得你在学习集成时在学校添加的+ C术语吗?当你到达位置时它是一个ct + k术语.这很重要.那是在你考虑到你正在获取的加速度数据被量化和平均之前,所以你实际上并没有整合设备的实际加速度.两次集成时,这些错误最终会很大.

仔细观察AirPaint演示,你会发现这种情况正好发生,渲染的形状与移动的形状明显不同.

即使是具有一些位置和速度感应的设备(例如,Wiimote)也难以进行手势识别.这是一个棘手的问题,人们付出了很多钱(比如像AILive这样的公司)为他们解决问题.

话虽如此,如果他们的大规模特征不同,你可以很容易地区分某些类型的手势.如果设备已经在六个角度范围中的每一个中接收到加速度,则可以检测到圆(例如).您可以通过空中扫动iphone并摇晃它之间进行检测.

说出一个圆和一个正方形之间的区别将会变得更加困难.


the*_*man 2

您需要了解加速度与速度以及速度与位置的关系。我现在脑子里有一个小屁,但我确信它是积分……你想要相对于时间积分加速度。维基百科应该可以帮助你解决数学问题,我相信有一个很好的图书馆可以帮助你。

但请记住,加速计并不完美,轮询速度也不够快。真正突然的动作可能不会被很好地捕捉到。但对于在空气中轻轻绘制,它应该可以正常工作。