古月居课堂笔记,居于ubuntu 24实战
古月居讲得很好,所以最近正在认真学一遍他的课,本页是记录发布者和订阅的思想和代码和笔记
首先呢发布者和订阅者大家可以理解成传统中间队,的本质,不过这个的实现除了写好代码,还要在一个配置中文配置一下,方法名,打包编释才能生成正确代码
** API 关键函数差异**
**发布者专属**
**create_publisher(消息类型, 话题名, 队列长度):创建发布对象**
**create_timer(周期, 回调):定时周期性执行发布逻辑**
**publish(msg):把组装好的消息发送出去**
**订阅者专属**
**create_subscription(消息类型, 话题名, 回调函数, 队列长度):创建订阅对象**
我们先来来理一下发布者可订阅才的代码核心

- 一个 ROS2 Python 功能包内可以存放多个独立业务功能节点(发布者、订阅者、控制节点、视觉节点等),各个功能相互独立运行。
- 每一个独立功能对应单独一个
.py脚本文件,每个脚本内部必须唯一编写一个main()入口主函数,作为该节点启动执行入口;单个脚本不允许写多个main()。 - 想要通过
ros2 run命令直接启动该节点,就需要在setup.py的entry_points['console_scripts']列表里单独增加一行注册配置。 - 册格式固定:
自定义启动别名 = 包名.脚本文件名:main - 册完成、编译并刷新环境后,即可用命令独立启动任意一个注册过的节点:
bash
ros2 run 包名 自定义启动别名

以下是简单示例
但是在之前你会发现创建节点的方式不一样,以下二个方法是等效的,所以不用纠结
node = PublisherNode("topic_helloworld_pub")
node=node("topic_helloworld_pub")
import rclpy from rclpy.node import Node from std_msgs.msg import String # 自定义发布者节点类 class PublisherNode(Node): def __init__(self, name): super().__init__(name) # 创建发布者:消息类型String,话题名chatter,队列长度10 self.pub = self.create_publisher(String, "chatter", 10) # 创建定时器,0.5s周期触发回调 self.timer = self.create_timer(0.5, self.timer_callback) # 定时器回调函数:定时发布消息 def timer_callback(self): msg = String() msg.data = "Hello World" self.pub.publish(msg) # 打印日志 self.get_logger().info(f"Publishing: {msg.data}") def main(args=None): # ROS2初始化 rclpy.init(args=args) # 实例化节点 node = PublisherNode("topic_helloworld_pub") # 节点循环自旋 rclpy.spin(node) # 销毁节点、关闭ROS2 node.destroy_node() rclpy.shutdown() if __name__ == "__main__": main()
# 订阅回调:收到话题消息后自动执行
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
# 自定义发布者节点类
class PublisherNode(Node):
def __init__(self, name):
super().__init__(name)
# 创建发布者:消息类型String,话题名chatter,队列长度10
self.pub = self.create_publisher(String, "chatter", 10)
# 创建定时器,0.5s周期触发回调
self.timer = self.create_timer(0.5, self.timer_callback)
# 定时器回调函数:定时发布消息
def timer_callback(self):
msg = String()
msg.data = "Hello World"
self.pub.publish(msg)
# 打印日志
self.get_logger().info(f"Publishing: {msg.data}")
def main(args=None):
# ROS2初始化
rclpy.init(args=args)
# 实例化节点
node = PublisherNode("topic_helloworld_pub")
# 节点循环自旋
rclpy.spin(node)
# 销毁节点、关闭ROS2
node.destroy_node()
rclpy.shutdown()
if __name__ == "__main__":
main()
# 启动订阅者(新开终端)
# 启动发布者
ros2 run learning_topic topic_helloworld_pub
# 启动订阅者(新开终端)
ros2 run learning_topic topic_helloworld_sub
以上代码如果你是在ai 编辑器中你只需要明白你要做什么,然后可ai 可以直接帮你生成或写上面代码,之所以做成笔记,目 的复原老师的代码,
浙公网安备 33010602011771号