我已经浏览了一下,iOS5的惯性导航没有那么多的谈话或例子。我知道iOS5引入了一些非常酷的传感器融合算法:
motionQueue = [[NSOperationQueue alloc] init];
[motionQueue setMaxConcurrentOperationCount:1];
motionManager = [[CMMotionManager alloc] init];
motionManager.deviceMotionUpdateInterval = 1/20.0;
[motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXTrueNorthZVertical toQueue:motionQueue withHandler:^(CMDeviceMotion *motion, NSError *error) {
}];
我已经看过WWDC处理上述块的视频。
生成的CMDeviceMotion包含设备姿态向量,以及与用户引起的加速度分离的加速度。
是否有专门针对iOS 5的开源惯性导航项目利用这种新的传感器融合?我正在谈论进一步将这些数据与GPS和磁力计输出相结合,以获得更准确的GPS位置。
一个额外的问题:从硬件的角度来看,这种融合甚至可能吗?如果我开始在很长一段时间内对所有可用传感器数据进行20hz处理,我会融化我的iPhone4吗?
我已经准备好开始修补这些了,但是我希望能够获得比上面的空块更开始的东西:)
感谢您的任何指示!
答案 0 :(得分:3)
我正在为水肺潜水员编写一个应用程序,并希望增加惯性导航,因为GPS和其他基于无线电的导航在水下不可用。我做了很多研究,发现iPhone上的传感器数据中有太多的抖动,无法进行精确的惯性导航。我做了一个快速的实验,发现即使设备完全静止,由于信号中的噪声引起的“漂移”表明设备仅在几分钟后“移动”了许多米。这是我在实验中使用的代码。如果你能看到我做错了什么,请告诉我。否则,我想要我的下午回来!
- (void)startCoreMotion {
CMMotionManager *manager = [[CMMotionManager alloc] init];
if ([manager isAccelerometerAvailable]) {
manager.deviceMotionUpdateInterval = 1.0/updateHz;
[manager startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMDeviceMotion *motion, NSError *error) {
xVelocity += (( 9.8 * motion.userAcceleration.x ) / updateHz);
yVelocity += (( 9.8 * motion.userAcceleration.y ) / updateHz);
zVelocity += (( 9.8 * motion.userAcceleration.z ) / updateHz);
xPosition += ( xVelocity * ( 1 / updateHz ));
yPosition += ( yVelocity * ( 1 / updateHz ));
zPosition += ( zVelocity * ( 1 / updateHz ));
self.xPositionLabel.text = [NSString stringWithFormat:@"x = %f m", xPosition];
self.yPositionLabel.text = [NSString stringWithFormat:@"y = %f m", yPosition];
self.zPositionLabel.text = [NSString stringWithFormat:@"z = %f m", zPosition];
self.xVelocityLabel.text = [NSString stringWithFormat:@"vx = %f m/s", xVelocity];
self.yVelocityLabel.text = [NSString stringWithFormat:@"vy = %f m/s", yVelocity];
self.zVelocityLabel.text = [NSString stringWithFormat:@"vz = %f m/s", zVelocity];
self.distanceLabel.text = [NSString stringWithFormat:@"dist = %f m", sqrt( pow(xPosition, 2) + pow(yPosition, 2) + pow(zPosition, 2))];
}];
}
}