Kalibracja dynamiczna magnetometru

19

Pracuję nad magnetometrem AK8975 będącym częścią IMU. To wydaje mi się bardzo trudne. Ten układ daje wektor 3D jako wyjście opisujące ziemskie pole magnetyczne w dowolnym miejscu na ziemi lub w jej pobliżu.

Wypróbowałem dwa typy algorytmów obliczania kursu: jeden jest prosty, arctan(-y/x)a drugi to matematyka anulowania nachylenia (skoku) i przechylania (przechylenia), jak wspomniano poniżej. Zarówno skłonność, jak i banki dają złą produkcję.

Jestem w stanie uzyskać prawidłowy kurs na ziemi (przy użyciu prostych dostępnych otwartych zasobów do badań), gdy jest ona obracana, utrzymując poziomo na planie ziemi za pomocą dowolnego z dwóch alg.

Próbowałem kalibracji dla błędów miękkiego i twardego żelaza. Mógłbym wykreślić go w 3D i pokazać idealną kulę 3D. Nadal nie działa na nachylenie lub deklinację.

Każdy wskaźnik będzie pomocny.

Kod i jego implementacje są następujące:

void Compass_Heading()
{
  double MAG_X;
  double MAG_Y;
  double cos_roll;
  double sin_roll;
  double cos_pitch;
  double sin_pitch;

  cos_roll = cos(roll);
  sin_roll = sin(roll);
  cos_pitch = cos(pitch);
  sin_pitch = sin(pitch); 

  //// Tilt compensated Magnetic filed X:
  MAG_X = magnetom_x*cos_pitch + magnetom_y*sin_roll*sin_pitch + magnetom_z*cos_roll*sin_pitch;
  //// Tilt compensated Magnetic filed Y:
  MAG_Y = magnetom_y*cos_roll-magnetom_z*sin_roll;
  //// Magnetic Heading


  MAG_Heading = atan2(-MAG_Y, MAG_X) ;

}

Gdzie magnetom_x, #_yi #_zsą składowymi wektora 3D, które w rzeczywistości są wartości RAW z magnetometru. roll i pitch pochodzą z tajemniczego wyjścia filtra Kalmana z pokładowego akcelerometru i żyroskopu. Te trzy czujniki są w ATAVRSBIN1 . Roll i pitch są w porządku do tego etapu.

Teraz proste obliczenie nagłówka według Journal_of_sensors_renaudin et al_2010c.pdf powinno być MAG_Heading = atan2(-magnetom_y, magnetom_x) ;z kompensacją jak wyżej.

Cały kod pochodzi z OPEN AHRS .


Dane w formacie Roll, Pitch i Yaw. Obróciłem urządzenie tylko ręką. Pierwsze trzy zostały skoncentrowane tylko na odpowiednio Roll, Pitch i Yaw. Pozostałe dwa są najpierw obracane wokół urządzenia o 45 stopni wzdłuż X (walcowane), a następnie obracane wzdłuż lokalnego Z magnetometru. Następnie to samo zostało powtórzone z obrotem około 45 stopni wzdłuż Y (pochylone), a następnie obracane wzdłuż lokalnego Z magnetometru.

Wykresy wykreślono w zakresie od -180 do 180 stopni.

Rolka Kąty w stopniach w pliku Charakterystyka YAW w Roll.

Smoła Kąty w stopniach w pliku Charakterystyka YAW na skoku.

Myszkować Kąty w stopniach w pliku Charakterystyka YAW na samym Yaw.

Odchylenie do tyłu o 45 stopni nachylone Kąty w stopniach w pliku Charakterystyka YAW na Yaw z walcowaniem o 45 stopni.

Odchylenie w 45 stopniach przechyłu Kąty w stopniach w pliku Charakterystyka YAW na Yaw z nachyleniem 45 stopni.

Uwaga: W przypadku ostatnich 2 zdjęć: Najpierw trzymane w pozycji wyjściowej, to samo dla wszystkich (patrz pliki TXT). Następnie Walcowane 45 stopni, a następnie za pomocą płaskiego urządzenia (z magnetometrem) zostało obrócone wzdłuż osi Z Magnetometru.

Podobnie dla ostatniego obrazu urządzenie zostało pochylone o 45 stopni, a następnie wzdłuż osi Z magnetometru.

Mam nadzieję, że pomogą one rozwiązać mój problem.


Nowe rozwiązania są następujące:

Pracowałem trochę nad nagłówkiem. Mam następujący wynik. Rolka csv

Smoła csv

Myszkować csv


Rick2047
źródło
brak odpowiedzi !!
4
Myślę, że dostaniesz więcej odpowiedzi, jeśli pokażesz matematykę, którą próbujesz zaimplementować, i kod użyty do jej wdrożenia. Pozostaje nam niewiele do zrobienia inaczej niż „to nie działa, pomoc” - tak brzmi twoje pytanie. Przepraszam!
Martin Thompson
Zastosowanie magnetometru jest bardzo wyspecjalizowaną dziedziną, z którą stosunkowo niewiele osób będzie miało specjalistyczną wiedzę. Czytając kilka razy twoje pytanie, wciąż nie jestem pewien, co jest nie tak. Mówisz, że daje to „zły wynik”, ale to dość niejasne. Może jakieś przykłady liczbowe?
Jason R
1
Czy jest to pytanie o to, jak interpretować sygnały wyjściowe czujnika lub jak obliczyć przydatne nawigacyjnie miary z wektora x, y, z dostarczonego przez czujnik? Czy twoje pomiary są powtarzalne z innym wystąpieniem tego samego czujnika?
vicatcu
1
@Rahul - Jestem zaskoczony, że to nie przyciąga więcej uwagi!
Kevin Vermeer

Odpowiedzi:

8

Lubię twoje wykresy. Wyraźnie pokazują, że przechylenie, pochylenie i odchylenie wydają się działać. Gratulacje! To już większy postęp niż większość ludzi.

Zgaduję, że przedstawiony kod oblicza „niewłaściwą” wartość MAG_Heading, inną niż oczekiwana wartość MAG_Heading.

O wiele łatwiej byłoby nam pomóc, jeśli dałeś nam: (To jest sekcja „opisz objawy” w „Jak zadawać pytania w inteligentny sposób” )

  • AK8975 magnetometr wartości wyjściowe m_x, m_y i m_z na jakimś jednym punkcie w czasie.
  • Wartości pitch i roll w tym samym momencie
  • rzekomo błędna wartość wyjściowa MAG_Heading obliczona na podstawie tych wartości
  • czego się spodziewałeś

Pozostaję więc spekulować, że może napotykasz te same problemy, które sam sobie stawiam :-).

  • Jakiego formatu kąta oczekują funkcje sin () oraz cos () i atan2 ()? Czy potrzebujesz wykonać jakąś konwersję między skokiem formatu a rolką, które są zapisane w tym formacie? Czy musisz przekonwertować z tego formatu na to, czego potrzebujesz MAG_heading? (ćwieki, stopnie lub radiany? zmiennoprzecinkowy czy stały punkt?)
  • Czy istnieje przesunięcie w surowych wartościach m_x, m_y, m_z, które należy odjąć?
  • Czy wszystkie części są ułożone w sposób zgodny z kodem? W szczególności, czy oś skoku i przechyłu jest wyrównana z osią magnetometru? (Czy m_x ma wskazywać do przodu, wzdłuż osi przechyłu? Czy m_y ma wskazywać w prawo, wzdłuż osi skoku?)
  • Może jakąś wartość czujnika lub inną - być może m_z - trzeba zanegować przed wprowadzeniem do tego kodu?
  • Czy może ten kod jest przerywany przez jedno przerwanie lub inne, które psują jego wewnętrzne wartości? Wydaje mi się, że przypominam sobie inny projekt, w którym po tym, jak ktoś umieści „podział” w procedurze przerwań, każde obliczenie funkcji trig wszędzie w innym programie często dawałoby zły wynik.
  • Czy może przerwanie strzelania jest tak częste, że ten kod nigdy nie kończy działania?

Wydaje się, że istnieją inne osoby omawiające bardzo podobny kod gdzie indziej: http://diydrones.com/forum/topics/heading-from-3d-magnetometer ; http://diydrones.ning.com/profiles/blogs/dcm-imu-theory-first-draft ; http://aeroquad.com/showthread.php?1138-REVOLUTION!!!-New-IMU !!! ; http://www.rcgroups.com/forums/showthread.php?t=1436742&page=6 ; http://aeroquad.com/showthread.php?691-Hold-your-heading-with-HMC5843-Magnetometer ; itp.

Davidcary
źródło
Widziałem to teraz. Wrócę.
Rick2047
\ 1 / Tworzę plik csv dla [Roll, pitch, yaw and (Mx, My, Mz)]. \ 2 / Oczekuję, że nagłówek MAG_ nie powinien się zmieniać wraz ze zmianą rzutu i wysokości co najmniej do dwóch kolejnych kwadrantów. Nagłówek oznacza, że ​​jeśli kieruje się na NE, powinien ciągle wskazywać NE, dopóki nie przekroczy 90 stopni od horyzontu w kierunku obrotu w górę lub w dół w celu nachylenia i powinien być taki sam w przypadku przechylania lub kombinacji.
Rick2047,
\ 3 / Wszystkie wewnętrzne obliczenia zostały wykonane w radianach i wszystkie funkcje Consine oczekują tylko radianów. Do wyświetlania tylko wartości są kopiowane i konwertowane na stopnie. \ 4 / zmiennoprzecinkowy. \ 5 / Wszystkie czujniki są wyrównane, a także wszystkie możliwe odpowiednie kombinacje zostały wypróbowane do wyrównania przy użyciu SENSOR_SIGN [9]. \ 6 / Robię to w odpytywaniu, więc w oparciu o przerwanie, wszystkie problemy nie będą tutaj.
Rick2047,
Dla mojego punktu \ 1 / tutaj dla wszystkich wykresów załączyłem również odpowiednie pliki csv. Lub poprosiłeś o coś innego. Dziękuję za tę dobrą odpowiedź. :) Wdrażam „Jak zadawać pytania w inteligentny sposób”, na ile pozwala mój wysiłek i czas. :)
Rick2047
\ 1 / Będę pracował raczej dla [Roll, pitch, yaw i (Mx, My, Mz) (head, declination)].
Rick2047,
1

Uwaga aplikacja dla LSM303 posiada użyteczną przewodnik kalibracji kompas z kompensacją nachylenia, który ma zastosowanie do Twojego problemu. Jest dość szczegółowy, w przeciwnym razie ponownie zapisałbym obliczenia tutaj. Należy zauważyć, że wartości akcelerometru są niezbędne do obliczeń pełnego skoku, przechylenia i odchylenia, ponieważ obrót wokół osi linii pola magnetycznego nie powoduje zmiany wartości magnetometru. Podobnie dla grawitacji z akcelerometrem.

geometrikal
źródło
Link pokazuje inny znak w tym samym równaniu. Spróbuję wszystkich innych kombinacji.
Rick2047,