Приложение для удаленного синхронизированного управления дронами в шоу и модуль экстренной защиты дронов.
client.py
- основной модуль связи и управления дрономfailsafe.py
- модуль защиты дронов, который создает сервис/emergency_land
и контролирует состояние дрона в соответствии с логикой, указанной в пунктах[FAILSAFE]
и[EMERGENCY LAND]
файла настроекclient.ini
Клиент является сервисом clever-show
в операционной системе коптера. Сервис запускает скрипт client.py и автоматически запускается при загрузке операционной системы. В случае необходимости применения параметров обновлённой конфигурации клиента сервис может быть перезапущен. Сервис clever-show
предназначен для управления и настройки коптера для группового полёта с помощью приложения сервера.
Вместе с клиентом в операционной системе зарегистрирован сервис экстренной защиты дрона failsafe
. Данный сервис запускает скрипт failsafe.py и автоматически запускается при загрузке операционной системы. В случае необходимости применения параметров обновлённой конфигурации клиента сервис может быть перезапущен.
Сервис failsafe
предназначен для автоматической посадки коптера в экстренных ситуациях:
- при отсутствии сообщений о позиции дрона из топика
/mavros/vision_pose/pose
- при столкновении с объектами в полёте, когда расстояние между текущей точкой, где находится коптер, и точкой, где ему следует находиться по полётному заданию, превышает пороговое значение.
Также failsafe
предоставляет ROS сервис /emergency_land
, к которому может обратиться клиент по команде с сервера для экстренной посадки дрона.
Логи обоих сервисов записываются в файл /var/log/syslog
операционной системы бортового компьютера Raspberry Pi на дроне. Логи текущего сеанса доступны для просмотра при выполнении команд journalctl -u clever-show
для клиента и journalctl -u failsafe
для сервиса экстренной защиты дрона в терминале, подключенном к Raspberry Pi. Логи могут быть полезны при анализе возникших нештатных или аварийных ситуаций при полёте коптера под управлением приложения клиента.
Конфигурация клиента создаётся согласно спецификации, в ней можно посмотреть значения по умолчанию для любого параметра после ключевого слова default
. Все изменения сохраняются в файл конфигурации client.ini
в папке clever-show/drone/config
. Доступно редактирование конфигурации клиента через GUI модуль Config editor
в приложении сервера. Для редактирования конфигурации с сервера нужно выбрать строку с клиентом, для которого требуется изменение конфигурации, кликнуть левой кнопкой мыши по любой ячейке из строки и выбрать Edit config
из контекстного меню.
Конфигурация по умолчанию является полностью работоспособной и не требует изменений для быстрого старта клиента.
Для централизованной загрузки конфигурации на все коптеры нужно использовать пункт меню Send configurations
на сервере. Допускается загрузка неполного файла параметров конфигурации, с отсутствующими разделами или параметрами относительно конфигурации по умолчанию. Также доступна опция загрузки конфигурации конкретного клиента на выделенные коптеры: для этого нужно в приложении сервера выбрать строку с клиентом, с которого требуется скопировать конфигурацию на выделенные клиенты, кликнуть левой кнопкой мыши по любой ячейке из строки и выбрать Copy config to selected
из контекстного меню.
config_name
- название конфигурацииconfig_version
- версия конфигурацииid
- имя коптера, отображаемое в таблице. Если значение/hostname
- имя определяется из файла/etc/hostname
.clover_dir
- путь к директории с ROS пакетом сlover. Необходим для загрузки файлов с картами aruco меток и launch файлов настройки запуска сервисаclover
. Если значениеauto
- клиент пытается сам определить нужную директорию пакетаclover
(илиclever
) черезrospkg
при первом запуске. Если директорию с пакетом не удаётся определить, значение устанавливается вerror
, а файлы, специфичные для настройки ROS пакетасlover
не передаются с сервера на клиент.
В этом разделе задаются параметры сетевого взаимодействия клиента с сервером. Доступны следующие параметры:
port
- TCP порт, на который будут приниматься входящие соединения от сервера. При использовании настройки use_broadcast на сервере, данный порт будет сконфигурирован у клиента автоматически. Рекомендуется изменить значение по умолчанию в целях безопасности (любое пятизначное и более число, если другое ПО не использует выбранный порт).host
- IP адрес сервера.buffer_size
- размер буфера при приёме и передаче данных. Не рекомендуется изменять. Рекомендуется использовать единое значение у сервера и клиентов.
В этом разделе включается/выключается механизм получения broadcast пакетов по UDP с сервера.
use
- логическое значение, определяет, использовать или не использовать механизм получения broadcast пакетов по UDP с сервера.port
- порт UDP для приёма broadcast сообщений.
В данном разделе настраивается поток передачи телеметрии на сервер.
transmit
- логическое значение, определяет, нужно ли передавать данные на сервер.frequency
- частота передачи данных на сервер, целочисленное значение, количество раз в секунду.log_resources
- логическое значение, определяет, будет ли записываться в лог сервиса клиента clever-show состояние бортового компьютера: загрузка процессора и оперативной памяти, температура процессора, состояние температуры, состояние системы питания (только для Raspberry Pi).
В данном разделе находятся настройки, влияющие на процесс полёта коптера.
frame_id
- название системы координат, относительно которой будут публиковаться координаты точек для воспроизведения анимации. Если значениеfloor
- клиент публикует статическую систему координат с названиемfloor
и настройками из раздела FLOOR_FRAME. Внимание! Убедитесь, что коптер удерживает позицию в данной системе координат. Для этого вы можете воспользоваться командой Takeoff из серверного приложения. Коптер взлетит на высотуtakeoff_height
относительно текущей.takeoff_height
- высота взлёта коптера, в метрах. Используется в начале воспроизведения анимации или при тестировании коптера с сервера.takeoff_time
- максимальное время взлёта коптера, в секундах.reach_first_point_time
- максимальное время полёта к первой точке анимации, в секундах.land_time
- время зависания в конечной точке анимации перед посадкой, в секундах.land_timeout
- время таймаута посадки, после которого происходит выключение моторов коптера, в секундах.
Данный раздел описывает смещение системы координат с названием floor
и используется только при указании параметра frame_id
как floor
в разделе COPTERS.
enabled
- логическое значение, определяет, нужно ли публиковать фреймfloor
parent
- название опорной системы координат, относительно которой будет располагаться система координатfloor
.translation
- смещение системы координатfloor
по осям (x, y, z) относительно системы координатparent
, в метрах.rotation
- поворот системы координатfloor
на углы (roll, pitch, yaw) вокруг осей (x, y, z) относительно системы координатparent
, в градусах.
Внимание! Повороты roll
, pitch
, yaw
производятся последовательно в указанном порядке.
Данный раздел описывает создание системы координат с названием gps
. Начальное положение этой системы координат лежит в точке с координатами lat
(latitude, широта), lon
(longitude, долгота). Угол поворота системы координат относительно севера задаётся значением yaw
(в градусах, по часовой стрелке). Начальная высота системы координат настраивается параметром amsl
: её можно оставить равной начальной высоте коптера (current
), либо обозначить значением высоты над уровнем моря в формате AMSL.
lat
- широта в градусах в системе WGS 84lon
- долгота в градусах в системе WGS 84yaw
- угол поворота системы координат в градусахamsl
- высота в метрах
В данном разделе настраивается обработка анимации. За обработку анимации отвечает отдельный модуль animation. При загрузке анимации на коптер модуль производит разделение последовательности кадров анимации на 5 ключевых этапов:
- Коптер неподвижен в начале анимации -
static_begin
- Коптер взлетает -
takeoff
- Коптер следует по маршруту анимации -
route
- Коптер выполняет посадку -
land
- Коптер неподвижен до завершения файла анимации -
static_end
Кадр анимации - это набор данных, необходимых для позиционирования коптера и определения цвета его подсветки. В текущей версии ПО кадр анимации представлен последовательностью чисел x y z yaw r g b
в строке .csv
файла с анимацией, где:
x
,y
,z
- координаты коптера в текущем кадре в метрахyaw
- рыскание коптера в радианахr
,g
,b
- компоненты цвета подсветки коптера, целые числа от 0 до 255
После разделения анимации на ключевые этапы модуль формирует выходную последовательность кадров, определяющих положение коптера и цвет его подсветки, а также последовательность действий при полёте к первой точке анимации. Настройка модуля производится с помощью следующих параметров:
-
start_action
- первое действие при запуске воспроизведения анимации. Доступные варианты:auto
- автоматический выбор действия междуtakeoff
(взлёт) илиfly
(мгновенный полёт по точкам) на основе текущего уровня высоты коптера. Если (z
в начальной точке анимации) > (уровень взлетаtakeoff_level
), то значение устанавливается вtakeoff
, иначе значение устанавливается вfly
.fly
- выполнение логики немедленного полётаtakeoff
- выполнение логики полёта к первой точке.
Если в файле анимации коптер взлетает с земли, при старте анимации будет применена логика немедленного воспроизведения (fly): коптер с выключенными моторами воспроизводит цвет из анимации, пока неподвижен, включает двигатели перед моментом взлёта, затем через время
arming_time
начинает следовать точкам, указанным в анимации.Если в файле анимации коптер начинает полёт в воздухе, при старте анимации будет применена логика полёта к первой точке (takeoff): коптер с выключенными моторами воспроизводит цвет из анимации, пока неподвижен, включает двигатели перед моментом взлёта, затем взлетает на высоту
takeoff_height
за времяtakeoff_time
, затем перемещается к первой точке за времяreach_first_point_time
, и затем начинает следовать точкам, указанным в анимации. -
takeoff_level
- уровень взлёта для автоматического определения первого действия коптера при старте анимации -
ground_level
- уровень земли, используется для проверки, не попытается ли коптер улететь под землю при воспроизведении анимации. Доступные варианты настройки:current
- за уровень земли принимается текущий уровень высоты коптера перед стартом.- координата z в метрах
-
check_ground
- логическое значение, определяет, нужно ли производить проверку уровня земли в анимации. -
frame_delay
- время воспроизведения одного кадра в секундах. -
yaw
- поворот коптера при полёте по точкам, в градусах. Если значениеnan
- коптер сохраняет изначальную ориентацию в полёте. Если значениеanimation
- коптер берёт поворот по yaw из файла с анимацией. -
ratio
- масштаб анимации (ratio_x, ratio_y, ratio_z) по осям (x, y, z) -
common_offset
- смещение анимации относительно текущей системы, общее для всех коптеров, в метрах. Список из 3 величин (x, y, z): каждая величина задаёт смещение по соответствующей оси. -
private_offset
- смещение анимации относительно текущей системы, только для данного коптера, в метрах. Список из 3 величин (x, y, z): каждая величина задаёт смещение по соответствующей оси. -
[[OUTPUT]]
- флаги, определяющие, какие этапы будут включены в выходную последовательность кадров.
Настройки использования светодиодной ленты на коптере. Для настройки самой ленты необходимо настроить файл led.launch
, подробная информация в статье по работе с лентой в Клевере.
use
- логическое значение, определяет, используется или нет светодиодная лента.takeoff_indication
- логическое значение, определяет, использовать ли подсветку для обозначения взлётаland_indication
- логическое значение, определяет, использовать ли подсветку для обозначения посадки
В данном разделе настраивается программа экстренной защиты коптера от потери позиции или столкновения с объектом. Модуль failsafe
при запуске предоставляет сервис /emergency_land
, его настройки находятся в следующем разделе EMERGENCY LAND.
enabled
- логическое значение, определяет, использовать или нет экстренную защиту при потере визуальной позиции или столкновении с объектом.log_state
- логическое значение, определяет, будет ли записываться в лог сервиса состояние коптера:armed: {} | mode: {} | vis_dt: {:.2f} | pos_delta: {:.2f} | pos_dt: {:.2f} | range: {:.2f} | watchdog_action: {}
.action
- действие при срабатывании экстренной защиты. Доступные варианты:land
- посадка коптера в режиме полётного контроллера AUTO.LAND,emergency_land
- посадка коптера с постепенным уменьшением мощности моторов,disarm
- выключение моторов. Внимание! Не рекомендуется использовать режим AUTO.LAND с выключенным барометром - при потере источника высоты в полёте, например показаний лазера или визуальной позиции, режим AUTO.LAND не гарантирует посадку коптера, так как ориентируется на показания высоты. Для посадки коптера при его позиционировании с использованием визуальной позиции или лазера и возможности потери данных с этих систем рекомендуется использовать режимemergency_land
.vision_pose_delay_after_arm
- время после взлёта коптера в секундах, которое требуется для получения визуальной позиции. В течение этого времени после взлёта защита по потере визуальной позиции не будет срабатывать. Этот параметр полезен при использовании модуля экстренной защиты совместно с системой позиционирования по aruco маркерам, расположенным на полу: при взлёте коптер какое-то время не имеет визуальной позиции.vision_pose_timeout
- время в секундах после потери визуальной позиции, через которое срабатывает экстренная защита.position_delta_max
- максимальная разница между текущим положением и точкой, в которой сейчас должен находиться коптер, в метрах. Требуется для проверки на столкновение коптера с объектом. Если расстояние между текущим положением коптера и положением, в котором он должен сейчас находиться, больше этого числа (в метрах), срабатывает экстренная защита.disarm_timeout
- время, через которое коптер безусловно выключает моторы после срабатывания экстренной защиты, в секундах.
Настройки параметров экстренной посадки при действии emergency_land
экстренной защиты или при вызове ROS сервиса /emergency_land
.
thrust
- начальная мощность, подаваемая на моторы в случае выбора действияemergency_land
при срабатывании экстренной защиты. Безразмерная величина, от 0 (отсутствие мошности) до 1 (полная мощность). Для гарантированной посадки рекомендуется устанавливать в значение, меньшее по величине на 5-10 процентов, чем газ висения (параметрMPC_THR_HOVER
в px4). Внимание! Неправильная настройка этого параметра может привести к взлёту коптера вверх вместо посадки!decrease_thrust_after
- время, через которое мощность на моторах плавно начинает уменьшаться в случае выбора действияemergency_land
при срабатывании экстренной защиты, в секундах.
Системные настройки служебных команд клиента
change_hostname
- логический параметр, определяет, требуется ли смена hostname при переименованииid
коптера.restart_after_rename
- логический параметр, определяет, требуется ли перезагрузка коптера при переименовании егоid
удалённо с сервера.
Помимо синхронизации времени (с миллисекундной точностью) с помощью пакета chrony, предоставляется альтернатива - возможность использования внешних (при наличии соединения локальной сети с интернетом) или внутрисетевых NTP-серверов. Внимание! Для корректной работы системы, и сервер, и клиенты должны использовать единый способ синхронизации времени (набор параметров в этом разделе). Данный раздел полностью унифицирован и для сервера, и для клиентов.
use_ntp
- определяет, будет ли использоваться синхронизация времени с помощью NTP. (при значенииFalse
будет использовано локальное время ОС (синхронизируется автоматически при использовании chrony). Рекомендуется использование chrony, а не NTPhost
- имя хоста или IP адрес NTP сервера (локального или удаленного)port
- порт, используемый NTP сервером