检测平面上的iPhone移动

Mic*_*wek 6 cocoa-touch accelerometer ios gyroscope core-motion

我是一名coremotion初学者.

我需要检测平板表面上的iPhone移动 - 到目前为止,我通过访问陀螺仪的偏航来检测其侧向移动,但我想不出一种检测上/下变化的方法.我尝试使用加速度计,但它检测到更多的设备倾斜而不是移动.此外,当运动停止时会有反作用力.

您是否有任何想法,以便能够以相当精确的方式获得运动数据?我需要它来做空气曲棍球比赛.

fis*_*ear 7

为了确定来自deviceMotion的水平位置是不可行的.要使用的水平传感器是加速度计,但它们可以测量速度的变化.因此,要从中找到位置,您需要将传感器数据集成两次.一旦获得速度,那么第二次获得位置.

这意味着即使加速度数据中最小的不准确性也会导致速度误差,这意味着您的程序认为手机正在以恒定速度移动,而实际上它是静止不动的.

如果你不需要准确(例如,当你来回移动时不需要它回到相同的位置),那么如果你强制速度为零,你可能会得到可接受的结果加速度计数据安静且接近于零.

如果您真的尝试这样做,那么卡尔曼滤波器可能是您从加速度计数据中获取速度和位置的最佳选择.这意味着,您的代码将最终看起来像以下,其中acceleration,speedposition你保持三个变量,并且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;
Run Code Online (Sandbox Code Playgroud)

DT数据样本之间的时间在哪里,FACTOR1..3您需要找到合适的值.

顺便说一句,Yaw不会给你水平运动,而是旋转.


eag*_*arn 6

所以我对CoreMotion也很陌生.我会尽力解释为什么你的要求无法完成,至少不准确.

基于我阅读的Apple Docs,iOS有3个动作处理程序:

  • 加速度计
  • 陀螺仪
  • 磁力仪

(我相信最新的设备有高度计?)

根据我对物理学的理解,我认为加速度计对你的场景最有用,因为陀螺仪和磁力计更注重旋转.我做了一些研究并找到了这本书.特别是第9.5章.从书中:

虽然加速度计提供x轴,y轴和z轴的力测量,但它无法测量旋转.另一方面,陀螺仪是变化率装置; 当手机围绕轴旋转时,它允许您测量这种旋转的变化.

按照图9-5中的代码实现一个简单的app来观察加速:

#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
Run Code Online (Sandbox Code Playgroud)

然后在.m viewDidLoad中

- (void)viewDidLoad {
    [super viewDidLoad];

    motionManager = [[CMMotionManager alloc] init];
    motionManager.accelerometerUpdateInterval  = 1.0/10.0; // Update at 10Hz
    if (motionManager.accelerometerAvailable) {
        NSLog(@"Accelerometer avaliable");
        queue = [NSOperationQueue currentQueue];
        [motionManager startAccelerometerUpdatesToQueue:queue
          withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
            CMAcceleration acceleration = accelerometerData.acceleration;
            xLabel.text = [NSString stringWithFormat:@"%f", acceleration.x];
            xBar.progress = ABS(acceleration.x);

            yLabel.text = [NSString stringWithFormat:@"%f", acceleration.y];
            yBar.progress = ABS(acceleration.y);

            zLabel.text = [NSString stringWithFormat:@"%f", acceleration.z];
            zBar.progress = ABS(acceleration.z);
        }];

    }
}
Run Code Online (Sandbox Code Playgroud)

将所有内容连接起来并在手机上运行之后,我看到加速度计正在测量我的手机在平台上移动时加速和减速的变化.现在我们有加速度,但要从中获得位置变化(这就是你所要求的)需要双重积分(即有趣的微积分).虽然可行,但我抬头看看arduino上知识渊博的人们在这里要说些什么,男孩是否是严峻的消息.(他们没有讨论iPhone加速度计,但我推断这个信息也适用于这个问题).

我在这里发布的相关部分:

从加速中获取位置是一种双重整合,因此错误叠加真的是邪恶的.通过螺栓连接的IMU获得良好的位置数据(您正在尝试做什么)是一个真正难以解决的问题; 这种加速度计非常昂贵.

你所说的是双重集成,这个硬件上的单个加速度计太不准确了.即使是单一集成,每单位时间的误差也会增加,原因很简单,因为这种设置缺乏准确性.

所有这些研究都导致我的结论是,在iPhone上做你要求的事情是不可行的.虽然就像我说的那样,我也是初学者!对不起,这不是你想听到的答案.