# uXRCE-DDS (PX4-ROS 2/DDS 桥接器)

备注

uXRCE-DDS 取代了 快速 RTPS 网桥 (打开新窗口) 在 PX4 v1.13 中使用。如果您使用的是 Fast-RTPS 网桥,请按照 迁移指南.

PX4 使用 uXRCE-DDS 中间件,允许 uORB 信息 在配套计算机上发布和订阅,就好像它们是 ROS 2 主题。这为 PX4 和 ROS 2 提供了快速可靠的集成,使 ROS 2 应用程序更容易获取载具信息和发送命令。

PX4 使用 XRCE-DDS 实现,利用了 eProsima Micro XRCE-DDS (打开新窗口).

以下指南介绍了架构以及设置客户端和代理的各种选项。其中特别涵盖了对 PX4 用户最重要的选项。

# 建筑学

uXRCE-DDS 中间件包括在 PX4 上运行的客户端和在配套计算机上运行的代理,两者之间通过串行或 UDP 链接进行双向数据交换。代理作为客户端的代理,使其能够发布和订阅全球 DDS 数据空间中的主题。

采用 ROS 2 的 uXRCE-DDS 架构

要在 DDS 网络上共享 PX4 uORB 主题,您需要 uXRCE-DDS 客户端 在 PX4 上运行,连接到 微型 XRCE-DDS 代理 在同伴身上运行。

PX4 uxrce_dds_client 向/从一组定义的 uORB 主题发布到全局 DDS 数据空间。

eProsima micro XRCE-DDS 代理人 (打开新窗口) 在配套计算机上运行,在 DDS/ROS 2 网络中充当客户机的代理。

代理本身不依赖客户端代码,可以独立于 PX4 或 ROS 进行构建和/或安装。

要订阅/发布 PX4 的代码确实依赖于客户端代码;它需要与创建 PX4 uXRCE-DDS 客户端所用的 uORB 消息定义相匹配的 uORB 消息定义,这样它才能解释消息。

# 代码生成

PX4 uxrce_dds_client 会在构建时生成,并默认包含在 PX4 firmare 中。该代理不依赖客户端代码。它可以独立构建或在 ROS 2 工作区中构建,也可以作为 Ubuntu 上的 snap 包安装。

构建 PX4 时,代码生成器会使用源代码树中的 uORB 消息定义 (PX4-Autopilot/msg (打开新窗口)中的 uORB 主题子集编译支持。 PX4-Autopilot/src/modules/uxrce_dds_client/dds_topics.yaml (打开新窗口)uxrce_dds_client.

PX4 主构建或发布构建会自动将构建中的 uORB 报文定义集导出到 PX4/px4_msgs (打开新窗口).

ROS 2 应用程序需要在工作区中构建,该工作区包括 一样 用于在 PX4 固件中创建 uXRCE-DDS 客户端模块的消息定义。可通过克隆接口包将这些定义纳入工作区 PX4/px4_msgs (打开新窗口) 进入 ROS 2 工作区并切换到相应的分支。请注意,所有与信息相关的代码生成都由 ROS 2 处理。

# Micro XRCE-DDS 代理安装

Micro XRCE-DDS Agent 可以使用二进制软件包安装在配套计算机上,也可以从源代码中构建和安装,或者在 ROS 2 工作区中构建和运行。所有这些方法都能获取 一应俱全 与客户端通信所需的依赖项(如 FastCDR)

备注

官方(更完整)的安装指南是 Eprosima: micro XRCE-DDS 安装指南 (打开新窗口).本节总结了在创建这些文档时使用 PX4 测试过的选项。

# 从源代码安装独立版本

在 Ubuntu 上,您可以使用以下命令从源代码构建并独立安装代理:

Git 克隆 https://github.com/eProsima/Micro-XRCE-DDS-Agent.git
CD Micro-XRCE-DDS-Agent
mkdir 构建
CD 构建 cmake ..
生产
苏都 生产 安装
苏都 ldconfig /usr/local/lib/

备注

有多种构建配置选项,可从相应主题中的 官方指南 (打开新窗口)但尚未进行测试。

启动代理,设置连接到模拟器上运行的 uXRCE-DDS 客户端:

MicroXRCEAgent udp4 -p 8888

# 从 Snap 软件包安装

在 Ubuntu 上使用以下命令从快照软件包安装:

苏都安装 micro-xrce-dds-agent --edge

使用连接到模拟器上运行的 uXRCE-DDS 客户端的设置启动代理(注意,命令名称与在本地构建代理时不同):

micro-xrce-dds-agent udp4 -p 8888

备注

在编写本报告时,从 snap 安装的稳定版本可以连接到 PX4,但在创建主题时会报错。使用 --边缘 上述方法确实有效。

# 在 ROS 2 工作区内构建/运行

该代理可在 ROS 2 工作区内构建和启动(或独立构建并从工作区启动)。您必须已经按照以下说明安装了 ROS 2: ROS 2 用户指南 > 安装 ROS 2.

在 ROS 中建立代理:

  1. 为代理创建工作区目录:

    mkdir -p ~/px4_ros_uxrce_dds_ws/src
    
  2. 克隆 eProsima 的源代码 Micro-XRCE-DDS-Agent (打开新窗口)/src 目录(该 主要 默认情况下会克隆分支):

    CD ~/px4_ros_uxrce_dds_ws/src
    Git 克隆 https://github.com/eProsima/Micro-XRCE-DDS-Agent.git
    
  3. 源代码 ROS 2 开发环境,并使用 胶管:

      这将生成 /src 使用源工具链。

    在工作区中运行 micro XRCE-DDS 代理:

    1. 资料来源 local_setup.bash 使可执行文件在终端中可用(也可以 setup.bash 如果使用新终端)。

      1. 启动代理,设置连接到模拟器上运行的 uXRCE-DDS 客户端:

        MicroXRCEAgent udp4 -p 8888
        

      # 启动代理和客户

      # 启动代理

      代理用于通过特定通道(如 UDP 或串行连接)连接客户端。通道设置在启动代理时使用命令行选项指定。这些选项在 eProsima 用户指南中有详细说明: Micro XRCE-DDS 代理 > 代理 CLI (打开新窗口).请注意,代理支持多种通道选项,但 PX4 只支持 UDP 和串行连接。

      备注

      您应该为每个需要连接的通道创建一个代理实例。

      例如,PX4 模拟器通过 UDP 在 8888 端口上运行 uXRCE-DDS 客户端,因此要连接到模拟器,可以使用命令启动代理:

      MicroXRCEAgent udp4 -p 8888
      

      在使用真实硬件时,设置取决于硬件、操作系统和通道。例如,如果您使用的是 RasPi UART0 串行端口,您可以使用该命令进行连接(基于 Raspberry Pi 文档 > 配置 UARTS (打开新窗口)):

      苏都 MicroXRCEAgent serial --dev /dev/AMA0 -b 921600
      

      备注

      有关设置通信频道的更多信息,请参阅 Pixhawk + 同伴设置 > 串行端口设置和子文件。

      # 启动客户端

      uXRCE-DDS 客户端模块 (uxrce_dds_client) 默认包含在所有固件和模拟器中。必须根据要与代理进行通信的通信通道的适当设置启动该程序。

      备注

      模拟器会在本地主机 UDP 端口自动启动客户端 8888 使用默认的 uxrce-dds 命名空间。

      可以使用 UXRCE-DDS 参数:

      • UXRCE_DDS_CFG:设置要连接的端口,例如 TELEM2, 以太网无线网络.

      • 如果使用以太网连接:

        • UXRCE_DDS_PRT:用于指定代理的 UDP 监听端口。默认值为 8888.

        • uxrce_dds_ag_ip:用于指定代理的 IP 地址。IP 地址必须在 int32 格式,因为 PX4 不支持字符串参数。默认值为 2130706433 对应于 本地主机 127.0.0.0.1.

          您可以使用 Tools/convert_ip.py (打开新窗口) 之间进行转换:

          • 要获得 int32 以十进制点符号表示的 IP 版本,该命令为:

            python3 ./PX4-Autopilot/Tools/convert_ip.py <;IP 地址  十进位点记法>;
            
          • 以十进制点符号从 int32 版本:

            python3 ./PX4-Autopilot/Tools/convert_ip.py -r <;IP 地址  int32 符号>;
            
      • 如果使用串行连接:

      • 某些设置可能还需要设置这些参数:

        • UXRCE_DDS_KEY:uXRCE-DDS 密钥。如果使用的是多客户端、单代理配置,则每个客户端都应有一个唯一的非零密钥。这对多载具模拟非常重要,因为在多载具模拟中,所有客户端都通过 UDP 连接到同一个代理。(请参阅 EPROSIMA 官方文件 (打开新窗口) , uxr_init_session.)
        • uxrce_dds_dom_id:DDS 域 ID。它提供了 DDS 网络之间的逻辑分隔,可用于分隔不同网络上的客户端。默认情况下,ROS 2 在 ID 0 上运行。

      备注

      许多端口已经有了默认配置。要使用这些端口,必须先禁用现有配置:

      设置完成后,可能需要重启 PX4 才能使参数生效。这些参数将在以后的重启中持续生效。

      您还可以启动 uxrce_dds_client 使用命令行。可以作为 系统启动 或通过 MAVLink 外壳 (或系统控制台)。这种方法在需要设置自定义客户端命名空间时非常有用,因为没有为此提供参数。例如,可以使用以下命令通过以太网连接到远程主机,地址为 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_PRTuxrce_dds_ag_ip.

      # 在模拟环境中启动客户端

      模拟器 启动逻辑 (init.d-posix/rcS (打开新窗口))使用客户端启动命令进行单个和 多车模拟这样就可以设置适当的实例 ID 和 DDS 命名空间。默认情况下,客户端通过本地主机 UDP 端口启动。 8888 没有额外的命名空间。

      提供的环境变量可覆盖某些 UXRCE-DDS 参数.这些允许用户为其模拟创建自定义启动文件:

      例如,可以使用以下命令启动 Gazebo 仿真,并在 DDS 域上运行 che 客户端 3端口 9999 和主题名称空间 嗡嗡声.

      ROS_DOMAIN_ID=3 px4_uxrce_dds_port=9999 px4_uxrce_dds_ns=嗡嗡声 生产 PX4_SITL GZ_X500
      

      # 支持的 uORB 信息

      的集合 PX4 uORB 主题dds_topics.yaml (打开新窗口).

      这些主题是针对特定版本的(支持内容编入了 uxrce_dds_client 在构建时)。虽然大多数版本应该支持非常相似的信息集,但要确定这一点,您需要检查特定版本的 yaml 文件。

      请注意,ROS 2/DDS 需要有 一样 信息定义用于在 PX4 固件中创建 uXRCE-DDS 客户端模块,以便解释信息。信息定义存储在 ROS 2 接口包中 PX4/px4_msgs (打开新窗口)的 CI 自动同步。 主要 和发布分支。请注意,PX4 源代码中的所有信息都存在于版本库中,但只有在 dds_topics.yaml 将作为 ROS 2 的主题提供。因此

      • 如果您使用的是 PX4 主版本或发布版本,可以通过克隆接口软件包来获取报文定义 PX4/px4_msgs (打开新窗口) 进入你的工作空间。

      • 如果要创建或修改 uORB 信息,必须从 PX4 源代码树中手动更新工作区中的信息。一般来说,这意味着你要更新 dds_topics.yaml (打开新窗口),克隆接口包,然后通过将新的/修改过的报文定义从 PX4-Autopilot/msg (打开新窗口) 到其 信息 文件夹假设 PX4-Autopilot 位于您的主目录中 ~px4_msgs~/px4_ros_com/src/那么命令可能是

        rm ~/px4_ros_com/src/px4_msgs/msg/*.msg
        cp ~/PX4-Autopilot/mgs/*.msg ~/px4_ros_com/src/px4_msgs/msg/
        

        备注

        从技术上讲 dds_topics.yaml (打开新窗口) 完全定义了 PX4 uORB 主题和 ROS 2 信息之间的关系。更多信息请参见 DDS 主题 YAML 下图

      # 自定义主题名称空间

      自定义主题名称空间可在构建时应用(更改 dds_topics.yaml (打开新窗口))或运行时(这对多车运行非常有用):

      • 一种可能性是使用 -n 选项时启动 uxrce_dds_client 命令行。这种技术既可用于模拟,也可用于实际载具。
      • 通过设置环境变量 px4_uxrce_dds_ns 然后再开始模拟。

      备注

      在运行时更改命名空间会将所需的命名空间作为前缀附加到所有 主题 中的字段 dds_topics.yaml (打开新窗口).因此,类似这样的命令

      uxrce_dds_client start -n uav_1
      

      px4_uxrce_dds_ns=uav_1 生产 PX4_SITL GZ_X500
      

      将在命名空间下生成主题:

      /uav_1/fmu/in/  # 为订阅者
      /uav_1/fmu/out/ # 为出版商
      

      # PX4 ROS 2 QoS 设置

      发布者的 PX4 QoS 设置与 ROS 2 订阅者的默认 QoS 设置不兼容。因此,如果 ROS 2 代码需要订阅 uORB 主题,就需要使用兼容的 QoS 设置。其中一个例子如下 ROS 2 用户指南 > ROS 2 用户服务质量设置.

      PX4 对发布商使用以下 QoS 设置:

      uxrQoS_t qos = {
        .耐久性 = UXR_DURABLE_Transient_Local,
        .可靠性 = uxr_reliability_best_effort,
        .历史 = uxr_history_keep_last,
        .深度 = 0,
      };
      

      PX4 对用户使用以下 QoS 设置:

      uxrQoS_t qos = {
        .耐久性 = uxr_耐用性_易失性,
        .可靠性 = uxr_reliability_best_effort,
        .历史 = uxr_history_keep_last,
        .深度 = 队列深度,
      };
      

      ROS 2 对发布者和订阅使用以下 QoS 设置(默认):"keep last"(保留最后一次")表示历史记录,队列大小为 10;"reliable"(可靠")表示可靠性;"volatile"(易失")表示耐用性;"system default"(系统默认")表示实时性。最后期限、生命周期和租期也都设置为 "默认值"。

      # DDS 主题 YAML

      PX4 yaml 文件 dds_topics.yaml (打开新窗口) 定义了内置于固件并已发布的 PX4 uORB 主题集。更确切地说,它完全定义了 PX4 uORB 和 ROS 2 消息之间的关系/配对。

      文件结构如下

      出版物:
      
        - 主题: /fmu/out/collision_constraints
          类型: px4_msgs::信息::碰撞限制
      
        ...
      
        - 主题: /fmu/out/vehicle_odometry
          类型: px4_msgs::信息::载具几何尺寸
      
        - 主题: /fmu/out/vehicle_status
          类型: px4_msgs::信息::载具状态
      
        - 主题: /fmu/out/vehicle_trajectory_waypoint_desired
          类型: px4_msgs::信息::载具轨迹航点
      
      订阅:
      
        - 主题: /fmu/in/offboard_control_mode
          类型: px4_msgs::信息::机外控制模式
      
        ...
      
        - 主题: /fmu/in/vehicle_trajectory_waypoint
          类型: px4_msgs::信息::载具轨迹航点
      

      每个主题,类型) 成对定义:

      1. 新的订阅或出版物,视其添加到的列表而定。
      2. 主题 基本名称其中 必须 与要发布/订阅的 uORB 主题名称一致。它由 主题: 开头的 / 并不包含任何 / 中。 载具几何, 载具状态车外控制模式 都是基础名称的例子。
      3. 主题 命名空间 (打开新窗口).默认设置为
        • /fmu/out/ 的主题 已出版 由 PX4 提供。
        • /fmu/in/ 的主题 已订阅 由 PX4 提供。
      4. 信息类型 (载具几何尺寸, 载具状态, 机外控制模式等)和 ROS 2 软件包 (px4_msgs),它将提供报文定义。

      您可以任意更改配置。例如,您可以使用不同的默认命名空间,或使用自定义包来存储消息定义。

      # Fast-RTPS 到 uXRCE-DDS 迁移指南

      本指南说明了如何从使用 PX4 v1.13 迁移到使用 PX4 v1.13 快速 RTPS 中间件到 PX4 v1.14 uXRCE-DDS 中间件。如果您有 为 PX4 v1.13 编写的 ROS 2 应用程序 (打开新窗口)或使用 Fast-RTPS 将应用程序连接到 PX4 直接 (打开新窗口).

      备注

      本节包含迁移特定信息。要正确理解 uXRCE-DDS,还应阅读本页的其他内容。

      # 无需移除依赖项

      uXRCE-DDS 不需要 Fast-RTPS 所需的依赖项,例如通过以下主题安装的依赖项 快速 DDS 安装 (打开新窗口).您可以保留它们,而不会影响您的 uXRCE-DDS 应用程序。

      如果您选择删除依赖项,请注意不要删除应用程序使用的任何内容(如 Java)。

      # _rtps 目标已删除

      之前使用过带有扩展名的构建目标的任何地方 _rtps例如 PX4_FMU-V5_RTPSpx4_sitl_rtps现在,您可以使用等效的默认目标(针对这些情况 px4_fmu-v5_defaultpx4_sitl_default).

      带扩展功能的制造目标 _rtps 用于构建包含客户端 RTPS 代码的固件。uXRCE-DDS 中间件默认包含在大多数电路板的构建中,因此你不再需要特殊的固件就能使用 ROS 2。

      要检查您的电路板是否安装了中间件,请查找 CONFIG_MODULES_UXRCE_DDS_CLIENT=y.px4board 文件。这些文件嵌套在 PX4-自动驾驶仪/控制板 (打开新窗口).

      如果不存在,或者设置为 n然后,您必须克隆 PX4 软件源,修改电路板配置,并手动 汇编 固件。

      # 新的客户端模块和新的启动参数

      由于客户端是由新的 PX4 模块实现的,因此现在有了新的参数来启动它。请看 客户启动部分 了解如何做到这一点。

      # 用于设置发布主题的新文件

      为特定固件发布和订阅的主题列表现在由 dds_topic.yaml (打开新窗口) 配置文件,取代 urtps_bridge_topics.yaml (打开新窗口)

      参见 支持的 uORB 信息DDS 主题 YAML 章节获取更多信息。

      # 主题不再需要在客户端和代理之间同步。

      在 ROS 2 中,代理和客户端之间的桥接主题列表不再需要同步,所以 update_px4_ros2_bridge.sh 脚本不再需要。

      # 默认主题命名约定已更改

      更改了主题命名格式:

      • 发表的主题 /fmu/topic-name/out (快速-RTPS)到 /fmu/out/topic-name (XRCE-DDS)。
      • 订阅主题: /fmu/topic-name/in(快速-RTPS)到 /fmu/in/topic-name (XRCE-DDS)。

      您应根据新约定更新您的应用程序。

      备注

      您还可以编辑 dds_topic.yaml (打开新窗口) 恢复到旧的习惯。不建议这样做,因为这意味着您必须始终使用自定义固件。

      # XRCE-DDS-Agent

      XRCE-DDS 代理是通用代理,独立于 PX4: micro-xrce-dds-agent (打开新窗口).在个人电脑/配套电脑上安装的方法有很多种,如需了解更多信息,请参见 专门部分.

      # 针对应用程序的更改

      如果您没有在使用 ROS 2 的同时使用代理 (独立于 ROS 的快速 DDS 接口 (打开新窗口)),则需要迁移到 eProsima Fast DDS (打开新窗口).

      ROS 2 应用程序仍然需要与 PX4 消息一起编译,您可以通过添加 px4_msgs (打开新窗口) 软件包到工作区。您可以删除 px4_ros_com (打开新窗口) 包,因为除了用于示例代码外,不再需要它。

      在 ROS 2 节点中,您需要

      • 更新 服务质量 因为 PX4 不使用 ROS 2 的默认设置。

      • 更改主题名称,除非您编辑了 dds_topic.yaml (打开新窗口).

      • 删除与时间同步相关的所有内容,因为 XRCE-DDS 会自动处理代理/客户端时间同步。

        在 C++ 应用程序中,您可以设置 时戳 字段:

        信息.时戳 = ->;获取时钟()->;现在().纳秒() / 1000;
        

        在 Python 应用程序中,您可以设置 时戳 字段:

        信息.时戳 = int(自我.获取时钟().现在().纳秒 / 1000)
        

      # 有用资源