跳转至

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:

RflySim MAVROS 数据链

端口与多机命名空间

对 CopterID 为 N 的飞机,RflySim 默认使用以下规则:

CopterSim 目标端口 = 20100 + N * 2 - 2
MAVROS 接收端口   = CopterSim 目标端口 + 1
MAVLink System ID = N
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 消息。

PX4 uXRCE-DDS 数据链

使用前需要:

  • 使用支持 uXRCE-DDS 的 PX4 固件,并确保 PX4 侧 Client 已启用且端口配置正确。
  • 安装与 PX4 版本匹配的 px4_msgs;自行开发桥接包时通常还会使用 px4_ros_com。
  • 在 WinWSL 中启动 Agent:
MicroXRCEAgent udp4 -p 8888

典型输出话题为 /fmu/out/vehicle_local_position,控制输入话题位于 /fmu/in/...。可以通过以下命令确认链路:

ros2 topic list | grep '^/fmu/'
ros2 topic echo /fmu/out/vehicle_local_position

快速启动 MAVROS

推荐方式

  1. 先通过 RflySim 统一启动器执行 Environment Check,确认 WinWSL、PX4 和 ROS 环境正常。
  2. 运行 RflyTools\SITLRunROS。该脚本会以 Mavlink_Full 模式启动 CopterSim,并自动拉起对应的 MAVROS/MAVROS2 节点。
  3. 如果仿真和 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 目录中的实际文件名为准。

启动后可检查连接状态:

# ROS 1
rostopic echo /mavros/state

# ROS 2
ros2 topic echo /mavros/state

如果 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