古月居课堂笔记,居于ubuntu 24实战

古月居讲得很好,所以最近正在认真学一遍他的课,本页是记录发布者和订阅的思想和代码和笔记

首先呢发布者和订阅者大家可以理解成传统中间队,的本质,不过这个的实现除了写好代码,还要在一个配置中文配置一下,方法名,打包编释才能生成正确代码

** API 关键函数差异**
**发布者专属**
**create_publisher(消息类型, 话题名, 队列长度):创建发布对象**
**create_timer(周期, 回调):定时周期性执行发布逻辑**
**publish(msg):把组装好的消息发送出去**
**订阅者专属**
**create_subscription(消息类型, 话题名, 回调函数, 队列长度):创建订阅对象**

  我们先来来理一下发布者可订阅才的代码核心

image

 

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

image

 以下是简单示例

但是在之前你会发现创建节点的方式不一样,以下二个方法是等效的,所以不用纠结

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 可以直接帮你生成或写上面代码,之所以做成笔记,目 的复原老师的代码,

posted @ 2026-06-13 22:00  鬼门元歌  阅读(3)  评论(0)    收藏  举报