translated_page: https://github.com/PX4/Devguide/blob/master/en/simulation/sitl.md

translated_sha: b522243efef9deb5e2d3ae7bd03ae9ed0eee3418

Multi-Vehicle Simulation

This tutorial explains how to simulate multi UAV in Gazebo. This is a software in the loop (SITL) simulation.

Note: This is tested only in Linux.

Required

Build and test

To test an example setup, follow the below steps,

  • clone the PX4/Firmware code, then build the SITL code
    1. cd Firmware_clone
    2. git submodule update --init --recursive
    3. make posix_sitl_default gazebo
  • source your environment,

    1. source Tools/setup_gazebo.bash $(pwd) $(pwd)/build/posix_sitl_default
    2. export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:$(pwd)
    3. export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:$(pwd)/Tools/sitl_gazebo
  • run launch file,

    1. roslaunch px4 multi_uav_mavros_sitl.launch

What’s happening?

For each simulated vehicle, the following is required,

  • Gazebo model: This is defined as xacro file in Firmware/Tools/sitl_gazebo/models/rotors_description/urdf/<model>_base.xacro see here. Currently, the model xacro file is assumed to end with base.xacro. This model should have an argument called mavlink_udp_port which defines the UDP port on which gazebo will communicate with PX4 node. The model’s xacro file will be used to generate an sdf model that contains UDP port that you select. To define the UDP port, set the mavlink_udp_port in the launch file, see here.
    NOTE: If you are using the same vehicle model, you don’t need a separate xacro file for each vehicle. The same xacro file is adequate.

  • PX4 node: this is the SITL PX4 app. It communicates with the simulator, Gazebo, through the same UDP port defined in the Gazebo vehicle model, i.e. mavlink_udp_port. To set the UDP port on the PX4 SITL app side, you need to set the SITL_UDP_PRT parameter in the startup file, see here. You also need to specify the path of the startup file, for each vehicle, in the launch file, see here. It is recommended that you set a unique mavlink ID for each vehicle in the startup file, see here.

  • MAVROS node (optional): A seperate MAVROS node can be run in the launch file, see here, in order to connect to PX4 SITL app, if you want to control your vehcile through ROS. You need to start a mavlink stream on a unique set of ports in the startup file, see here. Those unique set of ports should matched when you launch MAVROS node, see here.

The launch file multi_uav_mavros_sitl.launchdoes the following,

  • loads a world in gazebo, see here.
  • for each vehicle,

    • loads gazebo model and runs PX4 SITL app instance, runs

      1. <arg name="fcu_url" default="udp://:14540@localhost:14557"/>
      2. <arg name="gcs_url" value=""/>
      3. <arg name="tgt_system" value="1"/>
      4. <arg name="tgt_component" value="1"/>
      5. <arg name="rcS1" default="$(find px4)/posix-configs/SITL/init/$(arg est)/$(arg vehicle)_1"/>
      6. <arg name="ID" value="1"/>
      7. <include file="$(find px4)/launch/single_vehcile_spawn.launch">
      8. <arg name="x" value="0"/>
      9. <arg name="y" value="0"/>
      10. <arg name="z" value="0"/>
      11. <arg name="R" value="0"/>
      12. <arg name="P" value="0"/>
      13. <arg name="Y" value="0"/>
      14. <arg name="vehicle" value="$(arg vehicle)"/>
      15. <arg name="rcS" value="$(arg rcS1)"/>
      16. <arg name="mavlink_udp_port" value="14560"/>
      17. <arg name="ID" value="$(arg ID)"/>
      18. </include>
    • runs a mavros node,

      1. <include file="$(find mavros)/launch/node.launch">
      2. <arg name="pluginlists_yaml" value="$(arg pluginlists_yaml)" />
      3. <arg name="config_yaml" value="$(arg config_yaml)" />
      4. <arg name="fcu_url" value="$(arg fcu_url)" />
      5. <arg name="gcs_url" value="$(arg gcs_url)" />
      6. <arg name="tgt_system" value="$(arg tgt_system)" />
      7. <arg name="tgt_component" value="$(arg tgt_component)" />
      8. </include>
  • The complete block for each vehicle looks like the following,

    1. <!-- UAV2 iris_2 -->
    2. <group ns="uav2">
    3. <arg name="fcu_url" default="udp://:14541@localhost:14559"/>
    4. <arg name="gcs_url" value=""/>
    5. <arg name="tgt_system" value="2"/>
    6. <arg name="tgt_component" value="1"/>
    7. <arg name="rcS2" default="$(find px4)/posix-configs/SITL/init/$(arg est)/$(arg vehicle)_2"/>
    8. <arg name="ID" value="2"/>
    9. <include file="$(find px4)/launch/single_vehcile_spawn.launch">
    10. <arg name="x" value="1"/>
    11. <arg name="y" value="0"/>
    12. <arg name="z" value="0"/>
    13. <arg name="R" value="0"/>
    14. <arg name="P" value="0"/>
    15. <arg name="Y" value="0"/>
    16. <arg name="vehicle" value="$(arg vehicle)"/>
    17. <arg name="rcS" value="$(arg rcS2)"/>
    18. <arg name="mavlink_udp_port" value="14562"/>
    19. <arg name="ID" value="$(arg ID)"/>
    20. </include>
    21. <include file="$(find mavros)/launch/node.launch">
    22. <arg name="pluginlists_yaml" value="$(arg pluginlists_yaml)" />
    23. <arg name="config_yaml" value="$(arg config_yaml)" />
    24. <arg name="fcu_url" value="$(arg fcu_url)" />
    25. <arg name="gcs_url" value="$(arg gcs_url)" />
    26. <arg name="tgt_system" value="$(arg tgt_system)" />
    27. <arg name="tgt_component" value="$(arg tgt_component)" />
    28. </include>
    29. </group>

    To simulate more vehicles, add more blocks with the appropriate changes in the startup files, and launch file’s parameters.