Поиск по этому блогу

Программирование полёта

 

Методы планирования автономных миссий беспилотных летательных аппаратов


Данный раздел будет посвящен программированию беспилотников. Рассмотрим методики составления траекторий полета для БПЛА, используя как конфигураторы и программное обеспечение наземных станций управления, так и язык Python с доступом к API прошивки бортового контроллера.

Отсутствие дополнительных датчиков (кроме гироскопа и акселерометра) в бортовом контроллере не позволяет БПЛА точно позиционироваться в пространстве. Для обеспечения стабилизации и возможности составления автономных миссий полета, а также для автоматического управления БПЛА, необходим GPS-модуль. В настоящее время наиболее популярными GPS-модулями являются Beitian BN-180 и Beitian BN-220. Подключение этих модулей осуществляется по интерфейсу UART (Universal Asynchronous Receiver-Transmitter) к бортовому контроллеру. При этом важно отметить, что RX (Receiver) модуля GPS следует подключать к TX (Transmitter) бортового контроллера, а TX модуля GPS – к RX бортового контроллера.

Настройка режимов полета

Использование GPS открывает доступ к дополнительным режимам полета. Настроить эти режимы можно в разделе «Режимы».

* ALTHOLD (режим удержания высоты). В этом режиме БПЛА будет удерживать заданную высоту. Штурвал газа отвечает за изменение высоты. Для работы данного режима необходим барометр на борту бортового контроллера.

* POSHOLD (удержание позиции).  В этом режиме БПЛА удерживает заданное положение в пространстве. Корректировка положения осуществляется с помощью стиков управления.

* RTH (Возвращение домой). В этом режиме БПЛА автоматически возвращается к точке старта, которая определяется как местоположение БПЛА в момент перехода в режим ARM.

* WP (Автоматический полет по миссии). В этом режиме БПЛА выполняет заранее заданный маршрут полета.

Требования к бортовым системам управления

Постоянное развитие технологий управления полетом БПЛА предъявляет высокие требования к созданию продвинутых автопилотных систем.  Такие системы должны обладать:

* Полным набором датчиков: включая гироскоп, акселерометр, барометр и магнитометр для точного определения положения и ориентации БПЛА в пространстве.

* Широким набором портов ввода-вывода: для подключения периферийных устройств, расширяющих функциональные возможности БПЛА.

* Высококачественным программным обеспечением:  обеспечивающим удобное управление и доступ ко всем функциям автопилота.

Полетные контроллеры БПЛА должны быть универсальными и совместимыми с различными типами аппаратов.

Системы PX4 и Ardupilot представляют собой популярные типы программного обеспечения с открытым исходным кодом для управления беспилотными летательными аппаратами (БПЛА). Обе системы обладают широким спектром функций, необходимых для автономных полетов.

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

Для эффективной работы как PX4, так и Ardupilot требуется использование специализированных бортовых контроллеров полета. Такие контроллеры должны быть оснащены набором датчиков, включая гироскоп, акселерометр, барометр и магнитометр, для обеспечения точной ориентации и навигации БПЛА. 

В частности, для PX4 и Ardupilot разработаны контроллеры типа Pixhawk. Кроме того, для реализации автоматических полетов БПЛА требуется GPS-модуль для определения местоположения.

Составление миссии в QGroundControl

QGroundControl (QGC) – это программное обеспечение для наземной станции управления, предназначенное для прошивки, настройки и формирования полетных заданий для беспилотных летательных аппаратов (БПЛА).  

Основным преимуществом QGC является совместимость с PX4, однако оно также может использоваться с Ardupilot.

Процедура составления миссии:

1. Запустите QGroundControl и перейдите в раздел "Plan". 

2. В открывшемся окне вы увидите интерфейс для создания миссии для автоматического полета.

Существует несколько вариантов создания миссии: GeoFence, Pattern или самый простой – создание миссии по выбранным точкам.

3. Для создания простейшей миссии в окне "Plan" сначала выберите точку взлета "Takeoff" и щелкните на карте. В правом окне задайте высоту взлета. Строка "Yaw" предназначена для выбора направления курса БПЛА.

4. Выбрав на вкладке слева точку "Waypoint", перенесите ее на карту. Введите высоту для точки и скорость. Также можно указать настройки камеры и подвеса. Повторите процедуру для всех желаемых точек.

5. В конце миссии необходимо вернуть БПЛА в точку старта, которая совпадает с точкой взлета. Выбрав на вкладке слева "Return", вы переведете БПЛА в режим "Return To Launch" и зададите маршрут на высоте, соответствующей параметру режима. 

6. Для загрузки миссии в полетный контроллер нажмите кнопку "Upload" в верхней панели окна.

Создание миссий в Mission Planner

Mission Planner представляет собой мощное программное обеспечение для наземной станции управления беспилотными летательными аппаратами (БПЛА). Оно преимущественно используется с прошивкой Ardupilot. Процесс создания миссии в Mission Planner схож с QGroundControl и позволяет задавать как отдельные точки, так и полеты по полигональным площадям.

Для создания простой миссии по точкам, запустите Mission Planner и перейдите на вкладку "Plan". Щелкните правой кнопкой мыши и выберите "Insert WP" для добавления точки. Удерживая левую кнопку мыши на точке, ее положение можно скорректировать. Для первой точки в нижней панели программы выберите команду "Takeoff" ("Взлет") в графе "Команда".  Далее, используя левую кнопку мыши, можно задавать положение последующих точек. В нижней части панели для каждой точки можно настроить высоту, задержку по времени и курс. Для загрузки миссии в полетный контроллер нажмите кнопку "Записать WP" в правой части окна.

Программирование автономных миссий

В то время как программы наземного управления беспилотными летательными аппаратами (БПЛА) удобны для личного использования, часто возникает потребность в разработке собственных приложений для обеспечения автономного полета.

Для реализации автономного режима управления БПЛА могут потребоваться дополнительные вычислительные ресурсы. В этом случае на борт БПЛА устанавливается вспомогательный компьютер – "компаньон". Функционал такого компьютера может быть разнообразным: от обработки изображений с использованием технологий компьютерного зрения до взаимодействия с сетевыми интерфейсами и управления БПЛА по сети Интернет. Примером такого устройства может служить Raspberry Pi.

Для унификации взаимодействия внешних устройств с бортовым контроллером БПЛА сообществом был разработан протокол коммуникации Mavlink. Mavlink – это стандартный протокол, обеспечивающий взаимодействие с беспилотными летательными аппаратами.

Данная система использует современную архитектуру "подписка-публикация" и "точка-точка" для обмена данными, которые передаются в виде тем (топиков).

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

В качестве API для взаимодействия с бортовым контроллером могут быть использованы MAVSDK и ROS.

ROS (Robot Operating System) - это экосистема для разработки роботов, предлагающая функции для распределенной работы. Хотя ROS является универсальным API для роботов, его оптимизация для беспилотных летательных аппаратов (БПЛА) не так высока. Кроме того, ROS требует более сложной установки необходимых пакетов и настройки.

MAVSDK - это более интуитивно понятный и оптимизированный для БПЛА API, поддерживающий больше языков программирования и операционных систем.


Использование языка Python для программирования автономного полета


Установка среды разработки

Python - высокоуровневый интерпретируемый язык программирования, характеризующийся простотой освоения и широким спектром применения благодаря наличию множества библиотек. Для его функционирования требуется установка интерпретатора – программы, отвечающей за выполнение файлов Python. Последнюю версию интерпретатора для вашего дистрибутива можно скачать на официальном сайте python.org. Пользователи Linux (например, Ubuntu) могут обнаружить, что Python уже предустановлен в их операционной системе. При установке Python необходимо добавить интерпретатор в переменную окружения.

Установка PX4 Toolchain с симулятором

Разработка приложений для беспилотных летательных аппаратов (БПЛА) требует специализированного программного обеспечения, включающего инструменты для создания и тестирования, а также симулятор. Рассмотрим установку такого ПО под прошивку PX4.

Оптимальной операционной системой для установки является Ubuntu, но также возможна установка на Windows 10, 11 или Windows Subsystem for Linux (WSL). Информацию по установке WSL можно найти на сайте Microsoft. Процесс установки PX4 Toolchain в обоих вариантах схож. Рассмотрим вариант с использованием Ubuntu.

Запустите терминал и выполните следующую команду для загрузки репозитория PX4:

`git clone https://github.com/PX4/PX4-Autopilot.git --recursive`

После скачивания установите все необходимые компоненты, введя команду bash с указанием пути к файлу:

`bash ./PX4-Autopilot/Tools/setup/ubuntu.sh`

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

Установка MAVSDK

MAVSDK представляет собой набор библиотек для работы с Mavlink-системами, такими как БПЛА, наземные станции управления и подвесы. Библиотека предоставляет доступ к функциям БПЛА через удобный API, включая информацию о состоянии, телеметрию, контроль миссий и управление перемещением.

Установка библиотек и управление дроном в симуляторе

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

Установка библиотеки mavsdk:

`pip3 install mavsdk`

Установка библиотеки aioconsole:

`pip3 install aioconsole`

В дальнейшем будет рассмотрено управление виртуальным беспилотным летательным аппаратом (БПЛА) с помощью симулятора jMavSim.

Для запуска симулятора необходимо ввести команду:

`make px4_sitl jmavsim`

Управление БПЛА осуществляется в терминальном окне путем ввода команд после `px4>`.  Например, команда `commander takeoff` переводит дрон в состояние готовности к полету и задает высоту 2,5 метра. Для посадки БПЛА используется команда `commander land`.

Далее будет рассмотрена разработка программы управления БПЛА с использованием API MAVSDK. Для написания программы можно воспользоваться текстовым редактором nano, введя в командной строке:

`nano <имя файла>.py`

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

```python

#!/usr/bin/env python3

import asyncio 

from mavsdk import System

```

В данной программе используется асинхронный подход, реализуемый с помощью библиотеки `asyncio`. Для взаимодействия с дроном MAVSDK задействуется класс `System` из одноименной библиотеки.

Основная функция программы, обозначенная как `run()`, выполняет подключение к беспилотному летательному аппарату (БПЛА). С помощью объекта `drone` класса `System` устанавливается соединение с БПЛА. 

После подключения осуществляется проверка состояния соединения посредством цикла `async for`. При успешном подключении выводится соответствующее сообщение, и цикл прерывается.

Далее проверяется наличие глобальной позиции БПЛА, получаемой с помощью симулированного GPS. Цикл `async for` проходит по данным о состоянии здоровья дрона (`health`). Если глобальная позиция и позиция дома доступны, выводится подтверждающее сообщение, и цикл завершается.

Наконец, программа готова к выполнению команды "ARM" для БПЛА.

Более подробно!  Глава MAVSDK использует асинхронность, поэтому  необходима библиотека asyncio.

С помощью второй команды импортируем класс System из биб-лиотеки MAVSDK. 

Далее объявим входную функцию, через которую будем запус-кать нашу программу: async def run(): Далее, сделав отступ (синтаксис в Python требует наличие от-ступов), напишем саму функцию. Через переменную drone будем работать с функциями класса System и произведем подключение к нашему БПЛА: drone = System() await drone.connect() Сделаем проверку подключения к БПЛА следующим образом: print("Waiting for drone to connect...") async for state in drone.core.connection_state(): if state.is_connected: print(f"-- Connected to drone!")  break В первой строчке выводим информацию для пользователя о том, что мы ожидаем подключения. Далее запускаем цикл, в котором хранятся данные о состоянии подключения. Если появляется подключение, то просто выходим из цикла. 

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

print("Waiting for drone to have a global position estimate...") async for health in drone.telemetry.health(): if health.is_global_position_ok and health.is_home_position_ok: print("-- Global position estimate OK") break Теперь можно прописать состояние ARM БПЛА следующей командой: 

await drone.action.arm()  

И затем сам взлет: await drone.action.takeoff() 

Поставим задержку в 10 секунд: await asyncio.sleep(10) 

И выполним посадку БПЛА: await drone.action.land()

В конце программы запишем строчки, необходимые для кор-ректной работы кода: if __name__ == "__main__": asyncio.run(run()) Данная конструкция означает, что функция run() будет выпол-няться только тогда, когда будет запущен текущий файл. 

Полный код программы: #!/usr/bin/env python3

import asyncio from mavsdk import System

async def run():

 drone = System() await drone.connect(system_address="udp://:14540")

print("Waiting for drone to have a global position estimate...") async for health in drone.telemetry.health(): if health.is_global_position_ok and health.is_home_position_ok: print("-- Global position estimate OK") break

 print("-- Arming") await drone.action.arm()

 print("-- Taking off") await drone.action.takeoff()

 await asyncio.sleep(10)

 print("-- Landing") await drone.action.land()

 status_text_task.cancel()

async def print_status_text(drone): try: async for status_text in drone.telemetry.status_text(): print(f"Status: {status_text.type}: {status_text.text}") except asyncio.CancelledError:  return

if __name__ == "__main__": asyncio.run(run())



Сохраните файл сочетанием клавиш Ctrl+X, далее Y и нажмите Enter. 

Запуск программы осуществляется в новом терминале командой: python <имя файла>.py

Пример скачивания лог-файла с помощью Python 

Теперь рассмотрим функционал, на который способен MAVSDK. С помощью API можно скачивать лог-файлы полета.

Реализуем данную программу следующим образом. 

Начало программы не будет отличаться от предыдущей, добавим лишь им-порт пакета sys для работы с файловым выводом: #!/usr/bin/env python3

import asyncio 

from mavsdk 

import System  

import sys

Начало функции run() также не отличается: async def run():

drone = 

System() 

await drone.

connect()


print("Waiting for drone to connect...")  
async for state in drone.core.connection_state(): 
if state.is_connected:  
print(f"-- Connected to drone!")  
break 


Но вместо команд для взлета и проверки глобальной позиции добавим следующие строки:
entries = await get_entries(drone)  
for entry in entries:  
await download_log(drone, entry) 

Тут используются две функции, которые приведены ниже. 
Пер-вая отвечает за получение всех логов и их вывод на экран. 
Вторая занимается сохранением логов:
async def download_log(drone, entry):  
date_without_colon = entry.date.replace(":", "-")  
filename = f"./log-{date_without_colon}.ulog"  
print(f"Downloading: log {entry.id} from {entry.date} to {filename}")  
previous_progress = -1 
async for progress in drone.log_files.download_log_file(entry, filename): 
new_progress = round(progress.progress*100)  
if new_progress != previous_progress:  
sys.stdout.write(f"\r{new_progress} %")  
sys.stdout.flush() previous_progress = new_progress  
print()
async def get_entries(drone):  
entries = await 
drone.log_files.get_entries()
for entry in entries:  
print(f"Log {entry.id} from 
{entry.date}") return entries

Полный текст программы: 
#!/usr/bin/env 
python3

import asyncio 
from mavsdk 
import System 
import sys

async def run():
drone = 
System() 
await drone.
connect()

print("Waiting for drone to connect...") 
async for state in 
drone.core.connection_state():  
if state.is_connected:  
print(f"-- Connected to drone!")  
break

 entries = await 
get_entries(drone) for entry 
in entries:  
await download_log(drone, entry)


async def download_log(drone, entry):  
date_without_colon = entry.date.replace(":", "-")  
filename = f"./log-{date_without_colon}.ulog"  
print(f"Downloading: log {entry.id} from {entry.date} to 
{file-name}")  
previous_progress = -1

 async for progress in 
drone.log_files.download_log_file(entry, filename):  
new_progress = round(progress.progress*100)  
if new_progress != previous_progress:  
sys.stdout.write(f"\r{new_progress} %")  
sys.stdout.flush()  
previous_progress = new_progress  
print()


async def get_entries(drone):  
entries = await 
drone.log_files.get_entries()  
for entry in entries:  
print(f"Log {entry.id} from 
{entry.date}")  
return entries


if __name__ == 
"__main__":
asyncio.run(run())




Пример загрузки полетной миссии с помощью Python

Рассмотрим пример загрузки программы миссии полета в полетный контроллер с помощью Python. Данный функционал API может быть полезен при автоматизации загрузки большого количе-ства полетных миссий. Допустим, у нас есть готовый файл миссии с расширением plan. Составить такой план можно в программе наземной станции управления, например QGroundControl. 

Для начала импортируем файл и запишем это в переменную:
mission_import_data = await
drone.mission_raw.import_qgroundcontrol_mission( 
"example-mission.plan")

Далее просто запишем это в полетный контроллер следующей командой:
await
drone.mission_raw.upload_mission(mission_import_data.mis-sion_items)

Полный код программы: 
#!/usr/bin/env python3 
import asyncio 
from mavsdk import System 
import mavsdk.mission_raw 
async def run():  
drone = System()  
await drone.connect()  
print("Waiting for drone to connect...")  
async for state in drone.core.connection_state():  
if state.is_connected:  
print(f"-- Connected to drone!")
break  
mission_import_data = await \
 
drone.mission_raw.import_qgroundcontrol_mission(  
"example-mission.plan")
 print(f"{len(mission_import_data.mission_items)} mission items imported")  
await 
drone.mission_raw.upload_mission(mission_import_data.mis-sion_items)
print("Mission uploaded")

if __name__ == 
"__main__":
asyncio.run(run()) 

Программирование квадрокоптера является самой важной и сложной частью создания беспилотника.





Анализ типичных ошибок и потенциальных затруднений.


 Возможные проблемы при настройке беспилотного летательного аппарата (БПЛА)

Проблемы с установкой Python

Наиболее частой ошибкой при установке Python является отсутствие файла python.exe в переменных среды. Для решения этой проблемы необходимо во время установки Python отметить опцию «Add Python to environment variables».

Проблемы с установкой PX4 под WSL

Установка PX4 под Windows Subsystem for Linux (WSL) может вызвать трудности из-за недостаточного объема памяти на компьютере или несовместимости версии Windows. Важно помнить, что WSL – это подсистема Linux для Windows, поэтому для её установки и использования требуется Windows 10 версии 2004 или более поздней, а также Windows 11. Для установки PX4 Toolchain необходимо около 10 Гб свободного места на диске. Более подробную информацию можно найти на сайтах Microsoft и PX4.

БПЛА не подключается к компьютеру

Несмотря на кажущуюся простоту подключения БПЛА к конфигуратору и его прошивка, могут возникнуть проблемы с подключением. Как правило, причиной являются драйверы. 
При настройке в Betaflight внимательно изучите инструкции на начальном экране программы, где содержится информация по установке необходимых драйверов.

При установке QGroundControl или Mission Planner необходимые драйверы устанавливаются автоматически. Если после установки наблюдаются проблемы с подключением полетного контроллера или телеметрии, попробуйте установить драйверы CP210x USB to UART вручную с сайта производителя.

Проверка направления вращения двигателей

Необходимо убедиться в правильности направления вращения двигателей беспилотного летательного аппарата (БПЛА), так как двигатели могут иметь разное направление вращения. Для проверки направления вращения двигателей в программе Betaflight перейдите на вкладку «Моторы».  В окне программы вы можете проверить работу каждого двигателя по отдельности.


Внимательно ознакомьтесь с инструкцией!

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

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

Возможны два типа ошибок: неверное назначение двигателей и неправильное направление их вращения. На вкладке «Моторы» представлена схема с правильным расположением и направлением вращения двигателей.




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

Внимание!

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

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

Несоответствие ориентации контроллера полета

В некоторых случаях может потребоваться установить полетный контроллер не в стандартной ориентации относительно курса БПЛА.  Для корректировки требуется внести изменения в прошивку. Перейдите на вкладку «Конфигурация» и в окне «Расположение платы и датчиков» задайте значения углов для соответствующих осей.

Например, если полетный контроллер установлен с поворотом на 90 градусов по часовой стрелке, то в поле «Yaw градусы» необходимо указать значение –90. Для проверки правильности ориентации перейдите на вкладку «Система». Отклонения БПЛА на экране должны соответствовать отклонениям реального дрона.

Некорректное назначение каналов управления

Проверьте корректность назначения каналов на вкладке «Приёмник». При отклонении стиков на радиоуправлении убедитесь, что канал управления изменяется в соответствии с показаниями на экране.

Например, при отклонении левого стика вверх канал «Throttle» должен изменять свое значение, а при отклонении правого стика вправо канал «Roll» также должен увеличиваться. 

Если БПЛА не реагирует на движения стиков или реакция не соответствует ожидаемой, то каналы назначены некорректно. В этом случае измените расположение букв «R», «E», «T», «A» в окне «Таблица каналов».

Непредсказуемое поведение дрона при потере связи

Режим Failsafe

В случае потери связи с радиоуправлением, беспилотный летательный аппарат (БПЛА) переходит в режим Failsafe. Это критичное для безопасности режима, который необходимо настроить как на пульте управления, так и в прошивке бортового контроллера. 

Настройка Failsafe

* На пульте управления: В настройках модели ("Model Setup") перейдите к настройкам приемника. В поле "Failsafe" выберите "No Pulses". При этой настройке, при потере связи с передатчиком, приемник прекратит отправку сигналов на бортовой контроллер.

* В конфигураторе: Переключитесь в "Экспертный режим" и на вкладке "Failsafe" настройте сценарий поведения БПЛА при потере сигнала:

1. "Drop" - отключает моторы БПЛА.

 2. "Land" - переводит БПЛА в режим выравнивания и подаёт минимальный сигнал на моторы для посадки.

Отсутствие вывода телеметрии на OSD и пульт управления

Многие прошивки поддерживают вывод полетной информации на экран. Для этого приемник должен поддерживать передачу телеметрии (обычно по отдельному проводу, например S.Port у FrSky). 

Соедините контакт телеметрии с свободным UART-портом бортового контроллера. В настройках конфигуратора выберите тип телеметрии (SmartPort для FrSky) и включите "Telemetry" на вкладке "Приемник".

Вывод телеметрической информации на экран FPV-очков настраивается на вкладке "OSD".

 Инструкция по настройке вывода телеметрической информации и особенность режима ARM

Для отображения данных с борта беспилотного летательного аппарата (БПЛА) на пульте управления необходимо выполнить следующие действия:

1. Включите БПЛА и пульт дистанционного управления.

2. Перейдите в меню "Telemetry" на вашем пульте и выберите опцию "Discover Sensors".

3. На вкладке "Display" настройте отображение необходимых датчиков на экране пульта.

К наиболее важным параметрам относятся: уровень заряда аккумулятора (АКБ), качество связи (RSSI) и высота полета (при наличии барометра на плате контроллера).

Важно: При переключении в режим "ARM" БПЛА может кратковременно увеличить обороты моторов. Это связано с функцией "Air Mode", которая стремится стабилизировать аппарат в воздухе. В отсутствие винтов и перемещения дрона, контроллер пытается добиться баланса путем увеличения оборотов двигателей.

Комментариев нет:

Отправить комментарий

 Беспилотные летательные аппараты: принцип работы и классификация Беспилотный летательный аппарат (БПЛА), также известный как дрон, представ...