1

我环顾四周,关于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 吗?

我已经准备好开始修改这些了,但我希望得到比上面的空块更坚实的东西:)

感谢您的任何指点!

4

1 回答 1

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))];

    }];
}

}

于 2013-01-08T20:22:50.703 回答