惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - Franky
N
Netflix TechBlog - Medium
宝玉的分享
宝玉的分享
Google DeepMind News
Google DeepMind News
腾讯CDC
G
Google Developers Blog
Martin Fowler
Martin Fowler
Microsoft Security Blog
Microsoft Security Blog
Recent Announcements
Recent Announcements
爱范儿
爱范儿
Engineering at Meta
Engineering at Meta
Microsoft Azure Blog
Microsoft Azure Blog
A
About on SuperTechFans
aimingoo的专栏
aimingoo的专栏
有赞技术团队
有赞技术团队
Jina AI
Jina AI
人人都是产品经理
人人都是产品经理
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
M
MIT News - Artificial intelligence
罗磊的独立博客
博客园 - 三生石上(FineUI控件)
美团技术团队
WordPress大学
WordPress大学
阮一峰的网络日志
阮一峰的网络日志

博客园 - Lucky帅小武

AI学习入门,超清晰AI知识图谱整理及核心概念解析 基于SSM的在线考试系统毕业设计论文【范文】 基于SSM的仓库进销存系统毕业设计论文【范文】 基于SSM的在线外卖订餐系统毕业设计论文【范文】 基于SSM的酒店管理系统毕业设计论文【范文】 基于SSM的校园论坛网站系统毕业设计论文【范文】 ROS2笔记6--ROS2常用命令工具 ROS2笔记5--动作通讯 ROS2笔记4--服务通讯 ROS2笔记2--工作空间、功能包、节点 ROS2笔记1--简介及开发环境搭建 基于SSM的网上商城系统毕业设计论文【范文】 软考笔记(1)--操作系统 软考笔记(9)--计算机组成原理4--总线系统 软考笔记(9)--计算机组成原理3--处理器 软考笔记(9)--计算机组成原理2--指令系统 软考笔记(8)--多媒体技术 软考笔记(7)--数据库关系代数 软考笔记(5)--系统安全性与保密性设计
ROS2笔记3--话题通讯
Lucky帅小武 · 2024-04-18 · via 博客园 - Lucky帅小武

一、话题(Topic)通讯简介

话题通讯是ROS2使用频率最高的一种通信方式,有发布者发布指定话题的数据,订阅者只要订阅了该话题的数据,就可以接收到数据。话题通讯是基于发布/订阅模型,话题数据传输的特性是从一个节点到另一个节点,发送数据的对象称为发布者,接收数据的对象称为订阅者,每个话题都需要一个名字,传输的数据也需要有固定的数据类型。

二、话题案例

2.1、新建功能包

cd ~/ros_ws/src 
ros2 pkg create pkg_topic --build-type ament_python --dependencies rclpy --node-name publisher_demo

执行上述命令后,会创建pkg_topic功能包,同时会创建一个publisher_demo的节点,并且已配置好相关的配置文件。

2.2、发布者实现

# 导入rclpy
import rclpy
from rclpy.node import Node
# 导入String字符串消息
from std_msgs.msg import String

class Topic_Publisher(Node):
    def __init__(self, name):
        super().__init__(name)
        # 创建发布者,使用create_publisher函数
        # 传入参数分别是:话题数据类型、话题名称、消息队列长度         
        self.pub = self.create_publisher(String, "/topic_demo", 1)
        # 中断函数执行的间隔时间,中断处理函数
        self.timer = self.create_timer(1, self.pub_msg)

  
    # 定义处理函数
    def pub_msg(self):
        msg = String()
        msg.data = "Hello, I send a message"
        self.pub.publish(msg) #发布话题数据
    
def main():
    rclpy.init()
    publisher_demo = Topic_Publisher("publisher_node")
    rclpy.spin(publisher_demo)
    publisher_demo.destroy_node()
    rclpy.shutdown()

2.3、订阅方实现

# 导入相关的库
import rclpy
from rclpy.node import Node
from std_msgs.msg import String

class Topic_Subscriber(Node):
    def __init__(self, name):
        super().__init__(name)
        # 创建订阅者使用的是create_subscription
        # 参数分别是:话题数据类型、话题名称、回调函数名称,队列长度
        self.sub = self.create_subscription(String, "/topic_demo", self.sub_callback, 1)
    # 回调函数     
    def sub_callback(self, msg):
        print("recv:" + msg.data)

def main():
    rclpy.init()
    subscriber_demo = Topic_Subscriber("subscriber_node")
    rclpy.spin(subscriber_demo)
    subscriber_demo.destroy_node()
    rclpy.shutdown()

2.4、编辑配置文件、编译工作空间

编辑配置文件setup.py

 编译工作空间

cd ~/ros_ws colcon build --packages-select pkg_topic source install/setup.bash

2.5、运行程序

分终端执行发布者节点和订阅者节点

# 启动发布者节点
ros2 run pkg_topic publisher_demo
# 启动订阅者节点
ros2 run pkg_topic subscriber_demo

运行发布者节点

 运行订阅者节点