Симуляція
Симулятори дозволяють польотному коду PX4 керувати комп'ютерно змодельованим апаратом у змодельованому "світі". You can interact with this vehicle just as you might with a real vehicle, using QGroundControl, an offboard API, or a radio controller/gamepad.
TIP
Simulation is a quick, easy, and most importantly, safe way to test changes to PX4 code before attempting to fly in the real world. Це також хороший спосіб почати літати з PX4, якщо у вас ще немає апарату для експериментів.
PX4 supports both Software In the Loop (SITL) simulation, where the flight stack runs on computer (either the same computer or another computer on the same network) and Hardware In the Loop (HITL) simulation using a simulation firmware on a real flight controller board.
Інформація про доступні тренажери та способи їх налаштування наведена в наступному розділі. The other sections provide general information about how the simulator works, and are not required to use the simulators.
Підтримувані симулятори
Наступні симулятори підтримуються основною командою розробників PX4.
Симулятор | Опис |
---|---|
Gazebo | This simulator is highly recommended. Gazebo supersedes Gazebo Classic, featuring more advanced rendering, physics and sensor models. It is the only version of Gazebo available from Ubuntu Linux 22.04 A powerful 3D simulation environment that is particularly suitable for testing object-avoidance and computer vision. Він також може бути використаний для multi-vehicle simulation і зазвичай використовується з ROS, набором інструментів для автоматизації керування апаратами. Supported Vehicles: Quad, Standard VTOL, Plane |
Gazebo Classic | This simulator is highly recommended. A powerful 3D simulation environment that is particularly suitable for testing object-avoidance and computer vision. It can also be used for multi-vehicle simulation and is commonly used with ROS, a collection of tools for automating vehicle control. Supported Vehicles: Quad (Iris, Hex (Typhoon H480), Generic Standard VTOL (QuadPlane), Tailsitter, Plane, Rover, Submarine |
There are also a number of Community Supported Simulators.
Решта цієї теми - це "дещо загальний" опис того, як працює інфраструктура симуляції. It is not required to use the simulators.
Симулятор MAVLink API
Всі симулятори, крім Gazebo, взаємодіють з PX4 за допомогою API симулятора MAVLink. Цей API визначає набір повідомлень MAVLink, які передають дані датчиків з модельованого світу в PX4 і повертають значення двигуна і приводу з польотного коду, які будуть застосовані до модельованого апарату. На зображенні нижче показано потік повідомлень.
INFO
A SITL build of PX4 uses SimulatorMavlink.cpp to handle these messages while a hardware build in HIL mode uses 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 directly uses the Gazebo API to interface with Gazebo and MAVlink is not required.
Порти UDP PX4 MAVLink за замовчуванням
By default, PX4 uses commonly established UDP ports for MAVLink communication with ground control stations (e.g. QGroundControl), Offboard APIs (e.g. MAVSDK, MAVROS) and simulator APIs (e.g. Gazebo). Ці порти:
- PX4's remote UDP Port 14550 is used for communication with ground control stations. Очікується, що GCS прослуховуватиме з'єднання на цьому порту. QGroundControl listens to this port by default.
- PX4's remote UDP Port 14540 is used for communication with offboard APIs. Очікується, що зовнішні API будуть чекати на з'єднання через цей порт.
INFO
Multi-vehicle simulations use a separate remote port for each instance, allocated sequentially from
14540
to14549
(additional instances all use port14549
).
:::
- The simulator's local TCP Port, 4560, is used for communication with PX4. Симулятор слухає цей порт, і PX4 ініціює TCP-з'єднання з ним.
INFO
The ports for the GCS, offboard APIs and simulator are specified by startup scripts. See System Startup to learn more.
Середовище симуляції SITL
На схемі нижче показано типове середовище симуляції SITL для будь-якого з підтримуваних тренажерів, що використовують MAVLink (тобто всіх, окрім Gazebo).
Різні частини системи з'єднуються через протокол UDP і можуть працювати як на одному комп'ютері, так і на іншому комп'ютері в тій самій мережі.
PX4 використовує спеціальний модуль для підключення до локального TCP-порту 4560 симулятора. Simulators then exchange information with PX4 using the Simulator MAVLink API described above. PX4 на SITL і симулятор можуть працювати як на одному комп'ютері, так і на різних комп'ютерах в одній мережі.
INFO
Simulators can also use the uxrce-dds bridge (XRCE-DDS) to directly interact with PX4 (i.e. via UORB topics rather than MAVLink). This approach may used by Gazebo Classic for multi-vehicle simulation.
:::
PX4 використовує звичайний модуль MAVLink для підключення до наземних станцій і зовнішніх API розробників, таких як MAVSDK або ROS
- Ground stations listen to PX4's remote UDP port:
14550
- External developer APIs listen to PX4's remote UDP port:
14540
. For multi-vehicle simulations, PX4 sequentially allocates a separate remote port for each instance from14540
to14549
(additional instances all use port14549
).
- Ground stations listen to PX4's remote UDP port:
PX4 defines a number of local UDP ports (
14580
,18570
), which are sometimes used when networking with PX4 running in a container or virtual machine. Вони не рекомендуються для "загального" використання і можуть змінюватися в майбутньому.A serial connection may be used to connect Joystick/Gamepad hardware via QGroundControl.
If you use the normal build system SITL make
configuration targets (see next section) then both SITL and the Simulator will be launched on the same computer and the ports above will automatically be configured. Ви можете налаштувати додаткові UDP-з'єднання MAVLink та іншим чином змінити середовище моделювання у файлах конфігурації та ініціалізації збірки.
Запуск/створення симуляції SITL
Система збірки дозволяє дуже легко зібрати і запустити PX4 на SITL, активувати симулятор і з'єднати їх. Синтаксис (спрощений) виглядає наступним чином:
sh
make px4_sitl simulator[_vehicle-model]
where simulator
is gz
(for Gazebo), gazebo-classic
, jmavsim
or some other simulator, and vehicle-model is a particular vehicle type supported by that simulator (Gazebo and jMAVSim only support multicopters at time of writing, while Gazebo Classic supports many different types).
Нижче наведено кілька прикладів, і їх набагато більше на окремих сторінках для кожного з симуляторів:
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
: This variable configures which estimator to use. Possible options are:ekf2
(default),lpe
(deprecated). It can be set viaexport PX4_ESTIMATOR=lpe
before running the simulation.
The syntax described here is simplified, and there are many other options that you can configure via make - for example, to set that you wish to connect to an IDE or debugger. For more information see: Building the Code > PX4 Make Build Targets.
Запуск симуляції швидше, ніж у реальному часі
SITL можна запустити швидше або повільніше, ніж у реальному часі, використовуючи jMAVSim або Gazebo Classic.
The speed factor is set using the environment variable 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
You can apply the factor to all SITL runs in the current session using EXPORT
:
sh
export PX4_SIM_SPEED_FACTOR=2
make px4_sitl jmavsim
INFO
At some point IO or CPU will limit the speed that is possible on your machine and it will be slowed down "automatically". Потужні комп'ютери зазвичай можуть запускати симуляцію зі швидкістю близько 6-10 разів, для ноутбуків досягається швидкість близько 3-4 разів.
INFO
To avoid PX4 detecting data link timeouts, increase the value of param COM_DL_LOSS_T proportional to the simulation rate. For example, if COM_DL_LOSS_T
is 10 in realtime, at 10x simulation rate increase to 100.
Симуляція Lockstep
PX4 SITL and the simulators (jMAVSim or Gazebo Classic) have been set up to run in lockstep. Це означає, що PX4 і симулятор чекають один на одного для отримання повідомлень від датчиків і приводів, а не працюють зі своїми власними швидкостями.
INFO
Lockstep makes it possible to run the simulation faster or slower than realtime, and also to pause it in order to step through code.
Послідовність кроків для lockstep наступна:
- The simulation sends a sensor message HIL_SENSOR including a timestamp
time_usec
to update the sensor state and time of PX4. - PX4 receives this and does one iteration of state estimation, controls, etc. and eventually sends an actuator message HIL_ACTUATOR_CONTROLS.
- Симуляція чекає, поки не отримає повідомлення від приводу/двигуна, потім моделює фізику і обчислює наступне повідомлення від датчика, яке знову надсилається до PX4.
Система починається з "вільного ходу", під час якого симуляція надсилає повідомлення від датчиків, зокрема про час, і, таким чином, запускає PX4, доки він не ініціалізується і не надішле відповідне повідомлення від приводу.
Вимкнення Lockstep симуляції
Lockstep симуляцію можна вимкнути, якщо, наприклад, SITL потрібно використовувати з тренажером, який не підтримує цю функцію. У цьому випадку симулятор і PX4 використовують системний час хоста і не чекають один на одного.
To disable lockstep in PX4, run make px4_sitl_default boardconfig
and set the BOARD_NOLOCKSTEP
"Force disable lockstep" symbol which is located under toolchain.
To disable lockstep in Gazebo, edit the model SDF file and set <enable_lockstep>false</enable_lockstep>
.
To disable lockstep in jMAVSim, remove -l
in sitl_run.sh, or make sure otherwise that the java binary is started without the -lockstep
flag.
Сценарії запуску
Scripts are used to control which parameter settings to use or which modules to start. They are located in the ROMFS/px4fmu_common/init.d-posix directory, the rcS
file is the main entry point. See System Startup for more information.
Імітація збоїв та відмов датчиків/обладнання
Simulate Failsafes explains how to trigger safety failsafes like GPS failure and battery drain.
Середовище симуляції HITL
У симуляції з апаратним забезпеченням у контурі (HITL) звичайна прошивка PX4 виконується на реальному обладнані. The HITL Simulation Environment in documented in: HITL Simulation.
Інтеграція джойстиків/геймпада
QGroundControl desktop versions can connect to a USB Joystick/Gamepad and send its movement commands and button presses to PX4 over MAVLink. Це працює як на SITL, так і на HITL симуляціях, і дозволяє вам безпосередньо керувати симульованим апаратом. Якщо у вас немає джойстика, ви можете керувати апаратом за допомогою екранних віртуальних паличок QGroundControl.
For setup information see the QGroundControl User Guide:
Симуляція камери
PX4 supports capture of both still images and video from within the Gazebo Classic simulated environment. This can be enabled/set up as described in Gazebo Glassic > Video Streaming.
The simulated camera is a gazebo classic plugin that implements the MAVLink Camera Protocol . PX4 connects/integrates with this camera in exactly the same way as it would with any other MAVLink camera:
- TRIG_INTERFACE must be set to
3
to configure the camera trigger driver for use with a MAVLink cameraTIP
In this mode the driver just sends a CAMERA_TRIGGER message whenever an image capture is requested. For more information see Cameras Connected to Flight Controller Outputs.
::: 2. PX4 повинен перенаправляти всі команди камери між GCS і (симулятором) MAVLink Camera. You can do this by starting MAVLink with the -f
flag as shown, specifying the UDP ports for the new connection.
sh
mavlink start -u 14558 -o 14530 -r 4000 -f -m camera
INFO
More than just the camera MAVLink messages will be forwarded, but the camera will ignore those that it doesn't consider relevant.
Інші симулятори можуть використовувати такий самий підхід для реалізації підтримки камери.
Запуск симуляції на віддаленому сервері
Симулятор можна запустити на одному комп'ютері, а доступ до нього отримати з іншого комп'ютера в тій же мережі (або в іншій мережі з відповідною маршрутизацією). Це може бути корисно, наприклад, якщо ви хочете протестувати програму для безпілотника, що працює на реальному комп'ютері-компаньйоні на фоні змодельованого транспортного засобу.
Це не працює "з коробки", оскільки PX4 за замовчуванням не маршрутизує пакети на зовнішні інтерфейси (щоб уникнути спаму в мережі та втручання різних симуляцій одна в одну). Замість цього він спрямовує трафік всередину - на "localhost".
Існує декілька способів зробити UDP-пакети доступними на зовнішніх інтерфейсах, як описано нижче.
Використання MAVLink Router
The mavlink-router can be used to route packets from localhost to an external interface.
To route packets between SITL running on one computer (sending MAVLink traffic to localhost on UDP port 14550), and QGC running on another computer (e.g. at address 10.73.41.30
) you could:
Start mavlink-router with the following command:
shmavlink-routerd -e 10.73.41.30:14550 127.0.0.1:14550
Use a mavlink-router conf file.
ini[UdpEndpoint QGC] Mode = Normal Address = 10.73.41.30 Port = 14550 [UdpEndpoint SIM] Mode = Eavesdropping Address = 127.0.0.1 Port = 14550
INFO
More information about mavlink-router configuration can be found here.
Увімкнення трансляції UDP
The mavlink module routes to localhost by default, but you can enable UDP broadcasting of heartbeats using its -p
option. Any remote computer on the network can then connect to the simulator by listening to the appropriate port (i.e. 14550 for QGroundControl).
INFO
UDP broadcasting provides a simple way to set up the connection when there is only one simulation running on the network. Do not use this approach if there are multiple simulations running on the network (you might instead publish to a specific address).
This should be done in an appropriate configuration file where mavlink start
is called. For example: /ROMFS/px4fmu_common/init.d-posix/px4-rc.mavlink.
Увімкнення стрімінгу на певну адресу
The mavlink module routes to localhost by default, but you can specify an external IP address to stream to using its -t
option. The specified remote computer can then connect to the simulator by listening to the appropriate port (i.e. 14550 for QGroundControl).
This should be done in various configuration files where mavlink start
is called. For example: /ROMFS/px4fmu_common/init.d-posix/px4-rc.mavlink.
Тунелювання по SSH
Тунелювання SSH є гнучким варіантом, оскільки комп'ютер для моделювання та система, що його використовує, не обов'язково повинні знаходитися в одній мережі.
INFO
You might similarly use VPN to provide a tunnel to an external interface (on the same network or another network).
Одним із способів створення тунелю є використання параметрів тунелювання SSH. The tunnel itself can be created by running the following command on localhost, where remote.local
is the name of a remote computer:
sh
ssh -C -fR 14551:localhost:14551 remote.local
UDP-пакети потрібно перетворити на TCP-пакети, щоб їх можна було перенаправляти через SSH. The netcat utility can be used on both sides of the tunnel - first to convert packets from UDP to TCP, and then back to UDP at the other end.
TIP
QGC must be running before executing netcat.
On the QGroundControl computer, UDP packet translation may be implemented by running following commands:
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
The port number 14550
is valid for connecting to QGroundControl or another GCS, but should be adjusted for other endpoints (e.g. developer APIs etc.).
The tunnel may in theory run indefinitely, but netcat connections may need to be restarted if there is a problem.
The QGC_remote_connect.bash script can be run on the QGC computer to automatically setup/run the above instructions. Симуляція вже має бути запущена на віддаленому сервері, і ви повинні мати доступ по SSH до цього сервера.