Skip to content

使用 Gazebo Classic 进行多载具仿真

本主题介绍如何使用 Gazebo Classic 仿真环境 和软件在环仿真(SITL,仅适用于 Linux 系统)对多架无人机进行仿真。 在使用和不使用 ROS 的情况下,采用的仿真是不同的方法。

使用 Gazebo Classic 进行多载具仿真

要在 Gazebo Classic 中对多架 Iris 或固定翼飞机载具进行仿真,请在终端中(从 Firmware 目录树的根目录执行)使用以下命令:

sh
Tools/simulation/gazebo-classic/sitl_multiple_run.sh [-m <model>] [-n <number_of_vehicles>] [-w <world>] [-s <script>] [-t <target>] [-l <label>]
  • <model>:要生成的 载具类型/模型,例如:iris(默认值)、plane(固定翼飞机)、standard_vtol(标准垂直起降飞行器)、rover(无人车)、r1_rovertyphoon_h480(六旋翼飞行器)。

  • <number_of_vehicles>:要生成的载具数量。 默认值为 3。 最大值为 254。

  • <world>:载具应生成到的 世界场景,例如:empty(默认值)。

  • <script>:生成多种不同类型的载具(覆盖 -m-n 中的值)。 例如:

    sh
    -s "iris:3,plane:2,standard_vtol:3"
    • 支持的载具类型有:irisplanestandard_vtolroverr1_rovertyphoon_h480
    • 冒号后面的数字表示要生成的(该类型)载具数量。
    • 载具的最大数量为 254。
  • <target>:构建目标,例如:px4_sitl_default(默认值)、px4_sitl_nolockstep

  • <label>:模型的特定标签,例如:rplidar

每个载具实例都会被分配一个唯一的 MAVLink 系统 ID(2、3、4 等)。 为了在 命名空间 之间保持一致性,会跳过 MAVLink 系统 ID 1。 载具实例通过按顺序分配的 PX4 远程 UDP 端口进行访问:14541 - 14548(其他额外的实例都使用相同的远程 UDP 端口 14549 进行访问)。

INFO

出现 254 个载具的限制是因为 MAVLink 的 MAV_SYS_ID 在同一网络中仅支持 255 个载具(并且第一个会被跳过)。 MAV_SYS_ID 是在 SITL 的 rcS 文件中分配的:init.d-posix/rcS

视频:多架多旋翼飞行器(Iris)

视频:多架固定翼飞机

视频:多架垂直起降飞行器

构建与测试(XRCE-DDS)

Tools/simulation/gazebo-classic/sitl_multiple_run.sh 可用于在 Gazebo Classic 中对通过 XRCE-DDS 连接的多载具进行仿真。

INFO

你需要先安装 XRCE-DDS 的依赖项。 有关更多信息,请参阅:ROS 2 用户指南(PX4-ROS 2 桥接),了解与 ROS 2 节点的接口相关内容。

要构建一个示例设置,请按照以下步骤操作:

  1. 克隆 PX4/Firmware 代码,然后构建 SITL 代码:

    sh
    cd Firmware_clone
    git submodule update --init --recursive
    DONT_RUN=1 make px4_sitl gazebo-classic
  2. 按照 此处的说明 构建 micro xrce-dds agent 和接口包。

  3. 运行 Tools/simulation/gazebo-classic/sitl_multiple_run.sh。 例如,要生成 4 个载具,运行:

    sh
    ./Tools/simulation/gazebo-classic/sitl_multiple_run.sh -m iris -n 4

    INFO

    每个载具实例都会被分配一个唯一的 MAVLink 系统 ID(2、3、4 等)。 MAVLink 系统 ID 1 会被跳过。

:::

  1. 运行 MicroXRCEAgent。 它将自动连接到所有四个载具:

    sh
    MicroXRCEAgent udp4 -p 8888

    INFO

    仿真器启动脚本会自动为每个载具分配一个 唯一的命名空间

:::

使用 MAVROS 和 Gazebo Classic 进行多载具仿真

本示例展示了一个设置,该设置会打开 Gazebo Classic 客户端图形用户界面(GUI),在一个空的世界场景中显示两架 Iris 载具。 然后,你可以像管理单个载具一样,使用 QGroundControl 和 MAVROS 来控制这些载具。

所需条件

构建与测试

要构建一个示例设置,请按照以下步骤操作:

  1. 克隆 PX4/PX4-Autopilot 代码,然后构建 SITL 代码:

    sh
    cd Firmware_clone
    git submodule update --init --recursive
    DONT_RUN=1 make px4_sitl_default gazebo-classic
  2. 配置环境变量:

    sh
    source Tools/simulation/gazebo-classic/setup_gazebo.bash $(pwd) $(pwd)/build/px4_sitl_default
    export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:$(pwd):$(pwd)/Tools/simulation/gazebo-classic/sitl_gazebo
  3. 运行启动文件:

    sh
    roslaunch px4 multi_uav_mavros_sitl.launch

    INFO

    你可以在上述 roslaunch 命令中指定 gui:=false,以在不启动 Gazebo Classic 用户界面的情况下启动它。

:::

该教程示例会打开 Gazebo Classic 客户端 GUI,在一个空的世界场景中显示两架 Iris 载具。

你可以像管理单个载具一样,使用 QGroundControl 或 MAVROS 来控制这些载具:

  • QGroundControl 会有一个下拉菜单,用于选择处于“聚焦”状态的载具。
  • MAVROS 要求你在主题/服务路径前包含正确的命名空间(例如,对于 <group ns="uav1">,你将使用 /uav1/mavros/mission/push)。

运行原理

对于每个模拟的载具,需要以下组件:

  • Gazebo Classic 模型:这在 PX4-Autopilot/Tools/simulation/gazebo-classic/sitl_gazebo-classic/models/rotors_description/urdf/<model>_base.xacro 中定义为 xacro 文件,请参阅 此处。 当前,假设模型的 xacro 文件以 base.xacro 结尾。 该模型应该有一个名为 mavlink_udp_port 的参数,用于定义 Gazebo Classic 将与 PX4 节点进行通信的 UDP 端口。 模型的 xacro 文件将用于生成一个包含你所选 UDP 端口的 urdf 模型。 要定义 UDP 端口,请在启动文件中为每个载具设置 mavlink_udp_port,示例请参阅 此处

    INFO

    如果你使用的是相同的载具模型,不需要为每个载具单独准备一个 xacro 文件。同一个 xacro 文件就足够了。

:::

  • PX4 节点:这是 SITL PX4 应用程序。 它通过与 Gazebo Classic 载具模型中定义的相同 UDP 端口(即 mavlink_udp_port)与仿真器 Gazebo Classic 进行通信。 要在 PX4 SITL 应用程序端设置 UDP 端口,你需要在启动文件中设置 SITL_UDP_PRT 参数,使其与前面讨论的 mavlink_udp_port 匹配,示例请参阅 此处。 启动文件在启动文件中的路径是根据 vehicleID 参数生成的,示例请参阅 此处。 启动文件中每个载具的 MAV_SYS_ID,示例请参阅 此处,应该与启动文件中该载具的 ID 匹配,此处。 这将有助于确保启动文件和启动脚本之间的配置一致。

  • MAVROS 节点(可选):如果要通过 ROS 控制载具,可以在启动文件中运行一个单独的 MAVROS 节点,示例请参阅 此处,以便连接到 PX4 SITL 应用程序。 你需要在启动文件中在一组唯一的端口上启动 MAVLink 流,示例请参阅 此处。 这些唯一的端口组需要与启动文件中 MAVROS 节点的端口匹配,示例请参阅 此处

启动文件 multi_uav_mavros_sitl.launch 执行以下操作:

  • 在 Gazebo Classic 中加载一个世界场景:

    xml
      <!-- Gazebo 仿真 -->
      <include file="$(find gazebo_ros)/launch/empty_world.launch">
          <arg name="gui" value="$(arg gui)"/>
          <arg name="world_name" value="$(arg world)"/>
          <arg name="debug" value="$(arg debug)"/>
          <arg name="verbose" value="$(arg verbose)"/>
          <arg name="paused" value="$(arg paused)"/>
      </include>
  • 对于每个载具:

    • 从 xacro 创建 urdf 模型,加载 Gazebo Classic 模型并运行 PX4 SITL 应用程序实例:

      xml
        <!-- PX4 SITL 和载具生成 -->
        <include file="$(find px4)/launch/single_vehicle_spawn.launch">
            <arg name="x" value="0"/>
            <arg name="y" value="0"/>
            <arg name="z" value="0"/>
            <arg name="R" value="0"/>
            <arg name="P" value="0"/>
            <arg name="Y" value="0"/>
            <arg name="vehicle" value="$(arg vehicle)"/>
            <arg name="rcS" value="$(find px4)/posix-configs/SITL/init/$(arg est)/$(arg vehicle)_$(arg ID)"/>
            <arg name="mavlink_tcp_port" value="4560"/>
            <arg name="ID" value="$(arg ID)"/>
        </include>
    • 运行一个 MAVROS 节点:

      xml
        <!-- MAVROS -->
        <include file="$(find mavros)/launch/px4.launch">
            <arg name="fcu_url" value="$(arg fcu_url)"/>
            <arg name="gcs_url" value=""/>
            <arg name="tgt_system" value="$(arg ID)"/>
            <arg name="tgt_component" value="1"/>
        </include>

    INFO

    每个载具的完整代码块都包含在一组 <group> 标签中,以分隔载具的 ROS 命名空间。

:::

要在这个仿真中添加第三架 Iris 载具,需要考虑两个主要组件:

  • multi_uav_mavros_sitl.launch 添加 UAV3

    • 复制现有载具(UAV1UAV2)的组。
    • ID 参数递增为 3
    • mavlink_udp_port 参数选择一个不同的端口,用于与 Gazebo Classic 通信。
    • 通过修改 fcu_url 参数中的两个端口号,选择用于 MAVROS 通信的端口。
  • 创建一个启动文件,并按如下方式修改文件:

    • 复制一个现有的 Iris rcS 启动文件(iris_1iris_2),并将其重命名为 iris_3

    • MAV_SYS_ID 值设置为 3

    • SITL_UDP_PRT 值设置为与启动文件中 mavlink_udp_port 参数的值匹配。

    • 将第一个 mavlink start 端口和 mavlink stream 端口的值设置为相同的值,该值将用于与 QGC 通信。

    • 第二个 mavlink start 端口需要与启动文件 fcu_url 参数中使用的端口匹配。

      INFO

      请注意不同端点的 srcdst 分别是哪个端口。

:::

使用 SDF 模型进行多载具仿真

本节展示了开发人员如何使用 Gazebo Classic SDF 文件中定义的载具模型来模拟多载具(而不是像本主题其余部分所讨论的那样,使用 ROS Xacro 文件中定义的模型)