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

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


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

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

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

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

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

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

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

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

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

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

РЭ Houston Control Center

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

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

les05

05 Урок. Получение сырых данных с магнитометра.

Знакомство с магнитометром смартфона

Почти в каждом современном смартфоне установлен магнитометр, давайте познакомимся с ним. Установите в смартфон приложение для визуализации данных, полученных со встроенного магнитометра, например, MagnetMeter (рисунок 1):

Рисунок 1. Приложение MagnetMeter

Откройте приложение – вы увидите синюю стрелку, которая показывает направление силовых линий магнитного поля (рисунок 2):

Рисунок 2. Силовые линии магнитного поля

Вращайте смартфон и убедитесь, что магнитные линии направлены всегда в одну сторону – почти на север. На показания магнитометра кроме поля Земли влияют и другие магнитные поля. Убедитесь в этом приблизив магнит к смартфону. Перемещая магнит около смартфона определите точное место установки магнитометра в корпусе смартфона (рисунок 3):

Рисунок 3. Направление магнитных линий при вращении смартфона

Обратите внимание на величину напряженности магнитного поля Земли и поля вблизи магнита.

Проверка работоспособности магнитометра Орбикрафт

В конструкторе Орбикрафт 3D магнитометр установлен на плате БВМ. Соедините БВМ с СЭП. Загрузите программу и запустите ее.

Код на С.

mag_test.c
#include <stdio.h>
#include <stdint.h>
#include "libschsat.h"
 
void control(void){ 
	/*Устанавливаем период отправки телеметрии магнитометром*/
	magnetometer_gyro_set_telemetry_period(0, 500);
	/*Объявляем переменные*/
	float mag_x = 0, mag_y = 0, mag_z = 0;
	uint16_t mag_num = 0;
 
	/*Выводим 20 значений магнитометра по 2 значения в секунду*/
	for (int i = 0; i < 20; i++){
		mSleep(500); /*Интервал задержки*/
		/*Получаем значения магнитометра*/
		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");
}

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

Получение азимута с магнитометра

Распечатайте транспортир (шаблон в файле Transportir.pdf), приклейте его к столу с помощью клеящих подушечек, не оставляющих следов (аналог UHU patafix), затем установите Orbicraft 2 на транспортир, и поворачивайте на 30 градусов с интервалом в 10 секунд (рисунок 4):

Рисунок 4. Установка ОрбиКрафт 3D на распечатанный транспортир

Загрузите в БКУ следующую программу, которая произведет 60 измерений с шагом в 1 сек.

Код на С.

azimuth.c
#include <stdio.h>
#include <stdint.h>
#include <math.h>
#define M_PI 3.146284827473
#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;
	float mag_alpha;
 
	/*Выводим 12 значений магнитометра один раз в 10 секунд*/
	for (int i = 0; i < 12; i++){
		mSleep(10000); /*Интервал задержки 10 сек*/
		/*Получаем значения магнитометра*/
		magnetometer_request_raw(mag_num, &mag_x, &mag_y, &mag_z);
		/*Вычисляем азимут*/
		mag_alpha = atan2(mag_y, mag_x)*180/M_PI;
		/*Выводим значения азимута*/
		printf("alfa = %d  mag_alpha = %f\n", i*30, mag_alpha);
	}
	puts("Sent");
}

Поворачивайте магнитометр с шагом в 30 градусов и записывайте выдаваемое значение угла в таблицу EXCEL с точностью до градуса. Должна получится подобная таблица с данными (рисунок 5):

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

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

Обратите внимание, при повороте на 30 градусов значение угла, выдаваемое магнитометром изменяется не ровно на 30 градусов. Давайте вычислим эти значения средствами EXCEL.

Создание таблицы

Создайте новый столбец, который будет содержать разность соседних чисел. Введите в пустую ячейку С2 знак равенства, а затем кликните мышкой в ячейку В1, введите знак «-», а затем кликните в ячейку В2 и нажмите Enter (рисунок 6):

Рисунок 6. Создание столбца с разностью чисел

В ячейке С2 будет вычислена разность В1-В2. Протяните вниз уголок — формула автоматически скопируется во все нижние ячейки (рисунок 7):

Рисунок 7. Результат вычитания

Разности будут вычислены автоматически (рисунок 8):

Рисунок 8. Готовый столбец

Обратите внимание, значение -341 явно ошибочное. При переходе через значение 180 градусов изменился знак измеренного угла, следовательно формулу =B6-B5 нужно изменить следующим образом =(180+B6)+(180-B5) что равносильно =360+B6-B5 (рисунок 9):

Рисунок 9. Изменение формулы

Построение диаграмм

Теперь нужно построить график чтобы наглядно увидеть искажения, вносимые в измерение угла некалиброванным магнитометром. Выделите вычисленные значения разностей (рисунок 10):

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

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

Рисунок 11. Вставка круговой диаграммы

Кликните правой кнопкой мышки в цветной круг и выберите белый цвет заливки и черный цвет контура (рисунок 12):

Рисунок 12. Выбор цвета диаграммы

Теперь невооруженным глазом видно, что магнитометр далек от идеала — сектора круга не ровно по 30 градусов. Некоторые уже, а некоторые шире (рисунок 13):

Рисунок 13. Построенная круговая диаграмма

Давайте построим еще один график, который наглядно проиллюстрирует неидеальность магнитометра. Выделите вычисленные значения разностей. Нажмите Вставка и выберите лепестковую диаграмму (рисунок 14):

Рисунок 14. Построение лепестковой диаграммы

Теперь очень хорошо видно, что значения далеки от идеального 12 угольника радиусом 30.

Анализ данных с помощью функций

А теперь давайте вычислим среднее значение разности между измеренными углами с использованием функции EXCEL СРЗНАЧ. Выберите любую ячейку, введите знак равенства, имя функции и откройте скобку (рисунок 15):

Рисунок 15. Ввод формулы для вычисления средних значений

Затем выберите мышкой диапазон вычисленных значение разностей, на основе которого мы строили диаграммы и закройте скобку. Функция будет иметь такой вид =СРЗНАЧ(C2:C13). Нажмите Enter, и функция вычислит среднее значение указанных чисел. А теперь давайте вычислим стандартное отклонение вычисленных разностей от среднего значения, которое покажет величину разброса значений относительно среднего. Для этого используем функцию СТАНДОТКЛОНА. Выберите любую ячейку, введите знак равенства, имя функции и откройте скобку (рисунок 16):

Рисунок 16. Ввод формулы для вычисления величины разброса значений относительно среднего

Затем выберите мышкой диапазон вычисленных значение разностей, на основе которого мы строили диаграммы и закройте скобку. Функция будет иметь такой вид =СТАНДОТКЛОНА(C2:C13). Нажмите Enter, и функция вычислит стандартное отклонение вычисленных разностей от среднего значения. Теперь вычислите процентное соотношение среднего значения и стандартного отклонения (рисунок 17):

Рисунок 17. Вычисление процентного соотношения среднего значения и стандартного отклонения

Как видите, разброс очень велик и составляет 47% от среднего значения. Магнитометр необходимо откалибровать.

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

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

Код на С.

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");
}
 

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

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

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

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

– функция возвращающая сырые данные измеренные магнитометром с номером mag_num, так как магнитометр в конструкторе только один, то mag_num-0 и функция возвращает три значения, которые помещаются в переменные mag_x, mag_y и mag_z.

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

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

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

les05.txt · Последние изменения: 2022/04/03 00:30 — ekaterina.manucharova

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