les06 [ОрбиКрафт 3D]

Инструменты пользователя


Боковая панель

Назначение ОрбиКрафт 3D

Сборка ОрбиКрафт 3D

Интерфейсы конструктора ОрбиКрафт 3D

Работа с ОрбиКрафт 3D по УКВ

Работа с ОрбиКрафт 3D по Wi-Fi

Работа с ОрбиКрафт 3D через WEB-интерфейс

Полезная нагрузка на базе Arduino

ОрбиКрафт 3D (трехосный) на стенде полунатурного моделирования

Среда разработки

РЭ Houston Control Center

Лабораторная оснастка

Обратная связь

les06

06 Урок. Калибровка магнитометра

Получение сырых данных для калибровки магнитометра

По умолчанию магнитометр не откалиброван, т.е. выдает неточные значения. Уточненные значения можно получить из сырых данных путем калибровки, которая заключается в нахождении матрицы преобразования и вектора смещения. Сырые данные с магнитометра можно получить, выполнив код на языке С, представленный ниже. Во время сбора данных БВМ со встроенным магнитометром необходимо хаотично вращать, стараясь повернуть его во все возможные стороны.

Код на С.

raw_data.c
#include <stdio.h>
#include <stdint.h>
#include "libschsat.h"
 
void control(void){ 
	/*Устанавливаем период отправки телеметрии магнитометром*/
	magnetometer_gyro_set_telemetry_period(0, 100);
	/*Объявляем переменные*/
	float mag_x = 0, mag_y = 0, mag_z = 0;
	uint16_t mag_num = 0;
 
	/*Выводим 500 значений магнитометра по 10 значений в секунду*/
	for (int i = 0; i < 500; i++){
		mSleep(100); /*Интервал задержки*/
		/*Получаем значения магнитометра*/
		magnetometer_request_raw(mag_num, &mag_x, &mag_y, &mag_z);
		/*Выводим значения магнитометра*/
		printf("%f %f %f\t\n", mag_x, mag_y, mag_z);
	}
	puts("Sent");
}
 

Загрузите программу и запустите ее. Хаотично вращайте Орбикрафт 3D, чтобы собрать сырые данные со всех возможных вариантов его ориентации. Сохраните полученные данный в файл с расширением txt. Для этого выделите все результаты с помощью Ctrl+A и скопируйте с помощью Ctrl+C и сохраните.

Анализ работы программы

В программе используются следующие функции работы с магнитометром.

magnetometer_request_raw(mag_num, &mag_x, &mag_y, &mag_z) 

– функция возвращающая сырые данные измеренные магнитометром с номером mag_num, представляющие собой список из 4 числовых значений. Считанные данные мы помещаем в переменные mag_x, mag_y и mag_z.

В программе использован оператор цикла

for (int i = 0; i < 500; i++)

который будет выполнен 500 раз, соответственно будет выведено 500 значений. Эти значения понадобятся при калибровке магнитометра.

Анализ полученных данных в Excel

Откройте полученный файл с данными с Excel. Нажмите Ctrl-O и выберите папку с файлом. По умолчанию Excel не открывает файлы типа txt, однако если в поле ввода имени ввести * и нажать на Enter, то будут показаны все файлы. Выберите файл с данными и нажмите Открыть (рисунок 1):

Рисунок 1. Открытие текстового файла в Excel

Запустится мастер импорта. Нажмите Далее. На второй странице укажите что символом-разделителем столбцов является пробел (рисунок 2):

Рисунок 2. Мастер импорта

Убедитесь, что в окне с образцом разбора данных все столбцы с данными разделены вертикальными линиями и нажмите Далее (рисунок 3):

Рисунок 3. Выбор символа-разделителя

Формат данных столбцов оставьте общим. Нажмите Готово и данные будут загружены в лист Excel (рисунок 4):

Рисунок 4. Выбор формата столбцов

Теперь необходимо преобразовать загруженные значения в числа, для этого надо все точки заменить запятыми (рисунок 5):

Рисунок 5. Замена точек запятыми

Теперь у нас есть три столбца числовых значений. Первый столбец - проекция вектора магнитного поля на ось Х, второй - на ось Y, третий - на ось Z (рисунок 6):

Рисунок 6. Столбцы со значениями проекции вектора магнитного поля на оси Х, Y и Z

Давайте построим три точечные диаграммы чтобы убедиться в неидеальности магнитометра.

Сначала построим диаграмму в плоскости XY. Выделите первые два столбца, нажмите Вставка, выберите точечную диаграмму (рисунок 7):

Рисунок 7. Выбор данных для построения диаграммы

На листе появится вот такая диаграмма, на которой видно, что окружность далека от идеала (рисунок 8):

Рисунок 8. Диаграмма в плоскости XY

Теперь выделите вторые два столбца, чтобы построить проекцию на плоскость YZ (рисунок 9):

Рисунок 9. Выбор данных для построения диаграммы

Нажмите Вставка, выберите точечную диаграмму (рисунок 10):

Рисунок 10. Диаграмма в плоскости YZ

Теперь выделите первый и третий столбцы, чтобы построить проекцию на плоскость XZ (рисунок 11):

Рисунок 11. Выбор данных для построения диаграммы

Нажмите Вставка, выберите точечную диаграмму (рисунок 12):

Рисунок 12. Диаграмма в плоскости XZ

Как видите, все три фигуры далеки от ровных окружностей, следовательно магнитометру требуется калибровка.

Получение калибровочных коэффициентов

Скачайте программу Magneto по ссылке Скачать Magneto

Разархивируйте и запустите программу Magneto (рисунок 13):

Рисунок 13. Интерфейс программы Magneto

Введите в окно, отмеченное цифрой 1, значение 1000, затем нажмите на кнопку Open и выберите файл с сырыми данными, и нажмите на кнопку Calibrate. Программа Magneto вычислит и отобразит поправочные коэффициенты. В дальнейшем нам потребуются не все коэффициенты, рассчитанные программой Magneto, а только три значения Combined bias (b) и девять значений Correction for combined scale factors (рисунок 14):

Рисунок 14. Необходимые коэффициенты

Тест откалиброванного магнитометра

Добавьте в функцию def mag_calibrated коэффициенты из программы Magneto. Скопируйте значения следующим образом (рисунок 15):

Рисунок 15. Добавление полученных коэффициентов в программу

Обратите внимание! Три верхних нормировочных коэффициента, отвечающие за смещение ноля, вставляются в формулу с обратными знаками, в отличие от остальных коэффициентов, описывающих искажения эллипсоида.

Код на С.

calibr.c
#include <stdio.h>
#include <stdint.h>
#include <math.h>
#define M_PI 3.146284827473
 
const uint16_t mag_num = 0;
float mag_alpha = 0;
 
int mag_calibrated(float *magx, float *magy, float *magz ){
/*Функция mag_calibrated вносит поправки в показания магнитометра с учетом калибровочных коэффициентов*/
 
    float magx_cal = 0.018176*(*magx + 19327.009102) + -0.000453*(*magy + 3637.841067) + 0.000262*(*magz + -2152.959204);
    float magy_cal = -0.000453*(*magx + 19327.009102) + 0.018216*(*magy + 3637.841067) + -0.000091*(*magz + -2152.959204);
    float magz_cal = 0.000262*(*magx + 19327.009102) + -0.000091*(*magy + 3637.841067) + 0.018785*(*magz + -2152.959204);
 
    *magx = magx_cal;
    *magy = magy_cal;
    *magz = magz_cal;
 
    return 0;
}
 
int control(){
    float magx_cal=0;
    float magy_cal=0;
    float magz_cal=0;
    int i;
 
    for ( i= 0; i < 60; i++)
    {
        magnetometer_request_raw(mag_num, &magx_cal, &magy_cal, &magz_cal);
	mag_calibrated(&magx_cal, &magy_cal, &magz_cal);
	mag_alpha = atan2(magy_cal, magx_cal)*180/ M_PI;
	printf("mag_alpha = %f\n", mag_alpha);
	mSleep(10000);
    }
    return 0;
}

Загрузите в Орбикрафт 3D программу calibr.c, которая произведет 60 измерений с шагом в 10 сек. Используйте распечатанный транспортир и магнитометр с линейкой. Поворачивайте магнитометр с шагом в 30 градусов и записывайте выдаваемое значение угла в таблицу EXCEL. Должна получится примерно вот такая таблица с данными (рисунок 16):

Рисунок 16. Полученные значения с шагом угла в 30 градусов

Анализ данных в Excel

Проанализируйте полученные данные как на прошлом уроке (рисунок 17):

Рисунок 17. Анализ данных в Excel

Средне значение разности между измеренными углами 30.

Стандартное отклонение вычисленных разностей от среднего значения 1.6.

Процентное соотношение среднего значения и стандартного отклонения 5%.

Измеренное на прошлом уроке процентное соотношение составляло 47%, следовательно, откалиброванный магнитометр измеряет примерно в 10 раза точнее.

les06.txt · Последние изменения: 2022/04/03 17:25 — ekaterina.manucharova

Инструменты страницы