订阅和发布_话题通信探索

1.话题订阅与发布

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import rclpy
from rclpy.node import Node
import requests
from example_interfaces.msg import String
from queue import Queue

class NovelPubNode(Node):
def __init__(self,node_name):
super().__init__(node_name)
self.get_logger().info(f'{node_name},启动!!!!')
self.novels_queue=Queue() #创建队列 存数据
self.novel_publisher_ = self.create_publisher(String,'novel',10)
self.timer_ = self.create_timer(5,self.timer_callback)#创建定时器

def timer_callback(self):
#self.novel_publisher_.publish()
if self.novels_queue.qsize()>0:#判断队列大小
line=self.novels_queue.get()
msg=String()#组装
msg.data=line
self.novel_publisher_.publish(msg)
self.get_logger().info(f'发布了:{msg}')

def download(self,url):
response = requests.get(url)
response.encoding = 'utf-8'
text = response.text
self.get_logger().info(f'下载{url},{len(text)}')
for line in response.text.splitlines():
self.novels_queue.put(line)#按行分割

def main():
rclpy.init()
node = NovelPubNode('novel_pub')
node.download('http://0.0.0.0:8000/novel1.txt')
rclpy.spin(node)
rclpy.shutdown()

ps:

1.执行ros2 run demo_python_topic novel_pub_node时要同时在另一个终端打开服务器python3 -m http.s
erver(这里没注意到当时拖了好几周才解决)

2.ros2 topic echo /novel早于ros2 run demo_python_topic novel_pub_node才能接受到完整的内容

先启动订阅者,再启动发布者(服啦 每次都先启动完发布者,再开订阅者,我说怎么有时候可以收到最后两行。。。)