赞
踩
本文将概述ROS2相比ROS中间件的改进和优势,重点推荐Iceoryx
不同厂商可以根据需要实现不同的 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 等功能。
在开发过程中,需要关注 DDS 的 QoS 特性,它可以通过指定所需的网络传输质量来满足通信需求。
ros2 topic echo /example_topic --qos-reliability reliable
切换不同的 DDS 系统只需安装相应的包,并通过设置环境变量即可:
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp
在ROS 2中,注册和订阅的机制是由节点自身以及底层的通信中间件(如Fast-RTPS)共同负责的。以下步骤描述了注册和订阅的过程:
节点启动:当一个ROS2节点启动时,它会初始化并与底层通信中间件建立连接。这个过程包括创建节点上下文、设置QoS(Quality of Service)策略等。
创建发布者和订阅者:节点通过调用ROS2 API创建发布者和订阅者。发布者用于向特定的话题发送消息,而订阅者则用于接收特定话题的消息。
发布者和订阅者的注册:
发现机制:通信中间件负责维护一个关于网络上所有活动节点、话题、服务和动作的动态目录。当节点注册了发布者或订阅者后,通信中间件会广播这些信息,以便其他节点能够发现它们。
匹配过程:一旦一个订阅者注册,通信中间件会查找与之匹配的发布者。匹配基于话题名称和消息类型,以及任何附加的QoS策略。如果找到匹配项,中间件将建立一个直接的连接,允许发布者和订阅者之间直接通信,而无需通过中心节点。
通信:匹配成功后,发布者和订阅者之间可以直接交换数据。发布者发送消息,而订阅者接收消息。这一过程是去中心化的,意味着数据流经由直接的点对点连接,提高了效率和可靠性。
ROS2的这种设计允许节点在不需要中心协调的情况下自主发现和通信,这极大地增强了系统的灵活性、可扩展性和鲁棒性。同时,DDS的QoS机制允许用户根据应用需求调整消息的传输特性,比如可靠性、持久性、历史记录等,从而满足不同的实时性和数据完整性要求。
提供简易的一键安装脚本,支持多个版本的 ROS2 安装。
wget http://fishros.com/install -O fishros && . fishros
# 支持 noetic(ROS1), foxy(ROS2), galactic(ROS2), rolling(ROS2), iron(ROS2), humble(ROS2)
链接到 ROS2 的官方安装教程,为用户提供详细的安装指导。
https://docs.ros.org/
以下步骤展示了如何安装 Iceoryx 的 RMW 实现。安装 rmw_iceoryx
非常简单,因为 Iceoryx 已包含在 ros2.repos 中。所有提供的包都可以使用 colcon 构建,因此你可以轻松地在 ROS 2 工作区内构建 rmw_iceoryx
。rmw_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
有关替代安装说明和 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
就是这样!你已经安装了 iceoryx,现在可以开始使用了。
Iceoryx 基于共享内存,并具有一个名为 RouDi 的共享内存管理应用。启动守护进程:
./iceoryx_ws/install/iceoryx_posh/bin/iox-roudi
然后指定 RMW 实现并运行 ROS 2 示例节点:
source ~/iceoryx_ws/install/setup.bash
RMW_IMPLEMENTATION=rmw_iceoryx_cpp ros2 run demo_nodes_cpp talker
在另一个终端中订阅 talker
:
source ~/iceoryx_ws/install/setup.bash
RMW_IMPLEMENTATION=rmw_iceoryx_cpp ros2 run demo_nodes_cpp listener
基本的零拷贝工作流程如下:
loan_message()
:发布者请求借用一条消息。publish()
:发布者填写数据并发布消息。take_loaned_message()
:订阅者获取消息。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));
该对比数据展示了三种中间件解决方案(Iceoryx、cycloneDDS和FastDDS)的延迟性能。延迟单位为微秒(us),测试负载范围从1KB到64MB。
负载 | Iceoryx | cycloneDDS | FastDDS |
---|---|---|---|
1KB | 2.4 | 7.35 | 3.95 |
2KB | 2.4 | 7.88 | 3.85 |
4KB | 2.4 | 7.41 | 3.98 |
8KB | 2.4 | 9.47 | 4.42 |
16KB | 2.4 | 11.97 | 5.22 |
32KB | 2.4 | 14.40 | 6.35 |
64KB | 2.4 | 20.86 | 8.72 |
128KB | 2.4 | 39.29 | 10.11 |
256KB | 2.4 | 77.90 | 23.06 |
512KB | 2.4 | 238.35 | 44.66 |
1MB | 2.4 | 836.64 | 89.74 |
2MB | 2.4 | 984.68 | 264.61 |
4MB | 2.4 | 2809.75 | 526.03 |
8MB | NA | 4874.37 | 1895.88 |
16MB | NA | 8881.51 | 5112.93 |
32MB | NA | 55535.95 | 11998.55 |
64MB | NA | 120856.58 | 43563.32 |
负载 | Iceoryx | cycloneDDS | FastDDS |
---|---|---|---|
1KB | 1.5 | - | 1.22 |
2KB | 1.5 | - | 1.73 |
4KB | 1.5 | - | 1.82 |
8KB | 1.5 | - | 1.94 |
16KB | 1.5 | - | 2.34 |
32KB | 1.5 | - | 3.39 |
64KB | 1.5 | - | 4.45 |
128KB | 1.5 | - | 8.26 |
256KB | 1.5 | - | 23.09 |
512KB | 1.5 | - | 48.59 |
1MB | 1.5 | - | 103.26 |
2MB | 1.5 | - | 360.16 |
4MB | 1.5 | - | 687.45 |
8MB | NA | - | 1189.07 |
16MB | NA | - | 1951.29 |
32MB | NA | - | 3874.46 |
64MB | NA | - | 7967.83 |
综上所述,Iceoryx在小到中等负载的进程间和进程内通信中表现最为高效。而cycloneDDS和FastDDS虽然具有一定的处理能力,但在大数据传输时存在延迟瓶颈。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。