7.1 通过uXRCE-DDS实现PX4与ROS2通信
Micro XRCE-DDS、micro XRCE-DDS、 uXRCE-DDS 概念等同
Micro XRCE-DDS 取代了PX4 v1.13 中使用的Fast-RTPS Bridge。如果您之前使用的是 Fast-RTPS Bridge,请遵循迁移指南。
PX4 使用 uXRCE-DDS 中间件,允许在配套计算机上发布和订阅uORB 消息,就像ROS 2主题一样。这实现了 PX4 与 ROS 2 之间快速可靠的集成,并使 ROS 2 应用程序能够更轻松地获取无人机信息并发送命令。
以下指南介绍了设置客户端和代理的架构和各种选项。它特别涵盖了对 PX4 用户最重要的选项。
通信架构
uXRCE-DDS 中间件由运行在 PX4 上的客户端Client和运行在配套计算机上的代理Agent组成,它们之间通过串行或 UDP 链路进行双向数据交换。Agent充当客户端的代理,使其能够发布和订阅全局 DDS 数据空间中的主题。
为了使 PX4 uORB 主题能够在 DDS 网络上共享,您需要在 PX4 上运行uXRCE-DDS Client,并将其连接到在配套计算机设备上运行的uXRCE-DDS Agent。
使用串口连接
RDK X5 Module 的AI UART2即/dev/ttyS2与 Pixhawk 6X的 FC UART5即/dev/ttyS4可以通过内部连接串口进行通信,如图所示:

ROS 2 指南和 uXRCE-DDS页面涵盖了设置 uXRCE-DDS 和 ROS 的选项。本教程使用 ROS 2 “Humble”,并介绍了使用 RDK X5 Module 的具体设置。
Pixhawk/PX4 设置
接下来,我们在 TELEM2上设置 ROS 2 而不是 MAVLink 。我们通过更改 QGroundControl 中的参数来实现。QGroundControl 可以通过 USB 连接,也可以使用连接到 TELEM1的遥测无线电。
配置步骤如下:
-
使用 USB 电缆将 Pixhawk 与笔记本电脑连接,然后打开 QGroundControl(如果当前未连接)。
-
MAV_1_CONFIG = 0 (Disabled)
UXRCE_DDS_CFG = 102 (TELEM2)
SER_TEL2_BAUD = 921600MAV_1_CONFIG=0和UXRCE_DDS_CFG=102分别用于禁用 TELEM2 上的 MAVLink 和启用 TELEM2 上的 uXRCE-DDS 客户端。
SER_TEL2_BAUD用于设置通信链路的数据速率。你可以类似地使用MAV_1_CONFIG或MAV_0_CONFIG来配置与TELEM1的连接。若是没有 SER_TEL2_BAUD参数,可以将MAV_1_CONFIG = TELEM2来激活,然后再按照以上步骤重新设置。提示您需要重新启动飞行控制器才能应用对这些参数的任何更改。
-
PX4 uxrce_dds_client在构建时生成,并默认包含在 PX4 固件中。检查uxrce_dds_client模块是否正在运行。您可以在 QGroundControl MAVLink 控制台中运行以下命令来执行此操作:
uxrce_dds_client status信息如果客户端模块未能自动运行,您可以在 MAVLink 控制台中手动启动它:
uxrce_dds_client start -t serial -d /dev/ttyS4 -b 921600请注意,
/dev/ttyS4是USM10 Pixhawk 6X上的PX4TELEM2端口映射。对于其他飞行控制器,请查看其概览页面中的串行端口映射部分。
RDK X5 Module 上的 ROS 设置
在 RDK X5 Module上设置 ROS 2 和 Micro XRCE-DDS Agent 的步骤如下:
-
按照官方教程安装 ROS 2 Humble 。
-
使用 RDK X5 Module 终端安装 git
sudo apt install git -
安装ROS2 编译工具colcon
sudo apt update
sudo apt install python3-colcon-common-extensions -
请参阅uXRCE-DDS > Micro XRCE-DDS Agent安装了解安装代理的其他方法。
-
开启UART2串口 编辑/boot/config.txt文件,添加dtparam=uart2=on,并重启USX51
sudo nano /boot/config.txt -
在 RDK X5 Module 终端中启动代理:
sudo MicroXRCEAgent serial --dev /dev/ttyS2 -b 921600请注意我们如何使用之前设置的串行端口以及与 PX4 相同的波特率。
现在代理和客户端都已运行,您应该在 MAVLink 控制台和 RDK X5 Module 终端上都能看到活动。
PX4 启动并运行时, PX4 终端会显示NuttShell/PX4 系统控制台的输出。代理连接后,输出应包含INFO创建数据写入器的消息:
...
INFO [uxrce_dds_client] synchronized with time offset 1675929429203524us
INFO [uxrce_dds_client] successfully created rt/fmu/out/failsafe_flags data writer, topic id: 83
INFO [uxrce_dds_client] successfully created rt/fmu/out/sensor_combined data writer, topic id: 168
INFO [uxrce_dds_client] successfully created rt/fmu/out/timesync_status data writer, topic id: 188
...
RDK X5 Module 上的Micro XRCE-DDS Agent终端也应该开始显示输出,因为在 DDS 网络中创建了等效主题:
...
[1675929445.268957] info | ProxyClient.cpp | create_publisher | publisher created | client_key: 0x00000001, publisher_id: 0x0DA(3), participant_id: 0x001(1)
[1675929445.269521] info | ProxyClient.cpp | create_datawriter | datawriter created | client_key: 0x00000001, datawriter_id: 0x0DA(5), publisher_id: 0x0DA(3)
[1675929445.270412] info | ProxyClient.cpp | create_topic | topic created | client_key: 0x00000001, topic_id: 0x0DF(2), participant_id: 0x001(1)
...
您可以在 RDK X5 Module 上使用以下命令查看可用的主题:
source /opt/ros/humble/setup.bash
ros2 topic list
如下话题
...
/fmu/in/obstacle_distance
/fmu/in/offboard_control_mode
/fmu/in/onboard_computer_status
/fmu/in/register_ext_component_request
/fmu/in/sensor_optical_flow
/fmu/in/telemetry_status
/fmu/in/trajectory_setpoint
/fmu/in/unregister_ext_component
/fmu/in/vehicle_attitude_setpoint
/fmu/in/vehicle_command
/fmu/in/vehicle_command_mode_executor
/fmu/in/vehicle_mocap_odometry
/fmu/in/vehicle_rates_setpoint
/fmu/in/vehicle_thrust_setpoint
/fmu/in/vehicle_torque_setpoint
/fmu/in/vehicle_trajectory_bezier
/fmu/in/vehicle_trajectory_waypoint
/fmu/in/vehicle_visual_odometry
/fmu/out/estimator_status_flags
/fmu/out/failsafe_flags
/fmu/out/manual_control_setpoint
/fmu/out/position_setpoint_triplet
/fmu/out/sensor_combined
/fmu/out/timesync_status
/fmu/out/vehicle_attitude
/fmu/out/vehicle_control_mode
...
连接成功后,请参阅ROS 2 指南,了解更多关于使用 PX4 和 ROS 2 的信息。
使用以太网连接
启动代理
代理用于通过特定通道(例如 UDP 或串行连接)连接到客户端。通道设置在代理启动时使用命令行选项指定。这些设置记录在 eProsima 用户指南中:Micro XRCE-DDS Agent > Agent CLI。请注意,代理支持多种通道选项,但 PX4 仅支持 UDP 和串行连接。
您应该为需要连接的每个通道创建一个代理实例。
例如,PX4 模拟器在端口 8888 上通过 UDP 运行 uXRCE-DDS 客户端,因此要连接到模拟器,您可以使用以下命令启动代理:
MicroXRCEAgent udp4 -p 8888
启动客户端
所有固件和模拟器默认包含uXRCE-DDS 客户端模块 ( uxrce_dds_client )。必须根据您希望与代理通信的通道进行适当的设置来启动该模块。
模拟器8888使用默认的 uxrce-dds 命名空间自动在本地主机 UDP 端口上启动客户端。
可以使用UXRCE-DDS 参数完成配置:
-
UXRCE_DDS_CFG:设置要连接的端口,例如
TELEM2、Ethernet或Wifi。 -
如果使用以太网连接:
-
UXRCE_DDS_PRT:用于指定代理 UDP 监听端口。默认值为
8888。 -
UXRCE_DDS_AG_IP:用于指定代理的 IP 地址。
int32由于 PX4 不支持字符串参数,因此必须以字符串格式提供 IP 地址。默认2130706433值为127.0.0.1即localhost。您可以使用Tools/convert_ip.py在格式之间进行转换:
-
要获取
int32十进制点表示法的 IP 版本,命令如下:python3 ./PX4-Autopilot/Tools/convert_ip.py <the IP address in decimal dot notation> -
要从版本中获取十进制点表示法的 IP 地址
int32:python3 ./PX4-Autopilot/Tools/convert_ip.py -r <the IP address in int32 notation>
-
-
-
某些设置可能还需要设置这些参数:
- UXRCE_DDS_KEY:uXRCE-DDS 密钥。如果您使用的是多客户端单代理配置,则每个客户端都应具有唯一的非零密钥。这对于多车辆模拟尤其重要,因为所有客户端都通过 UDP 连接到同一个代理。(请参阅eprosima 官方文档,
uxr_init_session。) - UXRCE_DDS_DOM_ID:DDS 域 ID。这在 DDS 网络之间提供了逻辑隔离,并可用于区分不同网络上的客户端。默认情况下,ROS 2 在 ID 0 上运行。
- UXRCE_DDS_PTCFG:uXRCE-DDS 参与者配置。它允许将 DDS 主题的可见性限制为仅限_本地主机_,并使用存储在代理端的用户自定义参与者配置文件。
- UXRCE_DDS_SYNCT:桥接时间同步启用。uXRCE-DDS 客户端模块可以同步通过桥接交换的消息的时间戳。这是默认配置。在某些情况下,例如在模拟过程中,此功能可能会被禁用。
- UXRCE_DDS_KEY:uXRCE-DDS 密钥。如果您使用的是多客户端单代理配置,则每个客户端都应具有唯一的非零密钥。这对于多车辆模拟尤其重要,因为所有客户端都通过 UDP 连接到同一个代理。(请参阅eprosima 官方文档,
许多端口已具有默认配置。要使用这些端口,您必须先禁用现有配置:
TELEM1并TELEM2默认设置为通过 MAVLink 分别连接到地面站 (GCS) 和配套计算机。通过将MAV_0_CONFIG=0或MAV_1_CONFIG=0设置为零来禁用。更多信息请参阅MAVLink 外设。- 其他端口可类似配置。请参阅串口配置。
设置完成后,可能需要重启 PX4 才能使参数生效。这些参数在后续重启后仍会保留。
您也可以使用命令行启动uxrce_dds_client 。这可以作为系统启动的一部分调用,也可以通过MAVLink Shell(或系统控制台)调用。当您需要设置自定义客户端命名空间时,此方法 非常有用,因为没有为此提供任何参数。例如,以下命令可用于通过以太网连接到远程主机 ,192.168.0.100:8888并将客户端命名空间设置为/drone/。
uxrce_dds_client start -t udp -p 8888 -h 192.168.0.100 -n drone
选项-p或-h用于绕过UXRCE_DDS_PRT和UXRCE_DDS_AG_IP。
在模拟中启动客户端
模拟器启动逻辑( init.d-posix/rcS ) 使用客户端启动命令进行单车和多车模拟,从而可以设置适当的实例 ID 和 DDS 命名空间。默认情况下,客户端在 localhost UDP 端口上启动,8888无需任何额外的命名空间。
提供了覆盖某些UXRCE-DDS 参数的环境变量。这些变量允许用户为其模拟创建自定义启动文件:
PX4_UXRCE_DDS_NS:使用此项指定主题命名空间)。ROS_DOMAIN_ID:使用它来替换UXRCE_DDS_DOM_ID。PX4_UXRCE_DDS_PORT:使用它来替换UXRCE_DDS_PRT。
例如,以下命令可用于启动在 DDS 域3、端口9999和主题命名空间上运行 che 客户端的 Gazebo 模拟drone。
ROS_DOMAIN_ID=3 PX4_UXRCE_DDS_PORT=9999 PX4_UXRCE_DDS_NS=drone make px4_sitl gz_x500
代理和客户端现在正在运行,它们应该连接。
PX4 启动并运行时, PX4 终端会显示NuttShell/PX4 系统控制台的输出。代理连接后,输出应包含INFO创建数据写入器的消息:
...
INFO [uxrce_dds_client] synchronized with time offset 1675929429203524us
INFO [uxrce_dds_client] successfully created rt/fmu/out/failsafe_flags data writer, topic id: 83
INFO [uxrce_dds_client] successfully created rt/fmu/out/sensor_combined data writer, topic id: 168
INFO [uxrce_dds_client] successfully created rt/fmu/out/timesync_status data writer, topic id: 188
...
Micro XRCE-DDS Agent终端也应该开始显示输出,因为在 DDS 网络中创建了等效主题:
...
[1675929445.268957] info | ProxyClient.cpp | create_publisher | publisher created | client_key: 0x00000001, publisher_id: 0x0DA(3), participant_id: 0x001(1)
[1675929445.269521] info | ProxyClient.cpp | create_datawriter | datawriter created | client_key: 0x00000001, datawriter_id: 0x0DA(5), publisher_id: 0x0DA(3)
[1675929445.270412] info | ProxyClient.cpp | create_topic | topic created | client_key: 0x00000001, topic_id: 0x0DF(2), participant_id: 0x001(1)
...
通信示例教程
ROS2想要订阅或发布到 PX4 消息,需要与用于创建 PX4 uXRCE-DDS Client的 uORB 消息定义相匹配的px4_msgs,以便可以解释消息。
官方构建 PX4 时,代码生成器使用源树PX4-Autopilot/msg 中的 uORB 消息定义将对/src/modules/uxrce_dds_client/dds_topics.yaml中的 uORB 主题子集的支持编译到uxrce_dds_client中。
PX4 主版本或发布版本会自动将构建中的一组 uORB 消息定义导出到PX4/px4_msgs中的关联分支。
ROS 2 应用程序需要在包含与 PX4 固件中创建 uXRCE-DDS 客户端模块相同的消息定义的工作区中构建。您可以通过将接口包PX4/px4_msgs克隆到您的 ROS 2 工作区并切换到相应的分支,将这些消息定义添加到工作区中。请注意,所有与消息相关的代码生成均由 ROS 2 处理。
px4_ros_com
https://docs.px4.io/main/en/ros2/offboard_control.html
https://github.com/PX4/px4_ros_com.git
px4-ros2-interface-lib
https://docs.px4.io/main/en/ros2/px4_ros2_interface_lib.html
https://github.com/Auterion/px4-ros2-interface-lib
更多信息
请参考PX4官方文档