Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
lesson5 [2019/05/14 10:54] golikov [Получение азимута с магнитометра] |
lesson5 [2020/02/27 15:58] golikov |
||
---|---|---|---|
Строка 113: | Строка 113: | ||
print "Enable magnetometer", mag_num | print "Enable magnetometer", mag_num | ||
magnetometer_turn_on(mag_num) | magnetometer_turn_on(mag_num) | ||
- | sleep(1) | + | sleep(10) |
mag_state = 0 # Инициализируем статус магнитометра | mag_state = 0 # Инициализируем статус магнитометра | ||
alpha_goal = 0 # Целевой угол | alpha_goal = 0 # Целевой угол | ||
omega_goal = 0 # Целевая угловая скорость | omega_goal = 0 # Целевая угловая скорость | ||
- | for i in range(60): | + | for i in range(12): |
mag_state, magx_raw, magy_raw, magz_raw = magnetometer_request_raw(mag_num) # опрос магнитометра | mag_state, magx_raw, magy_raw, magz_raw = magnetometer_request_raw(mag_num) # опрос магнитометра | ||
if not mag_state: # если код ошибки 0, то ошибки нет | if not mag_state: # если код ошибки 0, то ошибки нет | ||
Строка 144: | Строка 144: | ||
#include <math.h> | #include <math.h> | ||
void control(void){ | void control(void){ | ||
- | int time_step = 1; | + | int time_step = 10; |
uint16_t mag_num = 1; | uint16_t mag_num = 1; | ||
printf("Enable magnetometer %d\n", mag_num); | printf("Enable magnetometer %d\n", mag_num); | ||
Строка 158: | Строка 158: | ||
int16_t *pRAW_dataZ = &p_dataZ; | int16_t *pRAW_dataZ = &p_dataZ; | ||
int i; | int i; | ||
- | for (i = 0; i < 60; i++){ | + | for (i = 0; i < 12; i++){ |
mag_state = magnetometer_request_raw(mag_num, pRAW_dataX, pRAW_dataY, pRAW_dataZ); | mag_state = magnetometer_request_raw(mag_num, pRAW_dataX, pRAW_dataY, pRAW_dataZ); | ||
float mag_alpha; | float mag_alpha; | ||
Строка 232: | Строка 232: | ||
Теперь очень хорошо видно, что значения далеки от идеального 12 угольника радиусом 30. | Теперь очень хорошо видно, что значения далеки от идеального 12 угольника радиусом 30. | ||
+ | |||
+ | |||
+ | {{:2_1.gif?direct|}} | ||
==== Анализ данных с помощью функций ==== | ==== Анализ данных с помощью функций ==== | ||
Строка 265: | Строка 268: | ||
По умолчанию магнитометр не откалиброван, т.е. выдает неточные значения. Уточненные значения можно получить из сырых данных путем калибровки, которая заключается в нахождении матрицы преобразования и вектора смещения. Сырые данные с магнитометра можно получить, выполнив код на языке Python, представленный ниже. Во время сбора данных магнитометр необходимо хаотично вращать, стараясь повернуть его во все возможные стороны. | По умолчанию магнитометр не откалиброван, т.е. выдает неточные значения. Уточненные значения можно получить из сырых данных путем калибровки, которая заключается в нахождении матрицы преобразования и вектора смещения. Сырые данные с магнитометра можно получить, выполнив код на языке Python, представленный ниже. Во время сбора данных магнитометр необходимо хаотично вращать, стараясь повернуть его во все возможные стороны. | ||
- | <code python> | + | Код на Python. |
+ | <file python raw_data.py> | ||
def control(): #Основная программы, в которой вызываем остальные функции | def control(): #Основная программы, в которой вызываем остальные функции | ||
Строка 278: | Строка 282: | ||
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: | Строка 324: | ||
Поэтому считанные данные мы помещаем в список 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 значений. |
Эти значения понадобятся на следующем уроке при калибровке магнитометра. | Эти значения понадобятся на следующем уроке при калибровке магнитометра. | ||