You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用rclpy实现与ros2 node list相同的节点列表查询功能?

用rclpy实现ros2 node list的节点列表查询

问题原因

你当前的代码仅返回自身节点,是因为get_node_names_and_namespaces()默认只查询本地节点信息。要获取全局所有节点,需要调用ROS 2内置的全局节点查询服务,这也是ros2 node list命令底层依赖的机制。

解决方案代码

import rclpy
from rclpy.node import Node
from rcl_interfaces.srv import GetNodeNamesAndNamespaces

class NodeLister(Node):
    def __init__(self):
        super().__init__('node_lister')
        # 创建服务客户端,连接全局节点查询服务
        self.client = self.create_client(GetNodeNamesAndNamespaces, '/get_node_names_and_namespaces')
        # 等待服务就绪
        while not self.client.wait_for_service(timeout_sec=1.0):
            self.get_logger().info('服务未就绪,等待中...')
        # 构造空请求(该服务无需输入参数)
        self.request = GetNodeNamesAndNamespaces.Request()

    def send_request(self):
        # 异步调用服务并处理响应
        future = self.client.call_async(self.request)
        rclpy.spin_until_future_complete(self, future)
        if future.result() is not None:
            # 按ros2 node list的格式输出节点
            for name, namespace in zip(future.result().node_names, future.result().node_namespaces):
                full_name = f"{namespace}/{name}" if namespace != '/' else f"/{name}"
                print(full_name)
        else:
            self.get_logger().error(f"服务调用失败: {future.exception()}")

def main(args=None):
    rclpy.init(args=args)
    node_lister = NodeLister()
    node_lister.send_request()
    node_lister.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
    main()

代码说明

  • 引入rcl_interfaces.srv.GetNodeNamesAndNamespaces:这是ROS 2内置的全局节点查询服务类型。
  • 连接全局服务/get_node_names_and_namespaces:该服务由ROS 2的核心组件提供,所有节点均可访问。
  • 处理响应:将返回的节点名与命名空间拼接成ros2 node list的标准输出格式(如/talker或/demo/listener)。

验证步骤

  1. 先启动几个测试节点,比如:
    ros2 run demo_nodes_cpp talker
    ros2 run demo_nodes_py listener
    
  2. 运行上述Python代码,即可获取所有运行中的节点,效果与ros2 node list完全一致。

内容的提问来源于stack exchange,提问作者Eduardo Reis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 13:25:04