使用 ROS 2 进行多车辆仿真
XRCE-DDS 支持多个客户端通过 UDP 协议连接到同一个代理。 这在模拟中特别有用,因为只有一个代理需要启动。
设置和要求
唯一的要求是
- 能够在不依赖 ROS 2 的情况下,使用所需的仿真器(Gazebo, Gazebo Classic, FlightGear 和 JMAVSim)运行多车辆仿真multi-vehicle simulation。
- 能够在单车辆仿真中使用ROS 2(机器人操作系统 2)
工作原理
在仿真中,每个 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_NS | px4_instance | UXRCE_DDS_KEY | 客户端命名空间 |
---|---|---|---|
未提供 | 0 | px4_instance+1 | 无 |
已提供 | 0 | px4_instance+1 | PX4_UXRCE_DDS_NS |
未提供 | > 0 | px4_instance+1 | px4_${px4_instance} |
已提供 | > 0 | px4_instance+1 | PX4_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.