ROS2 (3): 话题通讯
·
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)
参考链接:
更多推荐
所有评论(0)