Skip to content

Симулятор

Симулятори дозволяють польотному коду 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

Існує також ряд Тренажерів, що підтримуються спільнотою.


Решта цієї теми - це "дещо загальний" опис того, як працює інфраструктура симуляції. Це не обовʼязково для використання симуляторів.

Всі симулятори, крім Gazebo, взаємодіють з PX4 за допомогою API симулятора MAVLink. Цей API визначає набір повідомлень MAVLink, які передають дані датчиків з модельованого світу в PX4 і повертають значення двигуна і приводу з польотного коду, які будуть застосовані до модельованого апарату. На зображенні нижче показано потік повідомлень.

Симулятор MAVLink API

SITL-збірка PX4 використовує SimulatorMavlink.cpp для обробки цих повідомлень, тоді як апаратна збірка у режимі HIL використовує mavlink_receiver.cpp. Дані датчиків з симулятора записуються в теми PX4 uORB. Всі двигуни/приводи заблоковані, але внутрішнє програмне забезпечення повністю функціонує.

Повідомлення описані нижче (див. посилання для більш детальної інформації).

ПовідомленняНапрямокОпис
MAV_MODE:MAV_MODE_FLAG_HIL_ENABLEDNAПрапорець режиму при використанні симуляції. Всі двигуни/приводи заблоковані, але внутрішнє програмне забезпечення повністю функціонує.
HIL_ACTUATOR_CONTROLSPX4 -> SimВиходи керування PX4 (до двигунів, приводів).
HIL_SENSORSim -> PX4Імітація показань IMU в одиницях СІ в рамі корпусу NED.
HIL_GPSSim -> PX4Симульоване значення датчика GPS RAW.
HIL_OPTICAL_FLOWSim -> PX4Імітація оптичного потоку від датчика потоку (наприклад, PX4FLOW або датчика оптичної миші)
HIL_STATE_QUATERNIONSim -> PX4Містить фактичне "змодельоване" положення апарату, орієнтацію, швидкість і т.д. Це може бути записано в журнал і співставлено з оцінками PX4 для аналізу і діагностики (наприклад, перевірка того, наскільки добре оцінювач працює для зашумлених (імітованих) вхідних сигналів датчика).
HIL_RC_INPUTS_RAWSim -> PX4Отримані RAW-значення каналів РК.

Безпосереднє використання PX4 Gazebo API для взаємодії з Gazebo і 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).

Огляд PX4 SITL

Різні частини системи з'єднуються через протокол 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).
  • 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 наступна:

  1. Симуляція надсилає повідомлення датчика HIL_SENSOR з міткою часу time_usec для оновлення стану та часу датчика PX4.
  2. PX4 отримує це повідомлення, виконує одну ітерацію оцінювання стану, керування тощо і врешті-решт надсилає актуатору повідомлення HIL_ACTUATOR_CONTROLS.
  3. Симуляція чекає, поки не отримає повідомлення від приводу/двигуна, потім моделює фізику і обчислює наступне повідомлення від датчика, яке знову надсилається до 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:

  1. TRIG_INTERFACE має бути встановлено у 3, щоб налаштувати драйвер тригера камери для використання з камерою MAVLink :::tip У цьому режимі драйвер просто надсилає повідомлення CAMERA_TRIGGER щоразу, коли запитується захоплення зображення. Для отримання додаткової інформації див. Камери, підключені до виходів контролера польоту. :::

  2. PX4 повинен перенаправляти всі команди камери між GCS і (симулятором) MAVLink Camera. Ви можете зробити це, запустивши MAVLink з прапором -f, як показано на малюнку, вказавши UDP-порти для нового з'єднання.

    sh
    mavlink start -u 14558 -o 14530 -r 4000 -f -m camera

    INFO

Повідомлення MAVLink пересилатимуться не лише на камеру, але камера ігноруватиме ті, які вона вважає неважливими. :::

Інші симулятори можуть використовувати такий самий підхід для реалізації підтримки камери.

Запуск симуляції на віддаленому сервері

Симулятор можна запустити на одному комп'ютері, а доступ до нього отримати з іншого комп'ютера в тій же мережі (або в іншій мережі з відповідною маршрутизацією). Це може бути корисно, наприклад, якщо ви хочете протестувати програму для безпілотника, що працює на реальному комп'ютері-компаньйоні на фоні змодельованого транспортного засобу.

Це не працює "з коробки", оскільки PX4 за замовчуванням не маршрутизує пакети на зовнішні інтерфейси (щоб уникнути спаму в мережі та втручання різних симуляцій одна в одну). Замість цього він спрямовує трафік всередину - на "localhost".

Існує декілька способів зробити UDP-пакети доступними на зовнішніх інтерфейсах, як описано нижче.

Mavlink-router можна використовувати для маршрутизації пакетів з localhost на зовнішній інтерфейс.

Ви можете маршрутизувати пакети між SITL, запущеним на одному комп'ютері (що надсилає трафік MAVLink на localhost через UDP-порт 14550), і QGC, запущеним на іншому комп'ютері (наприклад, за адресою 10.73.41.30):

  • Запустіть mavlink-router за допомогою наступної команди:

    sh
    mavlink-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 до цього сервера.