From 6bcf7afdae72c5aea470950fc05837d319e4d389 Mon Sep 17 00:00:00 2001 From: Arthur Golubtsov Date: Wed, 25 Dec 2019 19:10:46 +0300 Subject: [PATCH] docs: Next review of the article about server --- docs/ru/img/server-led-emergency-land.png | Bin 0 -> 16961 bytes docs/ru/server.md | 275 +++++++++++----------- 2 files changed, 144 insertions(+), 131 deletions(-) create mode 100644 docs/ru/img/server-led-emergency-land.png diff --git a/docs/ru/img/server-led-emergency-land.png b/docs/ru/img/server-led-emergency-land.png new file mode 100644 index 0000000000000000000000000000000000000000..8105c1e0cca0f58f2e5c9c169c2b10c2d3d90c0a GIT binary patch literal 16961 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 X`P}d-aV_D63q(qCYO*D-%|HAP06-d! literal 0 HcmV?d00001 diff --git a/docs/ru/server.md b/docs/ru/server.md index 691de8e..d7a1717 100644 --- a/docs/ru/server.md +++ b/docs/ru/server.md @@ -1,3 +1,131 @@ +# Сервер + +* [Интерфейс](#интерфейс-сервера) +* [Настройка](#настройка-сервера) +* [Дополнительные операции](#дополнительные-операции) + +# Интерфейс сервера + +Сервер имеет визуальный графический интерфейс для удобства взаимодействия. + +![Интерфейс сервера](img/server_gui.png) + +## Таблица состояния коптеров + +При первом подключении клиента к серверу в таблицу добавляется строка для отображения состояния клиента, содержащая только имя клиента (`copter ID`). Если на клиентах настроена автоматическая передача телеметрии, данные в таблице будут обновляться автоматически. Строки можно сортировать по возрастанию или убыванию значений любого из столбцов, кликнув по его заголовку. + +Ячейки таблицы подсвечиваются: + +* жёлтым, если необходимое значение отсутствует +* красным, если данные в ячейке не прошли проверку +* зелёным, если данные в ячейке прошли проверку + +Коптер считается **готовым к воспроизведению анимации**, если все ячейки в строке прошли проверку и подсвечены зелёным. + +Коптер считается **готовым к полёту**, если все ячейки в строке, кроме `animation ID` и `dt`, прошли проверку и подсвечены зелёным. + +### Столбцы таблицы + +* `copter ID` - имя клиента. Может быть сконфигурирован на стороне клиента. Отображается сразу при подключении клиента. Рядом с каждым ID коптера расположен чекбокс - коптеры, чей ID отмечен чекбоксом положительно (галочка), считаются *выбранными*. Ячейки в этом столбце всегда проходят проверку. +* `version` - хеш-код текущей git версии клиента. Ячейки в этом столбце всегда проходят проверку. +* `animation ID` - внутреннее название файла анимации, подгруженного клиентом. Ячейка в данном столбце не проходит проверку, если анимация отсутствует (значение `No animation`). В остальных случаях, если ячейка не пустая, она проходит проверку. **Внимание!** Проверьте соответствие названий файлов анимаций у коптеров перед запуском. +* `battery` - значение напряжения на аккумуляторе коптера в вольтах и заряд в процентах по данным полётного контроллера. Ячейка в данном столбце проходит проверку, если значение заряда батареи выше значения [battery_percentage_min](###раздел-checks), задаваемого в настройках сервера. В остальных случаях, если ячейка не пустая, она не проходит проверку. +* `system` - состояние полётного контроллера. Ячейка в данном столбце проходит проверку, если её значение `STANDBY`. В остальных случаях, если ячейка не пустая, она не проходит проверку. +* `sensors` - состояние калибровки компаса, акселлерометра и гироскопа полётного контроллера. Ячейка в данном столбце проходит проверку, если её значение `OK`. В остальных случаях, если ячейка не пустая, она не проходит проверку. +* `mode` - режим полётного контроллера. Ячейка в данном столбце не проходит проверку, если её значение `NO_FCU` или содержит `CMODE`. В остальных случаях, если ячейка не пустая, она проходит проверку. +* `checks` - состояние самодиагностики коптера. Ячейка в данном столбце проходит проверку, если её значение `OK`. В остальных случаях, если ячейка не пустая, она не проходит проверку. +* `current x y z yaw frame_id` - текущее положение коптера с указанием названия системы координат. Ячейка в данном столбце не проходит проверку, если её значение `NO_POS` или содержит `nan`. В остальных случаях, если ячейка не пустая, она проходит проверку. +* `start x y z` - стартовое положение коптера для воспроизведения анимации. Ячейка в данном столбце не проходит проверку, если её значение `NO_POS` или разница между текущим и стартовым положением коптера больше значения [start_pos_delta_max](###раздел-checks). В остальных случаях, если ячейка не пустая, она проходит проверку. +* `dt` - разница между временем на сервере и клиенте в секундах, включая сетевую задержку. Ячейка в данном столбце проходит проверку, если её значение меньше значения [time_delta_max](###раздел-checks), задаваемого в настройках сервера. В остальных случаях, если ячейка не пустая, она не проходит проверку. При слишком больших значениях сигнализирует об отсутствии синхронизации времени между коптером и клиентом. + +## Меню + +### Раздел 'Server' + +![Скриншот раздела Server](img/server-server.png) + +Данный раздел содержит несколько утилит по отправке различных данных на *выбранные* клиенты. **Внимание!** Не используйте данные команды во время полёта коптеров! +* `Send Animations` - отправка файлов анимации, экспортированных аддоном к Blender, на выбранные коптеры. В диалоговом окне необходимо выбрать *папку*, содержащую файлы анимации. Каждый файл анимации будет отправлен на клиент с именем, соответствующим имени файла без расширения. +* `Send Configurations` - отправка *единого* файла конфигурации клиента на все выбранные клиенты. В диалоговом окне необходимо выбрать *один* файл конфигурации в установленном формате. Файл конфигурации может быть неполным, в таком случае будут перезаписаны лишь указанные в файле параметры. **Внимание!** Не рекомендуется использовать данное действие для массовой перезаписи `copter ID`, кроме значения `/hostname`. **Внимание!** НЕ отправляйте на клиенты файл конфигурации сервера. +* `Send Launch files ` - отправка launch-файлов конфигурации сервиса `clever`. В диалоговом окне необходимо выбрать *папку*, содержащую файлы конфигурации с сширением `.launch`. Все файлы с таким расширением будут отправлены *на каждый* из клиентов. **Внимание!** Существующие файлы конфигурации на коптерах будут перезаписаны, однако файлы, не отправленные сервером, не будут удалены или модифицированы. +* `Send Aruco map` - отправка *единого* файла карты aruco маркеров на все выбранные клиенты. В диалоговом окне необходимо выбрать *один* файл карты в установленном формате. Файл на клиенте будет перезаписан. После получения и записи файла клиент автоматически перезапустит сервис `clever`. Для возобновления работоспособности полётных функций и получения некоторых значений телеметрии *необходимо подождать* некоторое время до полного запуска сервиса. +* `Send Camera Calibrations` - отправка yaml-файлов калибровки камеры для сервиса `clever`. В диалоговом окне необходимо выбрать *папку*, содержащую файлы конфигурации с расширением `.yaml`. Каждый файл калибровки будет отправлен на клиент с именем (copter ID), соответствующим имени файла без расширения. **Внимание!** Существующий файл калибровки на коптере будет перезаписан. +* `Send FCU parameters` - отправка и запись *единого* файла конфигураций полётного контроллера (FCU) на все выбранные клиенты. В диалоговом окне необходимо выбрать *один* файл параметров в установленном формате. Параметры на полётном контроллере будут перезаписаны. +* `Developer mode`: **Внимание!** Используйте данные действия с большой осторожностью. + * `Send any file` - отправка *одного* любого файла на все выбранные клиенты. В диалоговом окне необходимо выбрать *один* файл. Далее, необходимо указать путь, по которому данный файл будет записан на клиенты (не включая имя файла). + * `Send any command` - отправка и выполнение любой команды терминала на все выбранные клиенты. В диалоговом окне необходимо ввести требуемую команду. Команды *могут* использовать `sudo`-права. +* `Select all drones` (`Ctrl+A`) - выделяет все коптеры в таблице. При следующем вызове команды, выделение всех коптеров будет отменено. + +### Раздел 'Drone' + +![Скриншот раздела Drone](img/server-drone.png) + +* `Set Z offfset to ground` - устанавливает собственный отступ по Z каждого из выбранных клиентов в значение, равное текущему положению по координате Z. Можно применять для выравнимания общей высоты полёта коптеров. +* `Reset Z offfset` - устанавливает собственный отступ по Z каждого из выбранных клиентов в значение `0` +* `Restart chrony` - перезапускает сервис синхронизации времени `chrony` на выбранных клиентах. Используйте для ручной синхронизации в случаях, если время между сервером и клиентами не синхронихированно. +* `Remove from table` - удаляет выбранные коптеры из таблицы. **Внимание!** В случае, если клиент был подключен, будет произведено отключение. В случае если удалённый таким образом клиент исправно функционировал, он переподключится в кратчайшие сроки. +* `Developer mode`: **Внимание!** Используйте данные действия с большой осторожностью. + * `Restart clever service` - перезапускает сервис `clever` на выбранных клиентах. Для возобновления работоспособности полётных функций и получения некоторых значений телеметрии *необходимо подождать* некоторое время до полного запуска сервиса. + * `Restart clever-show service` - перезапускает сервис шоу коптеров `clever-show` на выбранных клиентах. Во время перезапуска клиенты будут отключены. + * `Update clever-show git` - обновляет папку репозитория `clever-show` на выбранных клиентах. Файлы конфигурации клиента *не будут* перезаписаны. **Внимание!** Для того, чтобы изменения вступили в силу, *необходимо* перезапустить сервис `clever-show`. + * `Reboot all` - полностью перезагружает полётный контроллер и компьютер на выбранных коптерах. Во время перезапуска клиенты будут отключены. + +### Раздел 'Animation' + +![Скриншот раздела Animation](img/server-animation.png) + +- `Set start X Y to current position` - устанавливает точку старта анимации у выбранных клиентов в значения текущей позиции по X Y. +- `Reset start position` - устанавливает точку старта анимации у выбранных клиентов в значения `0.0`, `0.0`. + +### Раздел 'Music' + +![Скриншот раздела Music](img/server-music.png) + +- `Select music file` - загружает выбранный музыкальный файл для дальнейшего воспроизведения вручную или через определённое время после старта анимации. Поддерживаемые расширения: `.mp3` или `.wav`. +- `Play music` - воспроизводит загруженную музыку. + +- `Stop music` - останавливает воспроизведение проигрываемой музыки. + +## Боковая панель команд + +![Скриншот боковой панели](img/server_sidemenu.png) + +### Управление + +Данный раздел команд предназначен для выскоуровневого управления роем дронов. + + * Спинбокс `Start after` - задаёт время задержки синхронного запуска выполнения анимаций коптерами после нажатия на кнопку `Start animation`. Для загруженных, подверженных помехам или имеющих большой пинг сетей рекомендуется использовать значения больше нуля. + * Спинбокс `Music after` - задаёт время задержки запуска музыки после нажатия на кнопку `Start animation`. + * Чекбокс `Play music ` - определяет, будет ли воспроизведена музыка при запуске анимации. + * Кнопка `Preflight check` - все выбранные клиенты выполняют самодиагностику и предполётную проверку. Результаты, вместе с другими параметрами клиента, будут отображены в таблице по мере поступления данных. Необходима в том случае, если на клиенте не настроена автоматическая передача телеметрии. + * Кнопка `Start animation` - посылает время старта анимации на все выбранные коптеры с учётом заданного в спинбоксе `Start after` времени. Все выбранные коптеры начинают синхронное воспроизведение анимации после нажатия на данную кнопку и через время, заданное в спинбоксе `Start after`. По окончанию анимации все коптеры выполнят посадку на месте окончания своей анимации. Кнопка активна только в том случае, если все коптеры готовы к воспроизведению анимации. При нажатии запрашивается дополнительное предупреждение. + * `Pause/Resume` - ставит на паузу и возобновляет выполнение полётных задач. После каждого нажатия кнопка меняет состояние на обратное. + * Состояние`Pause` - ставит на паузу очередь заданий всех выбранных коптеров: приостанавливается выполнение любого полётного задания. Рекомендуется использовать в чрезвычайных ситуациях для определения неисправного коптера. **Внимание!** Данная команда НЕ прерывает полёт коптера в уже указанную точку (например: элементы взлёта, посадки; следование до начальной точки анимации и т.д.) + * Состояние `Resume` - все выбранные коптеры *синхронизированно* продолжат выполнение своих очередей заданий (например исполнение анимации) + * Кнопка `Stop and land all` - прерывает выполнение полётных заданий *ВСЕХ* подключенных коптеров. Сбрасывает очередь заданий - *действие необратимо*. Выполняет полную остановку и немедленную посадку коптеров. **Используйте в экстренных случаях как одно из средств перехвата.** + * Кнопка `Emergency land` - открывает диалоговое окно дополнительного модуля быстрого выбора коптера и его последующей экстренной посадки или дизарма. *Полное описание в конце статьи.* + * Кнопка `Disarm selected` - все выбранные коптеры прекращают выполнение своих полётных заданий, очищают очередь заданий и немедленно отключают моторы. Это может привести к падению и повреждению коптеров. + * Кнопка `Disarm ALL` - ВСЕ коптеры прекращают выполнение своих полётных заданий, очищают очередь заданий и немедленно отключают моторы. Это может привести к падению и повреждению коптеров **Используйте в крайних случаях как последнее из средств перехвата.** + +### Тестовые команды + +В данном разделе находятся команды, позволяющие напрямую управлять коптерами для их проверки. + + * Кнопка `Test leds` - все выбранные коптеры выполняют двухсекундную анимацию (бегущие точки) светодиодной лентой (белым цветом). Команда *безопасна* и может быть использована для проверки работы светодиодных лент, качества и задержки подключения к серверу или определения соответствия коптера и его `copter ID` в таблице. + * Кнопка `Takeoff` - все выбранные коптеры совершают вертикальный взлёт, после чего зависают над точкой взлёта. Кнопка активна, *только* если все выбранные коптеры готовы к полёту. **Внимание!** Используйте осторожно, соблюдайте технику безопасности. Не применяйте во время выполнения других полётных функций! + * Чекбокс `Z` - если чекбокс активен, коптер взлетит в указанное значение по `z`. Иначе коптерами будут использоваться значения по умолчанию, указанные в их конфигурациях, а взлёт будет производиться относительно текущей высоты. + * Спинбокс `Z` - задаёт значение координаты `z` взлёта коптеров в метрах. + * Кнопка `Flip` - все выбранные коптеры **совершают флип (flip)** - переворот на 360 градусов вокруг одной из *горизонтальных* осей. **Внимание!** Используйте осторожно, соблюдайте технику безопасности. **Внимание!** Для исполнения флипа коптер должен иметь минимальную высоту больше 2м. **Внимание!** Не применяйте во время выполнения других полётных функций! + * Кнопка `Land` - все выбранные коптеры прекращают выполнение своих полётных заданий, очищают очередь заданий и немедленно переходят в режим посадки. **Используйте в экстренных случаях как одно из средств перехвата.** + +### Системные команды + +В данном разделе находятся команды, исполняемые непосредственно на полётном контроллере коптера. + +- Кнопка `Reboot FCU` - перезагружает полётные контроллеры всех выбранных коптеров. Можно использовать для обновления поворота коптера при его определении только с помощью инерциальной системы коптера, например при полёте по системе позиционирования Pozyx или с помощью Optical Flow. Для возобновления работоспособности полётных функций и получения некоторых значений телеметрии *необходимо подождать* некоторое время до перезагрузки полётного контроллера. +- Кнопка `Calibrate gyro` - переводит полётные контроллеры всех выбранных коптеров в режим калибровки гироскопа. **Внимание!** Коптеры должны быть неподвижны в течение калибровки. +- Кнопка `Calibrate level` - переводит полётные контроллеры всех выбранных коптеров в режим калибровки уровня горизонта. **Внимание!** Коптеры должны быть неподвижны в течение калибровки. + # Настройка сервера ## Файл конфигурации @@ -28,7 +156,7 @@ port = 123 Конфигурация по умолчанию является полностью работоспособной и не требует изменений для быстрого начала работы системы. -### Раздел [SERVER] +### Раздел SERVER В этом разделе задаются параметры сетевого взаимодействия сервера. Доступны следующие параметры: @@ -36,7 +164,7 @@ port = 123 * `buffer_size` - размер буфера при приёме и передаче данных. *Не рекомендуется изменять. Рекомендуется использовать единое значение у сервера и клиентов.* * `remove_disconnected` - Определяет поведение при разрыве связи с клиентом. При значении `True` вся информация о клиенте *будет удалена* как из внутренней памяти, так и *из таблицы*. *Это может привести к 'скачкам' таблицы при отключении клиентов.* При значении `False` отключённые клиенты *не будут* удалены из таблицы, но будут отображены с подсвечиванием ячейки в столбце `copter ID` красным цветом. Все данные будут сохранены. При переподключении клиента, он будет ассоциирован с той же строкой таблицы, а ячейка со значением `copter ID` вновь станет зелёного цвета. -### Раздел [CHECKS] +### Раздел CHECKS В этом разделе задаются параметры проверок коптера, которые регулируются на стороне сервера. Доступны следующие параметры: @@ -44,7 +172,7 @@ port = 123 * `start_pos_delta_max` - Максимальное расстояние от текущего положения коптера до его точки взлёта в файле анимации, допустимое для взлёта. Указывается *в метрах* (дробное значение от 0 до 'inf'). Значение больше указанного будет отмечено в столбце `start x y z` как неудовлетворительное. Допустимо использование строки 'inf' для любого допустимого расстояния. * `time_delta_max` - Максимальная разница (абсолютное значение) между временем сервера и клиента (включая сетевую задержку), допустимая для взлёта. Указывается *в секундах* (дробное значение от 0 до 'inf'). Значение больше указанного будет отмечено в столбце `dt` как неудовлетворительное. -### Раздел [BROADCAST] +### Раздел BROADCAST Сервер может использовать UDP broadcast, чтобы передавать клиентам актуальную информацию о конфигурации сервера. Таким образом становится возможным автоматическое подключение клиентов к серверу без необходимости дополнительной ручной конфигурации. В данном разделе задаются параметры этого механизма: @@ -52,140 +180,25 @@ port = 123 * `broadcast_port` - UDP порт, по которому будет осуществляться отправка сообщений. *Рекомендуется изменить значение по умолчанию в целях безопасности.* **Внимание!** При изменении этого параметра клиенты НЕ смогут принимать сообщения автоконфигурации до изменения (вручную) соответствующего параметра в конфигурации клиента на равное значение. * `broadcast_delay` - периодичность (в секундах, целочисленное значение), с которой будет происходить отправка broadcast сообщений. Увеличьте задержку для уменьшения нагрузки на сеть. Уменьшите задержку для уменьшения времени отклика и подключения при первом запуске клиентов. - ### Раздел [NTP] + ### Раздел NTP - Помимо синхронизации времени (с миллисекундной точностью) с помощью пакета chrony, предоставляется альтернатива - возможность использования внешних (при наличии соединения локальной сети с интернетом) или внутрисетевых NTP-серверов. **Внимание!** Для корректной работы системы, и сервер, *и* клиенты должны использовать единый способ синхронизации времени (набор параметров в этом разделе). Данный раздел полностью унифицирован и для сервера, и для клиентов. + Помимо синхронизации времени (с миллисекундной точностью) с помощью пакета chrony, предоставляется альтернатива - возможность использования внешних (при наличии соединения локальной сети с интернетом) или внутрисетевых NTP-серверов. **Внимание!** Для корректной работы системы, **и сервер, и клиенты** должны использовать единый способ синхронизации времени (набор параметров в этом разделе). Данный раздел полностью унифицирован и для сервера, и для клиентов. * `use_ntp` - Определяет, будет ли использоваться синхронизация времени с помощью NTP. (при значении `False` будет использовано локальное время ОС (синхронизируется автоматически при использовании chrony). *Рекомендуется использование chrony, а не NTP* * `host` - имя хоста или IP адрес NTP сервера (локального или удаленного) * `port` - порт, используемый NTP сервером -# Интерфейс сервера +# Дополнительные операции -Сервер имеет визуальный графический интерфейс для удобства взаимодействия. +## Emergency land -![Интерфейс сервера](img/server_gui.png) +Модуль визуальной экстренной посадки, предназначенный для быстрого поиска оператором визуально неисправного коптера методом бинарного поиска. Для успешного применения на всех коптерах должна быть установлена светодиодная лента. -## Глоссарий - -Некоторые термины, используемые для краткости записи: -* Удовлетворительный - прошедший проверку определённых условий. В таблице отмечается зелёным цветом. -* Готовый к полёту: прошедший предполётную проверку и имеющий удовлетворительные результаты по всем столбцам, кроме `animation ID` и `dt`. -* Готовый к воспроизведению анимации: прошедший предполётную проверку и имеющий удовлетворительные результаты по всем столбцам. -* FCU - Flight Controller Unit, полётный контроллер. - -## Меню - -### Раздел 'Server' - -![Скриншот меню](img/server-server.png) - -Данный раздел содержит несколько утилит по отправке различных данных на *выбранные* клиенты. **Внимание!** Не пытайтесь использовать данные команды во время полёта коптеров! -* `Send Animations` - отправка файлов анимации (экспортированных аддоном к Blender) на выбранные клиенты (коптеры). В диалоговом окне необходимо выбрать *папку*, содержащую файлы анимации (автоматически создается аддоном). Каждый файл анимации будет отправлен на клиент с именем (copter ID), соответствующим имени файла без расширения. -* `Send Configurations` - отправка *единого* файла конфигурации клиента на все выбранные клиенты. В диалоговом окне необходимо выбрать *один* файл конфигурации в установленном формате. Файл конфигурации может быть неполным, в таком случае будут перезаписаны лишь указанные в файле параметры. *Не рекомендуется использовать данное действие для массовой перезаписи* `Copter ID` *, кроме значения `/hostname`.* **Внимание!** НЕ отправляйте на клиенты файл конфигурации сервера. -* `Send Launch files ` - отправка launch-файлов конфигурации сервиса `clever`. В диалоговом окне необходимо выбрать *папку*, содержащую файлы конфигурации с сширением `.launch`. Все файлы с таким расширением будут отправлены *на каждый* из клиентов. **Внимание!** Существующие файлы конфигурации на коптерах будут перезаписаны, однако файлы, не отправленные сервером, не будут удалены или модифицированы. -* `Send Aruco map` - отправка *единого* файла карты aruco маркеров на все выбранные клиенты. В диалоговом окне необходимо выбрать *один* файл карты в установленном формате. Файл на клиенте будет перезаписан. После получения и записи файла клиент автоматически перезапустит сервис `clever`. Для возобновления работоспособности полётных функций и получения некоторых значений телеметрии *необходимо подождать* некоторое время до полного запуска сервиса. -* `Send Camera Calibrations` - отправка yaml-файлов калибровки камеры для сервиса `clever`. В диалоговом окне необходимо выбрать *папку*, содержащую файлы конфигурации с расширением `.yaml`. Каждый файл калибровки будет отправлен на клиент с именем (copter ID), соответствующим имени файла без расширения. **Внимание!** Существующий файл калибровки на коптере будет перезаписан. -* `Send FCU parameters` - отправка и запись *единого* файла конфигураций полётного контроллера (FCU) на все выбранные клиенты. В диалоговом окне необходимо выбрать *один* файл параметров в установленном формате. Параметры на полётном контроллере будут перезаписаны. -* `Developer mode`: **Внимание!** Используйте данные действия с большой осторожностью. - * `Send any file` - отправка *одного* любого файла на все выбранные клиенты. В диалоговом окне необходимо выбрать *один* файл. Далее, необходимо указать путь, по которому данный файл будет записан на клиенты (не включая имя файла). - * `Send any command` - отправка и выполнение любой команды терминала на все выбранные клиенты. В диалоговом окне необходимо ввести требуемую команду. Команды *могут* использовать `sudo`-права. -* `Select all drones` (`Ctrl+A`) Выделяет все коптеры в таблице. При следующем вызове команды, выделение всех коптеров будет отменено. - -### Раздел 'Drone' - -![Скриншот раздела](img/server-drone.png) - -* `Set Z offfset to ground` - Устанавливает собственный offset (отступ) каждого из выбранных клиентов на значение, равное текущему положению по координате Z -* `Reset Z offfset` - Устанавливает собственный offset (отступ) каждого из выбранных клиентов на значение `0` -* `Restart chrony` - Перезапускает сервис синхронизации времени `chrony` на выбранных клиентах. -* `Remove from table` - Удаляет выбранные коптеры из таблицы. **Внимание!** В случае, если клиент был подключен, будет произведено отключение. В случае если удалённый таким образом клиент исправно функционировал, он переподключится в кратчайшие сроки. -* `Developer mode`: **Внимание!** Используйте данные действия с большой осторожностью - * `Restart clever service` - Перезапускает сервис `clever` на выбранных клиентах. Для возобновления работоспособности полётных функций и получения некоторых значений телеметрии *необходимо подождать* некоторое время до полного запуска сервиса. - * `Restart clever-show service` - Перезапускает сервис шоу коптеров (клиента) `clever-show` на выбранных клиентах. Во время перезапуска клиенты будет отключены. - * `Update clever-show git` - Обновляет папку репозитория `clever-show` на выбранных клиентах. Файлы конфигурации клиента *не будут* перезаписаны. **Внимание!** Для того, чтобы изменения вступили в силу, *необходимо* перезапустить сервис `clever-show`. - * `Reboot all` - Полностью перезагружает систему выбранных клиентов. Во время перезапуска клиенты будет отключены. - -### Раздел 'Animation' - -![Скриншот раздела](img/server-animation.png) - -- `Set start X Y to current position` - Устанавливает точку старта анимации у выбранных клиентов на значения текущей позиции по X Y. -- `Reset start position` - Устанавливает точку старта анимации у выбранных клиентов на значения `0.0`, `0.0`. - -### Раздел 'Music' - -![Скриншот раздела](img/server-music.png) - -- `Select music file` - Загружает выбранный музыкальный файл (поддерживаемые расширения: `.mp3`, `.wav`) для дальнейшего воспроизведения вручную или через определённое время после старта анимации. -- `Play music` - Воспроизводит загруженную музыку. - -- `Stop music` - Останавливает воспроизведение проигрываемой музыки. - - - -## Боковая панель инструментов (команд) -![](img/server_sidemenu.png) - -### Управление - -Данный раздел команд предназначен для выскоуровневого управления роем дронов. - - * Спинбокс `Start after` - Задаёт время задержки синхронного запуска выполнения анимаций коптерами после нажатия на кнопку `Start animation`. Для загруженных\подверженных помехам\имеющих большой пинг сетей рекомендуется использовать значения больше нуля. - * Спинбокс `Music after` - Задаёт время задержки запуска музыки после нажатия на кнопку `Start animation`. - * Чекбокс `Play music ` - Определяет, будет ли воспроизведена музыка при запуске анимации. - * Кнопка `Preflight check` - Все выбранные клиенты выполняют самодиагностику и предполётную проверку. Результаты, вместе с другими параметрами клиента, будут отображены в таблице по мере поступления данных. Необходима в том случае, если на клиенте не настроена автоматическая передача телеметрии. - * Кнопка `Start animation` - По истечению заданного в спинбоксе `Start after` времени, все выбранные коптеры начинают синхронное воспроизведение анимации. По окончанию анимации все коптеры выполнят посадку *на месте окончания своей анимации*. Кнопка активна только в том случае, если все коптеры готовы к воспроизведению анимации. При нажатии запрашивается дополнительное предупреждение. - * `Pause/Resume` - Позволяет ставить на паузу и возобновлять выполнение полётных задач. После каждого нажатия кнопка меняет состояние на обратное. - * Состояние`Pause` - Ставит на паузу очередь заданий всех выбранных коптеров: приостанавливается выполнение любого полётного задания. Рекомендуется использовать в чрезвычайных ситуациях для определения неисправного коптера. **Внимание!** Данная команда НЕ прерывает полёт коптера в уже указанную точку (например: элементы взлёта, посадки; следование до начальной точки анимации и т.д.) - * Состояние `Resume` - Все выбранные коптеры *синхронизированно* продолжат выполнение своих очередей заданий (например исполнение анимации) - * Кнопка `Stop and land all` - Прерывает выполнение полётных заданий *ВСЕХ* подключенных коптеров. Сбрасывает очередь заданий - *действие необратимо*. Выполняет полную остановку и немедленную посадку коптеров. **Используйте в экстренных случаях как одно из средств перехвата.** - * Кнопка `Emergency land` - Открывает диалоговое окно дополнительного модуля быстрого выбора коптера и его последующей экстренной посадки \ дизарма. *Полное описание в конце статьи.* - * Кнопка `Disarm selected` - все выбранные коптеры прекращают выполнение своих полётных заданий, очищают очередь заданий и немедленно *отключают моторы (disarm).* Это может привести к падению и повреждению коптеров. - * Кнопка `Disarm ALL` - ВСЕ коптеры прекращают выполнение своих полётных заданий, очищают очередь заданий и немедленно *отключают моторы (disarm).* Это может привести к падению и повреждению коптеров **Используйте в крайних случаях как последнее из средств перехвата.** - -### Полётные функции (команды) - -В данном разделе находятся команды, позволяющие напрямую управлять коптером(ами). - * Кнопка `Test leds` - Все выбранные коптеры выполняют двухсекундную анимацию (бегущие точки) светодиодной лентой (белым цветом). Команда *безопасна* и может быть использована для проверки работы светодиодных лент \ качества и задержки подключения к серверу \ определения соответствия коптера и его `Copter ID` в таблице. - * Кнопка `Takeoff` - Все выбранные коптеры **совершают вертикальный взлёт**, после чего зависают над точкой взлёта. Кнопка активна, *только* если все выбранные коптеры готовы к полёту. **Внимание!** Используйте осторожно, соблюдайте технику безопасности. Не применяйте во время выполнения других полётных функций! - * Чекбокс `Z` - Если чекбокс активен, коптер взлетит в указанное значение по `z`. Иначе коптерами будут использоваться значения по умолчанию, указанные в их конфигурациях, а взлёт будет производиться относительно текущей высоты. - * Спинбокс`Z` - Задаёт значение координаты `z` взлёта коптеров в метрах. - * Кнопка `Flip` - Все выбранные коптеры **совершают флип (flip)** - переворот на 360 градусов вокруг одной из *горизонтальных* осей. **Внимание!** Используйте осторожно, соблюдайте технику безопасности. *Для исполнения флипа коптер должен иметь минимальную высоту >2м.* Не применяйте во время выполнения других полётных функций! - * Кнопка `Land` - Все выбранные коптеры прекращают выполнение своих полётных заданий, очищают очередь заданий и немедленно *переходят в режим посадки.* **Используйте в экстренных случаях как одно из средств перехвата.** - -### Системные команды - -- Кнопка `Reboot FCU` - перезагружает полётные контроллеры всех выбранных коптеров. Для возобновления работоспособности полётных функций и получения некоторых значений телеметрии *необходимо подождать* некоторое время до перезагрузки полётного контроллера. -- Кнопка `Calibrate gyro` - переводит полётные контроллеры всех выбранных коптеров в режим калибровки гироскопа. Коптеры должны быть неподвижны в течение калибровки. -- Кнопка `Calibrate level` - переводит полётные контроллеры всех выбранных коптеров в режим калибровки уровня горизонта. Коптеры должны быть неподвижны в течение калибровки. - -## Таблица состояния коптеров (клиентов) -При первом подключении клиента к серверу в таблицу добавляется строка для отображения состояния клиента, содержащая начальные данные, переданные клиентом при подключении (`Copter ID`). Строки можно сортировать по возрастанию \ убыванию значений любого из столбцов (кликнув по заголовку столбца). - -Ячейки таблицы подсвечиваются: -* жёлтым, если необходимое значение отсутствует -* красным, если значение (состояние) ячейки неудовлетворительно (согласно внутренним проверкам) -* зелёным, если значение (состояние) ячейки удовлетворительно (согласно внутренним проверкам) - -### Столбцы таблицы -* `copter ID` - идентификатор клиента. Может быть сконфигурирован на стороне клиента. Отображается сразу при подключении клиента. Рядом с каждым ID коптера расположен чекбокс - коптеры, чей ID отмечен чекбоксом положительно (галочка), считаются *выбранными*. -* `version` - хеш-код текущей git версии клиента. -* `animation ID` - внутреннее название файла анимации, подгруженного клиентом. Отображается после выполнения `selfcheck`. *Проверьте соответствие названий файлов анимаций у коптеров перед запуском.* -* `battery V` - абсолютное значение напряжения на аккумуляторе коптера в вольтах по данным полётного контроллера. *Убедитесь, что напряжение не ниже порогового для вашего аккумулятора.* **При критически низком значении коптер считается не готовым** - блокируется возможность взлёта и старта анимации. -* `battery %` - относительное значение напряжения на аккумуляторе коптера. Значение рассчитывается по среднему напряжению (по данным полётного контроллера) на ячейку аккумулятора (банку). *Убедитесь, что уровень заряда перед вылетом не менее установленного в настройках сервера.* **При критически низком значении коптер считается не готовым** - блокируется возможность взлёта и старта анимации. -* `checks` - Все дополнительные сообщения и ошибки при самодиагностике (*Смотреть далее.*). При успешном прохождении самодиагностики без ошибок выводится значение `OK`, ячейка подсвечивается зелёным цветом. **При наличии ошибок коптер считается не готовым** - блокируется возможность взлёта и старта анимации. -* `time delta` - Разница между временем на сервере и клиенте (в секундах). *При слишком больших значениях сигнализирует об отсутствии синхронизации времени между коптером и клиентом!* В это значение так же входит сетевая задержка. - -# Дополнительные операции [TODO] -## Selfcheck -.. - -## Emergency land {: #emergency-land } -Модуль экстренной посадки/дизарма, предназначенный для быстрого поиска оператором визуально неисправного коптера методом бинарного поиска ### Интерфейс -* Зелёная кнопка `1` - ... -* Красная кнопка `2` - ... -* Кнопка `Land` - все коптеры в выбранной ('зелёной') группе совершат процедуру экстренной посадки (аналогично кнопке `Land` в панели инструментов). -* Кнопка `Disarm` - все коптеры в выбранной ('зелёной') группе *немедленно отключают моторы (disarm).* (аналогично кнопке `Disarm` в панели инструментов) ==Это может привести к падению и повреждению коптеров==. -### Алгоритм использования -* ... + +![LED Emergency Land](img/server-led-emergency-land.png) + +При нажатии на кнопку `Emergency land` все коптеры делятся на 2 равные группы по порядку расположения в таблице. Первая половина коптеров зажигает светодиодную ленту зелёным цветом, вторая - красным. При нажатии на зелёную или красную кнопку происходит выбор группы, соответствующей цвету нажатой кнопки. Коптеры выбранного цвета снова делятся на две половины и каждая половина зажигает светодиодную ленту зелёным и красным цветом соответственно. Остальные коптеры выключают светодиодную ленту. + +Нажимая на кнопки, соответствующие цвету группы, в которой находится неисправный коптер, можно определить его номер и выполнить экстренную посадку за логорифмическое количество шагов от количества коптеров, т.е. гораздо быстрее, чем перебирая коптеры по одному. + +На любом шаге можно произвести посадку или выключение моторов всех коптеров, на которых включена светодиодная лента, нажав кнопку `Land` или `Disarm`.