Симулятор
Симулятори дозволяють польотному коду PX4 керувати комп'ютерно змодельованим апаратом у змодельованому "світі". Ви можете взаємодіяти з цим апаратом так само, як і зі справжнім, використовуючи QGroundControl, позабортовий API або радіоконтролер/ігровий пульт.
TIP
Симуляція - це швидкий, простий, а головне, безпечний спосіб протестувати зміни в коді PX4 перед тим, як спробувати літати в реальному світі. Це також хороший спосіб почати літати з PX4, якщо у вас ще немає апарату для експериментів.
PX4 підтримує як симуляцію Software In the Loop (SITL), де польотний стек працює на комп'ютері (або на тому ж комп'ютері, або на іншому комп'ютері в тій же мережі), так і симуляцію Hardware In the Loop (HITL) з використанням симуляційної прошивки на реальній платі польотного контролера.
Інформація про доступні тренажери та способи їх налаштування наведена в наступному розділі. Інші розділи надають загальну інформацію про те, як працює симулятор, і не є обов'язковими для використання симуляторів.
Підтримувані симулятори
Наступні симулятори підтримуються основною командою розробників PX4.
Симулятор | Опис |
---|---|
Gazebo | Ми дуже рекомендуємо цей тренажер. Gazebo supersedes Gazebo Classic, з більш досконалими моделями рендерингу, фізики та сенсорів. Це єдина версія Gazebo, доступна з Ubuntu Linux 22.04. Потужне середовище 3D-симуляції, яке особливо підходить для тестування обходу перешкод та комп'ютерного зору. Він також може бути використаний для multi-vehicle simulation і зазвичай використовується з ROS, набором інструментів для автоматизації керування апаратами. Підтримувані апарати: Quad, Standard VTOL, Літак |
Gazebo Classic | Ми дуже рекомендуємо цей тренажер. Потужне середовище 3D-симуляції, яке особливо підходить для тестування обходу перешкод та комп'ютерного зору. Він також може бути використаний для multi-vehicle simulation і зазвичай використовується з ROS, набором інструментів для автоматизації керування апаратами. Підтримувані апарати: Quad (Iris, Hex (Typhoon H480), Generic Standard VTOL (QuadPlane), Tailsitter, Plane, Rover, Submarine |
Існує також ряд Тренажерів, що підтримуються спільнотою.
Решта цієї теми - це "дещо загальний" опис того, як працює інфраструктура симуляції. Це не обовʼязково для використання симуляторів.
Симулятор MAVLink API
Всі симулятори, крім Gazebo, взаємодіють з PX4 за допомогою API симулятора MAVLink. Цей API визначає набір повідомлень MAVLink, які передають дані датчиків з модельованого світу в PX4 і повертають значення двигуна і приводу з польотного коду, які будуть застосовані до модельованого апарату. На зображенні нижче показано потік повідомлень.
SITL-збірка PX4 використовує SimulatorMavlink.cpp для обробки цих повідомлень, тоді як апаратна збірка у режимі HIL використовує mavlink_receiver.cpp. Дані датчиків з симулятора записуються в теми PX4 uORB. Всі двигуни/приводи заблоковані, але внутрішнє програмне забезпечення повністю функціонує.
Повідомлення описані нижче (див. посилання для більш детальної інформації).
Повідомлення | Напрямок | Опис |
---|---|---|
MAV_MODE:MAV_MODE_FLAG_HIL_ENABLED | NA | Прапорець режиму при використанні симуляції. Всі двигуни/приводи заблоковані, але внутрішнє програмне забезпечення повністю функціонує. |
HIL_ACTUATOR_CONTROLS | PX4 -> Sim | Виходи керування PX4 (до двигунів, приводів). |
HIL_SENSOR | Sim -> PX4 | Імітація показань IMU в одиницях СІ в рамі корпусу NED. |
HIL_GPS | Sim -> PX4 | Симульоване значення датчика GPS RAW. |
HIL_OPTICAL_FLOW | Sim -> PX4 | Імітація оптичного потоку від датчика потоку (наприклад, PX4FLOW або датчика оптичної миші) |
HIL_STATE_QUATERNION | Sim -> PX4 | Містить фактичне "змодельоване" положення апарату, орієнтацію, швидкість і т.д. Це може бути записано в журнал і співставлено з оцінками PX4 для аналізу і діагностики (наприклад, перевірка того, наскільки добре оцінювач працює для зашумлених (імітованих) вхідних сигналів датчика). |
HIL_RC_INPUTS_RAW | Sim -> PX4 | Отримані RAW-значення каналів РК. |
Безпосереднє використання PX4 Gazebo API для взаємодії з Gazebo і MAVlink не потрібно.
Порти UDP PX4 MAVLink за замовчуванням
За замовчуванням PX4 використовує загальноприйняті порти UDP для зв'язку MAVLink з наземними станціями управління (наприклад, QGroundControl), позабортовими API (наприклад, MAVSDK, MAVROS) і API симуляторів (наприклад, Gazebo). Ці порти:
- Віддалений UDP-порт PX4 14550 використовується для зв'язку з наземними станціями управління. Очікується, що GCS прослуховуватиме з'єднання на цьому порту. QGroundControl слухає цей порт за замовчуванням.
- Віддалений UDP-порт PX4 14540 використовується для зв'язку з зовнішніми API. Очікується, що зовнішні API будуть чекати на з'єднання через цей порт. :::info Для симуляції декількох апаратів використовується окремий віддалений порт для кожного екземпляра, виділений послідовно від
14540
до14549
(додаткові екземпляри використовують порт14549
). ::: - Для зв'язку з PX4 використовується локальний TCP-порт симулятора 4560. Симулятор слухає цей порт, і PX4 ініціює TCP-з'єднання з ним.
Порти для GCS, зовнішніх API та симулятора визначаються скриптами запуску. Щоб дізнатися більше, див. розділ Запуск системи.
Середовище симуляції SITL
На схемі нижче показано типове середовище симуляції SITL для будь-якого з підтримуваних тренажерів, що використовують MAVLink (тобто всіх, окрім Gazebo).
Різні частини системи з'єднуються через протокол UDP і можуть працювати як на одному комп'ютері, так і на іншому комп'ютері в тій самій мережі.
PX4 використовує спеціальний модуль для підключення до локального TCP-порту 4560 симулятора. Потім симулятори обмінюються інформацією з PX4 за допомогою Симулятор MAVLink API, описаного вище. PX4 на SITL і симулятор можуть працювати як на одному комп'ютері, так і на різних комп'ютерах в одній мережі.
Симулятори також можуть використовувати міст uxrce-dds (XRCE-DDS) для безпосередньої взаємодії з PX4 (тобто через UORB topics, а не MAVLink). Цей підхід може використовуватися Gazebo Classic для моделювання кількох апаратів.
:::
- PX4 використовує звичайний модуль MAVLink для підключення до наземних станцій і зовнішніх API розробників, таких як MAVSDK або ROS
- Наземні станції слухають віддалений UDP-порт PX4:
14550
- Зовнішні API розробника слухають віддалений UDP-порт PX4:
14540
. Для симуляції декількох апаратів PX4 послідовно виділяє окремий віддалений порт для кожного екземпляра від14540
до14549
(додаткові екземпляри використовують порт14549
).
- Наземні станції слухають віддалений UDP-порт PX4:
- PX4 визначає ряд локальних UDP-портів (
14580
,18570
), які іноді використовуються при роботі в мережі з PX4, запущеним у контейнері або віртуальній машині. Вони не рекомендуються для "загального" використання і можуть змінюватися в майбутньому. - Послідовне з'єднання можна використовувати для підключення джойстика/геймпада через QGroundControl.
Якщо ви використовуєте звичайну систему побудови SITL для створення
конфігураційних цілей (див. наступний розділ), то і SITL, і симулятор будуть запущені на одному комп'ютері, і наведені вище порти будуть автоматично налаштовані. Ви можете налаштувати додаткові UDP-з'єднання MAVLink та іншим чином змінити середовище моделювання у файлах конфігурації та ініціалізації збірки.
Запуск/створення симуляції SITL
Система збірки дозволяє дуже легко зібрати і запустити PX4 на SITL, активувати симулятор і з'єднати їх. Синтаксис (спрощений) виглядає наступним чином:
sh
make px4_sitl simulator[_vehicle-model]
де simulator
- це gz
(для Gazebo), gazebo-classic
, jmavsim
або інший симулятор, а vehicle-model - це конкретний тип транспортного засобу, який підтримується цим симулятором (Gazebo та jMAVSim на момент написання статті підтримують лише мультикоптери, тоді як Gazebo Classic підтримує багато різних типів).
Нижче наведено кілька прикладів, і їх набагато більше на окремих сторінках для кожного з симуляторів:
sh
# Start Gazebo with the x500 multicopter
make px4_sitl gz_x500
# Start Gazebo Classic with plane
make px4_sitl gazebo-classic_plane
# Start Gazebo Classic with iris and optical flow
make px4_sitl gazebo-classic_iris_opt_flow
# Start JMavSim with iris (default vehicle model)
make px4_sitl jmavsim
# Start PX4 with no simulator (i.e. to use your own "custom" simulator)
make px4_sitl none_iris
Симуляцію можна додатково налаштувати за допомогою змінних середовища:
PX4_ESTIMATOR
: Ця змінна визначає, який естіматор використовувати. Можливі варіанти:ekf2
(за замовчуванням),lpe
(застаріла). Його можна встановити черезexport PX4_ESTIMATOR=lpe
перед запуском симуляції.
Описаний тут синтаксис є спрощеним, і існує багато інших опцій, які можна налаштувати за допомогою make - наприклад, вказати, що ви бажаєте під'єднатися до IDE або дебаггера. Для отримання додаткової інформації дивіться: Збірка коду > PX4 Make Build Targets.
Запуск симуляції швидше, ніж у реальному часі
SITL можна запустити швидше або повільніше, ніж у реальному часі, використовуючи jMAVSim або Gazebo Classic.
Коефіцієнт швидкості задається за допомогою змінної оточення PX4_SIM_SPEED_FACTOR
. Наприклад, запустити симуляцію jMAVSim зі швидкістю у 2 рази більшою за швидкість реального часу:
sh
PX4_SIM_SPEED_FACTOR=2 make px4_sitl jmavsim
Запустити в половину реального часу:
sh
PX4_SIM_SPEED_FACTOR=0.5 make px4_sitl jmavsim
Ви можете застосувати коефіцієнт до всіх запусків SITL у поточній сесії за допомогою EXPORT
:
sh
export PX4_SIM_SPEED_FACTOR=2
make px4_sitl jmavsim
INFO
У певний момент введення-виведення або процесор обмежать швидкість, яка можлива на вашому комп'ютері, і він буде сповільнюватися "автоматично". Потужні комп'ютери зазвичай можуть запускати симуляцію зі швидкістю близько 6-10 разів, для ноутбуків досягається швидкість близько 3-4 разів.
Щоб уникнути виявлення PX4 тайм-аутів каналу передачі даних, збільште значення параметра COM_DL_LOSS_T пропорційно до швидкості моделювання. Наприклад, якщо COM_DL_LOSS_T
дорівнює 10 в реальному часі, при 10-кратному моделюванні швидкість збільшиться до 100.
Симуляція Lockstep
PX4 SITL і симулятори (jMAVSim або Gazebo Classic) налаштовані на роботу з кроком lockstep. Це означає, що PX4 і симулятор чекають один на одного для отримання повідомлень від датчиків і приводів, а не працюють зі своїми власними швидкостями.
Lockstep дозволяє запускати симуляцію швидше або повільніше, ніж у реальному часі, а також призупиняти її для того, щоб переходити між елементами коду.
Послідовність кроків для lockstep наступна:
- Симуляція надсилає повідомлення датчика HIL_SENSOR з міткою часу
time_usec
для оновлення стану та часу датчика PX4. - PX4 отримує це повідомлення, виконує одну ітерацію оцінювання стану, керування тощо і врешті-решт надсилає актуатору повідомлення HIL_ACTUATOR_CONTROLS.
- Симуляція чекає, поки не отримає повідомлення від приводу/двигуна, потім моделює фізику і обчислює наступне повідомлення від датчика, яке знову надсилається до PX4.
Система починається з "вільного ходу", під час якого симуляція надсилає повідомлення від датчиків, зокрема про час, і, таким чином, запускає PX4, доки він не ініціалізується і не надішле відповідне повідомлення від приводу.
Вимкнення Lockstep симуляції
Lockstep симуляцію можна вимкнути, якщо, наприклад, SITL потрібно використовувати з тренажером, який не підтримує цю функцію. У цьому випадку симулятор і PX4 використовують системний час хоста і не чекають один на одного.
Щоб вимкнути lockstep у PX4, виконайте make px4_sitl_default boardconfig
і встановіть символ BOARD_NOLOCKSTEP
"Force disable lockstep", який знаходиться під панеллю інструментів.
Щоб вимкнути lockstep у Gazebo, відредагуйте файл SDF моделі і встановіть <enable_lockstep>false</enable_lockstep>
.
Щоб вимкнути lockstep у jMAVSim, видаліть -l
у sitl_run.sh або іншим чином переконайтеся, що java-двійник запускається без прапора -lockstep
.
Сценарії запуску
Scripts are used to control which parameter settings to use or which modules to start. Вони знаходяться у каталозі ROMFS/px4fmu_common/init.d-posix, файл rcS
є основною точкою входу. Докладнішу інформацію наведено у розділі Запуск системи.
Імітація збоїв та відмов датчиків/обладнання
Імітація збоїв пояснює, як викликати збої безпеки, такі як відмова GPS і розряд акумулятора.
Середовище симуляції HITL
За допомогою симуляції Hardware-in-the-Loop (HITL) звичайна прошивка PX4 запускається на реальному обладнанні. Середовище моделювання HITL задокументовано: HITL симуляція.
Інтеграція джойстиків/геймпада
QGroundControl для ПК може підключатися до USB-джойстика/геймпада і надсилати команди руху та натискання кнопок на PX4 через MAVLink. Це працює як на SITL, так і на HITL симуляціях, і дозволяє вам безпосередньо керувати симульованим апаратом. Якщо у вас немає джойстика, ви можете керувати апаратом за допомогою екранних віртуальних паличок QGroundControl.
Для отримання інформації про налаштування див. Посібник користувача QGroundControl:
Симуляція камери
PX4 підтримує захоплення як нерухомих зображень, так і відео з симулятора Gazebo Classic. Це можна ввімкнути/налаштувати, як описано в розділі Gazebo Glassic > Потокове відео.
Симуляція камери - це класичний gazebo плагін, який реалізує MAVLink Camera Protocol. . PX4 з'єднується/інтегрується з цією камерою точно так само, як і з будь-якою іншою камерою MAVLink:
TRIG_INTERFACE має бути встановлено у
3
, щоб налаштувати драйвер тригера камери для використання з камерою MAVLink :::tip У цьому режимі драйвер просто надсилає повідомлення CAMERA_TRIGGER щоразу, коли запитується захоплення зображення. Для отримання додаткової інформації див. Камери, підключені до виходів контролера польоту. :::PX4 повинен перенаправляти всі команди камери між GCS і (симулятором) MAVLink Camera. Ви можете зробити це, запустивши MAVLink з прапором
-f
, як показано на малюнку, вказавши UDP-порти для нового з'єднання.shmavlink start -u 14558 -o 14530 -r 4000 -f -m camera
INFO
Повідомлення MAVLink пересилатимуться не лише на камеру, але камера ігноруватиме ті, які вона вважає неважливими. :::
Інші симулятори можуть використовувати такий самий підхід для реалізації підтримки камери.
Запуск симуляції на віддаленому сервері
Симулятор можна запустити на одному комп'ютері, а доступ до нього отримати з іншого комп'ютера в тій же мережі (або в іншій мережі з відповідною маршрутизацією). Це може бути корисно, наприклад, якщо ви хочете протестувати програму для безпілотника, що працює на реальному комп'ютері-компаньйоні на фоні змодельованого транспортного засобу.
Це не працює "з коробки", оскільки PX4 за замовчуванням не маршрутизує пакети на зовнішні інтерфейси (щоб уникнути спаму в мережі та втручання різних симуляцій одна в одну). Замість цього він спрямовує трафік всередину - на "localhost".
Існує декілька способів зробити UDP-пакети доступними на зовнішніх інтерфейсах, як описано нижче.
Використання MAVLink Router
Mavlink-router можна використовувати для маршрутизації пакетів з localhost на зовнішній інтерфейс.
Ви можете маршрутизувати пакети між SITL, запущеним на одному комп'ютері (що надсилає трафік MAVLink на localhost через UDP-порт 14550), і QGC, запущеним на іншому комп'ютері (наприклад, за адресою 10.73.41.30
):
Запустіть mavlink-router за допомогою наступної команди:
shmavlink-routerd -e 10.73.41.30:14550 127.0.0.1:14550
Використовуйте конфігураційний файл mavlink-router.
ini[UdpEndpoint QGC] Mode = Normal Address = 10.73.41.30 Port = 14550 [UdpEndpoint SIM] Mode = Eavesdropping Address = 127.0.0.1 Port = 14550
Більш детальну інформацію про конфігурацію mavlink-router можна знайти тут.
Увімкнення трансляції UDP
Mavlink module за замовчуванням маршрутизує до localhost, але ви можете увімкнути UDP-трансляцію за допомогою його опції -p
. Будь-який віддалений комп'ютер у мережі може підключитися до симулятора, прослуховуючи відповідний порт (наприклад, 14550 для QGroundControl).
UDP-трансляція забезпечує простий спосіб встановлення з'єднання, коли в мережі працює лише одна симуляція. Не використовуйте цей підхід, якщо у мережі запущено декілька симуляцій (ви можете замість цього publish to a specific address).
Це слід зробити у відповідному конфігураційному файлі, де викликається mavlink start
. Наприклад: /ROMFS/px4fmu_common/init.d-posix/px4-rc.mavlink.
Увімкнення стрімінгу на певну адресу
Mavlink module за замовчуванням спрямовує на localhost, але ви можете вказати зовнішню IP-адресу для потокового передавання за допомогою його параметра -t
. Вказаний віддалений комп'ютер може підключитися до симулятора, прослуховуючи відповідний порт (наприклад, 14550 для QGroundControl).
Це слід зробити у різних конфігураційних файлах, де викликається mavlink start
. Наприклад: /ROMFS/px4fmu_common/init.d-posix/px4-rc.mavlink.
Тунелювання по SSH
Тунелювання SSH є гнучким варіантом, оскільки комп'ютер для моделювання та система, що його використовує, не обов'язково повинні знаходитися в одній мережі.
INFO
Ви також можете використовувати VPN для створення тунелю до зовнішнього інтерфейсу (в тій самій або іншій мережі).
Одним із способів створення тунелю є використання параметрів тунелювання SSH. Сам тунель можна створити, виконавши наступну команду на localhost, де remote.local
- ім'я віддаленого комп'ютера:
sh
ssh -C -fR 14551:localhost:14551 remote.local
UDP-пакети потрібно перетворити на TCP-пакети, щоб їх можна було перенаправляти через SSH. За допомогою утиліти netcat можна працювати по обидва боки тунелю - спочатку для перетворення пакетів з UDP в TCP, а потім назад в UDP на іншому кінці.
QGC
must be running before executing netcat.
На комп'ютері QGroundControl трансляцію UDP-пакетів можна здійснити за допомогою наступних команд:
sh
mkfifo /tmp/tcp2udp
netcat -lvp 14551 < /tmp/tcp2udp | netcat -u localhost 14550 > /tmp/tcp2udp
Команда на стороні симулятора тунелю SSH:
sh
mkfifo /tmp/udp2tcp
netcat -lvup 14550 < /tmp/udp2tcp | netcat localhost 14551 > /tmp/udp2tcp
Номер порту 14550
дійсний для підключення до QGroundControl або іншої GCS, але повинен бути скоригований для інших кінцевих точок (наприклад, API розробника тощо).
Теоретично тунель може працювати нескінченно довго, але з'єднання netcat доведеться перезапустити, якщо є якась проблема.
Скрипт QGC_remote_connect.bash можна запустити на комп'ютері QGC для автоматичного налаштування/запуску вищевказаних інструкцій. Симуляція вже має бути запущена на віддаленому сервері, і ви повинні мати доступ по SSH до цього сервера.