Skip to content

使用 ROS 2 进行多车辆仿真

XRCE-DDS 支持多个客户端通过 UDP 协议连接到同一个代理。 这在模拟中特别有用,因为只有一个代理需要启动。

设置和要求

唯一的要求是

工作原理

在仿真中,每个 PX4 实例都会获得一个唯一的px4_instance编号,编号从0开始。 该值用于为 UXRCE_DDS_KEY分配一个唯一值:

sh
参数设置 UXRCE_DDS_KEY $(px4_instance+1))

INFO

通过这种方式,UXRCE_DDS_KEY 将始终与 [MAV_SYS_ID] 保持一致(../advanced_config/parameter_reference.md#MAV_SYS_ID)

此外,当 px4_instance 大于 0 时,会添加一个格式为 px4_$px4_instance 的唯一 ROS 2 命名空间前缀:

sh
uxrce_dds_ns="-n px4_$px4_instance"

INFO

环境变量 PX4_UXRCE_DDS_NS 若已设置,将覆盖上文所述的命名空间行为。

第一个实例(px4_instance=0)没有额外的命名空间,此举是为了与真实载具上 xrce-dds 客户端的默认行为保持一致。 这种不匹配可以通过手动使用 PX4_UXRCE_DDS_NS 来修复,或者通过从索引 1 中添加车辆而不是 0 (这是Gazebo Classic的 sitl_multiple_run.sh 的默认行为)。

模拟中的默认客户端配置概述如下:

PX4_UXRCE_DDS_NSpx4_instanceUXRCE_DDS_KEY客户端命名空间
未提供0px4_instance+1
已提供0px4_instance+1PX4_UXRCE_DDS_NS
未提供> 0px4_instance+1px4_${px4_instance}
已提供> 0px4_instance+1PX4_UXRCE_DDS_NS

调整 target_system

PX4 只在他们的 target_system 字段为 0 (路由通信) 或与 MAV_SYS_ID 一致时,才接受 VehicleCommand。 在所有其他情况下,信息都被忽视。 因此,当 ROS 2 节点需向 PX4 发送 VehicleCommand(载具指令)消息时,必须确保消息中填写了合适的 target_system(目标系统)字段值。

For example, if you want to send a command to your third vehicle, which has px4_instance=2, you need to set target_system=3 in all your VehicleCommand messages.