Kalibracja magnetometru ∞


15

W telefonach komórkowych i innych urządzeniach korzystających z 3-osiowego kompasu elektronicznego do kalibracji magnetometru służy ruch w kształcie ∞ / 8 / S, jak pokazano na tych filmach .

Dlaczego ten ruch jest wykonywany, jaka jest teoria i czy ktoś może podać przykładowy kod C, aby go zaimplementować?

Musisz przejść przez moje kolejne podobne pytanie zawierające więcej informacji.


Kilka dodatkowych informacji na temat tego konkretnego pytania: Platforma to 8-bitowy AtMega32, korzystający z AVR Studio 5.

Do tej pory próbowałem: próbowałem podzielić średnią przez 2 wartości wektorowe magnetometru tworzącego kształt. Myślenie może pomóc w obliczaniu przesunięć. Myślę, że niektóre z dwóch identycznych części / boków kształtu niwelują pole magnetyczne ziemi i podają wartości przesunięcia. Mogę się mylić. Ale szczególnie w przypadku kalibracji opartej na kształcie właśnie tu jestem. Myślę, że kalibracja działa w ten sposób. Chodzi o to, aby dowiedzieć się, czy to działa w ten sposób?


Ok kod, za pomocą którego mogę obliczyć przesunięcia, a później po prostu odjąć je od surowego wektora magnetycznego 3D. Mogę się całkowicie mylić i nie mam wyjaśnienia, jak to działa. Widząc wideo i dane wykreślone na kuli, jakoś przyspieszyło moją myśl i wykorzystałem ją w formie równania. B)

Kod:

Funkcje Read_accl();i Read_magnato(1);odczytują dane czujnika. Mam nadzieję, że kod jest zrozumiały. Mam nadzieję, że mądry ppl z pewnością użyje tego na znacznie lepsze sposoby. : \

void InfinityShapedCallibration()
{
    unsigned char ProcessStarted = 0;
    unsigned long cnt = 0; 

    while (1)
    {

            Read_accl();

            // Keep reading Acc data
            // Detect Horizontal position
            // Detect Upside down position
            // Then detect the Horizontal position again.
            // Meanwhile an infinity shaped movement will be created.
            // Sum up all the data, divide by the count, divide by 2 .
            // !We've offsets.          

                if (ProcessStarted!=3)
                {
                //
                    //USART_Transmit_String("\r");
                    //rprintfFloat(4, g_structAccelerometerData.accx_RAW);
                    //USART_Transmit_String(",");
                    //rprintfFloat(4, g_structAccelerometerData.accy_RAW);
                    //USART_Transmit_String(",");
                    //rprintfFloat(4, g_structAccelerometerData.accz_RAW);

                }


            if (
             abs( g_structAccelerometerData.accx_RAW) < 100 
            && abs(g_structAccelerometerData.accy_RAW) < 100 
            && g_structAccelerometerData.accz_RAW < -350 
            && ProcessStarted != 2 && ProcessStarted != 3 && ProcessStarted != 1 )
            {
                ProcessStarted = 1; 
            }   

            if (ProcessStarted==1)
            { 

            Read_magnato(1);

                structMagnetometerOffsetDataToEEPROM.Off_X += g_structMegnetometerData.magx_RAW;
                structMagnetometerOffsetDataToEEPROM.Off_Y += g_structMegnetometerData.magy_RAW;
                structMagnetometerOffsetDataToEEPROM.Off_Z += g_structMegnetometerData.magz_RAW;

                cnt++;

            }               
                if ( g_structAccelerometerData.accz_RAW > 350 
                && ProcessStarted==1)
                {
                    ProcessStarted = 2; 
                }

                if ( g_structAccelerometerData.accz_RAW < -350 
                && ProcessStarted == 2 )
                {
                    ProcessStarted=3; 
                    structMagnetometerOffsetDataToEEPROM.Off_X /= cnt;
                    structMagnetometerOffsetDataToEEPROM.Off_X /= 2;

                    structMagnetometerOffsetDataToEEPROM.Off_Y /= cnt;
                    structMagnetometerOffsetDataToEEPROM.Off_Y /= 2;

                    structMagnetometerOffsetDataToEEPROM.Off_Z /= cnt;
                    structMagnetometerOffsetDataToEEPROM.Off_Z /= 2;  

                    UpdateOFFSETDATAinEEPROM();  

                    break;

                } 
    }   
} 

Po uzyskaniu tych przesunięć użyłem ich w następujący sposób:

void main()
{
...

Read_magnato(1);
        g_structMegnetometerData.magx_RAW -= structMagnetometerOffsetDataToEEPROM.Off_X ;
        g_structMegnetometerData.magy_RAW -= structMagnetometerOffsetDataToEEPROM.Off_Y ;
        g_structMegnetometerData.magz_RAW -= structMagnetometerOffsetDataToEEPROM.Off_Z ;
...
}

Jak wspomniałem.


2
To pytanie wymaga dużej pomocy. Potrzebujesz pomocy w programowaniu? Teoria o magnetometrach? Jaka platforma? Czego próbowałeś lub szukałeś?
Kellenjb,

czy rysunek 8 nie jest po prostu gestem rozpoczęcia kalibracji?
geometrikal

1
Nie wiem, dlaczego ppl zachowują się tak, jakby byli robotami. Podałem link do tej samej pracy. Dużo nad tym pracowałem i ppl po prostu nie wiedząc, po prostu głosujcie. Nienawidzę go, kiedy moje pytanie jest odrzucone z powodu mojego niejasnego pytania. Zapytaj o to, co potrzebne tuż przed głosowaniem. Naprawdę umieram, aby uzyskać wyniki, a ppl nawet nie myśli przed głosowaniem. Źle się czuje i próbuje odciągnąć mnie od pracy we właściwym kierunku. Proszę, nie potrzebuję pomocy po obu stronach głosowania.
Rick2047,

1
@Kellenjb: Pracuję na IMU przy użyciu prostej 8-bitowej atmega32. Próbowałem nad tym pracować i doszedłem do wniosku, że 32-bitowy uC przypomina używanie miecza zamiast igły. (Przepraszam za moją zagadkę:)) Próbowałem zsumować wszystkie wartości RAW magnetometru, tworząc kształt. Następnie podziel przez liczbę wejść. Myślenie może pomóc w obliczeniu przesunięcia. Myślę, że niektóre, w jaki sposób dwie identyczne części / boki kształtu, przypominają anulowanie ziemskiego pola magnetycznego i podanie wartości przesunięcia. Mogę się mylić. Ale szczególnie w przypadku kalibracji opartej na kształcie właśnie tu jestem. Myślę, że ...
Rick2047,

1
Problem nie polegał na pytaniu, ale na liczbie osób na tej stronie, którzy będą głosować za pytaniami po prostu dlatego, że nie są wystarczająco zaznajomieni z tematem, aby zrozumieć, o co pytano. Jeśli nie wiesz, zostaw to w spokoju!
Chris Stratton,

Odpowiedzi:


21

Wzór w kształcie 8 / S służy do kalibracji magnetometrów w telefonach komórkowych i innych urządzeniach.

tło

Typowe magnetometry z epoki telefonu komórkowego mierzą natężenie pola magnetycznego wzdłuż trzech osi ortogonalnych, np .:

m=mxı^+myȷ^+mzk^

Przy wielkości pola podanej przez

m=mx2+my2+mz2

oraz kąt obrotu od każdej osi jako

θk=cos1mkm, where k[x,y,z]

Kalibrowanie

mxmymz

Idealnie powinien wyglądać mniej więcej tak:

kula

Jednak z powodu twardego i miękkiego efektu żelaza i innych zniekształceń, wygląda to jak zdeformowana kula:

zdeformowany

Wynika to z tego, że wielkość pola magnetycznego mierzona przez czujnik zmienia się wraz z orientacją. W rezultacie kierunek pola magnetycznego obliczany zgodnie z powyższymi wzorami różni się od prawdziwego kierunku.

Należy przeprowadzić kalibrację, aby wyregulować każdy z trzech odczytów osi, tak aby wielkość była stała niezależnie od orientacji - można myśleć o tym, że zdeformowana kula musi zostać wypaczona w idealną kulę. LSM303 aplikacja uwaga ma wiele szczegółowe instrukcje dotyczące sposobu wykonania tego.

A co powiesz na wzór 8?

Wykonanie wzoru z rysunku 8 „wykreśla” część zdeformowanej sfery powyżej. Na podstawie uzyskanych współrzędnych można oszacować odkształcenie kuli i uzyskać współczynniki kalibracji. Dobry wzór to taki, który śledzi największy zakres orientacji i dlatego szacuje największe odchylenie od prawdziwej stałej wielkości.

Aby oszacować kształt zdeformowanej kuli, można zastosować elipsę o najmniejszych kwadratach . Nota aplikacyjna LSM303 zawiera również informacje na ten temat.

Prosta metoda podstawowej kalibracji

Zgodnie z notatką aplikacji, jeśli nie przyjmiesz odkształcenia miękkiego żelaza, zdeformowana kula nie zostanie przechylona. Dlatego możliwa może być prosta metoda podstawowej kalibracji:

  • Znajdź maksymalną i minimalną wartość dla każdej osi i uzyskaj zakres 1/2 i punkt zerowy

rk=12(max(mk)min(mk))

zk=max(mk)rk

  • Przesuwaj i skaluj każdy pomiar osi

mk=mkzkrk

  • Oblicz wartości jak poprzednio, z wyjątkiem używaniamk

Jest to oparte na kodzie znalezionym tutaj.

Rozwiązywanie przy użyciu najmniejszych kwadratów

Kod MATLAB do rozwiązania przy użyciu najmniejszych kwadratów pokazano poniżej. Kod zakłada zmienną, w magktórej kolumny są wartościami xyz.

H = [mag(:,1), mag(:,2), mag(:,3), - mag(:,2).^2, - mag(:,3).^2, ones(size(mag(:,1)))];
w = mag(:,1).^2;
X = (H'*H)\H'*w;
offX = X(1)/2;
offY = X(2)/(2*X(4));
offZ = X(3)/(2*X(5));
temp = X(6) + offX^2 + X(4)*offY^2 + X(5)*offZ^2;
scaleX = sqrt(temp);
scaleY = sqrt(temp / X(4));
scaleZ= sqrt(temp / X(5));

Aby wykonać dynamiczną kalibrację liczby 8, można uruchomić procedurę najmniejszych kwadratów przy każdym nowym odczycie i zakończyć, gdy ustabilizują się współczynniki przesunięcia i skali.

Ziemskie pole magnetyczne

Uwaga: pole magnetyczne Ziemi zwykle nie jest równoległe do powierzchni i może występować duży element skierowany w dół.


Cześć, To znaczny wysiłek, który podjąłeś, aby oczyścić drogę dla problemu z rysunkiem 8. Teraz mogę połączyć niektóre moje wcześniejsze prace z obecną pracą. Widziałem pewne ulepszenia, ale nie do końca. Jak wyjaśniłem wcześniej w tym tylko pytanie; NEWS jest wyświetlany poprawnie przy użyciu danych wyjściowych po utworzeniu kształtu 8, a następnie uzyskaniu połowy średniej wszystkich wektorów. Zaskakująco działa dla planu poziomego (przez Fluke). Więc znowu jestem w tym samym miejscu z gdzie zacząłem pracować nad algo kształtem 8. Wrócę po „Najmniejszym kwadracie”. Nie jestem jednak w stanie zrozumieć fuksa.
Rick2047,

... Wydaje się w moim przypadku, że kula jest zdeformowana na osi Z. Pamiętaj, że jestem świadomy efektu twardego i miękkiego żelaza na wykreśloną kulę 3D. Spróbuję ponownie wykreślić go na 3D. Pokazać.
Rick2047,

@ Rahul2047 Cóż, mam tylko nadzieję, że jest poprawny, ale ma dla mnie sens. Muszę wykonać podobną kalibrację dla instrumentu, który buduję, ale nie jestem jeszcze w pełni zaimplementowany.
geometrikal

Zastanawiam się, że w przypadku telefonów, które zwykle są zainteresowane tylko kierunkiem w płaszczyźnie poziomej, prosty gest obejmuje wszystkie potrzebne punkty. Czy korzystasz z Matlaba? Łatwo jest tam dopasować. Najmniejsze kwadraty odnoszą się do metody pomiaru błędu.
geometrikal

1
Niektóre łącza do obrazów w tym artykule zepsuły się - czy możesz ponownie dodać obrazy? SE ma teraz funkcję, która przesyła obrazy i przechowuje je lokalnie, aby zapobiec przyszłym uszkodzeniom. Dzięki!
Nowa Aleksandria,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.