2012-06-01 4 views
1

Я осмотрелся и не так много разговоров или примеров по инерциальной навигации для iOS5. Я знаю, что iOS5 внес некоторые очень прохладные алгоритмы слияния датчика:iPhone4 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 часов в течение продолжительных периодов времени?

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

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

+2

Алекс, вы нашли какой-либо код для ИНСА на прошивке? У меня есть приложение, которое было бы идеально для него, и было также интересно, есть ли там код ... – Vic320

ответ

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

    }]; 
} 

}

+0

В моих экспериментах GPS дрейфует так же плохо, иногда на 20 или более метров –