# 带仿真场景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 节点。
要建立一个示例设置,请按照以下步骤操作:
克隆 PX4/固件代码,然后构建 SITL 代码:
CD 固件克隆 Git 子模块更新 --init --recursive DONT_RUN=1 生产 PX4_SITL_RTPS 仿真场景Gazebo
建立
micrortps_agent
- 要在独立于 ROS 的 RTPS/DDS 应用程序中使用该代理,请遵循 点击此处查看安装说明
- 要在 ROS 2 中使用该代理,请按照 此处的说明
运行
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 等)发送数据。
运行
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 的管理方式类似。
# 需要
-
备注
在撰写本文档时,该系统使用的是 Ubuntu 18.04 和 ROS Melodic/Gazebo 9。另请参见 仿真场景Gazebo模拟.
# 构建和测试
要建立一个示例设置,请按照以下步骤操作:
克隆 PX4/PX4-Autopilot 代码,然后构建 SITL 代码
cd Firmware_clone git submodule update --init --recursive DONT_RUN=1 make px4_sitl_default gazebo
从环境中寻找灵感:
源 Tools/setup_gazebo.bash $(pwd) $(pwd)/build/px4_sitl_default export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:$(pwd):$(pwd)/Tools/sitl_gazebo
运行启动文件:
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 命名空间。
要在模拟中添加第三个虹膜,需要考虑两个主要部分:
- 增加
UAV3
至 multi_uav_mavros_sitl.launch- 复制现有载具组 (
UAV1
或UAV2
) - 递增
身份证
将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 文件中定义的模型,如本主题其余部分所述)来模拟多辆载具。
步骤如下
- 安装 xmlstarlet 从你的 Linux 终端:
sudo apt install xmlstarlet
- 使用 玫瑰发射 与 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 需要有相应的启动脚本。
您可以选择
- 修改 single_vehicle_spawn_sdf.launch 将下面的一行改为指向模型的位置:
$(find px4)/Tools/sitl_gazebo/models/$(arg vehicle)/$(arg vehicle).sdf
备注
确保您设置了
汽车
参数,即使您对模型的路径进行了硬编码。 - 将模型复制到上述文件夹中(遵循相同的路径约定)。
- 修改 single_vehicle_spawn_sdf.launch 将下面的一行改为指向模型的位置:
汽车
参数用于设置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/.
# 其他资源
- 参见 模拟 的 UDP 端口配置说明。
- 参见 仿真场景Gazebo中的 URDF (打开新窗口) 以获取更多关于使用 xacro 生成模型的信息。
- 参见 转子 (打开新窗口) 了解更多 xacro 型号。