8个版本
1.0.0-alpha.6 | 2024年8月6日 |
---|---|
1.0.0-alpha.5 | 2024年7月26日 |
0.11.0 | 2024年6月4日 |
0.11.0-rc.3 | 2024年5月14日 |
0.10.1-rc | 2023年12月21日 |
#121 in 网络编程
每月269次下载
405KB
9K SLoC
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工具支持(
ros2
、rviz2
...) - 在桥接器上配置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上,确保已安装
llvm
和clang
开发包- 在Debian上执行:
sudo apt install llvm-dev libclang-dev
- 在CentOS或RHEL上执行:
sudo yum install llvm-devel clang-devel
- 在Alpine上执行:
apk install llvm11-dev clang-dev
- 在Debian上执行:
-
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
命令将自动安装Rust和clang作为构建依赖项。
如果您想在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-ros2dds
以 router
模式启动(有关模式之间的区别,请参阅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
并为其配置唯一的命名空间可以带来许多好处:
- 无需为每个ROS节点配置命名空间。因为单个机器人中所有节点的DDS流量都保持在该机器人内部,因此无需配置命名空间。
- 将每个
zenoh-bridge-ros2dds
配置为namespace: "/botX"
(其中'X'
是唯一的ID),每个路由到Zenoh的主题/服务/操作名称都将加上前缀"/botX"
。机器人的消息不会相互冲突。 - 在监控/控制主机上,您有两种选择:
- 运行一个带有
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
- http://<bridge-IP>:8000/@/<id>/ros2/dds/**:获取桥发现的全部DDS读取器/写入器
- http://<bridge-IP>:8000/@/<id>/ros2/node/**:获取桥发现的全部ROS节点及其接口
- http://<bridge-IP>:8000/@/<id>/ros2/route/**:获取桥建立的ROS接口与Zenoh之间的全部路由
依赖项
~58MB
~1M SLoC