2013-12-16 25 views
11

Obecnie tworzę aplikację na iPhone'a (na iPhone 5, iOS 7, Xcode 5), która wymaga bardzo dokładnego określenia aktualnego nastawienia. "Postawa" CMDeviceMotion nie spełnia tych wymagań, ponieważ algorytm fuzji czujnika Apple wydaje się polegać zbyt mocno na żyroskopie, który dryfuje dość szybko (według mojego doświadczenia). Dlatego postanowiłem odczytywać nagie dane z czujników, a później chcę je samemu połączyć w algorytmie fuzji czujnika.Czy kalibracja magnetometru Apple iPhone działa poprawnie?

Kiedy z prośbą o jeden danych magnetometru ma dwie możliwości:

  1. poprzez CMMagnetometerData w CMMotionManager

  2. poprzez CMCalibratedMagneticField w CMDeviceMotion o którym Apple mówi

CMCalibratedMagneticField powrócił przez tę właściwość daje całkowite magnetyczne fi w pobliżu urządzenia bez uprzedzeń dotyczących urządzenia. W przeciwieństwie do właściwości MagnetField klasy CMMagnetometer, wartości te odzwierciedlają pole magnetyczne Ziemi plus otaczające pola, minus polaryzacja urządzenia.

Zasadniczo (2.) dokładnie to, czego chcę.

Istnieje bardzo prosty test, jeśli dane magnetometru są prawidłowo skalibrowane. Dla uproszczenia można ograniczyć się do dwóch wymiarów. Gdy urządzenie leży na plecach, kombinacja B_x^2 + B_y^2 musi być stała, niezależnie od kierunku wskazywanego przez urządzenie. Musi równać się poziomemu komponentowi ziemskiego pola magnetycznego (zakładając, że nie ma innych pól w pobliżu urządzenia). Tak więc, przy wykonywaniu obrotu 360 stopni urządzenia, które leży na jego plecach, zmierzone dane B_y ponad B_x powinny wyświetlać okrąg. Aby uzyskać szczegółowe informacje, patrz: here.

Teraz punkt: dane CMCMagnesMagneticField NIE prowadzą do koła!

Plot

Czy ktoś ma wytłumaczenie tego? A może ktoś wie, w jaki sposób powstaje CMCalibratedMagneticField? Czy magnetometr jest skalibrowany w sensie link from above podczas wykonywania "ośmiokształtnego" ruchu urządzenia lub do czego jest odpowiedni ruch?

Przy okazji. dlaczego ruch "ośmiokształtny", a nie odwracanie urządzenia wokół jego trzech osi, co pozwoliłoby na kalibrację opisaną w link from above?

Byłbym bardzo zadowolony z wyjaśnienia w tej sprawie ... Dzięki!

Odpowiedz

2

Występuje problem z magnetometrem w systemie iOS 7, ma on błąd + -7º. Spróbuj użyć wersji 7.1 beta.

EDIT

magnetometru ma zero drift w czasie, ale jest dość niedokładna do nagłych zmian położenia. Z drugiej strony akcelerometr i żyroskop szybko dostosowują się do nagłych zmian, ale będąc czujnikami bezwładnościowymi, tracą dokładność przez pewien okres czasu.

Kiedy więc CMCalibratedMagneticField próbuje skompensować ruch obrotowy, wykorzystuje dane z żyroskopu i akcelerometru.To wtedy wkrada się przyspieszeniomierz i błąd żyroskopu + 7 ° i wyrzuca z niego kółko. Sprawdź ten answer i ten wikipedia article, aby uzyskać więcej informacji.

Jeśli chodzi o ósemkę: Oba robią to samo, orientują "Północ" urządzenia w każdym kierunku, mając nadzieję na wyeliminowanie zakłóceń magnetycznych. Przerzucenie urządzenia wzdłuż wszystkich trzech osi będzie działało lepiej, ale jest trudniejsze do wykonania, a nie tak łatwe do zrozumienia przez użytkownika.

Mam nadzieję, że to pomoże.

+0

Dziękuję bardzo za odpowiedź! Czy istnieje odniesienie do tych informacji? – user2980195

+0

Myliłem się, błąd został naprawiony w iOS 7.0.3. Odniesienia: http://support.apple.com/kb/DL1691 – Pranav

+0

Ale dotyczy to wyłącznie przyspieszeniomierza, a nie magnetometru, prawda? – user2980195