如何用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)。
验证步骤
- 先启动几个测试节点,比如:
ros2 run demo_nodes_cpp talker ros2 run demo_nodes_py listener - 运行上述Python代码,即可获取所有运行中的节点,效果与
ros2 node list完全一致。
内容的提问来源于stack exchange,提问作者Eduardo Reis
相关产品推荐
相关产品推荐

