-
Notifications
You must be signed in to change notification settings - Fork 7
Software
На данный момент для полета необходимы 3 устройства: arduino на квадрокоптере, компьютер с Bluetooth и arduino для джойстика. Джойстик подключается к компьютеру через USB, программа пересылает данные с джойстика на квадрокоптер через Bluetooth и запрашивает состояние.
Используется подход Arduino (выполнение операций в бесконечном цикле loop()), в дальнейшем планируется использование таймеров и прерываний от UART для лучшего распределения времени. Коммуникация с компьютером осуществляется через последовательный порт (Serial) на скорости 115200.
Создает объект класса Quadrocopter в setup() и вызывает метод iteration() в loop().
Код, рассчитывающий силы и моменты, используя данные с сенсоров и настройки, полученные с компьютера. Содержит объекты классов:
- Accelerometer и Gyroscope, реализующие получение данных с сенсоров в СИ
- MotorController (помогает управлять двигателями при помощи силы и двух моментов, т. е. абстрагируясь от мощностей моторов)
- MySerial (реализует буфер для отправляемых байт)
- TimerCount (позволяет вычислять время между итерациями)
- accelData, angularVelocity — откорректированные (см. ниже) данные с акселерометра и гироскопа в единицах СИ
- angularAcceleration — угловое ускорение (получается делением разности угловых скоростей на Δt).
- angular_velocity_max_correction, angle_max_correction — максимальный модуль соответствующей коррекции.
- angle содержит два угла поворота системы координат, связанной с квадрокоптером относительно g.
- anglePeriod — значение RC для RC-фильтра, который используется для получения угла (angle).
- angularVelocityPeriod — значение RC для RC-фильтра для угловой скорости.
- reactionType — тип реакции на воздействия
- gyroToAcc — расстояние в метрах от центра (где расположен гироскоп) до акселерометра. Используется для внесения небольших поправок в показания акселерометра, связанные с тем, что ускоренное вращение создает соответствующее линейное ускорение (которое рассчитывается и вычитается из показаний акселерометра).
- processSensorsData: производится запрос данных с датчиков, рассчитывается угол.
- processCorrection: находится соответствующая параметру reactionType коррекция.
- processSerialRx: выполняется реакция на входящие команды.
- processMotors: устанавливаются новые сила и моменты.
- processSerialTx: в случае наличия соответствующего запроса о состоянии производится ответ на него.
Макросы DEBUG_* используются для включения/выключения режимов отладки:
- DEBUG_NO_MOTORS отключает задержку в несколько секунд перед включением. Удобно для отладки кода (без моторов)
- DEBUG_NO_GYROSCOPE отключает запрос данных с гироскопа (возвращаемое значение — (0, 0, 0))
- DEBUG_NO_ACCELEROMETER отключает запрос данных с акселлерометра (возвращаемое значение — (0, 0, 0))
- DEBUG_NO_SERIAL выключает последовательный порт
Структура RVector3D реализует трехмерный вектор (часто используется в коде для представления только двух или трех чисел):
struct RVector3D { double x, y, z; };Поддерживает некоторые векторные операции.
Позволяет управлять одним мотором при помощи числа от 0 до 1.
Содержащит алгоритм инициализации моторов и методы управления ими. Имеет конструктор вида
MotorController(const int motor_control_pins[N_MOTORS]);где N_MOTORS (= 4) — число двигателей в модели
motor_control_pins — массив номеров выводов Arduino, к которым подключены контроллеры двигателей. Выводы должны поддерживать ШИМ (PWM, '~').
Управление моторами осуществляется посредством методов setTorque(RVector3D) и setForce(double).