Магнитометр ∞ образной калибровки


15

В мобильных телефонах и других устройствах, использующих 3-осевой электронный компас, для калибровки магнитометра используется движение в форме ∞ / 8 / S, как показано на этих видео .

Почему выполняется это движение, какова теория, и может ли кто-нибудь привести пример кода C для его реализации?

Вы должны пройти через мой другой похожий вопрос, содержащий больше информации.


Некоторая дополнительная информация для этого конкретного вопроса: Платформа 8-битная AtMega32, с использованием AVR Studio 5.

До сих пор я пытался: я пытался разделить среднее значение на 2 вектора значений магнитометра, делающего форму. Мышление может помочь в расчете смещений. Я думаю, что две одинаковые части / стороны фигуры нейтрализуют магнитное поле Земли и выдают значения смещения. Я могу быть не прав. Но особенно для калибровки на основе формы это то, где я сейчас нахожусь. Я думаю, что калибровка работает таким образом. Идея состоит в том, чтобы выяснить, так ли это работает?


Хорошо, код, по которому я могу вычислить смещения, а затем просто вычесть их из необработанного магнитного трехмерного вектора. Я могу быть совершенно неправ и не иметь объяснения, как это работает. Просмотр видео и данных, нанесенных на сферу, как-то ускорил мою мысль, и я использовал эту мысль в форме уравнения. B)

Код:

Функции Read_accl();и Read_magnato(1);считывают данные датчика. Я надеюсь, что код не требует пояснений. Надеюсь, мудрый человек будет использовать это гораздо лучше. : \

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 просто жестом для запуска калибровки?
геометрикал

1
Я не знаю, почему люди ведут себя так, как будто они роботы. Я дал ссылку на ту же работу. Я много работал над этим и, ппл, просто не зная, просто проголосуй. Я ненавижу, когда за мой вопрос проголосовали из-за моего неясного вопроса. Пожалуйста, спросите, что нужно, перед тем как проголосовать. Я действительно хочу получить результаты, и люди даже не думают, пока не проголосовали. Он чувствует себя плохо и пытается отвлечь меня от работы в правильном направлении. Пожалуйста, мне нужна помощь, ни одна из сторон голосования.
Rick2047

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

1
Проблема была не в вопросе, а в количестве людей на этом сайте, которые будут опускать вопросы просто потому, что они недостаточно знакомы с предметом, чтобы понять, что было задано. Если вы не знаете, просто оставьте это в покое!
Крис Страттон

Ответы:


21

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

Фон

Типичные магнитометры эпохи мобильных телефонов измеряют напряженность магнитного поля по трем ортогональным осям, например:

мзнак равномИкся^+мYȷ^+мZК^

С величиной поля, заданного,

| |м| |знак равномИкс2+мY2+мZ2

и угол поворота от каждой оси как

θКзнак равносоз-1мК| |м| |, где К[Икс,Y,Z]

калибровка

мИксмYмZ

В идеале это должно выглядеть примерно так:

сфера

Однако из-за эффектов твердого и мягкого железа и других искажений он в конечном итоге выглядит как деформированная сфера:

деформироваться

Это связано с тем, что величина магнитного поля, измеряемая датчиком, изменяется с ориентацией. В результате направление магнитного поля при расчете по приведенным выше формулам отличается от истинного направления.

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

Так что насчет рисунка 8 !?

Выполнение рисунка 8 рисунка «отслеживает» часть деформированной сферы выше. Из полученных координат можно оценить деформацию сферы и получить калибровочные коэффициенты. Хороший паттерн - это тот, который прослеживает наибольшую дальность ориентации и поэтому оценивает наибольшее отклонение от истинной постоянной величины.

Чтобы оценить форму деформированной сферы, можно использовать эллипс фитинга наименьших квадратов . Замечание по применению LSM303 также содержит информацию об этом.

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

Согласно примечанию к приложению, если вы не предполагаете никаких искажений из мягкого железа, деформированная сфера не будет наклонена. Поэтому возможен простой метод базовой калибровки:

  • Найти максимальное и минимальное значение для каждой оси, а также получить диапазон 1/2 и нулевую точку

рКзнак равно12(Максимум(мК)-мин(мК))

ZКзнак равноМаксимум(мК)-рК

  • Сдвиньте и масштабируйте каждую ось измерения

мК'знак равномК-ZКрК

  • мК'

Это основано на коде, найденном здесь.

Решение с использованием наименьших квадратов

Код 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. Давай посмотрим.
Rick2047

@ Rahul2047 Ну, я просто надеюсь, что это правильно, но для меня это имеет смысл. Я должен сделать аналогичную калибровку для инструмента, который я строю, но я еще не до конца внедрил код.
геометрикал

Интересно, что для телефонов, которые обычно заинтересованы только в направлении в горизонтальной плоскости, простой жест охватывает все необходимые точки. Вы используете Matlab? Там легко сделать посадку. Наименьшие квадраты относятся к методу измерения ошибки.
геометрикал

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