С точки зрения кинематики квадрокоптер представляет из себя 4 пропеллера, расположенных по углам квадрата, тяга которых направлена вниз. Самое главное: в отличие от вертолётов и самолётов он статически неустойчив в воздухе, и не может просто висеть без управления им — сразу же где-нибудь возникает перекос и коптер падает.

Теоретическая механика говорит нам, что положение твёрдого тела в пространстве задаётся шестью координатами (степенями свободы) — 3 поступательных и 3 вращательных. В авиации под координатами вращения понимаются углы Эйлера, и они обозначаются как крен (roll, поворот вокруг оси X), тангаж (pitch, поворот вокруг Y) и рысканье (yaw, поворот вокруг Z).

Коптер может управлять своим вращением только с помощью тяги винтов. Поэтому в первую очередь нужно рассмотреть управление тягой.

Управление тягой винта

Для управления скоростью мотора у регулятора есть вход ШИМ-сигнала. Точнее говоря, этот сигнал выглядит как ШИМ, но важна лишь длительность «1» в нём. Период повторения находится в пределах 10-20мс, и не очень важен — разве что маленький период позволит чаще менять скорость и делает систему управления более отзывчивой. На самом деле, такой сигнал скорее будет называться PDM (Pulse Density Modulation), но создавать мы его будем ШИМ-модулем микроконтроллера.

Генерировать такой сигнал очень удобно, используя практически любой из таймеров STM32 (кроме базовых). Каждый таймер STM32 имеет по 4 порта ввода-вывода, которые в режиме ШИМ включаются на «выход»; они имеют общий период повторения, но разную скважность. То есть, настраиваем один из таймеров (я использую TIM3) на ШИМ, назначаем ножки (в STM32F3 очень удобная система перенаправления этих ножек, доступны по два-три варианта для каждого комплекта), устанавливаем общий период, и нам остаётся лишь обновлять значения скважностей в разных каналах.

Скорость мотора будет примерно пропорциональной длительности «1»: 0% при 0.5мс и 100% при 2.4мс. Эти значения крайне примерные, обязательно нужно проверить их на живом моторе и ESC.

Зависимость тяги пропеллера от поданного сигнала нелинейна по нескольким причинам:

  1. неизвестна программа ESC — должна быть линейная зависимость скорости от сигнала, но это тяжело проверить.
  2. пропеллер имеет приблизительно квадратичную зависимость тяги от скорости вращения.
  3. при большой нагрузке проседает напряжение батареи, и на всех проводах тоже теряется бОльшее напряжение.

Я думаю, что можно примерно оценивать зависимость «сигнал-тяга» как квадратичную.

Комплекс «контроллер+мотор+пропеллер» обычно называется винтомоторной группой (ВМГ) — потому что для наших нужд нет смысла рассматривать эти детали в отдельности, и ВМГ для нас это просто чёрный ящик со входом «газ».

Управление наклоном (крен и тангаж)

Чтобы наклонить коптер в какую-то сторону — нужно ослабить тягу винтов на этой стороне, но так уменьшится общая тяга, и нужно это скомпенсировать увеличив тягу противоположных винтов.

Очень удобно представить желаемый наклон как вектор (нормаль к плоскости требуемого положения коптера), и рассматривать проекции этого вектора на лучи коптера. Тяга каждого мотора должна быть пропорциональна этим проекциям.

Требуемый наклон направлен в сторону 1 и 2 моторов: 30 градусов к 1 и 60 градусов ко 2. Значит, на 1 мотор пойдёт +0.7 тяги, на второй — +0.5, на третий — -0.7, на чевёртый — -0.5. Проекции R3 и R4 имеют отрицательную длину. Удобнее разобраться на виде снизу:

При такой точке зрения на управление становится неважным количество моторов — этот метод одинаково подойдёт и для лёгкого трикоптера, и для тяжелого двойного октокоптера, поменяется только число проекций вектора управления.

Управление поворотом (рысканье)

Если использовать одинаковые пропеллеры, вращающиеся в одну сторону — сам аппарат будет закручиваться в горизонтальной плоскости в противоположном направлении. Чтобы устранить этот эффект — используют два «правых» пропеллера и два «левых», и вращают их в разные стороны. Таким образом, они будут взаимно компенсировать рысканье аппарата. Если же нарушить этот баланс — коптер начнёт поворачиваться в какую-то сторону (по закону сохранения момента импульса). То есть, чтобы изменить рысканье коптера — нужно замедлить одну диагональную пару винтов, и ускорить другую пару, в зависимости от требуемого знака рысканья и направлений вращения винтов. К примеру, чтобы повернуть направо — нужно ускорить «левые» винты и замедлить «правые».

Все методы управления положением используют отклонение скоростей моторов от некой средней скорости, поэтому в следующих статьях я буду говорить о «скорости» как об отклонении скорости мотора относительно средней.

**Статьи цикла:

** 1. Начинаем проект квадрокоптера

  1. Выбор деталей

  2. Заказ деталей на Hobbyking.com

  3. Управление положением квадрокоптера

  4. Получение данных с MEMS-акселерометра

  5. Калибровка и обработка сигнала MEMS-акселерометра