ROS/ROS2 接口参考¶
RflySim 可以通过 ROS 1、ROS 2 接入飞控状态、控制指令、视觉传感器和集群算法。当前配套的 RflySim-20.04 WinWSL 默认提供 ROS 1 Noetic 和 ROS 2 Humble;其他 ROS 发行版能否使用取决于用户自行安装的环境与依赖兼容性。
通信方式选择¶
| 通信方式 | 适用场景 | 主要话题前缀 |
|---|---|---|
| MAVROS / MAVROS2 | 通过 MAVLink 读取 PX4 状态、解锁、切换模式和发送 Offboard 设定点 | /mavros/...、/mavrosN/... |
| uXRCE-DDS | PX4 v1.14+ 与 ROS 2 原生通信,访问固件配置开放的 uORB 话题 | /fmu/out/...、/fmu/in/... |
| RosTrans | 在 CopterSim、RflySim3D、视觉传感器、MAVLink 与 ROS 之间进行多协议转换 | 由 RosTrans 配置决定 |
三种方式不是同一套接口。使用 MAVROS 时查找 /mavros/...,使用 PX4 uXRCE-DDS 时查找 /fmu/...,使用 RosTrans 时以其参数文件和过滤规则为准。
MAVROS / MAVROS2¶
MAVROS 将 PX4 的 MAVLink 消息转换为 ROS 话题和服务。在 RflySim 的标准 SITL/HITL 链路中,MAVLink 数据先经过处于 Mavlink_Full 模式的 CopterSim,再由 MAVROS 接入 ROS:
端口与多机命名空间¶
对 CopterID 为 N 的飞机,RflySim 默认使用以下规则:
| CopterID | MAVROS 命名空间 | MAVROS 接收端口 | CopterSim 目标端口 |
|---|---|---|---|
| 1 | /mavros |
20101 | 20100 |
| 2 | /mavros2 |
20103 | 20102 |
| N | /mavrosN |
20100 + N * 2 - 1 |
20100 + N * 2 - 2 |
下文话题以 1 号飞机的 /mavros 为例。操作其他飞机时,应将前缀替换为对应的 /mavrosN。
常用订阅话题¶
| 话题 | ROS 1 类型 | ROS 2 类型 | 说明 |
|---|---|---|---|
/mavros/state |
mavros_msgs/State |
mavros_msgs/msg/State |
连接、解锁和飞行模式状态 |
/mavros/local_position/pose |
geometry_msgs/PoseStamped |
geometry_msgs/msg/PoseStamped |
本地位置与姿态 |
/mavros/local_position/velocity_local |
geometry_msgs/TwistStamped |
geometry_msgs/msg/TwistStamped |
本地速度 |
/mavros/global_position/global |
sensor_msgs/NavSatFix |
sensor_msgs/msg/NavSatFix |
GPS 全球坐标 |
/mavros/imu/data |
sensor_msgs/Imu |
sensor_msgs/msg/Imu |
IMU 数据 |
/mavros/battery |
sensor_msgs/BatteryState |
sensor_msgs/msg/BatteryState |
电池状态 |
常用发布话题¶
| 话题 | ROS 1 类型 | ROS 2 类型 | 说明 |
|---|---|---|---|
/mavros/setpoint_position/local |
geometry_msgs/PoseStamped |
geometry_msgs/msg/PoseStamped |
位置设定点 |
/mavros/setpoint_velocity/cmd_vel_unstamped |
geometry_msgs/Twist |
geometry_msgs/msg/Twist |
速度设定点 |
/mavros/setpoint_raw/local |
mavros_msgs/PositionTarget |
mavros_msgs/msg/PositionTarget |
原始位置、速度和加速度设定点 |
/mavros/setpoint_raw/attitude |
mavros_msgs/AttitudeTarget |
mavros_msgs/msg/AttitudeTarget |
姿态设定点 |
常用服务¶
| 服务 | ROS 1 类型 | ROS 2 类型 | 说明 |
|---|---|---|---|
/mavros/cmd/arming |
mavros_msgs/CommandBool |
mavros_msgs/srv/CommandBool |
解锁或上锁 |
/mavros/set_mode |
mavros_msgs/SetMode |
mavros_msgs/srv/SetMode |
切换飞行模式 |
/mavros/cmd/takeoff |
mavros_msgs/CommandTOL |
mavros_msgs/srv/CommandTOL |
起飞 |
/mavros/cmd/land |
mavros_msgs/CommandTOL |
mavros_msgs/srv/CommandTOL |
降落 |
坐标系与 ROS 2 QoS¶
- MAVROS 对 ROS 侧通常采用 ENU 世界坐标和 FLU 机体坐标,PX4 内部则采用 NED/FRD。
/mavros/local_position/pose和普通位置设定点不能直接填入未经转换的 PX4 NED 数值。 /mavros/setpoint_raw/local的解释还取决于mavros_msgs/PositionTarget.coordinate_frame和type_mask,发送前应明确坐标系以及启用的字段。- ROS 2 订阅端的 QoS 必须与 MAVROS2 发布端兼容。RflySim 的 MAVROS2 Offboard 例程订阅
/mavros/state时使用BEST_EFFORT、TRANSIENT_LOCAL、KEEP_LAST、depth=1;若话题存在但收不到消息,可用ros2 topic info -v <topic>检查实际 QoS。
ROS 2 uXRCE-DDS¶
PX4 v1.14+ 可以通过 uXRCE-DDS Client 和 Micro XRCE-DDS Agent 接入 ROS 2,无需 MAVROS。该链路只桥接 PX4 固件 dds_topics.yaml 中配置的 uORB 话题,并非自动开放全部 uORB 消息。
使用前需要:
- 使用支持 uXRCE-DDS 的 PX4 固件,并确保 PX4 侧 Client 已启用且端口配置正确。
- 安装与 PX4 版本匹配的
px4_msgs;自行开发桥接包时通常还会使用px4_ros_com。 - 在 WinWSL 中启动 Agent:
典型输出话题为 /fmu/out/vehicle_local_position,控制输入话题位于 /fmu/in/...。可以通过以下命令确认链路:
快速启动 MAVROS¶
推荐方式¶
- 先通过 RflySim 统一启动器执行 Environment Check,确认 WinWSL、PX4 和 ROS 环境正常。
- 运行
RflyTools\SITLRunROS。该脚本会以Mavlink_Full模式启动 CopterSim,并自动拉起对应的 MAVROS/MAVROS2 节点。 - 如果仿真和 CopterSim 已经启动,可运行
RflyTools\MavrosRun单独启动 MAVROS。输入1表示 1 号飞机;输入4,3表示从 4 号飞机开始启动 3 个节点。
CopterSim 模式要求
MAVROS 链路要求 CopterSim 使用 Mavlink_Full(UDPSIMMODE=2)。普通 SITL 已经运行但 CopterSim 不是该模式时,仅启动 MavrosRun 不能建立正确通信。
手动启动 ROS 1¶
确认 1 号 CopterSim 已处于 Mavlink_Full 模式后,在 WinWSL 中执行:
roslaunch mavros px4.launch \
namespace:=mavros \
tgt_system:=1 \
fcu_url:="udp://:20101@127.0.0.1:20100"
手动启动 ROS 2¶
ros2 launch mavros px4.launch.xml \
namespace:=mavros \
tgt_system:=1 \
fcu_url:="udp://:20101@127.0.0.1:20100"
当前配套 MAVROS2 同时提供 px4.launch 和 px4.launch.xml;SDK 的 RflyRosStart.py 使用 px4.launch.xml。如果使用自行安装的 MAVROS,请以其 share/mavros/launch 目录中的实际文件名为准。
启动后可检查连接状态:
如果 connected 始终为 false,依次检查 CopterSim 模式、CopterID、端口、tgt_system 和命名空间。分布式仿真还需要将 127.0.0.1 替换为 CopterSim 所在计算机的可达 IP,并检查防火墙和 UDP 路由。
相关例程¶
| 内容 | 路径 |
|---|---|
| MAVROS/MAVROS2 安装与 Offboard 控制 | RflySimAPIs\2.RflySimUsage\0.ApiExps\e10_Mavros |
| PX4 ROS 2 与 uXRCE-DDS | RflySimAPIs\2.RflySimUsage\0.ApiExps\e12_PX4ROS2 |
| ROS 视觉传感器 Python/C++ 通信 | RflySimAPIs\2.RflySimUsage\0.ApiExps\e13_VisAPIPyCpp |
| RosTrans 多协议转换 | RflySimAPIs\6.RflySimExtCtrl\0.ApiExps\e21.RosTransExps |
| ROS 2 集群控制 | RflySimAPIs\10.RflySimSwarm\0.ApiExps\e10.ROS2Swarm |