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

Инструменты сайта


lesson5

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
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 значений.
 Эти значения понадобятся на следующем уроке при калибровке магнитометра. Эти значения понадобятся на следующем уроке при калибровке магнитометра.
  
  
  
lesson5.txt · Последние изменения: 2020/03/25 16:28 (внешнее изменение)

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