所以我对 CoreMotion 也很陌生。我会尽力解释为什么你的要求不能完成,至少不能准确。
根据我阅读的 Apple Docs,iOS 有 3 个运动处理程序:
(我相信最新的设备有高度计?)
根据我对物理学的理解,我认为加速度计对您的场景最有用,因为陀螺仪和磁力计更侧重于旋转。我做了一些研究,发现this book。特别是第 9.5 章。从书中:
虽然加速度计可以测量 x、y 和
z 轴无法测量旋转。另一方面,陀螺仪是
变化率装置;当手机绕轴旋转时,它
允许您测量此类旋转的变化。
按照他们在图 9-5 下的代码来实现一个简单的应用程序来观察加速:
#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
然后在.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);
}];
}
}
将所有内容连接起来并在手机上运行后,我看到加速度计正在测量我的手机在平板上移动时加速和减速的变化。现在我们有了加速度,但是要从中获得位置变化(这是您所要求的),需要双重积分(即有趣的微积分)。虽然可行,但我查看了 arduino 的知识渊博的人对 here 的看法,这是一个可怕的消息。 (他们没有讨论 iPhone 加速度计,但我推断此信息也适用于这个问题)。
我在这里发布的相关部分:
从加速度获得位置是一个双重积分,所以
错误叠加真的很邪恶。使用螺栓获得良好的位置数据
down IMU(你正在尝试做的事情)是一个真正的难题;这
所需的加速度计非常昂贵。
和
你说的是双重整合,这也是
此硬件上的单个加速度计不准确。甚至单身
仅仅因为
此设置缺乏准确性。
所有这些研究得出的结论是,在 iPhone 上执行您要求的操作是不可行的。 虽然就像我说的,但我也是这方面的初学者!抱歉,这不是您想听到的答案。