1. 话题概念

话题在ROS2中的以发布和订阅作为通讯方式

 2. 编写发布函数

from typing import Counter
import rclpy
from rclpy.node import Node
from std_msgs.msg import String

class TomNode(Node):

    def __init__(self, name):
        super().__init__(name)
        self.get_logger().info(f"Hello, Jerry. {name} is comming again.")
        # create topic
        self.pub_cat_say = self.create_publisher(msg_type=String, topic="tom_say", qos_profile=10)
        # create a timer
        self.period = 5
        self.counter = 0
        self.timer = self.create_timer(timer_period_sec=self.period, \
            callback=self.time_callback)
        
        
    def time_callback(self):
        msg = String()
        msg.data = f"No. {self.counter} Tom meet {self.counter}"
        self.pub_cat_say.publish(msg)
        self.get_logger().info(f"Tom action: {msg.data}")
        self.counter += 1


def main(args=None):
    # init the client lib
    rclpy.init(args=args)
    # create node instance
    node_tom_say_again = TomNode(name="tom_say_again")
    # spin the node
    rclpy.spin(node=node_tom_say_again)
    # shutdown the node
    rclpy.shutdown()

此代码是在第一章中的代码进行改写,增加了一个publisher与callback函数

3. 编译及响应

4. 编写订阅函数

在原Class上进行修改,得到如下代码,增加了一个订阅者"tom_rob"。

import rclpy
from rclpy.node import Node
from std_msgs.msg import String, UInt32

class TomNode(Node):

    def __init__(self, name):
        super().__init__(name)
        self.get_logger().info(f"Hello, Jerry. {name} is comming again.")
        
        # create topic
        self.pub_cat_say = self.create_publisher(msg_type=String, topic="tom_say", qos_profile=10)
        
        # create a timer
        self.period = 5
        self.counter = 0
        self.timer = self.create_timer(timer_period_sec=self.period, \
            callback=self.time_callback)

        #create sub
        self.account = 30
        self.sub_from_tom = self.create_subscription(msg_type=UInt32, \
            topic="tom_rob", callback=self.recv_tom_callback, qos_profile=10)
        
        
    def time_callback(self):
        msg = String()
        msg.data = f"No. {self.counter} Tom meet {self.counter}"
        self.pub_cat_say.publish(msg)
        self.get_logger().info(f"Tom action: {msg.data}")
        self.counter += 1

    def recv_tom_callback(self, money):
        self.account += money.data
        self.get_logger().info(f"Rob {money.data}$, now Tom has {self.account}")


def main(args=None):
    # init the client lib
    rclpy.init(args=args)
    # create node instance
    node_tom_say_again = TomNode(name="tom_say_again")
    # spin the node
    rclpy.spin(node=node_tom_say_again)
    # shutdown the node
    rclpy.shutdown()

使用如下命令行发布消息

ros2 topic pub /tom_rob std_msgs/msg/UInt32 "{data: 10}"

看到节点“tom_say_again”的响应如下,此节点具备同时发布与订阅话题的能力。

 需要留意的是订阅函数比发布函数的异同,发布函数:

self.pub_cat_say = self.create_publisher(msg_type=String, topic="tom_say", qos_profile=10)

self.pub_cat_say.publish(msg)

订阅函数:

self.sub_from_tom = self.create_subscription(msg_type=UInt32, \
            topic="tom_rob", callback=self.recv_tom_callback, qos_profile=10)

参考链接:

【鱼香ROS】动手学ROS2|ROS2基础入门到实践教程|小鱼带你手把手学习ROS2_哔哩哔哩_bilibili

Logo

聚焦RDK与具身智能,汇集机器人开发教程、开源案例和技术交流

更多推荐