当前位置:   article > 正文

详解高性能中间件Iceoryx在ROS2中的使用

详解高性能中间件Iceoryx在ROS2中的使用

0. 概述

本文将概述ROS2相比ROS中间件的改进和优势,重点推荐Iceoryx

1. 系统架构对比

系统架构对比图

1.1 移除 Master 节点

  • ROS1:依赖 roscore 作为 Master 节点,Master 节点崩溃会导致系统无法订阅和发布。
  • ROS2:不再依赖 roscore,避免了 Master 节点崩溃导致的系统风险。

1.2 引入 DDS 系统

  • ROS1:使用 TCP/UDP 进行通信,存在延迟、数据丢失和无法加密的问题。
  • ROS2:基于 Data Distribution Service(DDS)的通信架构,提高了网络安全性和实时性。

1.3 跨平台支持

  • ROS1:跨平台支持较弱。
  • ROS2:提供了更好的跨平台兼容性,支持多种操作系统和硬件架构。

2. DDS 系统的引入

DDS 系统图

2.1 RMW 概述

不同厂商可以根据需要实现不同的 DDS 系统,如 OpenSplice 和 FastRTPS。为了统一不同 DDS 厂商的接口,ROS2 设计了 ROS Middleware(RMW)接口,使得各 DDS 厂商能够编写适配接口,将自家 DDS 系统移植到 ROS2 中。

ROS2 的核心概念与 ROS1 基本类似,但在架构上进行了优化,提供了更好的性能和灵活性。RMW 是构建 ROS 所需的原始中间件最小功能集,包括 Initialization and Shutdown、Nodes、Publisher、Subscription、Service Client、Service Server 等功能。

核心概念图

2.2 QoS(质量服务策略)

在开发过程中,需要关注 DDS 的 QoS 特性,它可以通过指定所需的网络传输质量来满足通信需求。

ros2 topic echo /example_topic --qos-reliability reliable
  • 1

切换不同的 DDS 系统只需安装相应的包,并通过设置环境变量即可:

export RMW_IMPLEMENTATION=rmw_fastrtps_cpp
  • 1

2.3 ROS2去中心化节点注册和订阅

在ROS 2中,注册和订阅的机制是由节点自身以及底层的通信中间件(如Fast-RTPS)共同负责的。以下步骤描述了注册和订阅的过程:

  • 节点启动:当一个ROS2节点启动时,它会初始化并与底层通信中间件建立连接。这个过程包括创建节点上下文、设置QoS(Quality of Service)策略等。

  • 创建发布者和订阅者:节点通过调用ROS2 API创建发布者和订阅者。发布者用于向特定的话题发送消息,而订阅者则用于接收特定话题的消息。

  • 发布者和订阅者的注册

    • 当节点创建发布者时,它会向通信中间件注册这个发布者,表明它将在这个话题上发布消息。
    • 当节点创建订阅者时,它同样会向通信中间件注册,声明它对某个话题感兴趣并希望接收相关消息。
  • 发现机制:通信中间件负责维护一个关于网络上所有活动节点、话题、服务和动作的动态目录。当节点注册了发布者或订阅者后,通信中间件会广播这些信息,以便其他节点能够发现它们。

  • 匹配过程:一旦一个订阅者注册,通信中间件会查找与之匹配的发布者。匹配基于话题名称和消息类型,以及任何附加的QoS策略。如果找到匹配项,中间件将建立一个直接的连接,允许发布者和订阅者之间直接通信,而无需通过中心节点。

  • 通信:匹配成功后,发布者和订阅者之间可以直接交换数据。发布者发送消息,而订阅者接收消息。这一过程是去中心化的,意味着数据流经由直接的点对点连接,提高了效率和可靠性。

ROS2的这种设计允许节点在不需要中心协调的情况下自主发现和通信,这极大地增强了系统的灵活性、可扩展性和鲁棒性。同时,DDS的QoS机制允许用户根据应用需求调整消息的传输特性,比如可靠性、持久性、历史记录等,从而满足不同的实时性和数据完整性要求。

3. ROS2安装与配置

3.1 一键安装

提供简易的一键安装脚本,支持多个版本的 ROS2 安装。

wget http://fishros.com/install -O fishros && . fishros
# 支持 noetic(ROS1), foxy(ROS2), galactic(ROS2), rolling(ROS2), iron(ROS2), humble(ROS2)
  • 1
  • 2

3.2 官网教程

链接到 ROS2 的官方安装教程,为用户提供详细的安装指导。

https://docs.ros.org/
  • 1

4. ROS2 底层切换 Iceoryx 官方实现

4.1 安装

以下步骤展示了如何安装 Iceoryx 的 RMW 实现。安装 rmw_iceoryx 非常简单,因为 Iceoryx 已包含在 ros2.repos 中。所有提供的包都可以使用 colcon 构建,因此你可以轻松地在 ROS 2 工作区内构建 rmw_iceoryxrmw_iceoryx 使用 rosidl_typesupport_introspection,这允许在现有的 ROS 2 工作区或 Debian 安装基础上构建 iceoryx,因为不需要再次构建 ROS 2 消息。

要在最新的 ROS 版本的 ROS 2 工作区中安装 rmw_iceoryx,请执行以下步骤:

mkdir -p ~/iceoryx_ws/src
cd $_
# LATEST_ROS_VERSION 可以是例如 iron
git clone --branch LATEST_ROS_VERSION https://github.com/ros2/rmw_iceoryx.git
  • 1
  • 2
  • 3
  • 4

有关替代安装说明和 iceoryx 内部详细信息,请参阅 iceoryx 的 GitHub 仓库

rmw_iceoryx 与 ROS 2 从 Eloquent 版本开始兼容。假设你已正确安装 ROS 2,可以使用 colcon 编译 iceoryx 工作区:

cd ~/iceoryx_ws/
source /opt/ros/LATEST_ROS_VERSION/setup.bash  # 或者 source 你自己的 ROS 2 工作区
rosdep update
rosdep install --from-paths src --ignore-src --rosdistro LATEST_ROS_VERSION -y
colcon build
# 或者使用更多选项
colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

就是这样!你已经安装了 iceoryx,现在可以开始使用了。

4.2 使用 rmw_iceoryx_cpp

Iceoryx 基于共享内存,并具有一个名为 RouDi 的共享内存管理应用。启动守护进程:

./iceoryx_ws/install/iceoryx_posh/bin/iox-roudi
  • 1

然后指定 RMW 实现并运行 ROS 2 示例节点:

source ~/iceoryx_ws/install/setup.bash
RMW_IMPLEMENTATION=rmw_iceoryx_cpp ros2 run demo_nodes_cpp talker
  • 1
  • 2

在另一个终端中订阅 talker

source ~/iceoryx_ws/install/setup.bash
RMW_IMPLEMENTATION=rmw_iceoryx_cpp ros2 run demo_nodes_cpp listener
  • 1
  • 2

4.3 零拷贝传输

基本的零拷贝工作流程如下:

在这里插入图片描述

  1. loan_message():发布者请求借用一条消息。
  2. publish():发布者填写数据并发布消息。
  3. take_loaned_message():订阅者获取消息。
  4. return_loaned_message():订阅者回调完成后,消息返回中间件。

示例代码:

auto pod_pub_ = node->create_publisher<std_msgs::msg::Float64>("/float", 1);
auto pod_loaned_msg = pod_pub_->borrow_loaned_message();
pod_loaned_msg.get().data = 123.456f;
pod_pub_->publish(std::move(pod_loaned_msg));
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

5. 不同负载下的Iceoryx、cycloneDDS和FastDDS延迟对比

该对比数据展示了三种中间件解决方案(IceoryxcycloneDDSFastDDS)的延迟性能。延迟单位为微秒(us),测试负载范围从1KB到64MB。

5.1 进程间延迟

负载IceoryxcycloneDDSFastDDS
1KB2.47.353.95
2KB2.47.883.85
4KB2.47.413.98
8KB2.49.474.42
16KB2.411.975.22
32KB2.414.406.35
64KB2.420.868.72
128KB2.439.2910.11
256KB2.477.9023.06
512KB2.4238.3544.66
1MB2.4836.6489.74
2MB2.4984.68264.61
4MB2.42809.75526.03
8MBNA4874.371895.88
16MBNA8881.515112.93
32MBNA55535.9511998.55
64MBNA120856.5843563.32

5.2 进程内延迟

负载IceoryxcycloneDDSFastDDS
1KB1.5-1.22
2KB1.5-1.73
4KB1.5-1.82
8KB1.5-1.94
16KB1.5-2.34
32KB1.5-3.39
64KB1.5-4.45
128KB1.5-8.26
256KB1.5-23.09
512KB1.5-48.59
1MB1.5-103.26
2MB1.5-360.16
4MB1.5-687.45
8MBNA-1189.07
16MBNA-1951.29
32MBNA-3874.46
64MBNA-7967.83

5.3 对比总结

  • Iceoryx在处理不同负载的进程间通信时,始终保持在2.4微秒的低稳定延迟,这显示了其在处理各种负载时的高效性。在进程内通信方面,其延迟更低,仅为1.5微秒。
  • cycloneDDS随着负载的增加,延迟逐渐增加,特别是在512KB以上,延迟显著增加,在64MB负载时达到120856.58微秒。
  • FastDDS的延迟性能优于cycloneDDS,但仍高于Iceoryx,负载增大时,特别是在4MB以上,延迟显著增加。

综上所述,Iceoryx在小到中等负载的进程间和进程内通信中表现最为高效。而cycloneDDS和FastDDS虽然具有一定的处理能力,但在大数据传输时存在延迟瓶颈。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号