Skip to content
etoestja edited this page Sep 29, 2012 · 14 revisions

На данный момент для полета необходимы 3 устройства: arduino на квадрокоптере, компьютер с Bluetooth и arduino для джойстика. Джойстик подключается к компьютеру через USB, программа пересылает данные с джойстика на квадрокоптер через Bluetooth и запрашивает состояние.

Table of Contents

Код для квадрокоптера

Используется подход Arduino (выполнение операций в бесконечном цикле loop()), в дальнейшем планируется использование таймеров и прерываний от UART для лучшего распределения времени. Коммуникация с компьютером осуществляется через последовательный порт (Serial) на скорости 115200.

auto_controlled_engine_set.ino (основной файл проекта для Arduino)

Создает объект класса Quadrocopter в setup() и вызывает метод iteration() в loop().

Quadrocopter.h (класс Quadrocopter)

Код, рассчитывающий силы и моменты, используя данные с сенсоров и настройки, полученные с компьютера. Содержит объекты классов:

  • 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 — расстояние в метрах от центра (где расположен гироскоп) до акселерометра. Используется для внесения небольших поправок в показания акселерометра, связанные с тем, что ускоренное вращение создает соответствующее линейное ускорение (которое рассчитывается и вычитается из показаний акселерометра).

Метод iteration()

  • processSensorsData: производится запрос данных с датчиков, рассчитывается угол.
  • processCorrection: находится соответствующая параметру reactionType коррекция.
  • processSerialRx: выполняется реакция на входящие команды.
  • processMotors: устанавливаются новые сила и моменты.
  • processSerialTx: в случае наличия соответствующего запроса о состоянии производится ответ на него.

Definitions.h

Макросы DEBUG_* используются для включения/выключения режимов отладки:

  • DEBUG_NO_MOTORS отключает задержку в несколько секунд перед включением. Удобно для отладки кода (без моторов)
  • DEBUG_NO_GYROSCOPE отключает запрос данных с гироскопа (возвращаемое значение — (0, 0, 0))
  • DEBUG_NO_ACCELEROMETER отключает запрос данных с акселлерометра (возвращаемое значение — (0, 0, 0))
  • DEBUG_NO_SERIAL выключает последовательный порт

RVector3D.h

Структура RVector3D реализует трехмерный вектор (часто используется в коде для представления только двух или трех чисел):

struct RVector3D {
    double x, y, z;
};
Поддерживает некоторые векторные операции.

Класс Accelerometer

Класс Gyroscope

Класс Motor

Позволяет управлять одним мотором при помощи числа от 0 до 1.

Класс MotorController

Содержащит алгоритм инициализации моторов и методы управления ими. Имеет конструктор вида

MotorController(const int motor_control_pins[N_MOTORS]);
где N_MOTORS (= 4) — число двигателей в модели
motor_control_pins — массив номеров выводов Arduino, к которым подключены контроллеры двигателей. Выводы должны поддерживать ШИМ (PWM, '~').

Управление моторами осуществляется посредством методов setTorque(RVector3D) и setForce(double).

Код для компьютера

Код для джойстика