跳转至

ROS2 Topic Publisher 基础知识与应用


概述

ROS2中的Publisher(发布者)是节点间通信的核心组件之一,用于向特定Topic发布消息。Publisher通过注册到指定Topic,将数据实时传递给订阅该Topic的Subscriber,是实现机器人传感器数据传输、控制指令发送等场景的基础。例如,发布激光雷达数据、发送运动控制指令等均依赖Publisher。


核心概念

1. Publisher的作用

  • 数据发布:将消息(如传感器数据、控制指令)发送到指定的Topic。
  • 异步通信:与Subscriber解耦,无需等待响应即可继续执行。
  • 多对多支持:一个Topic可被多个Publisher发布,多个Subscriber订阅。

2. 通信流程

Text Only
1
2
3
4
graph LR
    A[Publisher] -->|发布消息| B[Topic]
    C[Subscriber] -->|订阅Topic| B
    B -->|消息传递| C

3. 与Subscriber的区别

特性 Publisher Subscriber
功能 发布消息 接收消息
回调机制 无需回调函数 必须定义回调函数处理消息
消息处理 仅负责生成和发送消息 实时处理接收到的数据

4. 生命周期

  1. 注册发布:节点启动时向ROS2系统注册发布到指定Topic。
  2. 消息生成:创建消息对象并填充数据。
  3. 发送消息:通过publish()方法将消息发送到Topic。
  4. 持续运行:根据需求周期性或事件触发发送消息。

常用指令及用法

1. 查看系统中所有Topic

Bash
ros2 topic list
示例输出
Text Only
1
2
3
4
/camera/depth/image_raw
/cmd_vel
/odom
/scan

2. 查看Topic的详细信息

Bash
ros2 topic info <topic_name>
示例:查看/cmd_vel的详细信息:
Bash
ros2 topic info /cmd_vel
输出内容: - 消息类型:geometry_msgs/msg/Twist - 发布者数量:1 - 订阅者数量:2 - QoS配置(如可靠性、持久性)

3. 发布消息到Topic

Bash
ros2 topic pub <topic_name> <message_type> <message_content>
示例:向/turtle1/cmd_vel发布乌龟运动指令:
Bash
ros2 topic pub /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"

4. 查看Topic的消息类型

Bash
ros2 topic type <topic_name>
示例
Bash
ros2 topic type /cmd_vel
# 输出:geometry_msgs/msg/Twist

5. 查看消息结构

Bash
ros2 interface show <msg_type>
示例:查看Twist消息的结构:
Bash
ros2 interface show geometry_msgs/msg/Twist
输出
YAML
1
2
3
4
5
6
7
8
linear:
  x: float64
  y: float64
  z: float64
angular:
  x: float64
  y: float64
  z: float64

6. 测量消息发布频率

Bash
ros2 topic hz <topic_name>
示例:查看/scan话题的频率:
Bash
ros2 topic hz /scan
输出示例
Text Only
1
2
3
average rate: 10.002 Hz
max latency: 0.099999s
min latency: 0.090000s

7. 带参数的动态发布(高级用法)

Bash
ros2 topic pub --once <topic_name> <message_type> <message_content>
示例:仅发布一次消息:
Bash
ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist "{linear: {x: 0.5, y: 0.0, z: 0.0}, angular: {z: 0.0}}"


应用示例:小乌龟运动控制

步骤1:启动Subscriber节点

Bash
ros2 run turtlesim turtlesim_node

步骤2:手动发布运动指令

Bash
ros2 topic pub /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {z: 1.8}}"
效果:乌龟将向前移动并旋转。

步骤3:编写Publisher节点(Python示例)

Python
# publisher.py
import rclpy
from rclpy.node import Node
from geometry_msgs.msg import Twist

class MinimalPublisher(Node):
    def __init__(self):
        super().__init__('minimal_publisher')
        self.publisher_ = self.create_publisher(Twist, '/turtle1/cmd_vel', 10)
        self.timer = self.create_timer(0.5, self.timer_callback)  # 每0.5秒发布一次

    def timer_callback(self):
        msg = Twist()
        msg.linear.x = 1.0
        msg.angular.z = 0.5
        self.publisher_.publish(msg)
        self.get_logger().info('Publishing: Linear=%.1f, Angular=%.1f' % (msg.linear.x, msg.angular.z))

def main(args=None):
    rclpy.init(args=args)
    minimal_publisher = MinimalPublisher()
    rclpy.spin(minimal_publisher)
    minimal_publisher.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
    main()

步骤4:运行Publisher节点

Bash
ros2 run your_package_name publisher

常见问题与解决

问题1:消息未被接收

可能原因: - Topic名称拼写错误。 - Subscriber未启动或未订阅该Topic。 - QoS配置不匹配(如可靠性、持久性设置)。 解决方法

Bash
1
2
3
4
5
# 检查Subscriber是否运行
ros2 node list | grep turtlesim

# 确认Topic存在
ros2 topic list | grep cmd_vel

问题2:消息类型不匹配

现象:运行ros2 topic pub时提示No type specified解决方法

Bash
# 显式指定消息类型
ros2 topic pub /cmd_vel geometry_msgs/msg/Twist "{...}"

问题3:发布频率不稳定

可能原因: - 节点未进入spin()循环导致阻塞。 - 系统负载过高影响定时器精度。 解决方法

Python
# 确保代码包含spin循环
rclpy.spin(node)


扩展阅读

- ROS2 Humble 官方文档

通过本文,您已掌握ROS2 Publisher的核心概念、常用指令及开发实践。结合小乌龟案例和代码示例,能够高效实现数据发布与控制功能。