Skip to content

Симуляція Gazebo Classic

WARNING

Gazebo Classic підтримується з PX4 аж до Ubuntu Linux 20.04. Він був замінений Gazebo (раніше відомий як "Gazebo Ignition") для використання на Ubuntu 22.04 і новіше.

Gazebo Classic - це потужне середовище 3D симуляції для автономних систем яке зокрема підходить для перевірки уникання об'єктів та комп'ютерного зору. Ця сторінка описує її використання з SITL та єдиним рухомим засобом. Gazebo Classic також може бути використано з HITL та для симуляції кількох засобів.

Рухомі засоби що підтримуються: квадрокоптер (Iris), гексакоптер (Typhoon H480), загальний стандартний ВЗІП (квадроплан), засіб з ВЗІП з хвоста, літак, ровер, підводний рухомий засіб (UUV).

Діаграма: плагін Gazebo

INFO

Див. Симуляція для загальної інформації про симулятори, середовище симуляції та конфігурацію симуляції (наприклад, підтримувані транспортні засоби).

Встановлення

Налаштування Gazebo Classic 9 або 11 включено в наші стандартні інструкції зі збірки для Linux, macOS та Windows. Додаткові інструкції для встановлення можна знайти на gazebosim.org.

INFO

Якщо ви плануєте використовувати PX4 з ROS вам потрібно дотримуватись інструкцій ROS для встановлення ROS та Gazebo Classic (а також уникнення конфліктів установки).

INFO

Наступні команди можна використати для видалення Gazebo (Garden) та перевстановлення Gazebo Classic 11:

sh
sudo apt remove gz-garden
sudo apt install aptitude
sudo aptitude install gazebo libgazebo11 libgazebo-dev

Зверніть увагу, що менеджер пакетів aptitude потрібен, оскільки він може вирішити конфлікти залежностей (шляхом видалення певних пакетів), які apt не в змозі обробити.

Запуск симуляції

Виконайте симуляцію запустивши PX4 SITL та Gazebo Classic з налаштуванням планеру для завантаження (підтримуються мультикоптери, літаки, ВЗІП, оптичний потік так симуляції кількох засобів).

Найпростіший спосіб зробити це - відкрити термінал у кореневій директорії репозиторію PX4 PX4-Autopilot і викликати make для потрібної цілі. Наприклад для запуску симуляції квадрокоптера (за замовчуванням):

sh
cd /path/to/PX4-Autopilot
make px4_sitl gazebo-classic

Нижче перелічено рухомі засоби, що підтримуються та команди make (клацніть по посиланнях, щоб побачити зображення засобу).

INFO

Для повного списку цілей збірки запустіть make px4_sitl list_vmd_make_targets (і відфільтруйте ті, що починаються з gazebo-classic_).

Рухомий засібКоманда
Квадрокоптерmake px4_sitl gazebo-classic
Квадрокоптер з оптичним потокомmake px4_sitl gazebo-classic_iris_opt_flow
Квадрокоптер з камерою глибини (що направлено вперед)make px4_sitl gazebo-classic_iris_depth_camera
Квадрокоптер з камерою глибини (що направлено вниз)make px4_sitl gazebo-classic_iris_downward_depth_camera
3DR Solo (квадрокоптер)make px4_sitl gazebo-classic_solo
Typhoon H480 (гексакоптер) (з відеотрансляцією)make px4_sitl gazebo-classic_typhoon_h480
Стандартний літакmake px4_sitl gazebo-classic_plane
Стандартний літак (із запуском з катапульти)make px4_sitl gazebo-classic_plane_catapult
Стандартний ВЗІПmake px4_sitl gazebo-classic_standard_vtol
ВЗІП з хвостаmake px4_sitl gazebo-classic_tailsitter
UGV із трапецією Аккермана (ровер)make px4_sitl gazebo-classic_rover
UGV з диференціалом (ровер)make px4_sitl gazebo-classic_r1_rover
HippoCampus TUHH (UUV: безпілотний підводний засіб)make px4_sitl gazebo-classic_uuv_hippocampus
Човен (USV: безпілотний надводний засіб)make px4_sitl gazebo-classic_boat
Cloudship (дирижабль)make px4_sitl gazebo-classic_cloudship

INFO

Посібник Встановлення файлів і коду є корисним довідником якщо виникнуть помилки збірки.

Вищенаведені команди запускають єдиний засіб з повним користувацьким інтерфейсом. Інші варіанти включають:

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

Підйом у небо

Згадані вище команди make спочатку збирають PX4, а потім запускають її разом із симулятором Gazebo Classic.

Після запуску PX4 запуститься оболонка PX4, як показано нижче.

sh
______  __   __    ___
| ___ \ \ \ / /   /   |
| |_/ /  \ V /   / /| |
|  __/   /   \  / /_| |
| |     / /^\ \ \___  |
\_|     \/   \/     |_/

px4 starting.

INFO  [px4] Calling startup script: /bin/sh etc/init.d-posix/rcS 0
INFO  [param] selected parameter default file eeprom/parameters_10016
[param] Loaded: eeprom/parameters_10016
INFO  [dataman] Unknown restart, data manager file './dataman' size is 11798680 bytes
INFO  [simulator] Waiting for simulator to connect on TCP port 4560
Gazebo multi-robot simulator, version 9.0.0
Copyright (C) 2012 Open Source Robotics Foundation.
Released under the Apache 2 License.
http://gazebosim.org
...
INFO  [ecl/EKF] 5188000: commencing GPS fusion

Консоль буде виводити статус поки PX4 завантажує файли ініціалізації та параметрів для певного планера, чекати та підключатися до симулятора. Як тільки з'явиться вивід INFO що [ecl/EKF] commencing GPS fusion рухомий засіб готовий до роботи.

INFO

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

Інтерфейс Gazebo Classic

Ви можете підняти його у повітря надрукувавши:

sh
pxh> commander takeoff

Використання та варіанти налаштування

Параметри, які застосовуються до всіх симуляторів охоплені у темі Симуляція рівнем вище (деякі з них можуть бути продубльовані нижче).

Симуляція відмов датчиків/апаратного забезпечення

Симуляція запобігання відмовам пояснює як викликати запобіжники відмов, таких як відмова GPS або виснаження батареї.

Режим без інтерфейсу

Gazebo Classic можна запустити у режимі без інтерфейсу в якому користувацький інтерфейс Gazebo Classic не запускається. Цей режим запускається швидше та використовує менше системних ресурсів (тобто більш "легкий" спосіб запускати симуляцію).

Просто додайте перед командою make HEADLESS=1 як показано:

sh
HEADLESS=1 make px4_sitl gazebo-classic_plane

Встановлення користувацького місця зльоту

Місце зльоту в Gazebo Classic можна встановити використовуючи змінні середовища. Це замінить як стандартне місце зльоту, так й будь-яке значення встановлене для світу.

Змінні які потрібно встановити: PX4_HOME_LAT, PX4_HOME_LON та PX4_HOME_ALT.

Наприклад:

sh
export PX4_HOME_LAT=28.452386
export PX4_HOME_LON=-13.867138
export PX4_HOME_ALT=28.5
make px4_sitl gazebo-classic

Зміна швидкості симуляції

Швидкість симуляції може бути збільшена або зменшена відносно реального часу за допомогою змінної середовища PX4_SIM_SPEED_FACTOR.

sh
export PX4_SIM_SPEED_FACTOR=2
make px4_sitl_default gazebo-classic

Для додаткової інформації дивіться: Симуляція > Запуск симуляції швидше реального часу.

Зміна швидкості вітру

Для симуляції швидкості вітру, додайте плагін у файл світу та встановіть windVelocityMean в м/с (замініть SET_YOUR_WIND_SPEED на бажану швидкість). Якщо потрібно, підлаштуйте параметр windVelocityMax, щоб він був більшим за windVelocityMean:

xml
  <plugin name='wind_plugin' filename='libgazebo_wind_plugin.so'>
      <frameId>base_link</frameId>
      <robotNamespace/>
      <windVelocityMean>SET_YOUR_WIND_SPEED</windVelocityMean>
      <windVelocityMax>20.0</windVelocityMax>
      <windVelocityVariance>0</windVelocityVariance>
      <windDirectionMean>0 1 0</windDirectionMean>
      <windDirectionVariance>0</windDirectionVariance>
      <windGustStart>0</windGustStart>
      <windGustDuration>0</windGustDuration>
      <windGustVelocityMean>0</windGustVelocityMean>
      <windGustVelocityMax>20.0</windGustVelocityMax>
      <windGustVelocityVariance>0</windGustVelocityVariance>
      <windGustDirectionMean>1 0 0</windGustDirectionMean>
      <windGustDirectionVariance>0</windGustDirectionVariance>
      <windPubTopic>world_wind</windPubTopic>
    </plugin>

Напрямок вітру передається як вектор напрямку (за стандартною конвенцією ENU), який буде нормалізовано в плагіні gazebo. Додатково ви можете вказати відхилення швидкості вітру у (м/с)² та відхилення у напрямку на основі нормального розподілу, щоб додати випадковий фактор в симуляцію. Пориви вітру внутрішньо обробляються в такий самий спосіб що і вітер з невеликою різницею в тому, що ви можете вказати час їх початку та тривалість за допомогою наступних параметрів windGustStart та windGustDuration.

Ви можете побачити як це зроблено в PX4/PX4-SITL_gazebo-classic/worlds/windy.world.

Використання джойстика

Джойстик та підтримка джойстика для великого пальця підтримується через QGroundControl (тут інструкції налаштування).

Підвищення ефективності сенсору відстані

Поточний світ за замовчуванням - PX4-Autopilot/Tools/simulation/gazebo-classic/sitl_gazebo-classic/worlds/iris.world), що використовує мапу висот в якості землі.

Це може викликати труднощі під час використання датчика відстані. Якщо присутні несподівані результати рекомендуємо змінити модель в iris.model з uneven_ground на asphalt_plane.

Симуляція шуму GPS

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

Шум GPS увімкнений якщо SDF файл цільового рухомого засобу містить значення для елементу gpsNoise (тобто має рядок <gpsNoise>true</gpsNoise>). Він увімкнений за замовчуванням у багатьох SDF файлах рухомих засобів: solo.sdf, iris.sdf, standard_vtol.sdf, delta_wing.sdf, plane.sdf, typhoon_h480, tailsitter.sdf.

Щоб увімкнути/вимкнути шум GPS:

  1. Зберіть будь-яку ціль збірки gazebo, щоб згенерувати SDF файл (для всіх засобів). Наприклад:

    sh
    make px4_sitl gazebo-classic_iris

    TIP

Файли SDF не перезаписуються у наступних збірках. :::

  1. Відкрийте SDF файл цільового рухомого засобу (наприклад ./Tools/simulation/gazebo-classic/sitl_gazebo-classic/models/iris/iris.sdf).

  2. Знайдіть елемент gpsNoise:

    xml
    <plugin name='gps_plugin' filename='libgazebo_gps_plugin.so'>
      <robotNamespace/>
      <gpsNoise>true</gpsNoise>
    </plugin>
    • Якщо він присутній, GPS включений. Ви можете вимкнути його, видаливши рядок: <gpsNoise>true</gpsNoise>
    • Якщо він відсутній, GPS вимкнено. Ви можете включити його, додавши елемент gpsNoise до розділу gps_plugin (як показано вище).

Наступного разу, коли ви зберете/перезапустите Gazebo Classic він буде використовувати нове налаштування шуму GPS.

Завантаження певного світу

PX4 підтримує багато світів, яки зберігаються у PX4-Autopilot/Tools/simulation/gazebo-classic/sitl_gazebo-classic/worlds. За замовчуванням Gazebo Classic показує пласку рівнину без функцій, як визначено в empty.world.

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

Наприклад для завантаження світу склад, ви можете додати його як показано:

sh
make px4_sitl_default gazebo-classic_plane_cam__warehouse

INFO

Два підкреслювання присутні після моделі (plane_cam) вказують на те, що використовується налагоджувач за замовчуванням (none). Дивіться Збірка коду > Цілі збірки для PX4 Make.

Також можна вказати повний шлях до світу який потрібно завантажити використавши змінну середовища PX4_SITL_WORLD. Це підходить при тестуванні нового світу, який ще не включений до PX4.

TIP

Якщо завантажений світ не вирівняний з мапою, можливо знадобиться встановити розташування світу.

Встановлення розташування світу

Рухомий засіб відтворюється дуже близько до початкового положення моделі світу у певному симульованому GPS розташуванні.

INFO

Засіб відтворюється не точно біля початкового положення Gazebo (0,0,0), а використовуючи невеличке зміщення, що може висвітлити ряд загальних проблем коду.

При використанні світу, що відтворює реальне місце (наприклад певний аеропорт) це може призвести до доволі наявної невідповідності між тим що показується у світі, що симулюється та тим, що показується на мапі наземної станції. Для подолання цієї проблеми ви можете встановити місце розташування початкового положення світу до GPS координат, де воно буде в "реальному житті".

INFO

Ви також можете встановити користувацьке положення злету, що робить те ж саме. Однак додавання розташування на мапу простіше (і воно все ще може бути змінене шляхом встановлення користувацького розташування при необхідності).

Розташування світу визначається у файлі .world шляхом вказання розташування початкового положення з використанням тегу spherical_coordinates. Щоб це було коректним, обов'язково треба вказати широту, довготу та висоту над рівнем моря.

Приклад можна знайти у sonoma_raceway.world:

xml
    <spherical_coordinates>
      <surface_model>EARTH_WGS84</surface_model>
      <latitude_deg>38.161479</latitude_deg>
      <longitude_deg>-122.454630</longitude_deg>
      <elevation>488.0</elevation>
    </spherical_coordinates>

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

sh
make px4_sitl gazebo-classic_rover__sonoma_raceway

У наведеному нижче відео видно, що розташування середовища збігається зі світом:

Запуск Gazebo та PX4 окремо

Для розширених сеансів розробки можливо більш зручно запускати Gazebo Classic та PX4 окремо або навіть з IDE.

На додаток до наявних цілей збірки cmake, що виконують sitl_run.sh з параметрами для px4 для завантаження відповідної моделі, створюється ціль для запуску px4_<mode> яка є тонкою обгорткою для вихідного застосунку sitl px4. Ця тонка обгортка просто містить аргументи застосунку типу поточної робочої директорії та шляху до файлу моделі.

Щоб запустити Gazebo Classic та PX4 окремо:

  • Запустіть сервер gazebo classic (або іншого симулятора) та клієнтські переглядачі через термінал, вказавши варіант _ide:

    sh
    make px4_sitl gazebo-classic___ide

    або

    sh
    make px4_sitl gazebo-classic_iris_ide
  • У IDE оберіть ціль px4_<mode> яку ви хочете налагодити (наприклад px4_iris)

  • Запустіть сеанс налагодження безпосередньо з IDE

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

Симуляція камери спостереження

Камера спостереження Gazebo Classic моделює камеру MAVLink яка захоплює JPEG зображення з геотегами та передає інформацію захоплення з камери на під'єднану наземну станцію. Камера також підтримує відеотрансляцію. Вона може бути використана для перевірки захоплення камери, зокрема в політних завданнях спостереження.

Камера генерує повідомлення CAMERA_IMAGE_CAPTURED щоразу, коли захоплюється зображення. Захоплені зображення зберігаються у PX4-Autopilot/build/px4sitle_default/tmp/frames/DSC_n.jpg (де n починається з 00000 та збільшується на один кожне захоплення).

Для симуляції літака з цією камерою:

sh
make px4_sitl_default gazebo-classic_plane_cam

INFO

Симуляція камери реалізована у PX4/PX4-SITL_gazebo-classic/main/src/gazebo_camera_manager_plugin.cpp.

Симуляція камери глибини

Модель камери глибини Gazebo Classic симулює стереокамеру глибини Intel® RealSense™ D455 використовуючи плагін Openni Kinect.

Вона публікує зображення глибини та інформацію з камери у рубрики ROS /camera/depth/image_raw та /camera/depth/camera_info відповідно.

Щоб використовувати ці зображення, потрібно встановити ROS або ROS 2. Зверніть увагу на попередження зверху цієї сторінки про те, як "уникнути конфліктів встановлення" під час встановлення ROS і Gazebo.

Можна симулювати квадрокоптер з камерою глибини що дивиться вперед:

sh
make px4_sitl gazebo-classic_iris_depth_camera

або квадрокоптер з камерою глибини, що дивиться вниз:

sh
make px4_sitl gazebo-classic_iris_downward_depth_camera

Симуляція парашутування при припиненні польоту

Gazebo Classic можна використовувати для симуляції розгортання парашуту під час Припинення польоту (припинення польоту викликається командою ШІМ що симулюється в Gazebo Classic).

Ціль збірки if750a має парашут прикріплений до рухомого засобу. Для симуляції засобу виконайте наступну команду:

sh
make px4_sitl gazebo-classic_if750a

Для переведення рухомого засобу у стан припинення польоту, ви можете примусити його провалити перевірку безпеки яка має налаштування припинення польоту як дію для запобігання відмови. Наприклад ви можете зробити це примусивши Порушити геозону.

Для додаткової інформації дивіться:

Трансляція відео

PX4 SITL для Gazebo Classic підтримує трансляцію відео по UDP з датчика камери, приєднаної до симуляції моделі рухомого засобу. Коли трансляцію увімкнено, можна під'єднатися до цього потоку з QGroundControl (на UDP порту 5600) та переглянути відео середовища Gazebo Classic з засобу, що симулюється так само як з реальної камери. Відео транслюється за допомогою конвеєра gstreamer та може бути увімкнене/вимкнене за допомогою кнопки в інтерфейсі Gazebo Classic.

Симуляція датчику камери підтримується/увімкненно на наступних планерах:

Системні вимоги

Для відеотрансляції потрібний Gstreamer 1.0. Потрібні залежності вже повинні бути встановленні при налаштуванні Gazebo Classic (вони включені в стандартні скрипти/інструкції установки PX4 для macOS та Ubuntu Linux).

INFO

Виключно для інформації, залежності включають: gstreamer1.0-plugins-base, gstreamer1.0-plugins-good, gstreamer1.0-plugins-bad, gstreamer1.0-plugins-ugly, libgstreamer-plugins-base1.0-dev.

Запустити/Зупинити відеотрансляцію

Трансляція відео автоматично запускається, якщо підтримується цільовим засобом. Наприклад, щоб розпочати трансляцію відео на Typhoon H480:

sh
make px4_sitl gazebo-classic_typhoon_h480

Трансляція може бути припинена/перезапущена за допомогою кнопки інтерфейсу Gazebo_Video ON/OFF_.

Кнопка Video ON/OFF

Як переглянути відео Gazebo

Найпростіший спосіб переглянути відеопотік з камери SITL/Gazebo Classic - в QGroundControl. Просто відкрийте Налаштування застосунку > Загальне та встановіть Джерело відео у UDP h.264 відеопотік та UDP порт у 5600:

Налаштування відеотрансляції QGC для Gazebo

Відео з Gazebo Classic має показуватися в QGroundControl так само як зі справжньої камери.

Приклад відеотрансляції Gazebo у QGC

INFO

Світ моделі Typhoon не дуже цікавий.

Також можна переглянути відео, використовуючи Конвеєр Gstreamer. Просто введіть наступну команду терміналу:

sh
gst-launch-1.0  -v udpsrc port=5600 caps='application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264' \
! rtph264depay ! avdec_h264 ! videoconvert ! autovideosink fps-update-interval=1000 sync=false

Ведення докладного журналу

SITL нічого не виводить при помилці, коли щось не так з моделлю. Можна увімкнути більш детальне логування за допомогою VERBOSE_SIM, як показано:

sh
export VERBOSE_SIM=1
make px4_sitl gazebo-classic

або

sh
VERBOSE_SIM=1 make px4_sitl gazebo-classic

Розширення та персоналізація

Для розширення та персоналізації інтерфейсу симуляції, відредагуйте файли у директорії Tools/simulation/gazebo/sitl_gazebo. Код доступний в репозиторії sitl_gazebo на Github.

INFO

Система збірки забезпечує правильний GIT підмодулі, включаючи симулятор. Вона перезапише зміни в файлах та директоріях.

Додаткова інформація