Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия Следующая версия Следующая версия справа и слева | ||
lesson5 [2019/05/14 10:54] golikov [Получение азимута с магнитометра] |
lesson5 [2020/01/24 14:37] golikov |
||
---|---|---|---|
Строка 265: | Строка 265: | ||
По умолчанию магнитометр не откалиброван, т.е. выдает неточные значения. Уточненные значения можно получить из сырых данных путем калибровки, которая заключается в нахождении матрицы преобразования и вектора смещения. Сырые данные с магнитометра можно получить, выполнив код на языке Python, представленный ниже. Во время сбора данных магнитометр необходимо хаотично вращать, стараясь повернуть его во все возможные стороны. | По умолчанию магнитометр не откалиброван, т.е. выдает неточные значения. Уточненные значения можно получить из сырых данных путем калибровки, которая заключается в нахождении матрицы преобразования и вектора смещения. Сырые данные с магнитометра можно получить, выполнив код на языке Python, представленный ниже. Во время сбора данных магнитометр необходимо хаотично вращать, стараясь повернуть его во все возможные стороны. | ||
- | <code python> | + | Код на Python. |
+ | <file python raw_data.py> | ||
def control(): #Основная программы, в которой вызываем остальные функции | def control(): #Основная программы, в которой вызываем остальные функции | ||
Строка 278: | Строка 279: | ||
sleep(0.05) #Задержка пять сотых секунды | sleep(0.05) #Задержка пять сотых секунды | ||
magnetometer_turn_off(num) #Выключение магнитометра | magnetometer_turn_off(num) #Выключение магнитометра | ||
- | </code> | + | </file> |
+ | |||
+ | Код на С. | ||
+ | <file c raw_data.c> | ||
+ | #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); | ||
+ | } | ||
+ | </file> | ||
Соедините БКУ с СЭП и магнитометром. Не прикрепляйте магнитометр к пластине, чтобы его было удобно вращать. Загрузите программу в Орбикрафт и запустите ее. Хаотично вращайте магнитометр, чтобы собрать сырые данные со всех возможных вариантов его ориентации. | Соедините БКУ с СЭП и магнитометром. Не прикрепляйте магнитометр к пластине, чтобы его было удобно вращать. Загрузите программу в Орбикрафт и запустите ее. Хаотично вращайте магнитометр, чтобы собрать сырые данные со всех возможных вариантов его ориентации. | ||
Строка 291: | Строка 321: | ||
Поэтому считанные данные мы помещаем в список mgn_result, состоящий из 4 значений. | Поэтому считанные данные мы помещаем в список mgn_result, состоящий из 4 значений. | ||
mgn_result = [0,0,0,0] | mgn_result = [0,0,0,0] | ||
- | <code python> mgn_result = magnetometer_request_raw(num) </code> | + | <code c>mgn_result = magnetometer_request_raw(num) </code> |
Первое значение списка возвращает информацию об ошибке. Если возвращено значение 0,то ошибки нет, если 1, то датчик не соединен, если 2, то ошибка в программе. | Первое значение списка возвращает информацию об ошибке. Если возвращено значение 0,то ошибки нет, если 1, то датчик не соединен, если 2, то ошибка в программе. | ||
- | В программе использован оператор цикла for i in range(1000) который будет выполнен 1000 раз, соответственно будет выведено 1000 значений. | + | В программе использован оператор цикла <code c>for (i = 0; i < 500; i++)</code> который будет выполнен 500 раз, соответственно будет выведено 500 значений. |
Эти значения понадобятся на следующем уроке при калибровке магнитометра. | Эти значения понадобятся на следующем уроке при калибровке магнитометра. | ||