Для чего нужен ОрбиКрафт
Подсистемы конструктора
Инструкции по работе с ОрбиКрафт
Уроки
Лабораторная оснастка
Знакомство с Arduino
Полезная нагрузка на базе Arduino
Обратная связь
Новости
Для чего нужен ОрбиКрафт
Подсистемы конструктора
Инструкции по работе с ОрбиКрафт
Уроки
Лабораторная оснастка
Знакомство с Arduino
Полезная нагрузка на базе Arduino
Обратная связь
Новости
Это старая версия документа!
По умолчанию магнитометр не откалиброван, т.е. выдает неточные значения. Уточненные значения можно получить из сырых данных путем калибровки, которая заключается в нахождении матрицы преобразования и вектора смещения. Сырые данные с магнитометра можно получить, выполнив код на языке Python, представленный ниже. Во время сбора данных магнитометр необходимо хаотично вращать, стараясь повернуть его во все возможные стороны.
Код на Python.
def control(): #Основная программы, в которой вызываем остальные функции mgn_result = [0,0,0,0] #Инициализируем mgn_result num = 1 magnetometer_turn_on(num) #Включаем магнитометр sleep(1) for i in range(500): #Выполним 500 измерений mgn_result = magnetometer_request_raw(num) if not mgn_result[0]: #Если датчик не вернул сообщение об ошибке print mgn_result[1], mgn_result[2], mgn_result[3] sleep(0.05) #Задержка пять сотых секунды magnetometer_turn_off(num) #Выключение магнитометра
Код на С.
#include <stdio.h> #include <stdint.h> #include "libschsat.h" #define LSS_OK 0 #define LSS_ERROR 1 #define LSS_BREAK 2 void control(void){ //Основная программа, в которой вызываем остальные функции /*Для вывода данных необходимость в объявлении массива отпадает*/ int16_t mgn_result[] = {0, 0, 0, 0}; //Инициализируем mgn_result uint16_t num = 1; magnetometer_turn_on(num); //Включаем магнитометр Sleep(1); int i; for (i = 0; i < 500; i++) //Выполним 500 измерений { mgn_result[0] = magnetometer_request_raw(num, &mgn_result[1],&mgn_result[2],&mgn_result[3]); if(!mgn_result[0]){ //Если датчик не вернул сообщение об ошибке printf("%d, %d, %d\n", mgn_result[1], mgn_result[2], mgn_result[3]); } Sleep(0.5); //Задержка пять десятых секунды } magnetometer_turn_off(num); }
Соедините БКУ с СЭП и магнитометром как на прошлом уроке. Не прикрепляйте магнитометр к пластине, чтобы его было удобно вращать. Загрузите программу в Орбикрафт и запустите ее. Хаотично вращайте магнитометр, чтобы собрать сырые данные со всех возможных направлений.
Сохраните полученные данные в файл с расширением txt. Для этого выделите все результаты с помощью Ctrl+A, скопируйте с помощью Ctrl+C и сохраните.
В программе используются следующие функции работы с магнитометром:
magnetometer_turn_on(num)
– функция включения магнитометра, где num – это номер магнитометра.
magnetometer_request_raw(num)
– функция возвращающая сырые данные измеренные магнитометром с номером num, представляющие собой список из 4 числовых значений. Поэтому считанные данные мы помещаем в список mgn_result, состоящий из 4 значений.
mgn_result = [0,0,0,0] mgn_result = magnetometer_request_raw(num)
Первое значение списка возвращает информацию об ошибке. Если возвращено значение 0, то ошибки нет, если 1, то датчик не соединен, если 2, то ошибка в программе.
В программе использован оператор цикла for i in range(1000) который будет выполнен 1000 раз, соответственно будет выведено 1000 значений.
Эти значения понадобятся на следующем уроке при калибровке магнитометра.
Откройте полученный файл с данными с Excel. Нажмите Ctrl-O и выберите папку с файлом. По умолчанию Excel не открывает файлы типа txt, однако если в поле ввода имени ввести * и нажать на Enter, то будут показаны все файлы. Выберите файл с данными и нажмите Открыть.
Запустится мастер импорта. Нажмите Далее. На второй странице укажите что символом-разделителем столбцов является пробел.
Убедитесь, что в окне с образцом разбора данных все столбцы с данными разделены вертикальными линиями и нажмите Далее.
Формат данных столбцов оставьте общим. Нажмите Готово и данные будут загружены в лист Excel.
Теперь нужно построить график, чтобы выявить и удалить значения, которые измерены с большой ошибкой. На графике эти значения будут выбиваться из общего ряда. Кликните по заголовку столбца чтобы выделить его целиком.
Кликните Вставка и выберите точечную диаграмму.
Будет построена точечная диаграмма, на которой хорошо видны точки, которые выбиваются из общего ряда.
Наведите на точку курсор и увидите значение.
Найдите в таблице строку с указанным значением и удалите ее целиком. Аналогичным образом удалите ошибочные точки из второго и третьего столбцов.
Сохраните файл в формате txt. На вопрос о сохранении в текстовом формате ответьте Да.
Запомните где сохранен этот файл, он потребуется на следующем этапе калибровки магнитометра.
Скачайте программу Magneto по ссылке Скачать Magneto
Разархивируйте и запустите программу Magneto.
Введите в окно, отмеченное цифрой 1, значение 700, затем нажмите на кнопку Open и выберите файл с сырыми данными, очищенный от ошибок. Затем нажмите на кнопку Calibrate. Программа Magneto вычислит и отобразит поправочные коэффициенты. В дальнейшем нам потребуются не все коэффициенты, рассчитанные программой Magneto , а только три значения Combined bias (b) и девять значений Correction for combined scale factors.
Загрузите в Орбикрафт следующую программу, которая произведет 60 измерений с шагом в 1 сек. Используйте распечатанный транспортир и магнитометр с линейкой. Коэффициенты для функции def mag_calibrated возьмите из программы Magneto.
Скопируйте округленные значения следующим образом.
Код на Python.
import math time_step = 1 # Временной шаг измерений mag_num = 1 # Номер магнитометра # Функция mag_calibrated вносит поправки в показания магнитометра с учетом калибровочных коэффициентов def mag_calibrated(magx,magy,magz): magx_cal = 1.06*(magx + -7.49) + -0.01*(magy + -23.59) + 0.07*(magz + -108.24) magy_cal = -0.01*(magx + -7.49) + 1.11*(magy + -23.59) + 0.09*(magz + -108.24) magz_cal = 0.07*(magx + -7.49) + 0.09*(magy + -23.59) + 1.00*(magz + -108.24) return magx_cal, magy_cal, magz_cal def initialize_all(): print "Enable magnetometer", mag_num magnetometer_turn_on(mag_num) sleep(1) def switch_off_all(): print "Disable magnetometer", mag_num magnetometer_turn_off(mag_num) def control(): # основная функция программы, в которой вызываются остальные функции initialize_all() mag_state = 0 # Инициализируем статус магнитометра alpha_goal = 0 # Целевой угол omega_goal = 0 # Целевая угловая скорость for i in range(60): # опрос датчиков и маховика mag_state, magx_raw, magy_raw, magz_raw = magnetometer_request_raw(mag_num) if not mag_state: # если магнитометр вернул код ошибки 0, т.е. ошибки нет magx_cal, magy_cal, magz_cal = mag_calibrated(magx_raw,magy_raw,magz_raw) mag_alpha = math.atan2(magy_cal, magx_cal)/math.pi*180 print "mag_alpha atan2= ", mag_alpha elif mag_state == 1: print "Fail because of access error, check the connection" elif mag_state == 2: print "Fail because of interface error, check your code" sleep(time_step) switch_off_all()
Код на С.
#include <stdio.h> #include <stdint.h> #include "libschsat.h" #define LSS_OK 0 #define LSS_ERROR 1 #define LSS_BREAK 2 #include <math.h> const int time_step = 1; const uint16_t mag_num = 1; int mag_calibrated(int16_t *magx, int16_t *magy, int16_t *magz ){ //Функция mag_calibrated вносит поправки в показания магнитометра с учетом калибровочных коэффициентов float magx_cal; magx_cal = 1.06*(*magx + -7.49) + -0.01*(*magy + -23.59) + 0.07*(*magz + -108.24); float magy_cal; magy_cal = -0.01*(*magx + -7.49) + 1.11*(*magy + -23.59) + 0.09*(*magz + -108.24); float magz_cal; magz_cal = 0.07*(*magx + -7.49) + 0.09*(*magy + -23.59) + 1.00*(*magz + -108.24); *magx = (int16_t) magx_cal; *magy = (int16_t) magy_cal; *magz = (int16_t) magz_cal; return 0; } void initialize_all(){ printf("Enable magnetometer %d\n", mag_num); magnetometer_turn_on(mag_num); Sleep(1); } void switch_off_all(){ printf("Disable magnetometer %d\n", mag_num); magnetometer_turn_off(mag_num); } int control(){ initialize_all(); int mag_state = 0; int16_t mgx_cal=0; int16_t mgy_cal=0; int16_t mgz_cal=0; int16_t *magx_cal = &mgx_cal; int16_t *magy_cal = &mgy_cal; int16_t *magz_cal = &mgz_cal; int i; for ( i= 0; i < 60; i++){ mag_state = magnetometer_request_raw(mag_num, magx_cal,magy_cal,magz_cal); float mag_alpha; if (!mag_state){ mag_calibrated(magx_cal,magy_cal,magz_cal); mag_alpha = atan2(mgy_cal, mgx_cal)/ M_PI *180; printf("mag_alpha atan2 = %f\n", mag_alpha); } else if (mag_state == 1){ printf("Fail because of access error, check the connection"); } else if (mag_state == 2){ printf("Fail because of interface error, check your code"); } Sleep(time_step); } switch_off_all(); return 0; }
Поворачивайте магнитометр с шагом в 30 градусов и записывайте выдаваемое значение угла в таблицу EXCEL. Должна получится примерно вот такая таблица с данными.
Проанализируйте полученные данные как на прошлом уроке.
Средне значение разности между измеренными углами 30.
Стандартное отклонение вычисленных разностей от среднего значения 1.3.
Процентное соотношение среднего значения и стандартного отклонения 4%.
Измеренное на прошлом уроке процентное соотношение составляло 17%, следовательно, откалиброванный магнитометр измеряет примерно в 4 раза точнее.