iPhone4 iOS5 Sensor Fusion для короткой инерциальной навигации

Я осмотрелся вокруг, и там не так много выступлений или примеров по инерциальной навигации для 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.

Дополнительный вопрос: возможен ли подобный синтез даже с аппаратной точки зрения? Смогу ли я расплавить свой iPhone4, если начну обрабатывать все доступные данные датчика с частотой 20 Гц в течение продолжительного времени?

Я готов начать возиться с этим, но хотел бы получить что-то более твердое для начала, чем пустой блок выше:)

Спасибо за любые ссылки!

1 ответ

Решение

Я пишу приложение для аквалангистов и надеялся добавить инерциальную навигацию, поскольку 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))];

    }];
}

}

Другие вопросы по тегам