学习《ROS2 机器人开发 从入门道实践》 鱼香ROS2,增加了代码解析
目录
第2章 节点
2.1 第一个节点
2.1.1 第一个python节点
ros2_python_node.py
import rclpy
from rclpy.node import Node
def main():
# 初始化,分配资源
rclpy.init()
node = Node('python_node')
node.get_logger().info('你好 python_node')
node.get_logger().warn('你好 python_node')#警告级别的日志
rclpy.spin(node)#运行节点,需要主动退出
rclpy.shutdown()#退出节点时,清理
#判断当前文件是否是当前文件
if __name__=='__main__':
main()
# 修改终端中 日志输出内容
export RCUTILS_CONSOLE_OUTPUT_FORMAT=[{function_name}:{line_number}]:{message}
2.1.2 第一个Cpp节点
vscode添加路径,防止头文件报错
或在左侧目录中.vscode中添加
第3章 订阅和发布——话题通信探索
3.2 Python话题订阅和发布
3.2.1 通过话题发布小说
import rclpy
from rclpy.node import Node
import requests # Python库,用于发送HTTP请求,在本代码中用于从指定的URL获取小说内容。
# 这定义了一个简单的字符串消息类型,用于在ROS2的话题通信中传递小说的每一行内容。
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'创建队列,存放小说')
self.novels_queue_ = Queue()
self.get_logger().info(f'创建话题发布者,发布小说')
# 发布String类型的消息到名为novel的话题上
self.novels_publisher_ = self.create_publisher(String, 'novel', 10)
self.get_logger().info(f'创建定时器, 每隔1s执行回调函数')
self.timer_ = self.create_timer(1, self.timer_callback)
def download_novel(self, url):
response = requests.get(url)
response.encoding = 'utf-8'
self.get_logger().info(f'下载完成,网址是: {url}')
# 按行分割,放入队列
for line in response.text.splitlines():
self.novels_queue_.put(line)
def timer_callback(self):
print('进入timer_callback')
print('self.novels_queue_.qsize()', self.novels_queue_.qsize())
# 队列中有数据,则取出一行进行发布
if self.novels_queue_.qsize() > 0: # 返回队列的大小
# 实例化一个消息
msg = String()
# 对消息结构体进行赋值
# .get()从队列中取出一行小说内容并从队列开始删除
msg.data = self.novels_queue_.get()
self.novels_publisher_.publish(msg)
self.get_logger().info(f'发布了一行小说, 内容是:{msg.data}')
else :
print('self.novels_queue_.qsize()', self.novels_queue_.qsize())
def main():
rclpy.init()
node = NovelPubNode('novel_pub')
print('下载小说,需要运行服务器')
node.download_novel('http://0.0.0.0:8000/novel1.txt')
rclpy.spin(node)
rclpy.shutdown()
# 运行服务器 python3 -m http.server
# 存入内容 echo "第一章 111111111111111111"> novel1
运行结果
~/yuxiangros2/chapt3/topic_ws$ ros2 run demo_python_topic novel_pub_node
[INFO] [1732025647.586853531] [novel_pub]: 创建队列,存放小说
[INFO] [1732025647.587221664] [novel_pub]: 创建话题发布者,发布小说
[INFO] [1732025647.588936405] [novel_pub]: 创建定时器, 每隔1s执行回调函数
下载小说,需要运行服务器
[INFO] [1732025647.591781736] [novel_pub]: 下载完成,网址是: http://0.0.0.0:8000/novel1.txt
进入timer_callback
self.novels_queue_.qsize() 21
[INFO] [1732025648.589867623] [novel_pub]: 发布了一行小说, 内容是:第1章 111111111111111111
进入timer_callback
self.novels_queue_.qsize() 20
[INFO] [1732025649.589894541] [novel_pub]: 发布了一行小说, 内容是:第2章 222222222222222222
进入timer_callback
self.novels_queue_.qsize() 19
[INFO] [1732025650