资讯动态

ROS Topic通信实战

发布时间:2026/8/25 16:37:47 来源:尧图企业网站定制
文章目录编写发布者节点编写订阅者节点在分布式系统中Topic是一种基于发布/订阅 (Publish/Subscribe) 模型的异步通信机制其核心特征是解耦发布者Publisher和订阅者Subscriber不需要知道对方的存在它们仅通过“话题名称”和“消息类型”进行数据交互。在具体实现Topic通信的功能之前先创建工作空间具体可参考节点通信-创建工作空间。编写发布者节点在内层restaurant_robot目录下新建publisher_node.py代码如下importrclpyfromrclpy.nodeimportNodefromstd_msgs.msgimportStringclassPublisherNode(Node):def__init__(self):super().__init__(publisher_node)# 1. 创建发布者# 参数消息类型(String), 话题名称(test_topic), 队列长度(10)self.publisher_self.create_publisher(String,test_topic,10)# 2. 创建定时器# 参数触发间隔(1.0秒), 回调函数self.timerself.create_timer(1.0,self.timer_callback)self.i0# 计数器deftimer_callback(self):# 3. 构造消息对象msgString()msg.datafHello ROS2:{self.i}# 4. 发布消息self.publisher_.publish(msg)self.get_logger().info(fpublish{msg.data})self.i1defmain(argsNone):rclpy.init(argsargs)nodePublisherNode()try:rclpy.spin(node)exceptKeyboardInterrupt:passfinally:node.destroy_node()rclpy.shutdown()if__name____main__:main()退回上一级目录打开 setup.py在 console_scripts 列表中添加run_publisher restaurant_robot.publisher_node:main,接下来在工作空间最上层文件夹编译并运行colcon build source install/setup.bash ros2 run restaurant_robot run_publisher此时当前路径下就会不断输出log信息。此时打开另一个终端输入ros2 topic echo /test_topic就会看到发布者发来的字符串数据内容大致为【data: ‘Hello ROS2: 0’】。编写订阅者节点在上述测试中我们在另外一个终端中调用了【topic echo】命令该命令其实扮演了一个订阅者节点的角色其功能是接收发布者的信息并对其进行操作。下面我们亲自手写一个订阅者节点文件名是subscriber_node.py内容如下importrclpyfromrclpy.nodeimportNodefromstd_msgs.msgimportStringclassSubscriberNode(Node):def__init__(self):super().__init__(subscriber_node)# 1. 创建订阅者# 参数消息类型(String), 话题名称(test_topic), 回调函数, 队列长度(10)self.subscriptionself.create_subscription(String,test_topic,self.listener_callback,10)# 防止未使用的变量警告self.subscriptiondeflistener_callback(self,msg):# 2. 回调函数当收到新消息时系统会自动调用此函数# 参数 msg 就是发布者发来的消息对象self.get_logger().info(f接收到数据: {msg.data})defmain(argsNone):rclpy.init(argsargs)nodeSubscriberNode()try:rclpy.spin(node)exceptKeyboardInterrupt:passfinally:node.destroy_node()rclpy.shutdown()if__name____main__:main()同样再setup.py的console_scripyts列表中添加run_subscriber restaurant_robot.subscriber_node:main,至此在两个终端里分别运行发布者和订阅者节点source install/setup.bash ros2 run restaurant_robot run_subscriber然后就能看到订阅者节点源源不断地输出发布者发布的信息了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价