3. 使用rqt_graph可视化节点通信

任务目标

启动两个ROS2节点(一个发布者、一个订阅者),通过rqt_graph实时查看节点与话题之间的通信关系图,验证话题通信链路是否正确建立。

环境准备

本案例基于ROS2 Humble版本,需要预先安装rqt_graph插件:

sudo apt install ros-humble-rqt-graph

完整实现

创建两个Python节点:talker周期性发布字符串消息到/chatter话题,listener订阅该话题并打印接收内容。两个节点均使用rclpy标准API实现。

# talker.py
import rclpy
from rclpy.node import Node
from std_msgs.msg import String

class Talker(Node):
    def __init__(self):
        super().__init__('talker')
        self.publisher = self.create_publisher(String, '/chatter', 10)
        self.timer = self.create_timer(1.0, self.publish_message)
        self.count = 0

    def publish_message(self):
        msg = String()
        msg.data = f'Hello ROS2: {self.count}'
        self.publisher.publish(msg)
        self.get_logger().info(f'Publishing: {msg.data}')
        self.count += 1

def main(args=None):
    rclpy.init(args=args)
    node = Talker()
    rclpy.spin(node)
    node.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
    main()
# listener.py
import rclpy
from rclpy.node import Node
from std_msgs.msg import String

class Listener(Node):
    def __init__(self):
        super().__init__('listener')
        self.subscription = self.create_subscription(
            String, '/chatter', self.callback, 10)

    def callback(self, msg):
        self.get_logger().info(f'Received: {msg.data}')

def main(args=None):
    rclpy.init(args=args)
    node = Listener()
    rclpy.spin(node)
    node.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
    main()

运行与验证

打开三个终端,依次执行以下命令:

# 终端1:启动发布者
python3 talker.py

# 终端2:启动订阅者
python3 listener.py

# 终端3:启动可视化工具
rqt_graph

在rqt_graph窗口中,确认以下内容即判定通过:

  • 图形区域出现两个椭圆节点,分别标注/talker和/listener;
  • 两个节点之间有一条带箭头的连线,连线中间标注话题名/chatter;
  • 箭头方向从/talker指向/listener,表示发布→订阅方向;
  • 终端1持续输出Publishing: Hello ROS2: N,终端2同步输出Received: Hello ROS2: N,且计数一致。

常见问题

  • 图中出现/rosout节点:这是ROS2日志系统的默认节点,属于正常现象,不影响通信链路观察。
  • 看不到连线:确认两个节点均已启动且话题名称完全一致(均为/chatter),点击rqt_graph左上角刷新按钮。
  • 节点显示为灰色:表示该节点当前未发布或未订阅任何话题,检查节点代码中的话题名称和类型是否匹配。