Skip to content
Sergey edited this page Dec 29, 2013 · 6 revisions

«Мы сделали квадрокоптер!» — звучит не очень впечатляюще: сейчас не представляет труда купить готовый коптер, или собрать его из кусков.
Одним из них кусков является микроконтроллер, на котором выполняется программа, стабилизирующая полет.
Нашей целью было понять, что именно должна делать эта программа, и написать свою. В каком-то смысле, мы сделали свою плату управления.
Мы реализовали «мозги» коптера не на одной специализированной плате, а на Arduino Uno, добавив к ней датчики. Этим мы (еще раз) доказали, что реально сделать коптер на Arduino.
Я постараюсь объяснить основные принципы управления коптерами, а также рассказать про нашу реализацию.

Зачем нужна стабилизация?

Если просто включить все 4 мотора так, чтобы они давали одинаковые силы, то полететь не получится: из-за других внешних сил, а также из-за асимметрии конструкции коптер начнет неконтролируемо вращаться (и, соответственно, лететь в какую-то сторону). Поэтому главной задачей, которую решает контроллер, является динамическая стабилизация. Если знать текущее положение, то можно подобрать такие силы двигателей, чтобы положение и ориентация коптера (три угла, например) не изменялись.
Из законов динамики следует, что в одномерном случае вторая производная угла тела α пропорциональна моменту сил M(t), то есть, заданной силе моторов. Аналогично с координатой x. Таким образом, задача сведена к стандартной постановке: требуется поддерживать величины α, x заданными, контролируя их вторые производные. Трехмерный случай сводится к одномерному при правильном выборе углов.

ПИД-регулятор

Эта задача хорошо решается при помощи довольно простого алгоритма, который называется ПИД-регулятором. Оказывается, в качестве искомого момента сил M(t) достаточно взять линейную комбинацию самой величины α, ее производной, и ее интеграла по времени: У ПИД-регулятора много достоинств. Во-первых, эту формулу просто реализовать на микроконтроллере. Во-вторых, практически не требуется «помнить» что-либо для вычисления результата в текущий момент времени (кроме суммы всех α для интеграла и предыдущего значения для производной). Тем не менее, при правильном выборе коэффициентов (Kp, Ki, Kd), величина угла α будет под действием этого момента M(t) стремиться к заданному значению (т.е., например, коптер придет в горизонтальное положение). То есть, задача решена.

Датчики

Чтобы реализовать этот метод, очевидно, нужно знать величину угла α в текущий и предыдущие моменты времени. Для этого на коптере есть датчик (в нашем случае MPU-6050), который некоторым образом вычисляет этот угол. Выбор именно этого датчика связан с тем, что для получения угла необходимо довольно часто опрашивать физический датчик (измеряющий угловую скорость и ускорение) и производить некоторые вычисления. Данный датчик MPU-6050 сам способен выполнять эти вычисления, «разгружая» основной микроконтроллер Arduino Uno.

Управляемый полет


Итак, можно сделать так, чтобы ориентация коптера оставалась неизменной. Но для полноценного полета необходимо управление, то есть, возможность контролировать эту ориентацию. Для этого мы используем xBee и джойстик. Данные с джойстика передаются с компьютера (к которому подключен джойстик) по каналу xBee.
Также для отладки на компьютере запущена программа, отображающая параметры с коптера в реальном времени.
Clone this wiki locally