Данная статья включает в себя: Видео демонстрация Алгоритм, который мы использовали Программирование Geoscan Pioneer max (небольшой туториал, будет интересен не всем) Конструкция из Система автоматической разгрузки и загрузки дрона (Часть 1 — конструкция) / Хабр (habr.com)   Для проверки работы в условиях приближенных к реальным, мы прикрепили наши посадочные места к имитации окна для определения необходимого расстояния от поверхности, к которой закреплено посадочное место, при использование автопилота (ветер ни кто не отменял; дрон должен иметь возможность для экстренного манёвра). Ниже представлено видео после множественных тестовых полётов, которые помогли нам отладить систему и доработать конструкцию посадочного места (задержки перед каждой командой по 16 секунд (для того чтобы контролировать весь полёт), поэтому мы ускорили видео): Результат тестовых полётов: Автопилоту сложно контролировать себя при залёте на горизонтальную площадку (решение-сократить площадь поверхности) Вынести платформу ещё на 15 сантиметров от стены (выравниваясь, очень близко подлетает к вертикальной поверхности, и малейший ветерок прижмёт его к стене/окну) Так как нам требовалось доработать конструкцию в условиях будущего, мы решили разработать алгоритм для автоматического полёта и провести тестирование нашей конструкции для "тупой машины". К счастью нам не понадобилось писать с нуля автопилот, так как у нашего дрона Geoscan Pioneer max, он встроенный, несмотря на это нам всё равно понадобилось разработать алгоритм построения траектории движения, по двум вводимым точкам посадки (третья - стартовая точка). Алгоритм (упрощённо): Для начала мы подключили сервопривод, для этого нам понадобится Rapberry (так как встроенная система не умеет общаться с сервоприводом), подключаем Raspberry по инструкции в интернете и теперь встаёт вопрос куда подключать серво и что делать. Некоторые пины используются по умолчанию (но информацию об этом можно не найти на сайте геоскана) использование таких пинов может повредить сервопривод, поэтому мы рекомендуем использовать, например, пин GPIO25. Ну и конечно Ground и Power. Uart.new(num, rate, parity, stopBits) - создать Uart на порте с настройками. Параметры: num – номер UART;rate – скорость;parity – Uart.PARITY_NONE, Uart.PARITY_EVEN, Uart.PARITY_ODD, необязательный параметр, по умолчанию Uart.PARITY_NONE;stopBits – Uart.ONE_STOP, Uart.TWO_STOP, необязательный параметр, по умолчанию Uart.ONE_STOP. Uart.read(self, size) - прочитать size байт. Uart.write(self, data, size) - записать данные (data) длиной (size). Uart.bytesToRead(self) - количество данных доступных для чтения. Ниже представлены программы для работы сервопривода, так как вряд ли вы будете использовать только сервопривод в одностороннем порядке, то в предложенных программах уже реализована двухсторонняя связь, НО ограничение на передачу 31 символ, всё составлялось на основе документации (Программирование на Lua — Документация Pioneer December update 2022 (geoscan.aero)), НО информация имеет особенности применения. Для начала разберёмся с тем, какие команды дрон может принять: Название Название MCE_PREFLIGHT   Запустить двигатели и провести подготовку   ENGINES_DISARM   Отключить двигатели   MCE_LANDING   Отправить на посадку   MCE_TAKEOFF   Отправить на взлет   Для того чтобы отправить команду, мы будем использовать метод  ap.push(Event) Параметры: Event – номер события или название (например, Ev.MCE_LANDING  ). Но так же дрон нам будет присылать свои выполненные действия в функцию function callback(event) - Вызывается, когда приходят события от автопилота. Доступны следующие события, приходящие от автопилота: Название Описание ENGINES_STARTED Двигатели запущены COPTER_LANDED Коптер совершил посадку TAKEOFF_COMPLETE Коптер достиг высоты взлета POINT_REACHED Коптер достиг точки POINT_DECELERATION Коптер начал тормозить при подлёте к точке LOW_VOLTAGE1 Низкое напряжение аккумулятора, для возвращения домой LOW_VOLTAGE2 Низкое напряжение аккумулятора, переходит в режим посадки SYNC_START Получен сигнал синхронного старта от системы навигации SHOCK Столкновение или слишком сильные вибрации CONTROL_FAIL Угол наклона коптера превысил допустимый ENGINE_FAIL Отказ двигателя Из этого обширного круга событий нам понадобятся: TAKEOFF_COMPLETE POINT_REACHED Ну и только теперь перейдём к методу, который ключевой для написания автопилота: ap.goToLocalPoint(x, y, z, time) - для полёта с использованием локальной системы координат. Параметры: x – задается координата точки по оси x, в метрах;y – задается координата точки по оси y, в метрах;z – задается координата точки по оси z, в метрах;time – время, за которое коптер перейдет в следующую точку, в секундах. Если значение не указано, коптер стремится к точке с максимальной скоростью. Теперь можем приступить к написанию автопилота. Возьмём за шаблон данный кусок кода: Далее, если хотим сами записывать точки (две) и использовать сервопривод, то берём этот код за основу: После загрузки, вы можете сделать так: В ответ вы получите ответную индикацию, если запись прошла успешно, то моргнёт красный, если успешно очистили план полёта, то моргнёт зелёный, если ошибка, то индикации не будет. Более подробная информация о каждой строке вы сможете найти в документации геоскана: Описание методов API — Документация Pioneer December update 2022 (geoscan.aero)   Предыдущие публикации: Система автоматической разгрузки и загрузки дрона (Часть 1 — конструкция) / Хабр (habr.com)   Следующая публикация: Система автоматической разгрузки и загрузки дрона (Часть 3 — замок) / Хабр (habr.com)    Инженер-конструктор, программист.