ROS2 Topic Publisher 基础知识与应用
概述
ROS2中的Publisher(发布者)是节点间通信的核心组件之一,用于向特定Topic发布消息。Publisher通过注册到指定Topic,将数据实时传递给订阅该Topic的Subscriber,是实现机器人传感器数据传输、控制指令发送等场景的基础。例如,发布激光雷达数据、发送运动控制指令等均依赖Publisher。
核心概念
1. Publisher的作用
- 数据发布:将消息(如传感器数据、控制指令)发送到指定的Topic。
- 异步通信:与Subscriber解耦,无需等待响应即可继续执行。
- 多对多支持:一个Topic可被多个Publisher发布,多个Subscriber订阅。
2. 通信流程
Text Only |
---|
| graph LR
A[Publisher] -->|发布消息| B[Topic]
C[Subscriber] -->|订阅Topic| B
B -->|消息传递| C
|
3. 与Subscriber的区别
特性 |
Publisher |
Subscriber |
功能 |
发布消息 |
接收消息 |
回调机制 |
无需回调函数 |
必须定义回调函数处理消息 |
消息处理 |
仅负责生成和发送消息 |
实时处理接收到的数据 |
4. 生命周期
- 注册发布:节点启动时向ROS2系统注册发布到指定Topic。
- 消息生成:创建消息对象并填充数据。
- 发送消息:通过
publish()
方法将消息发送到Topic。
- 持续运行:根据需求周期性或事件触发发送消息。
常用指令及用法
1. 查看系统中所有Topic
示例输出:
Text Only |
---|
| /camera/depth/image_raw
/cmd_vel
/odom
/scan
|
2. 查看Topic的详细信息
Bash |
---|
| ros2 topic info <topic_name>
|
示例:查看/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 |
---|
| linear:
x: float64
y: float64
z: float64
angular:
x: float64
y: float64
z: float64
|
6. 测量消息发布频率
Bash |
---|
| ros2 topic hz <topic_name>
|
示例:查看/scan
话题的频率:
输出示例:
Text Only |
---|
| 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 |
---|
| # 检查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 Publisher的核心概念、常用指令及开发实践。结合小乌龟案例和代码示例,能够高效实现数据发布与控制功能。