ros2 node 之间的通信方式之 —— Topic通信案例

本文详细介绍了在ROS2中如何使用Topic进行node间的通信,包括创建工作空间、功能包,编写发布者和订阅者代码,以及CMakeLists.txt的配置。通过实例展示了如何创建并运行topic_helloworld_pub和topic_helloworld_sub节点实现消息交换。

ros2 node 之间的通信方式之 Topic通信

ROS 2 将复杂系统分解为许多模块化node。Topic是ROS的重要组成部分,充当node交换消息的总线。
请添加图片描述
一个节点可以将数据发布到任意数量的主题,并同时订阅任意数量的主题。

请添加图片描述
Topic是在node之间移动数据的主要方式之一,因此也是在系统的不同部分之间移动数据的主要方式之一。

Topic 通信案例

1、创建工作空间

如果没有创建工作空间,创建工作空间,反之则不用,进入目录src/下

$ mkdir -p ~/devnode_ws/src
$ cd ~/devnode_ws/src

2、创建功能包

$ ros2 pkg create --build-type ament_cmake topic_helloworld_cpp

在这里插入图片描述

3、编写发布者和订阅者代码

进入topic_helloworld_cpp功能包路径下的src文件,新键topic_helloworld_pub.cpp和topic_helloworld_sub.cpp

$ cd topic_helloworld_cpp/src
$ vim topic_helloworld_pub.cpp
$ vim topic_helloworld_sub.cpp

3.1 topic_helloworld_pub.cpp

#include<chrono>
#include<functional>
#include<memory>
#include<string>

#include"rclcpp/rclcpp.hpp"        //ROS2C++接口
#include"std_msgs/msg/string.hpp"  //字符串消息类型

using namespace std::chrono_literals;

class PublisherNode:public rclcpp::Node
{
   
   
public:
    PublisherNode():Node("topic_helloword_pub") //构造函数初始化
    
### ROS 2 中 RMW 的实现原理 ROS 2 使用了一种分层架构设计,其中底层通信依赖于 Real-Time Middleware Interface (RMW),这是一个抽象层,允许 ROS 2 利用不同的数据分发服务(DDS)供应商来处理节点之间的消息传递。这种设计使得 ROS 2 能够灵活地支持多种中间件实现。 #### RMW 层的作用 RMW 提供了一个通用接口,用于与各种 DDS 实现交互。它屏蔽了不同 DDS 库的具体细节,使上层 API 可以保持一致性和可移植性。通过这种方式,开发者可以选择最适合其应用场景的 DDS 实现[^1]。 #### 支持的 DDS 实现 在 ROS 2 中,可以通过设置环境变量 `RMW_IMPLEMENTATION` 来指定所需的 DDS 实现。以下是常见的几种选项及其特点: - **CycloneDDS**: 这是一个轻量级、高性能的 DDS 实现,适合资源受限的嵌入式系统。 - **Fast DDS**: 原名为 eProsima Fast RTPS,提供丰富的功能集和良好的性能表现。 - **Connext DDS**: 由 RTI 开发,具有强大的商业支持以及广泛的工业应用案例。 - **GurumDDS**: 一种开源 DDS 解决方案,虽然不如其他几个流行,但在某些特定场景下也有不错的表现[^2]。 #### 配置方法 要更改当前使用的 DDS 实现,只需修改环境变量即可。例如,在 Linux 系统中执行以下命令切换到 CycloneDDS: ```bash export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp ``` 对于 Windows 用户,则应使用 PowerShell 或 CMD 输入相应语法完成相同操作。 ### 发布者的创建过程详解 当涉及到实际的消息发送时,通常会涉及发布者对象的实例化。这一步骤需调用 Node 对象上的 create_publisher 方法,并为其提供三个必要参数:消息类型定义、目标主题名字符串形式表示以及服务质量策略(QoS Profile)[^3]。 具体而言,这些要素共同决定了如何封装待传输的数据包以便网络上传输;同时也影响接收端解码恢复原始结构的能力。 下面给出一段简单的 Python 示例代码展示这一流程: ```python import rclpy from std_msgs.msg import String def main(args=None): rclpy.init(args=args) node = rclpy.create_node('minimal_publisher') publisher = node.create_publisher(String, 'topic', 10) # 参数分别为消息类型、话题名称和服务质量等级 msg = String() msg.data = 'Hello World!' while True: node.get_logger().info(f'Sending message: {msg.data}') publisher.publish(msg) if __name__ == '__main__': main() ``` 此脚本展示了基本的发布逻辑——初始化上下文之后建立新节点并分配给定属性值至对应字段位置处等待循环广播直至程序终止为止。 ### 客户端函数剖析 除了上述提到的内容外,《深入解析ROS 2的客户端创建》一文中还提供了关于 `create_client` 函数更为详尽的技术解读。该部分不仅涵盖了理论层面的知识点说明还包括实践中的注意事项等方面的信息[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值