# Multi-Vehicle Sim with JMAVSim

This topic explains how to simulate multiple UAV (multicopter) vehicles using JMAVSim and SITL. All vehicle instances are started at the same position in the simulation.

:::tip This is the easiest way to simulate multiple vehicles running PX4. It is suitable for testing multi-vehicle support in *QGroundControl* (or the [MAVSDK](https://mavsdk.mavlink.io/), etc.). [Multi-Vehicle Simulation with Gazebo](/px4-user-guide/development/simulation/multi-vehicle-simulation.md) should be used for swarm simulations with many vehicles, or for testing features like computer vision that are only supported by Gazebo. :::

## How to Start Multiple Instances

To start multiple instances (on separate ports):

1. Build PX4

   ```
   make px4_sitl_default
   ```
2. Run **sitl\_multiple\_run.sh**, specifying the number of instances to start (e.g. 2):

   ```
   ./Tools/sitl_multiple_run.sh 2
   ```
3. Start the first instance in the same terminal (this will run in the foreground):

   ```
   ./Tools/simulation/jmavsim/jmavsim_run.sh -l
   ```
4. Open a new terminal for each subsequent instance, specifying the *simulation* TCP port for the instance:

   ```
   ./Tools/simulation/jmavsim/jmavsim_run.sh -p 4560 -l
   ```

   The port should be set to `4560+i` where `i` iterates for each instance (from `0` to `N-1`)

*QGroundControl* should automatically connect to all the new vehicle instances (all GCS traffic is sent to PX4's remote UDP port: `14550` from all instances). The vehicle that is currently being controlled is displayed in the application to bar; you can select this vehicle text to display a selection list of all of the (simulated) connected vehicle instances (`Vehicle 1`, `Vehicle 2`, etc.) and choose a new vehicle to control.

Developer APIs such as *MAVSDK* or *MAVROS* can connect to individual instances by listening on sequentially allocated PX4 remote UDP ports from `14540` (first instance) to `14549`. Additional instances *all* connect to port `14549`.

> **Tip** The **sitl\_multiple\_run.sh** script starts a separate process for each vehicle. To restart the simulations after killing one of them, you must call **sitl\_multiple\_run.sh** again, and also restart each of the individual instances in their own terminals.

## Additional Resources

* See [Simulation](/px4-user-guide/development/simulation.md) for more information about the port configuration.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://px4.gitbook.io/px4-user-guide/development/simulation/jmavsim/multi_vehicle_jmavsim.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
