Здесь показаны различия между двумя версиями данной страницы.
lesson8 [2019/05/14 11:30] golikov [Сбор значений для калибровки солнечных датчиков] |
lesson8 [2020/03/25 16:28] |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ====== 08 Урок. Знакомство с солнечными датчиками ====== | ||
- | ===== Знакомство с датчиком освещенности смартфона ===== | ||
- | Установите в смартфон приложение Andro sensor или аналогичное приложение с выводом на экран информации со встроенных датчиков смартфона. | ||
- | Запустите приложение и найдите датчик освещенности под названием LIGHT. | ||
- | |||
- | {{::08image001.png?nolink&400|}} | ||
- | |||
- | Освещенность изменяется в люксах (lux), один люкс – это равен освещённости поверхности площадью 1 м² при световом потоке падающего на неё излучения, равном 1 люмен. Соответственно, выполнятся: 1 лк = 1 лм/м2. | ||
- | |||
- | {{::08image003.png?nolink&200|}} | ||
- | |||
- | Один люмен равен световому потоку, испускаемому точечным источником, c силой света, равной одной канделе, в телесный угол величиной в один стерадиан. | ||
- | |||
- | {{::08image004.png?nolink&200|}} | ||
- | |||
- | Полный световой поток, создаваемый точечным источником, с силой света одна кандела, равен 4π люменам. | ||
- | Кандела – это сила света, энергетическая сила которого составляет 1/683 Вт/стерадиан. | ||
- | Сила света, излучаемого парафиновой свечой, близка к одной канделе. | ||
- | |||
- | {{::08image006.jpg?nolink&100|}} | ||
- | |||
- | Требования к освещению на рабочих местах, оборудованных ПЭВМ согласно СанПиН 2.2.2/2.4.1340-03: | ||
- | Освещенность на рабочем столе: 300-500 лк | ||
- | Освещенность на экране ПЭВМ: не выше 300лк | ||
- | |||
- | ===== Проверка работоспособности солнечных датчиков ===== | ||
- | |||
- | Соедините БКУ с СЭП и четырьмя солнечными датчиками. | ||
- | Загрузите в БКУ следующую программу, которая выведет значения, считанные с солнечных датчиков. | ||
- | |||
- | Код на Python. | ||
- | <file python sun_test.py> | ||
- | |||
- | def control(): # Основная функция программы, в которой нужно вызывать остальные функции | ||
- | sun_result = [0,0,0] # Инициализируем sun_result | ||
- | num = 1 | ||
- | print "Enable sun sensor №", num | ||
- | sun_sensor_turn_on(num) | ||
- | sleep(1) | ||
- | print "Get RAW data from sun sensor" | ||
- | |||
- | for i in range(10): | ||
- | sun_result = sun_sensor_request_raw(num) | ||
- | |||
- | if not sun_result[0]: # если датчик вернул сообщение об ошибке, | ||
- | |||
- | print "state:", sun_result[0], "raw =", sun_result[1], \ | ||
- | sun_result[2] | ||
- | |||
- | elif sun_result[0] == 1: | ||
- | print "Fail because of access error, check the connection" | ||
- | |||
- | elif sun_result[0] == 2: | ||
- | print "Fail because of interface error, check your code" | ||
- | |||
- | sleep(1) | ||
- | |||
- | print "Disable sun sensor №", num | ||
- | sun_sensor_turn_off(num) | ||
- | </file> | ||
- | |||
- | Код на С. | ||
- | <file c sun_test.c> | ||
- | #include <stdio.h> | ||
- | #include <stdint.h> | ||
- | #include "libschsat.h" | ||
- | #define LSS_OK 0 | ||
- | #define LSS_ERROR 1 | ||
- | #define LSS_BREAK 2 | ||
- | |||
- | int control(){ //Основная функция программы | ||
- | uint16_t sun_result[] = {0, 0, 0}; // инициализируем sun_result | ||
- | uint16_t num = 1; // номер солнечного датчика | ||
- | printf("Enable sun sensor №%d\n", num); | ||
- | sun_sensor_turn_on(num); //включаем датчик | ||
- | Sleep(1); //Ждем включения 1 секунду | ||
- | printf("Get RAW data from sun sensor №%d\n", num); | ||
- | int i; | ||
- | for (i = 0; i < 10; i++) //считываем показаия 10 раз | ||
- | { | ||
- | sun_result[0] = sun_sensor_request_raw(num,& sun_result[1],& sun_result[2]);/*проверить как работает, очень странно, что работает | ||
- | если не работает задать sun_result[0] */ | ||
- | if (!sun_result[0]){ //если датчик не вернул сообщение об ошибке, | ||
- | printf("state: %d raw = %d, %d\n", i, sun_result[1], sun_result[2]); | ||
- | } | ||
- | |||
- | else if (sun_result[0] == 1) { //если датчик вернул сообщение об ошибке 1 | ||
- | printf("Fail because of access error, check the connection\n"); | ||
- | } | ||
- | else if (sun_result[0] == 2) { //если датчик вернул сообщение об ошибке 2 | ||
- | printf("Fail because of interface error, check you code\n"); | ||
- | } | ||
- | Sleep(1); //показания считываются раз в секунду | ||
- | |||
- | } | ||
- | printf("Disable sun sensor №%d\n", num); | ||
- | sun_sensor_turn_off(num); //выключаем солнечный датчик | ||
- | return 0; | ||
- | } | ||
- | </file> | ||
- | |||
- | Запустите программу, при комнатном освещении значения датчиков будут находится в диапазоне от 70 до 300. | ||
- | Направьте на датчики свет от имитатора солнца – теперь значения будут изменяться от 70 до 20000. | ||
- | |||
- | ===== Сбор значений для калибровки солнечных датчиков ===== | ||
- | Установите на верхнюю панель Орбикрафт ДУС и магнитометр, и 4 солнечных датчика на 4 стороны Орбикрафта. Солнечные датчики установите перевернутыми, чтобы шлейфы не закрывали окно датчика. | ||
- | |||
- | {{::08image008.png?nolink&200|}} | ||
- | |||
- | Загрузите в БКУ следующую программу. | ||
- | |||
- | Код на Python. | ||
- | <file python sun_raw.py> | ||
- | |||
- | import time | ||
- | import math | ||
- | #!/usr/bin/env python | ||
- | # -*- coding: utf-8 -*- | ||
- | # Коэффициент дифференциальной обратной связи. | ||
- | # Коэффициент подбирается экспериментально в зависимости от формы | ||
- | # и массы вашего спутника. | ||
- | kd = 200.0 | ||
- | # Временной шаг работы алгоритма, с | ||
- | time_step = 0.05 | ||
- | # Целевая угловая скорость спутника, град/с. | ||
- | # Для режима стабилизации равна 0.0. | ||
- | omega_goal = 0.0 | ||
- | # Максимально допустимая скорость маховика, об/мин | ||
- | mtr_max_speed = 5000 | ||
- | # Номер маховика | ||
- | mtr_num = 1 | ||
- | # Номер ДУС (датчика угловой скорости) | ||
- | hyr_num = 1 | ||
- | # Номер магнитометра | ||
- | mag_num = 1 | ||
- | # Номер результата измерений | ||
- | i = 1 | ||
- | # Угол поворота текущий | ||
- | alpha = 0.0 | ||
- | |||
- | # Функция включает все приборы, | ||
- | # которые будут использоваться в основной программе. | ||
- | def initialize_all(): | ||
- | print "Enable angular velocity sensor №", hyr_num | ||
- | hyro_turn_on(hyr_num) | ||
- | sleep(1) | ||
- | print "Enable magnetometer", mag_num | ||
- | magnetometer_turn_on(mag_num) | ||
- | sleep(1) # Ждем включения 1 секунду | ||
- | print "Enable Sun sensors 1-4" | ||
- | sun_sensor_turn_on(1) | ||
- | sun_sensor_turn_on(2) | ||
- | sun_sensor_turn_on(3) | ||
- | sun_sensor_turn_on(4) | ||
- | sleep(1) | ||
- | print "Enable motor №", mtr_num | ||
- | motor_turn_on(mtr_num) | ||
- | sleep(1) | ||
- | |||
- | # Функция отключает все приборы, | ||
- | # которые будут использоваться в основной программе. | ||
- | def switch_off_all(): | ||
- | print "Finishing..." | ||
- | hyro_turn_off(hyr_num) | ||
- | magnetometer_turn_off(mag_num) | ||
- | sun_sensor_turn_off(1) | ||
- | sun_sensor_turn_off(2) | ||
- | sun_sensor_turn_off(3) | ||
- | sun_sensor_turn_off(4) | ||
- | motor_set_speed(mtr_num, 0) | ||
- | sleep(1) | ||
- | motor_turn_off(mtr_num) | ||
- | print "Finish program" | ||
- | |||
- | def mag_calibrated(magx,magy,magz): | ||
- | # вместо этих 3-х строк кода с коэффициентами калибровки, должны быть строки с коэффициентами калибровки для Вашего магнитометра | ||
- | #magx_cal = 1.04*magx - 0.26*magy + 0.05*magz - 68.76 # это 1-я строчка, которую нужно заменить по результатам калибровки Вашего магнитометра | ||
- | #magy_cal = 0.24*magx + 1.04*magy + 0.29*magz + 256.92 # это 2-я строчка, которую нужно заменить по результатам калибровки Вашего магнитометра | ||
- | #magz_cal = -0.09*magx - 0.19*magy + 0.77*magz + 159.41 # это 3-я строчка, которую нужно заменить по результатам калибровки Вашего магнитометра | ||
- | 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 | ||
- | |||
- | # Функции для определение новой скорости маховика. | ||
- | # Новая скорость маховика складывается из | ||
- | # текущей скорости маховика и приращения скорости. | ||
- | # Приращение скорости пропорционально ошибке по углу | ||
- | # и ошибке по угловой скорости. | ||
- | # mtr_speed - текущая угловая скорость маховика, об/мин | ||
- | # omega - текущая угловая скорость спутника, град/с | ||
- | # omega_goal - целевая угловая скорость спутника, град/с | ||
- | # mtr_new_speed - требуемая угловая скорость маховика, об/мин | ||
- | def motor_new_speed_PD(mtr_speed, omega, omega_goal): | ||
- | mtr_new_speed = int(mtr_speed | ||
- | + kd*(omega-omega_goal) | ||
- | ) | ||
- | if mtr_new_speed > mtr_max_speed: | ||
- | mtr_new_speed = mtr_max_speed | ||
- | elif mtr_new_speed < -mtr_max_speed: | ||
- | mtr_new_speed = -mtr_max_speed | ||
- | return mtr_new_speed | ||
- | |||
- | # Основная функция программы, в которой вызываются остальные функции. | ||
- | def control(): | ||
- | omega_goal = 0 # omega_goal - целевая угловая скорость спутника, град/с | ||
- | initialize_all() | ||
- | # Инициализируем статус маховика | ||
- | mtr_state = 0 | ||
- | # Инициализируем статус ДУС | ||
- | hyro_state = 0 | ||
- | sun_sensor_num = 0 # Инициализируем переменную для номера солнечного датчика | ||
- | sun_result_1 = [0,0,0] # Инициализируем sun_result_1 | ||
- | sun_result_2 = [0,0,0] # Инициализируем sun_result_2 | ||
- | sun_result_3 = [0,0,0] # Инициализируем sun_result_3 | ||
- | sun_result_4 = [0,0,0] # Инициализируем sun_result_4 | ||
- | mag_alpha = 0 | ||
- | |||
- | output_data_all = [0, 0, 0, 0, 0, 0, 0, 0, 0] | ||
- | output_data = [0, 0, 0, 0, 0, 0, 0, 0, 0] | ||
- | # Номер результата измерений | ||
- | i = 0 | ||
- | # Запоминаем время начала вращения | ||
- | time_start = time.time() | ||
- | # Запоминаем время начала секундного интервала | ||
- | time_interval = time.time() | ||
- | # Интервал вывода данных с солнечных датчиков в секундах | ||
- | time_output = 0.1 | ||
- | |||
- | while True: | ||
- | |||
- | # Опрос датчика угловой скорости и маховика. | ||
- | hyro_state, gx_raw, gy_raw, gz_raw = hyro_request_raw(hyr_num) | ||
- | mtr_state, mtr_speed = motor_request_speed(mtr_num) | ||
- | mag_state, magx_raw, magy_raw, magz_raw = magnetometer_request_raw(mag_num) | ||
- | |||
- | # Обработка показаний датчика угловой скорости, | ||
- | # вычисление угловой скорости спутника по показаниям ДУС. | ||
- | # Если код ошибки ДУС равен 0, т.е. ошибки нет | ||
- | if not hyro_state: | ||
- | gx_degs = gx_raw * 0.00875 | ||
- | gy_degs = gy_raw * 0.00875 | ||
- | gz_degs = gz_raw * 0.00875 | ||
- | # если ДУС установлен осью z вверх, то угловая скорость | ||
- | # спутника совпадает с показаниями ДУС по оси z, иначе | ||
- | # необходимо изменить знак: omega = - gz_degs | ||
- | omega = gz_degs | ||
- | elif hyro_state == 1: | ||
- | print "Fail because of access error, check the connection" | ||
- | elif hyro_state == 2: | ||
- | print "Fail because of interface error, check your code" | ||
- | |||
- | #Обработка показаний маховика и установка трубемой угловой скорости. | ||
- | if not mtr_state: # если код ошибки 0, т.е. ошибки нет | ||
- | # установка новой скорости маховика | ||
- | mtr_new_speed = motor_new_speed_PD(mtr_speed,omega,omega_goal) | ||
- | motor_set_speed(mtr_num, mtr_new_speed) | ||
- | |||
- | time.sleep(time_step) | ||
- | time_current = time.time() - time_start | ||
- | if not mag_state: # если магнитометр вернул код ошибки 0, т.е. ошибки нет | ||
- | magx_cal, magy_cal, magz_cal = mag_calibrated(magx_raw,magy_raw,magz_raw) | ||
- | magy_cal = - magy_cal # переходим из левой системы координат, которая изображена на магнитометре в правую, для того чтобы положительное направление угла было против часовой стрелки | ||
- | mag_alpha = math.atan2(magy_cal, magx_cal)/math.pi*180 | ||
- | |||
- | if (time.time() - time_interval) > time_output: | ||
- | # Запоминаем время начала следующего секундного интервала | ||
- | time_interval = time.time() | ||
- | sun_result_1 = sun_sensor_request_raw(1) | ||
- | sun_result_2 = sun_sensor_request_raw(2) | ||
- | sun_result_3 = sun_sensor_request_raw(3) | ||
- | sun_result_4 = sun_sensor_request_raw(4) | ||
- | #print sun_result_1, sun_result_2, sun_result_3, sun_result_4, mag_alpha, time_current | ||
- | |||
- | output_data = [time_current, sun_result_1[1], sun_result_1[2], sun_result_2[1], sun_result_2[2], sun_result_3[1], sun_result_3[2], sun_result_4[1], sun_result_4[2], mag_alpha] | ||
- | output_data_all += output_data | ||
- | |||
- | if i > 100: # Начинаем вращение через 5с после запуска | ||
- | omega_goal = 6.0 # omega_goal - целевая угловая скорость спутника, град/с | ||
- | |||
- | if time_current > 90: | ||
- | break | ||
- | |||
- | i += 1 | ||
- | |||
- | switch_off_all() | ||
- | |||
- | print "time_end = " , time.time() - time_start | ||
- | |||
- | for i in range(0, 5000, 10): | ||
- | print output_data_all[i-1], output_data_all[i], output_data_all[i+1], output_data_all[i+2], output_data_all[i+3], output_data_all[i+4], output_data_all[i+5], output_data_all[i+6], output_data_all[i+7], output_data_all[i+8] | ||
- | |||
- | </file> | ||
- | |||
- | Код на С. | ||
- | <file c sun_raw.c> | ||
- | #include <stdio.h> | ||
- | #include <stdint.h> | ||
- | #include "libschsat.h" | ||
- | #define LSS_OK 0 | ||
- | #define LSS_ERROR 1 | ||
- | #define LSS_BREAK 2 | ||
- | #include <math.h> | ||
- | #include <time.h> | ||
- | |||
- | /*Коэффициент дифференциальной обратной связи. | ||
- | Коэффициент положительный, если маховик расположен осью z вверх | ||
- | и ДУС расположен осью z также вверх. | ||
- | Коэффициент подбирается экспериментально в зависимости от формы | ||
- | и массы вашего спутника.*/ | ||
- | const float kd = 200.0; | ||
- | |||
- | // Временной шаг работы алгоритма, с | ||
- | const float time_step = 0.1; | ||
- | |||
- | /* Целевая угловая скорость спутника, град/с. Для режима стабилизации равна 0.0.*/ | ||
- | const float omega_goal = 0.0; | ||
- | // Максимально допустимая скорость маховика, об/мин | ||
- | const int mtr_max_speed = 5000; | ||
- | const uint16_t mtr_num = 1; // Номер маховика | ||
- | const uint16_t hyr_num = 1; // Номер ДУС | ||
- | const uint16_t mag_num = 1; // Номер магнитометра | ||
- | // Номер результата измерений | ||
- | int i = 1; | ||
- | // Угол поворота текущий | ||
- | const float alpha = 0.0; | ||
- | |||
- | |||
- | |||
- | void initialize_all(void){/* Функция включает все приборы, | ||
- | которые будут использоваться в основной программе.*/ | ||
- | printf("Enable angular velocity sensor №%d\n", hyr_num); | ||
- | hyro_turn_on(hyr_num); | ||
- | Sleep(1); | ||
- | printf("Enable magnetometer %d\n", mag_num); | ||
- | magnetometer_turn_on(mag_num); | ||
- | Sleep(1); // Ждем включения 1 секунду | ||
- | printf("Enable Sun sensors 1-4\n"); | ||
- | sun_sensor_turn_on(1); | ||
- | sun_sensor_turn_on(2); | ||
- | sun_sensor_turn_on(3); | ||
- | sun_sensor_turn_on(4); | ||
- | Sleep(1); | ||
- | printf("Enable motor №%d\n", mtr_num); | ||
- | motor_turn_on(mtr_num); | ||
- | Sleep(1); | ||
- | } | ||
- | |||
- | void switch_off_all(void){/* Функция отключает все приборы, | ||
- | которые будут использоваться в основной программе.*/ | ||
- | printf("Finishing..."); | ||
- | int16_t new_speed = 0; | ||
- | hyro_turn_off(hyr_num); | ||
- | magnetometer_turn_off(mag_num); | ||
- | sun_sensor_turn_off(1); | ||
- | sun_sensor_turn_off(2); | ||
- | sun_sensor_turn_off(3); | ||
- | sun_sensor_turn_off(4); | ||
- | motor_set_speed(mtr_num, 0, &new_speed); | ||
- | Sleep(1); | ||
- | motor_turn_off(mtr_num); | ||
- | printf("\nFinish program\n"); | ||
- | } | ||
- | |||
- | int mag_calibrated(int16_t *magx, int16_t *magy, int16_t *magz ){ | ||
- | /*Функция mag_calibrated вносит поправки | ||
- | в показания магнитометра с учетом калибровочных коэффициентов | ||
- | вместо этих 3-х строк кода с коэффициентами калибровки, должны быть строки с коэффициентами калибровки для Вашего магнитометра | ||
- | //magx_cal = 1.04*magx - 0.26*magy + 0.05*magz - 68.76 # это 1-я строчка, которую нужно заменить по результатам калибровки Вашего магнитометра | ||
- | //magy_cal = 0.24*magx + 1.04*magy + 0.29*magz + 256.92 # это 2-я строчка, которую нужно заменить по результатам калибровки Вашего магнитометра | ||
- | //magz_cal = -0.09*magx - 0.19*magy + 0.77*magz + 159.41 # это 3-я строчка, которую нужно заменить по результатам калибровки Вашего магнитометра*/ | ||
- | float magx_cal; | ||
- | float magy_cal; | ||
- | float magz_cal; | ||
- | 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); | ||
- | *magx = magx_cal; | ||
- | *magy = magy_cal; | ||
- | *magz = magz_cal; | ||
- | return 0; | ||
- | } | ||
- | |||
- | int motor_new_speed_PD(int mtr_speed, float omega, int16_t omega_goal){ | ||
- | /* Функция для определения новой скорости маховика. | ||
- | Новая скорость маховика складывается из | ||
- | текущей скорости маховика и приращения скорости. | ||
- | Приращение скорости пропорционально ошибке по углу и ошибке по угловой скорости. | ||
- | mtr_speed - текущая угловая скорость маховика, об/мин | ||
- | omega - текущая угловая скорость спутника, град/с | ||
- | omega_goal - целевая угловая скорость спутника, град/с | ||
- | mtr_new_speed - требуемая угловая скорость маховика, об/мин*/ | ||
- | int16_t mtr_new_speed; | ||
- | mtr_new_speed = (int)(mtr_speed + kd * (omega - omega_goal)); | ||
- | if (mtr_new_speed > mtr_max_speed) | ||
- | { | ||
- | mtr_new_speed = mtr_max_speed; | ||
- | } | ||
- | else if (mtr_new_speed < -mtr_max_speed) | ||
- | { | ||
- | mtr_new_speed = -mtr_max_speed; | ||
- | } | ||
- | return mtr_new_speed; | ||
- | } | ||
- | |||
- | int control(){// Основная функция программы, в которой вызываются остальные функции. | ||
- | int16_t omega; | ||
- | int omega_goal = 0; // omega_goal - целевая угловая скорость спутника, град/с | ||
- | initialize_all(); | ||
- | int mtr_state = 0; // Инициализируем статус маховика | ||
- | int hyro_state = 0; // Инициализируем статус ДУС | ||
- | int mag_state = 0; // Инициализируем статус магнитометра | ||
- | int16_t mtr_speed; | ||
- | int16_t mtr_new_speed; | ||
- | //данные ДУС | ||
- | int16_t gx_raw; | ||
- | int16_t gy_raw; | ||
- | int16_t gz_raw; | ||
- | int16_t *hyrox_raw=&gx_raw; | ||
- | int16_t *hyroy_raw= &gy_raw; | ||
- | int16_t *hyroz_raw = &gz_raw; | ||
- | //данные магнитометра | ||
- | int16_t mgx_cal=0; | ||
- | int16_t mgy_cal=0; | ||
- | int16_t mgz_cal=0; | ||
- | int16_t *magx_raw = &mgx_cal; | ||
- | int16_t *magy_raw = &mgy_cal; | ||
- | int16_t *magz_raw = &mgz_cal; | ||
- | |||
- | float gx_degs; | ||
- | float gy_degs; | ||
- | float gz_degs; | ||
- | uint16_t sun_result_1[] = {0,0,0}; // Инициализируем sun_result_1 | ||
- | uint16_t sun_result_2[] = {0,0,0}; // Инициализируем sun_result_2 | ||
- | uint16_t sun_result_3[] = {0,0,0}; // Инициализируем sun_result_3 | ||
- | uint16_t sun_result_4[] = {0,0,0}; // Инициализируем sun_result_4 | ||
- | int mag_alpha = 0; | ||
- | const int sizeOD = 10; | ||
- | int sizeODA = 0; | ||
- | int tempSODA; | ||
- | // double* output_data = (double*)calloc(sizeOD, sizeof(double)); | ||
- | double* output_data_all = (double*)calloc(sizeODA, sizeof(double)); | ||
- | |||
- | // Номер результата измерений | ||
- | int i = 0; | ||
- | // Запоминаем время начала вращения | ||
- | long int time_start = time(NULL); | ||
- | // Запоминаем время начала секундного интервала | ||
- | long int time_interval = time(NULL); | ||
- | // Интервал вывода данных с солнечных датчиков в секундах | ||
- | int time_output = 0.1; | ||
- | int j; | ||
- | char a=1; | ||
- | |||
- | while (a==1){ | ||
- | // Опрос датчика угловой скорости и маховика. | ||
- | hyro_state = hyro_request_raw(hyr_num,hyrox_raw,hyroy_raw,hyroz_raw); | ||
- | mtr_state = motor_request_speed(mtr_num, &mtr_speed); | ||
- | mag_state = magnetometer_request_raw(mag_num, magx_raw, magy_raw, magz_raw); | ||
- | |||
- | |||
- | if (!hyro_state){ | ||
- | /*Обработка показаний датчика угловой скорости, | ||
- | вычисление угловой скорости спутника по показаниям ДУС. | ||
- | Если код ошибки ДУС равен 0, т.е. ошибки нет*/ | ||
- | gx_degs = gx_raw * 0.00875; | ||
- | gy_degs = gy_raw * 0.00875; | ||
- | gz_degs = gz_raw * 0.00875; | ||
- | /* если ДУС установлен осью z вверх, то угловая скорость | ||
- | спутника совпадает с показаниями ДУС по оси z, иначе | ||
- | необходимо изменить знак: omega = - gz_degs*/ | ||
- | omega = gz_degs; | ||
- | // printf("gx_degs=%f, gy_degs=%f, gz_degs=%f\n", gx_degs, gy_degs, gz_degs);//ну так на всякий | ||
- | } | ||
- | else if (hyro_state == 1){ | ||
- | printf("Fail because of access error, check the connection\n"); | ||
- | } | ||
- | else if (hyro_state == 2) { | ||
- | printf("Fail because of interface error, check your code\n"); | ||
- | } | ||
- | |||
- | |||
- | //Обработка показаний маховика и установка требуемой угловой скорости. | ||
- | if (!mtr_state) {// если код ошибки 0, т.е. ошибки нет | ||
- | int16_t mtr_speed=0; | ||
- | motor_request_speed(mtr_num, &mtr_speed); | ||
- | // printf("Motor_speed: %d\n", mtr_speed); | ||
- | // установка новой скорости маховика | ||
- | mtr_new_speed = motor_new_speed_PD(mtr_speed,omega,omega_goal); | ||
- | motor_set_speed(mtr_num, mtr_new_speed, &omega); | ||
- | } | ||
- | |||
- | Sleep(time_step); | ||
- | long int time_current = time(NULL) - time_start; | ||
- | |||
- | if (!mag_state){ | ||
- | mag_calibrated(magx_raw,magy_raw,magz_raw); | ||
- | *magy_raw = - *magy_raw; /*переходим из левой системы координат, | ||
- | которая изображена на магнитометре в правую, для того чтобы | ||
- | положительное направление угла было против часовой стрелки*/ | ||
- | mag_alpha = atan2(mgy_cal, mgx_cal)/M_PI*180; | ||
- | } | ||
- | |||
- | if ((time(NULL) - time_interval) > time_output){ | ||
- | // Запоминаем время начала следующего секундного интервала | ||
- | time_interval = time(NULL); | ||
- | sun_result_1[0] = sun_sensor_request_raw(1, &sun_result_1[1],&sun_result_1[2]); | ||
- | sun_result_2[0] = sun_sensor_request_raw(2,&sun_result_2[1],&sun_result_2[2]); | ||
- | sun_result_3[0] = sun_sensor_request_raw(3,&sun_result_3[1],&sun_result_3[2]); | ||
- | sun_result_4[0] = sun_sensor_request_raw(4,&sun_result_4[1],&sun_result_4[2]); | ||
- | |||
- | int output_data[] = {time_current, sun_result_1[1], sun_result_1[2], sun_result_2[1], sun_result_2[2], sun_result_3[1], sun_result_3[2], sun_result_4[1], sun_result_4[2], mag_alpha}; | ||
- | tempSODA = sizeODA; | ||
- | sizeODA += sizeOD; | ||
- | output_data_all = (double*)realloc(output_data_all, sizeODA*sizeof(double)); | ||
- | for (j=tempSODA; j<sizeODA; j++) { | ||
- | output_data_all[j] = output_data[j-sizeODA+1]; | ||
- | } | ||
- | } | ||
- | if (i > 100){ // Начинаем вращение через 5с после запуска | ||
- | omega_goal = 6.0; // omega_goal - целевая угловая скорость спутника, град/с | ||
- | } | ||
- | |||
- | if (time_current > 90){ | ||
- | break; | ||
- | } | ||
- | i += 1; | ||
- | } | ||
- | |||
- | switch_off_all(); | ||
- | |||
- | printf("time_end = %ld" , time(NULL) - time_start); | ||
- | |||
- | for (i = 0; i < 5000; i = i + 10){ | ||
- | printf("%f, %f, %f, %f, %f, %f, %f, %f, %f, %f\n",output_data_all[i], output_data_all[i+1], output_data_all[i+2], output_data_all[i+3], output_data_all[i+4], output_data_all[i+5], output_data_all[i+6], output_data_all[i+7], output_data_all[i+8], output_data_all[i+9]); | ||
- | } | ||
- | printf ("Ok\n"); | ||
- | return 0; | ||
- | } | ||
- | </file> | ||
- | |||
- | |||
- | По результатам работы программы будут выведены 500 строк с данными следующего вида: | ||
- | <code python> | ||
- | onmessage0.132400989532 74 117 27 25 156 214 156 61 -34.6566118491 | ||
- | onmessage0.281419992447 74 116 27 25 156 215 156 61 -34.555539497 | ||
- | onmessage0.438189029694 74 116 27 25 156 214 156 61 -33.6820711721 | ||
- | onmessage0.585952043533 74 116 27 25 156 215 156 61 -34.6566118491 | ||
- | onmessage0.733724832535 74 116 27 25 156 214 156 61 -33.6705914701 | ||
- | onmessage0.88149189949 74 117 27 25 156 214 156 61 -33.7733709383 | ||
- | onmessage1.02926301956 74 117 27 25 156 214 156 61 -33.6745869595 | ||
- | onmessage1.1782848835 74 117 27 25 156 214 156 61 -33.4062495287 | ||
- | onmessage1.32730197906 74 117 27 25 156 214 156 61 -33.2488503276 | ||
- | onmessage1.47507381439 74 117 27 25 156 214 156 61 -33.8923918648 | ||
- | </code> | ||
- | |||
- | Где первое значение - время с начала измерений, два следующих – данные с первого солнечного датчика, следующие два значения со второго солнечного датчика, следующие два с третьего и с четвертого. Десятое значение – показания магнетометра (угол поворота Орбикрафт относительно направления на магнитный полюс). | ||
- | Для анализа полученных данных следует скопировать их из браузера (выбрав с помощью Ctrl-A и скопировав с помощью Ctrl-С) и сохранить в новом текстовом документе в Notepad++ (вставка с помощью (Ctrl-V). Затем следует очистить их от служебной информации в начале и в конце файла. | ||
- | Часто встречающееся служебное слово onmessage следует удалить с помощью функции замены Notepad++. Нажмите на клавиатуре Ctrl-H, введите в поле «Найти» onmessage, поле «Заменить на» оставьте пустым и нажмите на «Заменить все» или «Заменить во всех открытых документах». | ||
- | |||
- | {{::08image009.png?nolink&600|}} | ||
- | |||
- | Сохраните очищенный документ в txt файле. Теперь его можно проанализировать в Excel. | ||
- | |||