Simulation
Simulators allow PX4 flight code to control a computer modeled vehicle in a simulated "world". 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. It is also a good way to start flying with PX4 when you haven't yet got a vehicle to experiment with. :::
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.
Information about available simulators and how to set them up are provided in the next section. The other sections provide general information about how the simulator works, and are not required to use the simulators.
Supported Simulators
The following simulators work with PX4 for HITL and/or SITL simulation.
This simulator is highly recommended.
Supported Vehicles: Quad, Standard VTOL, Plane
This simulator is highly recommended.
Supported Vehicles: Plane, Autogyro, Rover
A simulator that provides advanced flight dynamics models. This can be used to model realistic flight dynamics based on wind tunnel data.
Supported Vehicles: Plane, Quad, Hex
A simple multirotor simulator that allows you to fly copter type vehicles around a simulated world.
Supported Vehicles: Quad
A cross platform simulator that provides physically and visually realistic simulations. This simulator is resource intensive, and requires a very significantly more powerful computer than the other simulators described here.
Supported Vehicles: Iris (MultiRotor model and a configuration for PX4 QuadRotor in the X configuration).
Supported Vehicles: Plane, Quad, Tailsitter
Instructions for how to setup and use the simulators are in the topics linked above.
The remainder of this topic is a "somewhat generic" description of how the simulation infrastructure works. It is not required to use the simulators.
Simulator MAVLink API
All simulators except for Gazebo communicate with PX4 using the Simulator MAVLink API. This API defines a set of MAVLink messages that supply sensor data from the simulated world to PX4 and return motor and actuator values from the flight code that will be applied to the simulated vehicle. The image below shows the message flow.
The messages are described below (see links for specific detail).
NA
Mode flag when using simulation. All motors/actuators are blocked, but internal software is fully operational.
PX4 to Sim
PX4 control outputs (to motors, actuators).
Sim to PX4
Simulated IMU readings in SI units in NED body frame.
Sim to PX4
The simulated GPS RAW sensor value.
Sim to PX4
Simulated optical flow from a flow sensor (e.g. PX4FLOW or optical mouse sensor)
Sim to PX4
Contains the actual "simulated" vehicle position, attitude, speed etc. This can be logged and compared to PX4's estimates for analysis and debugging (for example, checking how well an estimator works for noisy (simulated) sensor inputs).
Sim to PX4
The RAW values of the RC channels received.
Default PX4 MAVLink UDP Ports
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). These ports are:
PX4's remote UDP Port 14550 is used for communication with ground control stations. GCS are expected to listen for connections on this port. QGroundControl listens to this port by default.
PX4's remote UDP Port 14540 is used for communication with offboard APIs. Offboard APIs are expected to listen for connections on this port. :::note 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. The simulator listens to this port, and PX4 initiates a TCP connection to it.
SITL Simulation Environment
The diagram below shows a typical SITL simulation environment for any of the supported simulators that use MAVLink (i.e. all of them except Gazebo).
The different parts of the system connect via UDP, and can be run on either the same computer or another computer on the same network.
PX4 uses the normal MAVLink module to connect to ground stations and external developer APIs like MAVSDK or 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
).
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. These are not recommended for "general" use and may change in future.
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. You can configure additional MAVLink UDP connections and otherwise modify the simulation environment in the build configuration and initialisation files.
Starting/Building SITL Simulation
The build system makes it very easy to build and start PX4 on SITL, launch a simulator, and connect them. The syntax (simplified) looks like this:
A number of examples are shown below, and there are many more in the individual pages for each of the simulators:
The simulation can be further configured via environment variables:
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.
Run Simulation Faster than Realtime
SITL can be run faster or slower than realtime when using jMAVSim or Gazebo Classic.
The speed factor is set using the environment variable PX4_SIM_SPEED_FACTOR
. For example, to run the jMAVSim simulation at 2 times the real time speed:
To run at half real-time:
You can apply the factor to all SITL runs in the current session using EXPORT
:
:::note At some point IO or CPU will limit the speed that is possible on your machine and it will be slowed down "automatically". Powerful desktop machines can usually run the simulation at around 6-10x, for notebooks the achieved rates can be around 3-4x. :::
Lockstep Simulation
PX4 SITL and the simulators (jMAVSim or Gazebo Classic) have been set up to run in lockstep. What this means is that PX4 and the simulator wait on each other for sensor and actuator messages, rather than running at their own speeds.
The sequence of steps for lockstep are:
The simulation waits until it receives the actuator/motor message, then simulates the physics and calculates the next sensor message to send to PX4 again.
The system starts with a "freewheeling" period where the simulation sends sensor messages including time and therefore runs PX4 until it has initialized and responds with an actuator message.
Disable Lockstep Simulation
The lockstep simulation can be disabled if, for example, SITL is to be used with a simulator that does not support this feature. In this case the simulator and PX4 use the host system time and do not wait on each other.
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.
Startup Scripts
Simulating Failsafes and Sensor/Hardware Failure
HITL Simulation Environment
Joystick/Gamepad Integration
QGroundControl desktop versions can connect to a USB Joystick/Gamepad and send its movement commands and button presses to PX4 over MAVLink. This works on both SITL and HITL simulations, and allows you to directly control the simulated vehicle. If you don't have a joystick you can alternatively control the vehicle using QGroundControl's onscreen virtual thumbsticks.
For setup information see the QGroundControl User Guide:
Camera Simulation
:::note More than just the camera MAVLink messages will be forwarded, but the camera will ignore those that it doesn't consider relevant. :::
The same approach can be used by other simulators to implement camera support.
Running Simulation on a Remote Server
It is possible to run the simulator on one computer, and access it from another computer on the same network (or on another network with appropriate routing). This might be useful, for example, if you want to test a drone application running on real companion computer hardware running against a simulated vehicle.
This does not work "out of the box" because PX4 does not route packets to external interfaces by default (in order to avoid spamming the network and different simulations interfering with each other). Instead it routes traffic internally - to "localhost".
There are a number of ways to make the UDP packets available on external interfaces, as outlined below.
Use MAVLink Router
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:
Use a mavlink-router conf file.
Enable UDP Broadcasting
Enable Streaming to Specific Address
SSH Tunneling
SSH tunneling is a flexible option because the simulation computer and the system using it need not be on the same network.
:::note You might similarly use VPN to provide a tunnel to an external interface (on the same network or another network). :::
One way to create the tunnel is to use SSH tunneling options. The tunnel itself can be created by running the following command on localhost, where remote.local
is the name of a remote computer:
:::tip QGC must be running before executing netcat. :::
On the QGroundControl computer, UDP packet translation may be implemented by running following commands:
On the simulator side of the SSH tunnel, the command is:
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.
Last updated