ROS2筆記3--話題通訊

一、話題(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

運行發佈者節點

 運行訂閱者節點

 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章