8个版本

1.0.0-alpha.62024年8月6日
1.0.0-alpha.52024年7月26日
0.11.0 2024年6月4日
0.11.0-rc.32024年5月14日
0.10.1-rc2023年12月21日

#121 in 网络编程

Download history 144/week @ 2024-04-26 19/week @ 2024-05-03 125/week @ 2024-05-10 29/week @ 2024-05-17 3/week @ 2024-05-24 127/week @ 2024-05-31 23/week @ 2024-06-07 5/week @ 2024-06-14 2/week @ 2024-06-21 72/week @ 2024-07-05 25/week @ 2024-07-12 2/week @ 2024-07-19 150/week @ 2024-07-26 104/week @ 2024-08-02 12/week @ 2024-08-09

每月269次下载

EPL-2.0 OR Apache-2.0

405KB
9K SLoC

CI Discussion Discord License License

Eclipse Zenoh

Eclipse Zenoh:零开销的发布/订阅、存储/查询和计算。

Zenoh(发音为 /zeno/)统一了数据流动、静态数据和计算。它巧妙地将传统的发布/订阅与地理分布式存储、查询和计算相结合,同时保持时间效率和空间效率,远远超过任何主流堆栈。

请访问网站 zenoh.io路线图 获取更详细的信息。


ROS 2 over DDS的Zenoh桥

ROS(机器人操作系统)是一套软件库和工具,允许构建机器人应用程序。在其第2版中,ROS 2主要依赖于 O.M.G. DDS 作为 通信中间件。此插件通过Zenoh使用DDS桥接所有ROS 2通信。

虽然已经存在用于DDS的Zenoh桥,并帮助许多机器人用例克服了一些无线连接带宽集成问题,但使用专门针对ROS 2的桥接器带来了以下优势

  • 更好的ROS图集成(所有ROS主题/服务/操作都可以在桥接器中看到)
  • 更好的ROS工具支持(ros2rviz2...)
  • 在桥接器上配置ROS命名空间,而不是在每个ROS节点上
  • 与Zenoh原生应用程序(服务和方法映射到Zenoh可查询项)更容易集成
  • 桥接器之间发现信息交换更紧凑

插件还是桥接器?

此软件有两种构建方式可供选择

  • zenoh-plugin-ros2dds:一个Zenoh插件 - 一个可以被Zenoh路由器加载的动态库
  • zenoh-bridge-ros2dds:一个独立的可执行文件

本文件中描述的功能和配置适用于两者。这意味着在本文件的其余部分中,“插件”和“桥接器”这两个词可以互换。

如何安装它

要安装Zenoh路由器的DDS插件或独立的zenoh-bridge-ros2dds可执行文件的最新版本,可以按照以下步骤操作

手动安装(所有平台)

所有发布包都可以从以下链接下载

每个子目录的名称都是Rust目标的名称。请参阅https://doc.rust-lang.net.cn/stable/rustc/platform-support.html中每个目标对应的平台

选择您的平台并下载

  • 插件文件的zenoh-plugin-ros2dds-<version>-<platform>.zip
    然后将其解压缩到与zenohd相同的目录或任何可以找到插件库的目录(例如,/usr/lib)
  • 独立可执行文件的zenoh-bridge-ros2dds-<version>-<platform>.zip
    然后将其解压缩到您想要的位置,并运行提取的zenoh-bridge-ros2dds二进制文件。

Linux Debian

将Eclipse Zenoh私有仓库添加到源列表

echo "deb [trusted=yes] https://download.eclipse.org/zenoh/debian-repo/ /" | sudo tee -a /etc/apt/sources.list > /dev/null
sudo apt update

然后,您可以

  • 使用以下命令安装插件:sudo apt install zenoh-plugin-ros2dds.
  • 使用以下命令安装独立可执行文件:sudo apt install zenoh-bridge-ros2dds.

Docker镜像

zenoh-bridge-ros2dds独立可执行文件也作为Docker镜像提供,适用于amd64和arm64。要获取它,执行以下操作

  • docker pull eclipse/zenoh-bridge-ros2dds:latest获取最新版本
  • docker pull eclipse/zenoh-bridge-ros2dds:nightly获取主分支版本(夜间构建)

夜间构建

“发布”操作为大多数操作系统构建软件包。您可以从每个构建的“工件”部分下载这些软件包。
只需下载适用于您的操作系统的包并将其解压缩。您将获得3个zip文件:1个用于插件,1个用于作为Debian包的插件,1个用于网桥。解压缩以下文件:zenoh-bridge-ros2dds-<platform>.zip,然后您可以使用./zenoh-bridge-ros2dds

如何构建它

⚠️ 警告 ⚠️:Zenoh及其生态系统正在积极开发中。当您从git构建时,请确保您还构建了您计划使用的任何其他Zenoh仓库(例如,绑定、插件、后端等)。可能发生的情况是,git中的某些更改与最新的Zenoh发行版(例如,deb、docker、pip)不兼容。我们特别努力维护Zenoh项目中各种git仓库之间的兼容性。

⚠️ 警告 ⚠️:由于Rust没有稳定的ABI,插件应使用与zenohd相同的Rust版本构建,并使用与zenoh依赖项相同的版本(或提交编号)'zenohd'。否则,zenohd和库之间共享类型的内存映射不兼容可能导致"SIGSEV"崩溃。

为了构建DDS的zenoh网桥,您首先需要安装以下依赖项

  • Rust。如果您已经安装了Rust工具链,请确保它已更新到

    $ rustup update
    
  • 在Linux上,确保已安装llvmclang开发包

    • 在Debian上执行:sudo apt install llvm-dev libclang-dev
    • 在CentOS或RHEL上执行:sudo yum install llvm-devel clang-devel
    • 在Alpine上执行:apk install llvm11-dev clang-dev
  • CMake(用于构建CycloneDDS,它是一个原生依赖项)

一旦设置了这些依赖项,您可以在您的机器上克隆该仓库

$ git clone https://github.com/eclipse-zenoh/zenoh-plugin-ros2dds.git
$ cd zenoh-plugin-ros2dds
$ cargo build --release

独立的可执行二进制文件zenoh-bridge-ros2dds和一个插件共享库(Linux上的*.so,Mac OS上的*.dylib,Windows上的*.dll)将被生成在target/release子目录中,以便由zenoh路由器zenohd动态加载。

ROS 2软件包

您还可以通过运行来将zenoh-bridge-ros2dds构建为ROS软件包

rosdep install --from-paths . --ignore-src -r -y
colcon build --packages-select zenoh_bridge_ros2dds --cmake-args -DCMAKE_BUILD_TYPE=Release

rosdep命令将自动安装Rustclang作为构建依赖项。

如果您想在x86设备上为任何目标交叉编译软件包,可以使用以下命令

rosdep install --from-paths . --ignore-src -r -y
colcon build --packages-select zenoh_bridge_ros2dds --cmake-args -DCMAKE_BUILD_TYPE=Release  --cmake-args -DCROSS_ARCH=<target>

其中<target>是目标架构(例如,aarch64-unknown-linux-gnu)。架构列表可以在这里找到。

交叉编译使用zig作为链接器。您可以使用这里的说明进行安装。此外,还需要在目标设备上安装zigbuild软件包。您可以使用这里的说明进行安装。


用法

典型的用法是在机器人中运行1个桥接器,在另一台主机中运行1个桥接器以监控和操作机器人。

⚠️ 桥接器依赖于 CycloneDDS,并且已经与 RMW_IMPLEMENTATION=rmw_cyclonedds_cpp 进行了测试。虽然DDS实现可以通过UDP多播和单播进行互操作,但其他DDS实现的一些特定和非标准特性(例如共享内存)可能会导致一些问题。

确保通过 zenoh-bridge-ros2dds 桥接的两个主机之间不会发生任何DDS通信非常重要。否则,可能会出现一些重复或循环的流量。
为了确保这一点,您可以

  • 定义 ROS_LOCALHOST_ONLY=1
    最好,使用以下命令在回环接口上启用多播(在Linux上):sudo ip l set lo multicast on
  • 在每个主机上使用不同的 ROS_DOMAIN_ID
  • 使用一个 CYCLONEDDS_URI,该URI配置CycloneDDS仅使用机器人内部接口。此配置必须用于所有ROS节点以及桥接器。
    例如,对于嵌入2个主机并通过USB互连的Turtlebot4
    <CycloneDDS>
     <Domain>
         <General>
             <Interfaces>
                 <NetworkInterface name="usb0"/>
                 <!-- For less traffic, force multicast usage on loopback even if not configured.         -->
                 <!-- All ROS Nodes and bridges must have this same config, otherwise they won't discover -->
                 <NetworkInterface address="127.0.0.1" multicast="true"/> 
             </Interfaces>
             <DontRoute>true</DontRoute>
         </General>
     </Domain>
    
```

在机器人上运行

  • zenoh-bridge-ros2dds

在操作主机上运行

  • zenoh-bridge-ros2dds-e tcp/<robot-ip>:7447
  • 检查机器人的ROS接口是否可通过以下方式访问
    • ros2 topic list
    • ros2 service list
    • ros2 action list

两个桥接器之间可以配置其他互连方式(例如,通过UDP多播进行自动发现,通过一个或多个Zenoh路由器进行连接等)。有关Zenoh允许的可能部署的更多信息,请参阅Zenoh文档

配置

zenoh-bridge-ros2dds 可以通过通过 -c 参数传递的JSON5文件进行配置。您可以在以下位置查看此类配置文件的注释和详尽示例:DEFAULT_CONFIG.json5

此配置文件中相同的 ros2dds 部分还可以用于zenoh路由器的配置文件(在其 "plugins" 部分中)。路由器将自动在启动时尝试加载插件库(zenoh-plugin_dds)并应用其配置。

zenoh-bridge-ros2dds 还允许通过命令行参数配置一些这些配置值。运行此命令以查看哪些可以配置

  • zenoh-bridge-ros2dds-h

命令行参数覆盖配置文件中配置的等效键。

连接性配置

DDS通信

桥接器通过UDP多播根据DDS规范发现同一Domain ID(通过 ROS_DOMAIN_ID 或默认设置为 0)上运行的所有ROS 2节点及其主题/服务/操作。

由于桥接器依赖于 CycloneDDS,因此其DDS通信可以通过CycloneDDS XML配置文件进行配置,如此处所述。

Zenoh通信

v0.11.0版本开始,默认情况下,zenoh-bridge-ros2ddsrouter 模式启动(有关模式之间的区别,请参阅Zenoh文档:https://zenoh.io/docs/getting-started/deployment/)。
这意味着它通过任何网络接口监听远程网桥或任何Zenoh应用通过端口 7447 发送的TCP连接。它通过UDP多播或gossip协议进行发现,但不会自动连接到任何设备。
因此,网桥之间的连接必须在连接到一个(或多个)其他网桥的网桥中静态配置,通过命令行选项 -e,或者通过配置文件中的 connect 部分配置文件

如果需要,可以通过添加以下配置来启用自动连接到其他发现的网桥(也运行在 router 模式):

  scouting: {
    multicast: {
      autoconnect: { router: "router" }
    },
    gossip: {
      autoconnect: { router: "router" }
    }
  },

v0.11.0版本之前,zenoh-bridge-ros2dds 默认以 peer 模式启动。
它在随机端口(由操作系统选择)上监听传入的TCP连接,并自动连接到任何发现的网桥、路由器或对等方。

通过命名空间配置实现简单多机器人

在每个机器人上部署zenoh-bridge-ros2dds并为其配置唯一的命名空间可以带来许多好处:

  1. 无需为每个ROS节点配置命名空间。因为单个机器人中所有节点的DDS流量都保持在该机器人内部,因此无需配置命名空间。
  2. 将每个zenoh-bridge-ros2dds配置为namespace: "/botX"(其中'X'是唯一的ID),每个路由到Zenoh的主题/服务/操作名称都将加上前缀 "/botX"。机器人的消息不会相互冲突。
  3. 在监控/控制主机上,您有两种选择:
    • 运行一个带有namespace: "/botX"zenoh-bridge-ros2dds,对应于1个机器人。然后要监控/操作该特定机器人,只需运行任何无命名空间的ROS节点即可。
      例如:rviz2
    • 运行不带命名空间的zenoh-bridge-ros2dds。然后您可以通过将命名空间重映射到机器人的命名空间来监控/操作任何机器人,或者为每个您想要使用的主题/服务/操作名称添加机器人的命名空间作为前缀。
      例如:rviz2 --ros-args -r /tf:=/botX2/tf -r /tf_static:=/botX/tf_static

注意:网桥将所有主题/服务/操作名称前缀化,包括 /rosout/parameter_events/tf/tf_static

管理空间

该桥通过Zenoh管理空间在@/<id>/ros2/**下公开了一些内部状态,其中<id>是桥的唯一ID(可配置)。
可以通过Zenoh的get()操作查询此管理空间。例如,如果通过--rest-http-port 8000参数为桥配置了REST插件,则可以查询以下URL

依赖项

~58MB
~1M SLoC