使用 Gazebo Classic 进行多载具仿真
本主题介绍如何使用 Gazebo Classic 仿真环境 和软件在环仿真(SITL,仅适用于 Linux 系统)对多架无人机进行仿真。 在使用和不使用 ROS 的情况下,采用的仿真是不同的方法。
使用 Gazebo Classic 进行多载具仿真
要在 Gazebo Classic 中对多架 Iris 或固定翼飞机载具进行仿真,请在终端中(从 Firmware 目录树的根目录执行)使用以下命令:
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_rover
、typhoon_h480
(六旋翼飞行器)。<number_of_vehicles>
:要生成的载具数量。 默认值为 3。 最大值为 254。<world>
:载具应生成到的 世界场景,例如:empty
(默认值)。<script>
:生成多种不同类型的载具(覆盖-m
和-n
中的值)。 例如:sh-s "iris:3,plane:2,standard_vtol:3"
- 支持的载具类型有:
iris
、plane
、standard_vtol
、rover
、r1_rover
、typhoon_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 节点的接口相关内容。
要构建一个示例设置,请按照以下步骤操作:
克隆 PX4/Firmware 代码,然后构建 SITL 代码:
shcd Firmware_clone git submodule update --init --recursive DONT_RUN=1 make px4_sitl gazebo-classic
按照 此处的说明 构建
micro xrce-dds agent
和接口包。运行
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 会被跳过。
:::
运行
MicroXRCEAgent
。 它将自动连接到所有四个载具:shMicroXRCEAgent udp4 -p 8888
INFO
仿真器启动脚本会自动为每个载具分配一个 唯一的命名空间。
:::
使用 MAVROS 和 Gazebo Classic 进行多载具仿真
本示例展示了一个设置,该设置会打开 Gazebo Classic 客户端图形用户界面(GUI),在一个空的世界场景中显示两架 Iris 载具。 然后,你可以像管理单个载具一样,使用 QGroundControl 和 MAVROS 来控制这些载具。
所需条件
- 当前的 PX4 ROS/Gazebo 开发环境(其中包括 MAVROS 软件包)。
- 最新的 PX4/PX4-Autopilot 的克隆版本。
构建与测试
要构建一个示例设置,请按照以下步骤操作:
克隆 PX4/PX4-Autopilot 代码,然后构建 SITL 代码:
shcd Firmware_clone git submodule update --init --recursive DONT_RUN=1 make px4_sitl_default gazebo-classic
配置环境变量:
shsource 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
运行启动文件:
shroslaunch 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
匹配,示例请参阅 此处。 启动文件在启动文件中的路径是根据vehicle
和ID
参数生成的,示例请参阅 此处。 启动文件中每个载具的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
:- 复制现有载具(
UAV1
或UAV2
)的组。 - 将
ID
参数递增为3
。 - 为
mavlink_udp_port
参数选择一个不同的端口,用于与 Gazebo Classic 通信。 - 通过修改
fcu_url
参数中的两个端口号,选择用于 MAVROS 通信的端口。
- 复制现有载具(
创建一个启动文件,并按如下方式修改文件:
复制一个现有的 Iris rcS 启动文件(
iris_1
或iris_2
),并将其重命名为iris_3
。将
MAV_SYS_ID
值设置为3
。将
SITL_UDP_PRT
值设置为与启动文件中mavlink_udp_port
参数的值匹配。将第一个
mavlink start
端口和mavlink stream
端口的值设置为相同的值,该值将用于与 QGC 通信。第二个
mavlink start
端口需要与启动文件fcu_url
参数中使用的端口匹配。INFO
请注意不同端点的
src
和dst
分别是哪个端口。
:::
使用 SDF 模型进行多载具仿真
本节展示了开发人员如何使用 Gazebo Classic SDF 文件中定义的载具模型来模拟多载具(而不是像本主题其余部分所讨论的那样,使用 ROS Xacro 文件中定义的模型)