Как сделать квадрокоптер на базе arduino. Как спроектировать собственный квадрокоптер Наземная станция для квадрокоптера arduino

Управлять квадрокоптером – это веселое и интересное занятие. Интереснее может быть только создание своей системы управления такой игрушкой на базе какой-нибудь популярной платформы, например, Arduino. Чем и занялся энтузиаст под ником Dzl. Первым делом он разобрал пульт дистанционного управления для того, чтобы посмотреть, какая радиосистема в нем используется.



Внутри, как и ожидалось, была пара дешевых печатных плат с небольшим количеством компонентов на них.



Радиосвязь обеспечивалась небольшим дискретным радиомодулем. После дополнительного анализа и поиска в интерненте выяснилось, что модуль основан на микросхеме передатчика BK2421, работающего в диапазоне 2.4 ГГц. Сегодня, в принципе, большинство дешевых игрушек с радиоуправлением основаны на этом модуле.



Благодаря осциллографу и документации на микросхему было довольно просто найти выводы, по которым осуществлялась связь по интерфейсу SPI между модулем и остальной частью пульта.



Благодаря «прослушке» с помощью Arduino UNO стал понятен порядок инициализации и режим связи. имеется порядок инициализации.


Не вдаваясь в подробности низкоуровневой коммуникации, при включении пульта и квадрокоптера происходит следующее:


1. Пульт передает свой уникальный сетевой адрес или ID


2. Квадрокоптер принимает эту передачу, подтверждает ее и начинает прослушивать канал с данными от этого ID


3. После подтверждения пульт начинает передавать пакеты данных каждые 20 мс


Можно управлять одновременно несколькими квадрокоптерами, назначив им разные адреса. Передача ID проходит по одному фиксированному каналу, и данные передаются по одному из 12 каналов. Квадрокоптеры автоматически сканируют радиоканалы, пока не найдут данные.


Данные передаются в пакете, состоящем из 8 байт, в следующем формате:


Байт 0 = throttle (газ) 0-255
Байт 1 =Yaw (рыскание) 0-255
Байт 2 =Yaw_trim (подстройка Yaw) 0-128
Байт 3 = Pitch (тангаж) 0-255
Байт 4 = Roll (крен) 0-255
Байт 5 = Pitch_trim (подстройка Pitch) 0-128
Байт 6 = Roll_trim (подстройка Roll) 0-128
Байт 7 = Fly/run 0=fly, 16=run


Затем была создана базовая станция, которая должна связываться квадрокоптерами. В качестве модулей использовались RFM-70, содержащие ту же микросхему BK2421. Следует отметить, что выводы BK2421 толерантны к 5 В, поэтому дополнительные резисторы для 3.3 В можно не ставить.



Для подключения одного и более квадрокоптеров к Arduino была написана специальная библиотека . Эта библиотека должна работать с любыми платами Arduino на базе чипов ATMEGA88 - ATMEGA328P. И в конце видео работы:


Квадрокоптер – отличный вариант проведения свободного времени. Можно купить Arduino дрон в ближайшем магазине или заказать в Китае, но есть альтернатива в виде сборки его своими руками. Да, это вполне реально сделать даже при отсутствии особых навыков и большой денежной суммы, ведь простейшие модели обойдутся вам в сумму 70-80 долларов США. Подобная сумма вполне подъемна даже для бедного студента, который сможет собрать отличный дрон своими руками.

Немного теории

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

Перемещение дрона на Arduino и любом другом контролере осуществляется за счет изменения трех параметров:

  • тангаж;
  • крен;
  • рыскание.

Первый параметр определяет угол наклона вверх или вниз передней части квадрокоптера, позволяя выполнить снижение или подъем дрона. Крен определяет угол наклона, когда правая часть оказывает ниже или выше левой. Рыскание определяет угол поворота квадрокоптера Arduino вокруг вертикальной оси, проходящей через его центр тяжести, обеспечивая дрону поворот в горизонтальной плоскости на нужный угол.

Arduino – небольшая по габаритам плата (сравнима со спичечным коробком), имеющая собственный микропроцессор и память. На нем есть большое количество контактов для подключения компонентов, а возможность загрузки программы позволяет управлять ими по заданному определенному алгоритму.

В итоге плата Arduino дает широкие возможности для создания различных гаджетов, среди которых дрон лишь один из примеров.

Одновременно плата Arduino очень проста в освоении, поэтому работать с ней под силу даже людям, имеющим очень смутные познания в схемотехнике и программировании. Наличие же большого числа учебников, публикаций, видеоуроков позволит освоить простейшие действия с платой всего за пару часов. Непосредственно программирование на Arduino идет с помощью языка С++, имеющим большое распространение. Одновременно большое количество типовых программ позволит быстро его освоить до уровня, которого достаточно для управления дроном. Одновременно широкий выбор библиотек сократит время запуска первого дрона, предупредив появление детских ошибок.

Не потребует Arduino и наличия при сборке паяльника, так как вполне можно обойтись макетной доской и набором перемычек, что одновременно упрощает работу, позволяет быстро исправить какие-то недочеты и ошибки при сборке.

Что нам понадобится?

Перед началом работы нужно подготовить следующие комплектующие:

  • комплект проводов (лучше разноцветных для упрощения монтажа);
  • литиевые аккумуляторы (напряжение 3.7В);
  • транзистор ULN2003A Darlington Transistor (подойдут более мощные аналоги);
  • контролер Arduino Uno;
  • плата MPU-6050 (совмещает в себе функции акселерометра и гироскопа).

Дополнительно понадобится 3D-принтер или хотя бы доступ к нему, а также необходимые инструмент, масса любознательности и терпения, так как не все может получиться с первого раза.

Как собрать программируемый квадрокоптер на Ардуино Уно своими руками?

Шаг №1. Делаем корпус

Проектируем на SolidWorks и распечатываем на 3D-принтере корпус будущего дрона. В качестве прототипа можно взять одну из существующих моделей квадрокоптеров, а если есть навыки, то лучше доработать параметры корпуса за счет сот, которые снижают общий вес устройства. Правда, здесь важно не перестараться, так как излишне облегченный корпус будет легко сноситься ветром в сторону, потребовав соответствующей корректировки пилотом. После распечатки корпуса можно на него установить двигатели и припаять провода.

Обратим внимание, что желательно передние лучи или пропеллеры выполнить другим цветом.

Это позволит проще ориентироваться в пространстве и всегда понимать, где передняя часть дрона, чтобы быстрее им управлять в полете.

Если у вас нет доступа к 3D-принтеру, то альтернативой станет покупка уже готовых лучей в одном из интернет-магазинов. Еще одним вариантом станет изготовление корпуса из подручных средств. Например, раму можно изготовить из куска фанеры, а для лучей, удерживающих двигатели, подойдут пластиковые трубы.

Шаг №2. Подключение Arduino

Подключение платы осуществляется по схеме, но по умолчанию нужно понимать, что Arduino подключается через контакты, а если вы используете аналог другого производителя, то важно проконтролировать правильность расположения контактов. Последние маркируются одинаково, поэтому для предупреждения ошибок придерживайтесь следующей схемы:

  • VDD-3.3V;
  • GND-GND;
  • INT-digital2;
  • SCL-A5;
  • SDA-A4;
  • VIO-GND.

Для питания платы MPU6050 Arduino допускается использование напряжения 3,3В, а если оно составит 5В, то произойдет выход из строя. На многих платах есть встроенный предохранитель, защищающий систему от повышенного напряжения, но рисковать мы не советуем. Также на плате может быть контакт AD0, который требуется подключать к земле. Для управления двигателями Arduino может понадобиться подача большего напряжения, которое можно повысить транзисторами.

Шаг №3. Скетч для Arduino

После подключения к Arduino платы MPU-6050 необходимо загрузить скетч I2C scanner code, куда вставляется код программы. Обратим внимание, что на этом этапе пригодятся хоть минимальные познания в программировании на Arduino, поэтому при отсутствии даже них стоит сделать небольшую паузу и разобраться с особенностями.

Теперь откройте серийный монитор Arduino IDE (он находится в разделе Tools на вкладке Serial Monitors) и убедиться в наличии подключенного 9600. Если все предыдущие этапы были выполнены верно, то будет обнаружено устройство I2C с присвоенным адресом 0х69 или 0х68, который нужно записать. Теперь можно загрузить один из скетчей, который будет постоянно обрабатывать информацию с акселерометра и гироскопа. В интернете подобных скетчей для Arduino достаточно много, поэтому выбирайте любой, но ориентируйтесь на отзывы пользователей. После скачивания подобного скетча проведите его разархивирование. Затем опять перейдите в Arduino IDE и зайдите по адресу sketch-import libraty-add library, куда нужно будет добавить папки с вашими скетчами.

Теперь обязательно откройте файл MPU6050_DMP6. Если у вас был присвоен адрес 0х69, то обязательно нужно расскоментировать строку после #includes, так как по умолчанию присваивается 0х68. На этом этапе уже можно получить первые значения с гироскопа и акселерометра. Для этого загрузите программу и откройте с 115200 окно серийного монитора, следуя дальнейшим инструкциям.

После сборки квадрокоптера на Arduino нужно будет откалибровать параметры акселерометра и гироскопа. Для этого достаточно найти ровную плоскую поверхность и поставить на нее плату. Теперь достаточно запустить скетч для проведения калибровки, после которой имеющиеся отклонения записываться и учитываются в скетче MPU6050_DMP6. Их достаточно прописать один раз и сохранить (в дальнейшем корректировка понадобится только после сбоя данных и не потребует много времени).

Шаг №4. Установка программы для Arduino и подключение

Основной задачей платы остается управление моторами. Arduino дрон подает на выход ток малого напряжения и силы тока, поэтому для подключения моторов необходимо использовать транзисторы. При подключении необходимо обратить внимание, что транзисторы должны быть заземлены, а земля на Arduino подключается к земле непосредственно источника питания.


Теперь можно попробовать запустить двигатели, которые должны вращаться в правильных направлениях (по 2 в каждую сторону). Если этого не произошло, то переключите контакт мотора с 5В на транзистор, что позволит ему начать вращение в обратную сторону. В дальнейшем корректировать направление моторов не потребуется, так как управление квадрокоптера осуществляется за счет изменения скорости каждого из них.

В интернете можно найти несколько программ Arduino, позволяющий стабилизировать дрон на постоянном уровне в воздухе и затем вести управление им. Стабилизация квадрокоптера осуществляется с помощью двух ПИД-контроллеров. Один из них используется для тангажа (отклонение носа дрона вверх и вниз), а второй для крена (отклонение влево и вправо).

ПИД-регулирование предусматривает использование трех входов (заданное положение, выход, измерение). Выход определяется текущим положением и измерениями, а регулятор стремится изменить этот показатель таким образом, чтобы результат измерения соответствовал заданному положению. Для дрона с четырьмя винтами используется два контроллера, каждый из которых определяет разницу в скорости вращения винтов, расположенных по диагонали. Если она будет равна нулю, то крен и тангаж будут отсутствовать.

Шаг №5. Модификация дрона

Самой большой проблемой подобных квадрокоптеров остается их вес и стоимость. Можно, конечно, подобрать более мощные моторы, но это вряд ли даст намного лучший результат. Единственным вариантом станет выбор в пользу вентильных приводов (безщеточных). По своим техническим характеристикам они будут намного лучше, но требуется дополнительное использование контроллеров скорости, что повысит стоимость всей конструкции.

Для снижения веса всего дрона лучше применять Arduino Uno из-за возможности снять чип процессора и установить на ProtoBoard. Это будет достаточно для выигрыша порядка 30 граммов веса, что при подобных масштабах весьма неплохо. Дополнительно правда понадобится несколько конденсаторов, а если нет желания возиться с дополнительной электроникой, то можете выбрать сразу Arduino Pro Mini.

На что обратить внимание?

Пытаясь собрать дрон своими руками на Arduino возникает мысль полностью написать программное обеспечение. От этой мысли нужно избавиться, во всяком случае, на первых этапах.

Например, для управления полетным контроллером сейчас достаточно готовых решений. Если же вы сразу решите писать что-то свое, то высок риск повреждения квадрокоптера. Причина в том, что математика полета составляет минимальную часть всего кода программы, а для управления квадрокоптером без барометра и системы GPS требуется хорошая практика (особенно она понадобится при некорректной реакции дрона Arduino на управляющие команды, что происходит почти всегда).

Значительно удобней сначала попрактиковаться и разобраться в существующих программах, что позволит четко понять принципы работы.

Если вы решите писать программу для контроллера своими руками, то готовьтесь к большим временным затратам, которые неразумны при отсутствии соответствующего академического интереса. Во всяком случае, имеющиеся программы и решения для квадрокоптеров на базе Arduino вполне могут выполнять все стандартные действия (снимать видео, фотографировать, летать свободно и по заданию).

Решая заняться созданием квадрокоптера на Arduino, обратите внимание на следующие советы:

  • Не усложняйте первую конструкцию, устанавливая экшен-камеру. Вашей задачей остается создание дрона, который сможет взлететь и уверенно держаться в воздухе, а не упасть на землю, сломавшись при первом полете. Если же последнее произойдет, то легко можно разбить экшен-камеру, а это большие расходы.
  • Не гонитесь за большими масштабами, так как на первый раз достаточно создать небольшой рабочий Arduino дрон, над конструкцией которого можно будет дальше работать, совершенствуя и усложняя.
  • Сократите до минимума количество дополнительных элементов и соединений, так как большое число датчиков и всевозможных контролеров не всегда повышает надежность дрона в полете. Значительно лучше создать базовую конструкцию и постепенно ее усложнять, добавляя новые функции и возможности. Это будет значительно разумней и позволит в будущем проектировать «специализированные» дроны.
  • Если вы хотите изготовить квадрокоптер Arduino с камерой, то вам потребуется основание достаточно больших размеров, что снижает устойчивость всей конструкции.

В завершение обратим внимание, что программирование и создание квадрокоптера на базе Arduino – увлекательное, но достаточно сложное дело для новичков, поэтому не опускайте руки, если у вас не получается. Сделать на Arduino дрон вполне реально каждому и поможет в этом масса дополнительной информации и видео, которое вы легко найдете в интернете.

Квадрокоптер на Ардуино своими руками


Чтобы собрать квадрокоптер своими руками в домашних условиях, следует сначала разобраться в базовых компонентах квадрокоптера.

Детали для сборки квадрокоптера

  1. Каркас квадрокоптера Diatone Q450 Quad 450 V3 PCB Quadcopter Frame Kit 450mm (последние три цифры в названии Q450 указывают на расстояние между моторами в мм по диагонали). Представляет собой корпус летательного аппарата, который будет использован для монтажа всего прочего оборудования и электронной начинки. Состоит их 4 лучей и печатной платы. Вес 295 грамм.

    Banggood.com

    Цена 922 руб.

  2. Мотор DYS D2822-14 1450KV Brushless Motor. 4 штуки.

    Продается в интернет-магазине Banggood.com

    Цена 571 руб/шт

  3. Регулятор DYS 30A 2-4S Brushless Speed Controller ESC Simonk Firmware для регулирования оборотов и контроля скорости. 4 штуки.

    Продается в интернет-магазине Banggood.com

    Цена 438 руб/шт

  4. Пропеллеры DYS E-Prop 8x6 8060 SF ABS Slow Fly Propeller Blade For RC Airplane, 4 штуки. Два пропеллера правостороннего вращения и два левостороннего.

    Продается в интернет-магазине Banggood.com

    Цена 125 руб/шт

  5. Модуль управления квадрокоптером KK2.1.5 kk21evo. 1 шт.

    Продается в интернет-магазине Banggood.com

    Цена 1680 руб

  6. Аккумуляторная батарея литий-полимерного типа Turnigy nano-tech 2200mah 4S ~90C Lipo Pack, необходимо готовить минимум две штуки, а лучше четыре, поскольку они быстро садятся. 1 шт.

    Продается в интернет-магазине Parkflyer.ru

    Цена 1268 руб/шт

  7. Устройство для зарядки аккумуляторов Hobby King Variable6S 50W 5A. 1 шт.

    Продается в интернет-магазине Hobbyco.ru

    Цена 900 руб

  8. Коннектор для подключения аккумулятора XT60 Male Plug 12AWG 10cm With Wire. 1 шт.

    Продается в интернет-магазине Banggood.com

    Цена 144 руб

  9. Хомуты для закрепления проводов на корпусе квадрокоптера. 1000pcs 2.0x100mm Black/ White Nylon Cable Ties Zip Ties. 1 упаковка.

    Продается в интернет-магазине Banggood.com

    Цена 316 руб

  10. Коннекторы 20 Pairs 3.5mm Bullet Connector Banana Plug For RC Battery / Motor. Для проводов регулятора. 1 упаковка.

    Продается в интернет-магазине Banggood.com

    Цена 256 руб

  11. Лента с липучкой для прикрепления аккумулятора к корпусу квадрокоптера. 1 шт.

    Продается в интернет-магазине Banggood.com

    Цена 79 руб

  12. Винты 50pcs Motor Fixing Screws Set for DJI F450 F550 HJ450 550 Quadcopter Multicopter. 1 упаковка.

    Цена 217 руб

  13. Пульт управления квадрокоптером Spektrum DX6 V2 with AR610 Receiver. В одном комплекте поставляются приёмник и передатчик. 1 шт.

    Цена 9700 руб

Итого комплект оборудования для сборки обойдется в 20018 руб.

Особенности при выборе компонентов


Базовые характеристики передатчика:

  • Режимы Mode1 или Mode2. В первом режиме ручка газа находится справа, во втором режиме ручка газа находится слева.
  • Частота передатчика составляет 2,4Ггц.
  • Число каналов. Минимум каналов, которые требуются для осуществления управления летательным аппаратом - четыре. Управляющее оборудование от Spektrum DX6 V2 with AR610 Receiver содержит 6 каналов.

Пошаговая инструкция по сборке квадрокоптера своими руками

  1. Уменьшаем длину проводов на регуляторах. При подсоединении регулятора к моторам длина проводов будет значительно превышать длину луча на котором вся эта конструкция будет крепиться.

  2. Припаиваем коннекторы к концам проводов на регуляторе чтобы в дальнейшем можно было подключить регулятор к моторам.

  3. Производим монтаж двигателей - привинчиваем по 1 двигателю на каждый луч.

  4. Осуществляем сборку рамы. Привинчиваем лучи к плате.

  5. Подключаем провода регуляторов к двигателям. Кабели регулятора и двигателя соединяются в произвольном порядке. В дальнейшем может понадобиться изменение порядка подключения при окончательной конфигурации беспилотника. При использовании выделенных регуляторов для каждого двигателя, положительный и отрицательный полюс должны соединяться с контроллером, идя лишь от одного регулятора.

  6. Закрепляем на корпусе модуль управления двухсторонним скотчем. Его лучше всего расположить в центральной части платформы.

  7. Закрепляем на корпусе приемник двухсторонним скотчем и подключаем его к модулю управления. Приёмник должен быть расположен максимально близко к модулю.

    Назначение каналов описано в руководстве к приёмнику. Обычно их последовательность такова:

    1. Элероны - канал, отвечающий за левые и правые повороты;
    2. Элеватор - канал, руководящий направлениями вперёд и назад;
    3. Газ – канал, управляющий газом. Руководит выполнением взлёта и посадки, а также переменами высоты;
    4. Рысканье - канал даёт возможность производить вращение квадрокоптера вокруг его оси.

  8. Запитываем устройство. Подключаем к коннектору аккумуляторную батарею.

Эта операция завершает процесс сборки квадрокоптера.

Наладка

  1. Производим запуск двигателей. Активация двигателей нуждается в выполнении процесса запуска моторов - арминга. Руководство к эксплуатации подробно рассказывает каким образом этого добиться. Деактивация двигателей требует проведения процедуры дизарминга.
  2. Включаем слабый газ и убеждаемся, что моторы вращаются. Характер вращения должен быть таким же, как указано на схеме в руководстве к контроллеру. При неправильном вращении двигателя нужно просто поменять местами полюса проводов, идущих от двигателя к контроллеру.

  3. Привинчиваем вторую платформу к корпусу квадрокоптера.

  4. Подсоединяем к корпусу ленту с липучкой для крепления аккумулятора.

    Сборка квадрокоптера на ардуино своими руками

    Заключение

    Выполнять самостоятельную сборку квадрокоптера могут лишь те, кому по душе решение сложных проблем. Это должны быть люди, испытывающие наслаждение от хода разнообразных расчётов и процесса сборки устройства.

    Достоинство коптера, собранного собственными руками в том, что в любой момент можно произвести его апгрейд, добавляя новое оборудование.

Не обязательно покупать беспилотник в магазине — теперь вы можете сделать квадрокоптер на базе arduino самостоятельно. Дрон будет иметь мощное автономное питание и функционировать на стабилизационный системе, основой которой будет база Arduino. Если сделать летательный аппарат своими руками, можно сэкономить приличную сумму. Покупной коптер стоит минимум 80 долларов. Если вы создадите его самостоятельно, это обойдется примерно в 60 условных единиц.

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

Летающую модель с 4 ножками можно сотворить своими руками. Процесс не покажется вам сложным, а наоборот, доставит удовольствие, но только при условии изучения инструкции и пошагового ее соблюдения. Прежде всего, перед процессом создания дрона, стоит определиться с элементами, которые будут использованы в работе. В качестве контролера, как и предполагалось, будем использовать платформу Arduino — это недорогая, но качественная база, которая обеспечит устройству бесперебойную работу.

Для создания беспилотника важно правильно подобрать двигатели. Бесщеточные достаточно мощные, но их стоимость составляет минимум 20 долларов, это означает, что устройство обойдется около 80 долларов. В данном случае стоит отдать предпочтение щеточному варианту — намного дешевле, и не требуют установки дополнительных контроллеров.

Так же необходимо позаботиться о приобретении качественного мотора, а затем заняться его стабилизацией. Здесь не обойтись без акселерометра и гироскопа. Так определим угол наклона и ускорение. Данные сенсоры — для создания мощной модели. Чтобы сделать квадрокоптер своими руками с управлением Arduino, вам понадобятся:

  • аккумуляторы на 3,7 В литиевого типа;
  • провода;
  • транзистор не слабее ULN2003A Darlington Transistor;
  • моторы Coreless Motors;
  • микроконтроллер 0820 Coreless Motors;
  • гироскоп;
  • акселерометр;
  • инструменты для спаивания;
  • 3D принтер.

Первое, что следует сделать – это создать раму для будущего квадрокоптера. Каркас получится легким и прочным, если воспользоваться 3D принтером. Затем следует настроить акселерометр и гироскоп. Не нужно подключать к 5 В — это может привести к тому, что плата испортится. Лучше отдать предпочтение 3.3 В. Необходимо учесть, что в большинстве плат есть специальный регулятор напряжения.


После подключения акселерометра можно начать сборку электросхемы. Чтобы сделать все правильно, стоит просмотреть подробное видео, где доступно разъясняют способы сборки. Теперь у вас есть свой квадрокоптер, который вы сделали под нашим четким руководством.

Как оказалось – это вполне реальная задача. Процесс не доставит вам забот, зато можно сэкономить большую сумму. Если возникли сомнения по поводу запуска вашего устройства, инструкцию о том как это сделать читайте . При правильном обращении квадрокоптер на базе arduino прослужит долго.

Здравствуйте, хаброжители!
В этой серии статей мы с вами приоткроем крышку квадрокоптера чуть больше, чем этого требует хобби, а также напишем, настроим и запустим в воздух собственную программу для полетного контроллера, которым будет являться обычная плата Arduino Mega 2560.



У нас впереди:

  1. Базовые понятия (для начинающих коптероводов).
  2. PID-регуляторы с интерактивной web-демонстрацией работы на виртуальном квадрокоптере.
  3. Собственно программа для Arduino и настроечная программа на Qt.
  4. Опасные тесты квадрокоптера на веревке. Первые полёты.
  5. Крушение и потеря в поле. Автоматический поиск с воздуха средствами Qt и OpenCV.
  6. Окончательные успешные тесты. Подведение итогов. Куда дальше?


Материал объемный, но постараюсь уложиться в 2-3 статьи.
Сегодня нас ожидает: спойлер с видео, как наш квадрокоптер полетел; базовые понятия; PID-регуляторы и практика подбора их коэффициентов.

Зачем все это?

Академический интерес, который, кстати, преследует не только меня ( , ). Ну и, конечно же, для души. Я получил огромное удовольствие во время работы и ощутил настоящее непередаваемое счастье, когда «ЭТО» полетело с моей программой 🙂

Для кого?

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

Без ущерба для понимания в базовых понятиях смело пропускайте все, что вам известно, до следующего незнакомого термина, выделенного жирным , или до непонятной иллюстрации.

НЕТ №1!

Не беритесь писать собственную программу для полетного контроллера, пока не попробуете готовые решения, которых сейчас достаточно много (Ardupilot, MegapirateNG, MiltiWii, AeroQuad и т.п.). Во-первых, это опасно! Чтобы управлять квадрокоптером без GPS и барометра нужна практика, а тем более, когда он глючит, переворачивается, летит не совсем туда, куда надо - а этого почти не избежать во время первых тестов. Во-вторых, вам будет во много раз легче программировать понимая, что нужно программировать и как оно должно работать в итоге. Поверьте: математика полета - лишь малая часть кода программы .

НЕТ №2!

Не беритесь писать собственную программу для полетного контроллера, если вас не преследует академический интерес и вам нужно только то, что уже давно умеют готовые решения (летать, фотографировать, снимать видео, летать по заданию и т.п.) Пока вы сами все напишите, пройдет немало времени, даже если вы не один.

Базовые понятия


Квадрокоптеры бывают разные, но всех их объединяют четыре несущих винта:

Не смотря на кажущуюся симметрию, пилоту очень важно различать, где у квадрокоптера перед (показан стрелкой). Здесь, как у радиоуправляемых моделей автомобилей: при команде «вперед» квадрокоптер летит не туда, куда смотрит пилот, а туда, куда направлен воображаемый нос квадрокоптера. Это таит в себе опасность: новичкам бывает трудно вернуть к себе подхваченный ветром аппарат, развернутый как-нибудь боком (мы, конечно, не говорим про полеты по камере от первого лица и про «умные» режимы полета с использованием компаса и GPS.) Решению этой проблемы частично могут помочь передние винты или лучи другого цвета, какой-нибудь шарик спереди или разноцветные светодиоды. Но все это оказывается бесполезным, когда пепелац стремительно превращается в точку над горизонтом.

Мы будем летать на раме квадрокоптера формы «X», потому что она мне больше нравится внешне. У каждой конструкции свои плюсы и свое предназначение. Кроме квадрокоптеров есть и другие мультикоптеры. Даже если не считать экзотические варианты, все равно их видов - целая куча!



Разберемся, как наш квадрокоптер устроен внутри, и чем же должен заниматься полетный контроллер, который мы планируем программировать.




Углы тангажа, крена и рыскания (pitch, roll, yaw) - углы, которыми принято определять и задавать ориентацию квадрокоптера в пространстве.


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

Газ квадрокоптера - среднее арифметическое между скоростями вращения всех моторов. Чем больше газ, тем больше суммарная тяга моторов, тем сильнее они тащат квадрокоптер вверх (НЕ ВПЕРЕД!!! «Тапок в пол» здесь означает наискорейший подъем). Обычно измеряется в процентах: 0% - моторы остановлены, 100% - вращаются с максимальной скоростью. Газ висения - минимальный уровень газа, который необходим, чтобы квадрокоптер не терял высоту.

Газ, тангаж, крен, рыскание - если вы можете управлять этими четырьмя параметрами, значит вы можете управлять квадрокоптером. Их еще иногда называют каналами управления. Если вы приобрели двухканальный пульт, с квадрокоптером вам не совладать. Трехканальный скорее подойдет для маленьких вертолетов: без управления креном летать можно, но на квадрокоптере - не удобно. Если вы хотите менять режимы полета, придется раскошелиться на пятиканальный пульт. Хотите управлять наклоном и поворотом камеры на борту - еще плюс два канала, хотя профессионалы используют для этого отдельный пульт.

Режимов полета существует много. Используется и GPS, и барометр, и дальномер. Но мы хотим реализовать базовый - режим стабилизации (stab, stabilize , летать в «стабе»), в котором квадрокоптер держит те углы, которые ему задаются с пульта не зависимо от внешних факторов. В этом режиме при отсутствии ветра квадрокоптер может висеть почти на месте. Ветер же придется компенсировать пилоту.

Направление вращения винтов выбирается не случайно. Если бы все моторы вращались в одну сторону, квадрокоптер вращался бы в противоположную из-за создаваемых моментов. Поэтому одна пара противостоящих моторов всегда вращается в одну сторону, а другая пара - в другую. Эффект возникновения моментов вращения используется, чтобы изменять угол рыскания: одна пара моторов начинает вращаться чуть быстрее другой, и вот уже квадрокоптер медленно поворачивается к нам лицом (ужас какой):



  • LFW - left front clockwise rotation (левый передний, вращение по часовой стрелке)
  • RFC - right front counter clockwise rotation (правый передний, вращение против часовой стрелке)
  • LBC - left back counter clockwise rotation (левый задний, вращение против часовой стрелке)
  • RBW - right back clockwise rotation (правый задний, вращение по часовой стрелке)


Скоростью вращения моторов управляет полетный контроллер (контроллер, мозги) . Обычно это небольшая плата или коробочка с множеством входов и выходов. Существует огромное количество различных контроллеров с разным набором возможностей, разными прошивками, разными задачами. Вот лишь некоторые:




Обобщенной задачей полетного контроллера является несколько десятков раз в секунду выполнять цикл управления в который входит: считывание показаний датчиков, считывание каналов управления, обработка информации и выдача управляющих сигналов моторам, чтобы выполнять команды пилота. Именно это мы и собираемся запрограммировать.

Различных видов датчиков, которые можно задействовать, очень много. Мы будем использовать ставшие уже почти обязательными во всех квадрокоптерах трехосевой гироскоп и трехосевой акселерометр . Акселлерометр измеряет ускорение, гироскоп измеряет угловую скорость. Благодаря им полетный контроллер узнает текущие углы тангажа, крена и рыскания. Эти датчики бывают встроенными в полетный контроллер, а бывают внешними. Процесс вычисления трех углов по показаниям датчиков - тема для отдельной статьи. Но нам этого здесь знать не надо: за нас все сделает MPU-6050. Это небольшая плата, проводящая необходимые вычисления и фильтрации у себя внутри и выдающая по протоколу i2c уже почти готовые углы. Нам останется их считать, обработать с остальными данными и выдать управляющие сигналы моторам.

Моторы на мультикоптерах потребляют большие токи, поэтому полетный контроллер управляет ими не напрямую, а через специальные аппаратные драйвера, называемые регуляторами скорости (ESC , ре́гуль, е́ска) . Эти регуляторы питаются от основного бортового аккумулятора, управляющий сигнал получают от контроллера, а на выходе у них стоит по три провода (A, B, C), которые непосредственно идут к моторам (каждому мотору - свой регуль!)




«Протокол» общения между регулятором и мотором нам не так важен, как «протокол» общения между полетным контроллером и регулятором, ведь нам предстоит из контроллера программно управлять регулятором. Бывают регуляторы, управляемые по i2c, но наиболее распространенные управляются сигналом прямоугольной формы с минимумом 0 вольт и максимумом 3-5 вольт (его называют ШИМ или PWM , а некоторые утверждают, что правильнее - PPM . Подробнее, например, ).

«Протокол» - это громко сказано: чтобы дать команду мотору вращаться с максимальной скоростью контроллер должен отправлять импульсы длительностью 2 миллисекунды, перемежающиеся логическим нулем длительностью 10 - 20 миллисекунд. Длительности импульса в 1 миллисекунду соответствует остановка мотора, 1.1 мс - 10% от максимальной скорости, 1.2 мс - 20% и т.п. Практически длительность нуля не играет никакой роли, важна только длительность самого импульса.

При всей кажущейся простоте, здесь кроется засада: полетные контроллеры бывают разные с разными настройками, регуляторы бывают разные, и минимум (1 мс) и максимум (2 мс) - не универсальны. В зависимости от множества факторов диапазон 1-2 мс может на деле оказаться 1.1 - 1.9 мс. Для того, чтобы регулятор и контроллер говорили абсолютно на одном языке существует процедура калибровки регуляторов . В ходе этой процедуры диапазоны регуляторов изменяются и становятся равными диапазону контроллера. Процедура зашита в программу каждого регулятора и включает в себя несколько простых шагов (шаги могут отличаться в зависимости от производителя - читайте инструкции!):

  • Отключить питание регулятора.
  • Снять с мотора пропеллер.
  • Подать на вход регулятора сигнал, соответствующий максимальной скорости вращения.
  • Подать на регулятор питание. Мотор при этом должен сохранять неподвижность без посторонней помощи.
  • Подать на вход регулятора сигнал, соответствующий минимальной скорости вращения.
  • Сделать паузу 1-2 секунды, дождаться характерного писка.
  • Отключить питание регулятора.


После этого в регулятор будут занесены соответствующие границы интервала. При попытке взлететь с некалиброванными регуляторами последствия могут оказаться неожиданными: от внезапного рывка квадрокоптера в ближайшее дерево до полной неподвижности моторов при любом значении газа.

PWM с точно таким же принципом использует и бортовой приемник . Это небольшое устройство, получающая сигналы радиоуправления с земли и передающая их в полетный контроллер. Чаще всего в полетном контроллере для каждого канала управления (газ, тангаж, крен и т.п.) имеется свой вход на который поступает PWM. Логика взаимодействия проста: команда, например, «70% газ» непрерывно идет с земли на приемник, где преобразуется в PWM и по отдельному проводу поступает в полетный контроллер. Аналогично с тангажем, креном, рысканием.

Раз между приемником и контроллером свои товарищеские PWM отношения, то их тоже придется калибровать: пульты с приемниками бывают разные со своими диапазонами работы. Контроллер должен уметь подстраиваться. Процедуру калибровки радио , в отличие от калибровки регуляторов нам придется создавать самим как часть полетный программы. Общий план калибровки такой:

  • Снять пропеллеры с моторов на всякий случай.
  • Каким-либо образом перевести контроллер в режим калибровки радио.
  • Контроллер запускает калибровку радио на несколько десятков секунд.
  • За отведенное время двигаем всеми стиками пульта во все стороны до упоров.
  • Контроллер запоминает максимумы и минимумы для всех каналов управления во внутреннюю память на века.

Итак: во время калибровки радио полетный контроллер запоминает диапазоны приемника по всем каналам управления; во время калибровки регуляторов диапазон полетного контроллера заносится во все регуляторы.

Помимо программы для полетного контроллера необходима еще одна программа: интерфейс настройки полетного контроллера . Чаще всего им является программа для PC, которая соединяется с полетным контроллером по USB и позволяет пользователю настраивать и проверять полетную программу, например: запускать калибровку радио, настраивать параметры стабилизации, проверять работу датчиков, задавать маршрут полета на карте, определять поведение мультикоптера при потере сигнала и многое другое. Мы свой интерфейс настройки будем писать на C++ и Qt в виде консольной утилиты. Вот она, если заглянуть в будущее:




Никто не застрахован от случайностей. Даже десятидюймовые пластиковые винты на маленьких моторах могут оставить кровавые синяки на коже, которые будут болеть еще неделю (проверено лично). Элементарно сделать себе новый макияж и прическу, если зацепить стик газа на пульте, пока несешь включенный квадрокоптер. Поэтому полетный контроллер должен обеспечивать хоть какую-то безопасность: механизмarmed/disarmed . Состояние квадрокоптера «disarmed» означает, что моторы отключены и даже команда полного газа с пульта не имеет никакого эффекта, хотя питание подано. Состояние «armed» квадрокоптера означает, что команды с пульта выполняются полетным контроллером. В этом состоянии квадрокоптеры взлетают, летают и садятся. Квадрокоптер включается и должен сразу попасть в состояние disarmed на тот случай, если невнимальельный пилот включает его, когда стик газа на пульте находится не в нуле. Чтобы перевести коптер в состояние «armed» пилоту необхоимо сделать какой-то заранее оговоренный жест стиками пульта. Часто этим жестом является удержание левого стика в правом нижнем углу (газ = 0%, рыскание = 100%) втечении пары секунд. После этого полетный контроллер делает хотя бы минимальную самопроверку и при ее успешном прохождении «армится » (к полету готов!) Другим жестом (газ = 0%, рыскание = 0%) квадрокоптер «дизармится «. Еще одна хорошая мера безопасности - автодизарм , если газ был на нуле втечении 2-3 секунд.

О моторах, аккумуляторах, регуляторах, пропеллерах



Математика стабилизации, ПИД-регуляторы (PID)


Если вы решили заняться мультикоптерами, то рано или поздно вам придется столкнуться с настройкой ПИД-регулятора, поскольку этот математический аппарат применяется почти во всех задачах стабилизации: стабилизация углов квадрокоптера в воздухе, полет и удержание позиции по GPS, удержание высоты по барометру, бесколлекторные механизмы стабилизации видеокамеры в полете (подвес камеры).

Вы приобретаете двухосевой подвес для камеры, ставите туда, например, GoPro, включаете и вместо стабилизации получаете конвульсии, вибрации и дергания, хотя все датчики откалиброваны и механические проблемы устранены. Причина - неверные параметры ПИД-регуляторов.

Вы собираете мультикоптер, калибруете датчики, регуляторы, радио, все проверяете, пытаетесь взлететь, а он такой унылый в воздухе, что его даже легким ветерком переворачивает. Или наоборот: он такой резкий, что внезапно срывается с места и крутит тройное сальто без разрешения. Причина все та же: параметры ПИД-регуляторов.

Для многих устройств использующих ПИД-регуляторы существуют инструкции по настройке, а то и несколько в добавок к многочисленным видеонструкциям от самих пользователей. Но чтобы легче ориентироваться в этом многообразии полезно понимать, как же внутри устроены эти регуляторы. Кроме того, мы же собираемся писать собственную систему стабилизации квадрокоптера! Предлагаю вместе со мной самим заново «изобрести» и «на пальцах» понять формулу ПИД-регулятора. Для тех, кому больше нравится сухой математический язык, я рекомендую Википедию, т.к. в русской пока не так подробно изложен материал.

Будем рассматривать квадрокоптер в двумерном пространстве, где у него есть только один угол - угол крена, и два мотора: левый и правый.




В полетный контроллер непрерывно поступают команды с земли: «крен 30 градусов», «крен -10 градусов», «крен 0 градусов (держать горизонт)»; его задача - как можно быстрее и точнее их выполнять с помощью моторов с учетом: ветра, неравномерного распределения веса квадрокоптера, неравномерного износа моторов, инерции квадрокоптера и т.п. Таким образом, полетный контроллер должен непрерывно решать задачу, какую скорость вращения подавать на каждый мотор с учетом текущего значения угла крена и требуемого. Непрерывно - это, конечно, громко сказано. Все зависит от вычислительных возможностей конкретного железа. На Adruino вполне можно одну итерацию цикла обработки и управления уместить в 10 миллисекунд. Это значит, что раз в 10 миллисекунд будут считываться показания углов квадрокоптера, и на их основе будут отправляться управляющие сигналы к моторам. Эти 10 миллисекунд называют периодом регулирования . Понятно, что чем он меньше, тем чаще и точнее происходит регулирование.

Уровень газа поступает из приемника в контроллер. Обозначим его . Напомню, что это среднее арифметическое между скоростями вращения всех моторов, выраженное в процентах от максимальной скорости вращения. Если и - скорости вращения левого и правого моторов, то:




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

Представим ситуацию: поступает команда «держать горизонт» ( = 0), а квадрокоптер имеет крен влево:




- разность (ошибка) между и , которую контроллер стремится минимизировать.

Чем больше разность между желаемым углом крена и текущим, тем сильнее должна быть реакция, тем быстрее левый мотор должен закрутиться относительно правого. Если это записать с использованием наших обозначений:



Здесь P - коэффициент пропорциональности. Чем он больше, тем сильнее будет реакция, тем резче квадрокоптер будет реагировать на отклонение от требуемого угла крена. Эта интуитивно понятная и простая формула описывает работу пропорционального регулятора . Суть элементарна: чем сильнее квадрокоптер отклонился от требуемого положения, тем сильнее надо пытаться его вернуть. К сожалению, эту формулу придется усложнить. Главная причина - перерегулирование.

За несколько десятков миллисекунд (несколько итераций цикла обработки) под воздействием пропорционального регулятора квадрокоптер вернется в требуемое (в данном случае горизонтальное) положение. Все это время ошибка и усилие будут иметь один и тот же знак, хоть и становиться все меньше по модулю. Набрав какую-то скорость поворота (угловую скорость) квадрокоптер просто перевалится на другой бок, ведь никто его не остановит в требуемом положении. Все равно что пружина, которая всегда стремится вернуться в начальное положение, но если ее оттянуть и отпустить - будет колебаться, пока трение не возьмет верх. Конечно, на квадрокоптер тоже будет действовать трение, но практика показывает, что его не достаточно.

По этой причине в пропорциональный регулятор нужно добавить еще одно слагаемое, которое будет тормозить вращение квадрокоптера и препятствовать перерегулированию (переваливанию в противоположную сторону) - своего рода имитация трения в вязкой среде: чем быстрее поворачивается квадрокоптер, тем сильнее надо пытаться его остановить, конечно, в разумных пределах. Скорость вращения (скорость изменения ошибки) обозначим как , тогда:



где D - настраиваемый коэффициент: чем он больше, тем сильнее останавливающее усилие. Из школьного курса физики всплывают смутные воспоминания, что скорость изменения любой величины - производная этой величины по времени:

.

И вот пропорциональный регулятор превращается в пропорционально-дифференциальный (пропорциональное слагаемое и дифференциальное):

.

Ошибку вычислить легко, ведь на каждой итерации мы знаем и ; P и D - настраиваемые перед запуском параметры. Для вычисления производной (скорости изменения ) необходимо хранить предыдущее значение, знать текущее значение и знать время, которое прошло между измерениями (период регулирования). И вот она - физика шестого класса школы (скорость = расстояние / время):

.

- период регулирования; - значение ошибки с предыдущей итерации цикла регуляции. Кстати, эта формула - простейший способ численного дифференцирования, и он нам здесь вполне подойдет.

Теперь у нас есть пропорционально-дифференциальный регулятор в плоском «бикоптере», но осталась еще одна проблема. Пусть левый край будет весить чуть больше правого, или, что то же самое, левый мотор работает чуть хуже правого. Квадрокоптер чуть наклонен влево и не поворачивается обратно: дифференциальное слагаемое равно нулю, а пропорциональное слагаемое хоть и принимает положительное значение, но его не хватает, чтобы вернуть квадрокоптер в горизонтальное положение, ведь левый край весит чуть больше правого. Как следствие - квадрокоптер будет все время тянуть влево.

Необходим механизм, который бы отслеживал такие отклонения и исправлял их. Характерной особенностью таких ошибок является то, что они прявляют себя со временем. На помощь приходит интегральное слагаемое. Оно хранит сумму всех ошибкок по всем итерациям цикла обработки. Как же это поможет? Если пропорционального слагаемого не достаточно, чтобы исправить маленькую ошибку, но она все равно есть - постепенно, со временем, набирает силы интегральное слагаемое, увеличивая реакцию и квадрокоптер принимает требуемый угол крена.

Тут есть нюанс. Предположим равна 1 градусу, цикл регулирования - 0.1с. Тогда за одну секунду сумма ошибок примет значение 10 градусов. А если цикл обработки - 0.01с, то сумма наберет аж 100 градусов. Чтобы за одно и тоже время интегральное слагаемое набирало одно и тоже значение при разных периодах регулирования, полученную сумму будем умножать на сам период регулирования. Легко посчитать, что в обоих случаях из примера получается сумма в 1 градус. Вот оно - интегральное слагаемое (пока без настраиваемого коэффициента):

.

Эта формула - не что иное, как численный интеграл по времени функции в интервале от нуля до текущего момента. Именно поэтому слагаемое называется интегральным:

,

где T - текущий момент времени.
Пришло время записать окончательную формулу пропорционально-интергрально-дифференциального регулятора:

,

где - один из настраиваемых параметров, которых теперь трое: . Эта формула удобна в применении из программного кода, а вот формула, которая приводится в учебниках:

.

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

Практика

Ну а теперь пришло время для практики подбора коэффициентов. Читателям предлагается JavaScript-страничка с виртуальным квадрокоптером, который он уже видел на картинках: подбор параметров PID-регулятора для квадрокоптера (JSFiddle). При первом запуске сразу видно перерегулирование - колебания вокруг требуемого положения. Когда колебания останавливаются, можно наблюдать эффект, что пропорциональный коэффициент не справляется с ошибкой из-за «несимметричного» квадрокоптера (задается галочкой «Asymmetry»). Для настройки доступны параметры P, I, D. Теперь вы знаете что с ними делать. «Скролом» под квадрокоптером можно управлять требуемым значением крена. «Interval (ms):» - интервал регулирования. Уменьшать его - «читерство», но посмотреть как он влияет на качество стабилизации - очень полезно.

Для любителей «чистой» математики можно предложить настроить абстрактный ПИД-регулятор

Введенные параметры автоматически не применяются: нужно жмакать «Apply». Пара небольших советов: если вам кажется, что квадрокоптер слишком медленно реагирует на управление - можно увеличить P, но слишком большое значение P может привести к перерегулированию. С перерегулированием поможет справиться параметр D, но слишком большие значения приведут к частым колебаниям, или опять к перерегулированию. Параметр I, обычно, в 10 - 100 раз меньше, чем параметр P т.к. его сила в накоплении во времени, а не в быстром реагировании.

Ручная настройка ПИД-параметров требует практики. Существуют аналитические методы их вычисления, но они требуют хорошей подготовки и точного знания многих параметров конкретной настраиваемой системы. Как среднее между ручным подбором и аналитическим вычислением есть широкий ряд эмпирических методов, предложенных различными исследователями.

В нашем 2D квадрокоптере меняется только один угол - угол крена. В настроящем 3D квадрокоптере потребуется три независимых ПИД-регулятора для каждого из углов, а управление конкретным мотором будет представлять сумму усилий по всем регуляторам.

Заключение первой части

В этой статье мы познакомились с базовыми понятиями: квадрокоптер и принцип полета, тангаж, крен, рыскание, газ, газ висения, режим полета stabilize, полетный контроллер, гироскоп, акселерометр, регулятор скорости, ШИМ, калибровка регуляторов, калибровка радио, бортовой приемник, интерфейс настройки полетного контроллера, состояния armed/disarmed, автодизарм .

После этого мы заново изобрели формулу ПИД-регулятора немного каснувшись численного дифференцирования и интегрирования , и на своей шкуре испытали, как настраивать параметры P, I, D на виртуальном квадрокоптере .

Теперь, если вы владеете световым мечем-программированием, вы можете приступать к своей программе стабилизации квадрокоптера, или, еще лучше, присоединиться со свежими идеями к существующими open source проектам. Ну а я через неделю-другую продолжу рассказ, как это все программировалось, тестировалось, падало, резало мне пальцы и вовсе улетало в неизвестном направлении.

В заключении этой части я просто обязан упомянуть человека, который помогал мне в выборе комплектующих и настройке самого сложного (первого!) квадрокоптера на прошивке MegapirateNG и терпеливо отвечал на сотни вопросов по этим самым базовым понятиям: SovGVD , спасибо тебе! 🙂

В награду тем, кто смог промотать всю эту простыню, выкладываю обещанное маленькое видео, как наш квадрокоптер с нашими «изобретенными» ПИД-регуляторами, на нашей программе для Arduino Mega 2560 летает:



Конечно, ему не хватает GPS, как в коммерческих и массовых продуктах, немного не хватает устойчивости, но зато - НАШ, и мы знаем его вдоль и поперек до последнего множителя при интегральном коэффициенте! И это действительно круто, что сегодня нам доступны такие технологии.