# 带仿真场景Gazebo的多车模拟

本主题介绍如何使用 Gazebo 和 SITL(仅限 Linux)模拟多个无人飞行器。在使用 ROS 和不使用 ROS 的情况下,会采用不同的模拟方法。

# 多车带仿真场景Gazebo(无 ROS)

要在 Gazebo 中模拟多个虹膜或平面飞行器,请在终端中使用以下命令(从根目录的 固件 树):

Tools/gazebo_sitl_multiple_run.sh [-m <model>] [-n <number_of_vehicles>] [-w <world>] [-s <script>] [-t <target>] [-l <label>]。
  • 型号:""""""""""""等字样。 载具类型/型号 例如 马兰花 (默认)、 飞机, standard_vtol, UGV无人车, r1_rover 台风_h480.

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

  • <世界>;:""""""""""""等字样。 世界 载具应在其中生成,例如:...........: 空的 (默认)

  • <script>;:生成多辆不同类型的载具(覆盖 -m-n).例如

    -s"iris:3,plane:2,standard_vtol:3";
    
    • 支持的载具类型有 马兰花, 飞机, standard_vtol, UGV无人车, r1_rover 台风_h480.
    • 冒号后的数字表示要生成的(该类型)载具数量。
    • 最多可容纳 255 辆车。
  • <目标>;:构建目标,例如 px4_sitl_default (默认)、 px4_sitl_rtps

  • <标签>; : 型号的特定标签,例如 rtps

每个载具实例都有一个唯一的 MAVLink 系统 ID(1、2、3 等)。载具实例通过按顺序分配的 PX4 远程 UDP 端口进行访问: 14540 - 14548 (附加实例均使用相同的远程 UDP 端口访问): 14549).

备注

之所以会出现 255 辆车的限制,是因为 mavlink MAV_SYS_ID 同一网络中仅支持 255 辆车 MAV_SYS_ID 和各种 UDP 端口分配在 SITL rcS 中: init.d-posix/rcS (打开新窗口)

# 视频:多旋翼飞行器(虹膜)

# 视频多平面

# 视频多重 VTOL

# 构建和测试(RTPS/DDS)

要在 Gazebo 中基于 RTPS/DDS 模拟多辆汽车,请使用 gazebo_sitl_multiple_run.sh 命令,并在终端中使用 -t px4_sitl_rtps 选项中的 PX4-自动驾驶仪 树(如上所述)。在这里,我们将使用 -t px4_sitl_rtps 选项,设置我们将使用 RTPS 而不是 MAVLink 模拟 API 与 PX4 通信。这将构建并运行 马兰花 模型和 默认情况下也会启动 microRTPS 客户端 (您可以使用 -m 参数)。

备注

您需要安装或 eProsima Fast DDS 或 ROS 2 Foxy 或更高版本以及 micrortps_agent 应在每辆车的不同终端中运行。更多信息,请参阅: RTPS/DDS 接口:PX4-Fast RTPS(DDS)桥接器关于如何与非 ROS2 DDS 参与者应用程序交互,或 ROS 2 用户指南(PX4-ROS 2 桥接器)用于连接 ROS2 节点。

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

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

    CD 固件克隆
    Git 子模块更新 --init --recursive
    DONT_RUN=1 生产 PX4_SITL_RTPS 仿真场景Gazebo
    
  2. 建立 micrortps_agent

  3. 运行 gazebo_sitl_multiple_run.sh.例如,要生成 4 辆车,运行 :

    ./Tools/gazebo_sitl_multiple_run.sh -t px4_sitl_rtps -m iris -n 4
    

    备注

    每个载具实例分配一个唯一的 MAVLink 系统 ID(1、2、3 等),可从唯一的远程 UDP 端口(2019、2021、2023 等)接收数据,并向 UDP 端口(2020、2022、2024 等)发送数据。

  4. 运行 micrortps_agent.例如,要连接 4 辆车,运行 :

    micrortps_agent -t UDP -r 2020 -s 2019 -n vhcl0 及样品;
    micrortps_agent -t UDP -r 2022 -s 2021 -n vhcl1 及样品;
    micrortps_agent -t UDP -r 2024 -s 2023 -n vhcl2 及样品;
    micrortps_agent -t UDP -r 2026 -s 2025 -n vhcl3 及样品;
    

    备注

    要使用 ROS2 与 PX4 的特定实例通信,必须使用 -n<命名空间>; 选项。例如,运行 micrortps_agent -t UDP -r 2020 -s 2019 -n vhcl0 将导致代理在发布其所有主题时使用名称空间前缀 /vhcl0 例如 综合传感器 数据来自 vhcl0 将就这一主题发表 /vhcl0/fmu/sensor_combined/out而如果要向同一载具发送命令,则必须向主题 /vhcl0/fmu/vehicle_command/in).然后,您就可以只订阅和发布该载具的主题。

# 配有 ROS 和仿真场景Gazebo的多辆汽车

本示例演示的设置是打开 Gazebo 客户端图形用户界面,显示空旷世界中的两辆 Iris 载具。然后您可以使用 QGroundControl 和 MAVROS 的管理方式类似。

# 需要

# 构建和测试

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

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

    cd Firmware_clone git submodule update --init --recursive DONT_RUN=1 make px4_sitl_default gazebo
    
  2. 从环境中寻找灵感:

    源 Tools/setup_gazebo.bash $(pwd) $(pwd)/build/px4_sitl_default export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:$(pwd):$(pwd)/Tools/sitl_gazebo
    
  3. 运行启动文件:

    roslaunch px4 multi_uav_mavros_sitl.launch
    

    备注

    您可以指定 gui:=false 在上述 玫瑰发射 来启动无用户界面的 Gazebo。

教程示例打开 Gazebo 客户端图形用户界面,显示空旷世界中的两辆 Iris 载具。

您可以通过 QGroundControl 或 MAVROS 的管理方式与管理单一载具的方式类似:

  • QGroundControl 将有一个下拉菜单,用于选择重点关注的载具;
  • MAVROS 要求在主题/服务路径前包含适当的命名空间(例如,对于 <group ns="uav1">; 您将使用 /uav1/mavros/mission/push).

# 发生了什么?

每辆模拟载具都需要以下信息:

  • 仿真场景Gazebo模型:其定义为 xacro 文件中的 PX4-Autopilot/Tools/sitl_gazebo/models/rotors_description/urdf/<model>_base.xacro 看看 这里 (打开新窗口).目前,该模型 xacro 文件假定以 base.xacro.该模型应该有一个名为 mavlink_udp_port 定义了 gazebo 与 PX4 节点通信的 UDP 端口。模型的 xacro 文件将用于生成一个 urdf 该模型包含您选择的 UDP 端口。要定义 UDP 端口,请设置 mavlink_udp_port 在每辆车的发射文件中,请参见 这里 (打开新窗口) 为例。

    备注

    如果您使用的是同一车型,则不需要单独的 xacro 每辆车的文件。相同的 xacro 文件就足够了。

  • PX4 节点:这是 SITL PX4 应用程序。它通过 Gazebo 载具模型中定义的相同 UDP 端口与模拟器 Gazebo 通信,即 mavlink_udp_port.要在 PX4 SITL 应用程序端设置 UDP 端口,需要设置 SITL_UDP_PRT 参数与启动文件中的 mavlink_udp_port 前文已讨论过,见 这里 (打开新窗口).启动文件中的启动文件路径是根据 汽车身份证 论点,见 这里 (打开新窗口).......。 MAV_SYS_ID 启动文件中的每辆车,请参见 这里 (打开新窗口)应与 身份证 发射文件中该飞行器的 这里 (打开新窗口).这将有助于确保启动文件和启动文件的配置保持一致。

  • 马弗罗斯节点 (可选):可在启动文件中运行一个单独的 MAVROS 节点,参见 这里 (打开新窗口)如果您想通过 ROS 控制载具,您需要在启动文件中的特定端口集上启动 MAVLink 流,以便连接到 PX4 SITL 应用程序。您需要在启动文件中的一组独特端口上启动 MAVLink 流,请参见 这里 (打开新窗口).这些唯一的端口必须与 MAVROS 节点启动文件中的端口一致,请参见 这里 (打开新窗口).

启动文件 multi_uav_mavros_sitl.launch有以下作用、

  • 在仿真场景Gazebo中装载一个世界、

      <!-- 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 模型并运行 PX4 SITL 应用程序实例

        <!-- 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 节点

        <!-- 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>;
      

    备注

    每辆车的完整区块都包含在一组 组>; 标记来分隔载具的 ROS 命名空间。

要在模拟中添加第三个虹膜,需要考虑两个主要部分:

  • 增加 UAV3multi_uav_mavros_sitl.launch
    • 复制现有载具组 (UAV1UAV2)
    • 递增 身份证3
    • mavlink_udp_port 与 Gazebo 通信的 arg
    • 中的两个端口号,为 MAVROS 通信选择端口。 fcu_url 雅格
  • 创建一个启动文件,并对该文件进行如下修改:
    • 复制现有的 iris rcS 启动文件 (iris_1虹膜_2) 并将其重命名为 iris_3

    • MAV_SYS_ID 值为 3

    • SITL_UDP_PRT 的值相匹配 mavlink_udp_port 启动文件

    • 其一 启动 端口和 mavlink 流 将端口值改为相同的值,用于 QGC 通信

    • 其二 启动 端口必须与启动文件中使用的端口一致 fcu_url 雅格

      备注

      注意哪个端口是 来源数据终端 为不同的终点。

# 使用 SDF 模型的多辆汽车

本节将介绍开发人员如何使用 Gazebo SDF 文件中定义的载具模型(而不是使用 ROS Xacro 文件中定义的模型,如本主题其余部分所述)来模拟多辆载具。

步骤如下

  1. 安装 xmlstarlet 从你的 Linux 终端:
    sudo apt install xmlstarlet
    
  2. 使用 玫瑰发射multi_uav_mavros_sitl_sdf.launch 启动文件:
    roslaunch multi_uav_mavros_sitl_sdf.launch vehicle:=<model_file_name> ```` :::note 注意载具模型文件名参数是可选的 (`vehicle:=<model_file_name>`);如果省略,将默认使用 [plane model](https://github.com/PX4/sitl_gazebo/tree/master/models/plane)。 ::::
    
    

该方法与使用 xacro 相似,但 SITL/Gazebo 端口号会由 xmstarlet 不需要在 SDF 文件中指定。

要添加新的载具,您需要确保可以找到模型(以便在 Gazebo 中生成),并且 PX4 需要有相应的启动脚本。

  1. 您可以选择

    • 修改 single_vehicle_spawn_sdf.launch 将下面的一行改为指向模型的位置:
      $(find px4)/Tools/sitl_gazebo/models/$(arg vehicle)/$(arg vehicle).sdf
      

      备注

      确保您设置了 汽车 参数,即使您对模型的路径进行了硬编码。

    • 将模型复制到上述文件夹中(遵循相同的路径约定)。
  2. 汽车 参数用于设置 PX4_SIM_MODEL 环境变量,默认的 rcS(启动脚本)会使用该变量为模型查找相应的启动设置文件。在 PX4 中,这些启动文件可以在 PX4-Autopilot/ROMFS/px4fmu_common/init.d-posix/ 目录。例如,这里是飞机模型的 启动脚本 (打开新窗口).要实现这一功能,启动文件中的 PX4 节点需要通过参数来指定 rcS 文件 (etc/init.d/rcS)和 rootfs 等目录的位置 ($(find px4)/build_px4_sitl_default/etc).为简单起见,建议将模型的启动文件与 PX4 的启动文件一起放在 PX4-Autopilot/ROMFS/px4fmu_common/init.d-posix/.

# 其他资源