Магнітометр ∞ форма калібрування


15

У мобільних телефонах і інших пристроях з використанням 3-осьовий електронний компас, ∞ / 8 / S образного руху і використовується для калібрування магнитометра , як показано на цих відео .

Чому цей рух виконується, що таке теорія, і чи може хто-небудь навести приклад C коду для його здійснення?

Ви повинні пройти ще одне моє подібне запитання, що містить більше інформації.


Деякі додаткові відомості щодо цього конкретного питання: Платформа є 8-бітною AtMega32, використовуючи AVR Studio 5.

До цього часу я намагався: я спробував розділити середнє значення на 2 векторних значення магнітометра, роблячи форму. Мислення може допомогти у розрахунку компенсацій. Я думаю, що деякі, як дві однакові частини / сторони форми скасовують магнітне поле Землі та видають значення зміщення. Я можу помилятися. Але особливо для калібрування, заснованого на формі, це зараз я. Я думаю, що калібрування працює таким чином. Ідея полягає в тому, щоб з'ясувати, чи працює це таким чином?


Гаразд код, за допомогою якого я можу обчислити компенсації, а пізніше просто відняти ті з сирого магнітного 3D-вектора. Я, можливо, абсолютно помиляюся і не маю пояснення, як це працює. Побачення після відео та даних, нанесених на сферу, якимось чином прискорило мою думку, і я використав цю думку у формі рівняння. Б)

Код:

Функції Read_accl();та Read_magnato(1);функції зчитування даних датчика. Я сподіваюся, що код пояснює себе. Сподіваючись, що мудрий ppl напевно буде використовувати це набагато краще. : \

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;

                } 
    }   
} 

Після отримання цих компенсацій я використав їх наступним чином:

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 ;
...
}

Як я вже згадував.


2
Це питання потребує великої допомоги. Вам потрібна допомога з програмуванням? Теорія про магнітометри? Яка платформа? Що ви пробували чи шукали?
Kellenjb

хіба цифра 8 не є просто жестом для ініціювання калібрування?
geometrikal

1
Я не знаю, чому ppl поводиться так, ніби робот. Я дав посилання на ту саму роботу. Я багато працював над цим і ppl, просто не знаючи, просто проголосуйте. Я ненавиджу це, коли за моє незрозуміле запитання проголосовано моє запитання. Будь ласка, запитайте, що потрібно безпосередньо перед тим, як проголосувати. Я дійсно вмираю, щоб отримати вихідні дані, а ppl навіть не замислюється перед тим, як проголосувати. Мені здається погано і намагається відвернути мене від роботи в правильному напрямку. Будь ласка, мені потрібна допомога не з обох сторін голосу.
Rick2047

1
@Kellenjb: Я працюю над IMU, використовуючи простий 8-бітний atmega32. Я спробував попрацювати над цим і дійшов висновку, що 32-бітний UC - це як використовувати меч замість голки. (Вибачте за мою загадку:)) Я спробував додати всі значення RAW магнітометра для створення форми. Потім розділіть на кількість входів. Мислення може допомогти у розрахунку компенсації. Я думаю, що деякі, як дві однакові частини / сторони форми, дехто скасовує магнітне поле Землі та видає значення зміщення. Я можу помилятися. Але особливо для калібрування, заснованого на формі, це зараз я. Я думаю, що ...
Rick2047

1
Проблема була не в питанні, а в кількості людей на цьому веб-сайті, які спростують питання просто тому, що вони недостатньо знайомі з темою, щоб зрозуміти, що було задано. Якщо ви не знаєте, просто залиште його в спокої!
Кріс Страттон

Відповіді:


21

Візерунок у формі 8 / S використовується для калібрування магнітометрів у мобільних телефонах та інших пристроях.

Фон

Типові магнітометри епохи мобільного телефону вимірюють напруженість магнітного поля вздовж трьох ортогональних осей, наприклад:

м=мхı^+муȷ^+мzк^

З величиною поля, заданим,

м=мх2+му2+мz2

і кут повороту від кожної осі як

θк=cos-1мкм, де к[х,у,z]

Калібрування

мхмумz

В ідеалі воно повинно виглядати приблизно так:

сфери

Однак через вплив твердого та м'якого заліза та інших спотворень воно виглядає як деформована сфера:

деформовані

Це тому, що величина магнітного поля, виміряна датчиком, змінюється з орієнтацією. У результаті випливає, що напрямок магнітного поля при його обчисленні за формулами вище відрізняється від істинного напрямку.

Калібрування повинно бути виконано для регулювання кожного з трьох осі показань, щоб величина була постійною незалежно від орієнтації - ви можете думати про це, як деформована сфера повинна перетворюватися на ідеальну сферу. LSM303 додаток до відома має багато детальних інструкцій про те , як виконати це.

То як щодо рисунка 8?!

Виконуючи малюнок 8, викреслюємо частину деформованої сфери вгорі. З отриманих координат можна оцінити деформацію сфери та отримані коефіцієнти калібрування. Хороший зразок - це той, який простежує найбільший діапазон орієнтацій і тому оцінює найбільше відхилення від справжньої постійної величини.

Для оцінки форми деформованої сфери можуть бути використані найменші квадрати еліпсисного прилягання . Інформація про додаток LSM303 також містить інформацію про це.

Простий метод базової калібрування

Згідно з приміткою програми, якщо не допускати жодних спотворень із м'якого заліза, деформована сфера не буде нахилена. Тому можливий простий метод базової калібрування:

  • Знайдіть максимальне та мінімальне значення для кожної осі та отримайте 1/2 діапазону та нульову точку

rк=12(макс(мк)-хв(мк))

zк=макс(мк)-rк

  • Зміщення та масштабування кожного вимірювання осі

мк'=мк-zкrк

  • Обчислюйте значення, як раніше, за винятком використаннямк'

Це засновано на наведеному тут коді .

Розв’язування за допомогою найменших квадратів

Код MATLAB для вирішення за допомогою найменших квадратів показаний нижче. Код передбачає змінну, magде стовпці - значення 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));

Щоб виконати динамічну калібрування фігури 8, ви можете виконати процедуру найменших квадратів з кожним новим читанням і припинити, коли коефіцієнти зміщення та масштабування стабілізуються.

Магнітне поле Землі

Зауважте, що магнітне поле Землі зазвичай не паралельне поверхні і може бути великий компонент вниз.


Привіт, це помітні зусилля, які ви доклали, щоб очистити шлях для викрійки малюнка 8. Тепер я можу пов’язати деякі свої попередні роботи з поточною роботою. Я побачив деякі вдосконалення, але не до позначки. Як я пояснював раніше в цьому тільки питання; НОВИНИ відображаються правильно, використовуючи вихідні дані після створення форми 8, потім отримуючи половину середнього серед усіх векторів. На диво це працює для горизонтального плану (по флюйку). Отже, я знову на тому ж місці від де я почав працювати над альго у формі 8. Я повернусь після "Найменшої площі". Однак я не в змозі зрозуміти флюк.
Rick2047

... Здається, у моєму випадку також сфера деформується на осі Z. Будь ласка, знайте, що мені відомо про вплив твердого та м'якого заліза на побудовану 3D-сферу. Я спробую побудувати його ще раз на 3D. Подивимося.
Rick2047

@ Rahul2047 Ну, я просто сподіваюся, що це правильно, але для мене це має сенс. Я маю зробити подібну калібрування для інструменту, який будую, але я ще не зовсім до цього коду.
geometrikal

Мені цікаво, що для телефонів, які, як правило, цікавляться лише напрямком в горизонтальній площині, простий жест охоплює всі необхідні точки. Ви використовуєте матлаб? Тут легко зробити пристосування. Найменші квадрати - це метод вимірювання помилок.
геометрик

1
Деякі посилання на зображення в цій статті перервано - чи можете ви знову додати зображення? Тепер у SE є функція, яка завантажує зображення та зберігає їх локально, щоб запобігти майбутньому злому. Спасибі!
Нова Олександрія
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.