# 多车模拟与经典仿真场景Gazebo

本主题介绍如何使用以下工具模拟多个无人飞行器 经典仿真场景Gazebo 和 SITL(仅限 Linux)。使用 ROS 和不使用 ROS 的模拟采用了不同的方法。

# 带仿真场景Gazebo的多车型经典车型

要在 Gazebo Classic 中模拟多个光圈或飞机载具,请在终端(从 固件 树):

Tools/simulation/gazebo-classic/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,最大值为 254。

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

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

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

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

每个载具实例分配一个唯一的 MAVLink 系统 ID(2、3、4 等)。跳过 MAVLink 系统id 1,以保证不同系统之间的一致性。 命名空间.载具实例通过按顺序分配的 PX4 远程 UDP 端口访问: 14541 - 14548 (附加实例均使用相同的远程 UDP 端口访问): 14549).

备注

之所以有 254 辆车的限制,是因为 mavlink MAV_SYS_ID 在同一网络中只支持 255 辆车(第一辆车被跳过)。载具 MAV_SYS_ID 分配给 SITL rcS: init.d-posix/rcS (打开新窗口)

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

# 视频多平面

# 视频多重 VTOL

# 构建和测试(XRCE-DDS)

Tools/simulation/gazebo-classic/sitl_multiple_run.sh 可用于在 Gazebo Classic 中模拟通过 XRCE-DDS 连接的多辆汽车。

备注

您需要安装 XRCE-DDS 依赖项。更多信息,请参阅 ROS 2 用户指南(PX4-ROS 2 桥接器)用于连接 ROS 2 节点。

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

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

    CD 固件克隆
    Git 子模块更新 --init --recursive
    DONT_RUN=1 生产 px4_sitl gazebo-classic
    
  2. 建立 微型 xrce-dds 代理 和接口软件包后的 此处的说明.

  3. 运行 Tools/simulation/gazebo-classic/sitl_multiple_run.sh.例如,要生成 4 辆车,运行 :

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

    备注

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

  4. 运行 MicroXRCEAgent.它会自动连接所有四辆车:

    MicroXRCEAgent udp4 -p 8888
    

    备注

    模拟器启动脚本会自动分配一个 唯一命名空间 到每辆车。

# 配备 MAVROS 和经典仿真场景Gazebo的多辆汽车

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

# 需要

# 构建和测试

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

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

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

    源代码 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. 运行启动文件:

    roslaunch px4 multi_uav_mavros_sitl.launch
    

    备注

    您可以指定 gui:=false 在上述 玫瑰发射 来启动 Gazebo Classic,而不使用其用户界面。

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

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

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

# 发生了什么?

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

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

    备注

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

  • PX4 节点:这是 SITL PX4 应用程序。它通过 Gazebo Classic 载具模型中定义的相同 UDP 端口与模拟器 Gazebo Classic 通信,即 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 Classic 中装载一个世界、

      <!-- 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 Classic 通信的 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 Classic 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/PX4-SITL_gazebo-classic/tree/master/models/plane)。 ::::
    
    

该方法与使用 xacro 相似,但 SITL/Gazebo Classic 端口号会被以下程序自动插入 xmstarlet 不需要在 SDF 文件中指定。

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

  1. 您可以选择

    • 修改 single_vehicle_spawn_sdf.launch 将下面的一行改为指向模型的位置:

      $(find px4)/Tools/simulation/gazebo/sitl_gazebo-classic/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/.

# 其他资源