ROS2-话题学习

强烈推荐教程:

《ROS 2机器人开发从入门到实践》3.2.2订阅小说并合成语音_哔哩哔哩_bilibili

构建功能包

# create package demo_python_pkg

ros2 pkg create --build-type ament_python --license Apache-2.0 demo_python_pkg

 

自己写的代码放在./demo_python_pkg/demo_python_pkg目录下

发布者

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.novels_queue = Queue()
        self.get_logger().info("NovelPubNode has been started")
        self.novel_pub = self.create_publisher(String, "novel_topic", 10)

        self.timer = self.create_timer(5,self.timer_callback)


    def timer_callback(self):
        if not self.novels_queue.empty():
            line = self.novels_queue.get()
            msg = String()
            msg.data = line
            self.novel_pub.publish(msg)
            self.get_logger().info(f"Published novel: {line}")       

    def download_novel(self, url):
        response = requests.get(url)
        response.encoding = 'utf-8'
        text = response.text
        for text_line in text.splitlines():
            self.novels_queue.put(text_line)

        self.get_logger().info(f"Downloaded novel: {text}")



def main():
    rclpy.init()
    node = NovelPubNode("novel_pub_node")
    node.download_novel("http://0.0.0.0:8000/novel_1.txt")
    rclpy.spin(node)
    node.shutdown()

 

订阅者

import time
import espeakng
import rclpy
from rclpy.node import Node
from example_interfaces.msg import String
from queue import Queue
import threading


class NovelSubNode(Node):
    def __init__(self, node_name):
        super().__init__(node_name)
        self.get_logger().info("NovelSubNode has been created!")
        self.novels_queue = Queue()
        self.create_subscription(String, "novel_topic", self.novel_callback, 10)
        self.say_thread = threading.Thread(target=self.say)
        self.say_thread.start()
        


    def novel_callback(self, msg):
        self.novels_queue.put(msg.data)
        


    def say(self):
        engine = espeakng.Speaker()
        engine.voice = "zh"
        while rclpy.ok():
            if not self.novels_queue.empty():
                novel = self.novels_queue.get()
                engine.say(novel)
                print("Said: " + novel)
                engine.wait()
            else:
                time.sleep(1)



def main():
    rclpy.init()
    node = NovelSubNode("novel_sub_node")
    rclpy.spin(node)
    rclpy.shutdown()
    

代码完成后,配置setup.py文件

格式为:"名字 = 包名.文件名:函数名"

在根目录运行以下终端命令

# build package demo_python_pkg

colcon build

# source setup.bash

source install/setup.bash

运行以上命令后,得到build、install、log文件夹

可执行的节点文件在以下文件夹

./install/demo_python_pkg/lib/demo_python_pkg

运行节点命令

ros2 run demo_python_pkg python_pub_node

ros2 run demo_python_pkg python_sub_node

 

其他常用命令

# check if node is running

ros2 node list

# check if topic is published

ros2 topic list

# check topic content

ros2 topic echo /novel_topic

# check topic speed

ros2 topic hz /novel_topic

# check if service is available

ros2 service list

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张飞飞飞飞飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值