Ios 检测iPhone在平面上的移动
我是coremotion的初学者 我需要在一个像桌子一样的平面上检测iPhone的运动-到目前为止,我通过访问陀螺仪的偏航来检测它的侧向运动,但是我想不出一种方法来检测上/下变化。我尝试使用加速计,但它检测到的更多的是设备倾斜而不是移动。此外,当运动停止时,会产生反作用力Ios 检测iPhone在平面上的移动,ios,cocoa-touch,accelerometer,gyroscope,core-motion,Ios,Cocoa Touch,Accelerometer,Gyroscope,Core Motion,我是coremotion的初学者 我需要在一个像桌子一样的平面上检测iPhone的运动-到目前为止,我通过访问陀螺仪的偏航来检测它的侧向运动,但是我想不出一种方法来检测上/下变化。我尝试使用加速计,但它检测到的更多的是设备倾斜而不是移动。此外,当运动停止时,会产生反作用力 您是否有任何想法这样做,以便能够以相当的精度获得运动数据?我需要它来打曲棍球之类的比赛 这个链接也许可以解释更多的事情 看起来你需要注意Y轴的加速度。苹果的文档似乎很好地涵盖了这一点 使用运动处理方法检测运动何时更改,然后访
您是否有任何想法这样做,以便能够以相当的精度获得运动数据?我需要它来打曲棍球之类的比赛 这个链接也许可以解释更多的事情 看起来你需要注意Y轴的加速度。苹果的文档似乎很好地涵盖了这一点 使用运动处理方法检测运动何时更改,然后访问y位置的更改。如果您愿意,我可以尝试提供一些代码 设备无法检测到移动。沿工作台表面的直线恒定运动是绝对无法检测到的。这是因为没有作用力 该设备只能检测姿态(空间方向和该方向的变化)和力(速度的增加或减少)
所以,你需要围绕这些能力形成你的期望。所以我对CoreMotion也很陌生。我会尽我最大的努力解释为什么你所要求的不能做到,至少不能准确地做到 根据我阅读的苹果文档,iOS有3个运动处理程序:
- 加速计
- 陀螺仪
- 磁强计
#import <UIKit/UIKit.h>
#import <CoreMotion/CoreMotion.h>
@interface ViewController : UIViewController {
CMMotionManager *motionManager;
NSOperationQueue *queue;
}
@property (weak, nonatomic) IBOutlet UILabel *xLabel;
@property (weak, nonatomic) IBOutlet UILabel *yLabel;
@property (weak, nonatomic) IBOutlet UILabel *zLabel;
@property (weak, nonatomic) IBOutlet UIProgressView *xBar;
@property (weak, nonatomic) IBOutlet UIProgressView *yBar;
@property (weak, nonatomic) IBOutlet UIProgressView *zBar;
@end
在把所有东西连接起来并在手机上运行之后,我看到加速度计正在测量手机在平板上移动时的加速和减速变化。现在我们有了加速度,但要从中得到位置的变化(这是你所要求的),需要双重积分(即有趣的微积分)。虽然可行,但我查阅了arduino的知识渊博的人们对此的看法,天哪,这是个可怕的消息。(他们没有讨论iPhone加速计,但我推断这些信息也适用于这个问题)
我在这里发布的相关部分:
从加速度中获得位置是一个双重积分,因此
错误叠加真的很邪恶。使用螺栓连接获取良好的位置数据
向下IMU(您正在尝试做的事情)是一个真正困难的问题;这个
需要做这件事的加速度计非常昂贵
及
你所说的是双重整合,这太过分了
此硬件上的单个加速计不准确。甚至单身
由于以下原因,每单位时间的集成误差将不断增大
这种设置缺乏准确性
所有这些研究都导致了我的结论,即在iPhone上按照你的要求去做是不可行的。尽管如我所说,我也是这方面的初学者!很抱歉,这不是你想听的答案 为了确定设备的水平位置,运动实际上是不可行的。使用的水平传感器将是加速计,但它们测量速度的变化。因此,要从中找到位置,需要对传感器数据进行两次积分。一次获得速度,然后第二次获得位置 这意味着,即使是加速度数据中最小的误差也会导致最终速度出现错误,这意味着你的程序认为手机在以恒定速度移动,而实际上它却静止不动 如果您不需要精确(例如,当您来回移动它时,不需要它返回到相同的位置),那么如果您在加速计数据安静且接近零的情况下强制速度为零,您可能会得到可接受的结果 如果你真的开始尝试这一点,那么a可能是你从加速计数据得出速度和位置的最佳选择。 这意味着您的代码最终将类似于以下内容,其中
加速度
、速度
和位置
是您保留的三个变量,acc
是来自加速计的数据样本
// correction step:
double delta = (acc - acceleration);
acceleration += FACTOR1 * delta;
speed += FACTOR2 * delta;
position += FACTOR3 * delta;
// prediction step:
position = position + speed * DT + 0.5 * acceleration * DT * DT;
speed = speed + acceleration * DT;
其中,DT
是数据采样之间的时间,需要找出FACTOR1..3的合适值
顺便说一句,偏航不会给你水平运动,而是旋转
编辑:现在,您可以通过将加速度计输入与摄像头的图像分析相结合来获得良好的效果。它为您完成了所有艰巨的工作。好的,所以我现在要做的是var ax:Double=data.userAcceleration.x;var ay:Double=data.userAcceleration.y;如果((abs(ax)>0.05)| |(abs(ay)>0.05)){//使用数据}
,它出乎意料地实现了我真正想要的功能。然而,惯性反应存在一个大问题,如果设备突然停止移动,它基本上会将玩家置于任何移动之前的位置。你能想出什么解决办法来防止这种情况发生吗?我唯一能想到的就是保持跟踪,从而从设备明显移动的事实推断,这种突然减速可能是
// correction step:
double delta = (acc - acceleration);
acceleration += FACTOR1 * delta;
speed += FACTOR2 * delta;
position += FACTOR3 * delta;
// prediction step:
position = position + speed * DT + 0.5 * acceleration * DT * DT;
speed = speed + acceleration * DT;