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左上角刷新按钮。 - 节点显示为灰色:表示该节点当前未发布或未订阅任何话题,检查节点代码中的话题名称和类型是否匹配。