ROS 2节点简介
节点是执行计算的进程。节点组合在一起形成一个图(graph),并使用主题(topic)、服务(service)和参数服务器(paramter server)相互通信。这些节点旨在以细粒度的规模运行;机器人控制系统通常包含许多节点。例如,一个节点控制激光测距仪,一个节点控制机器人的轮式电机,一个节点执行定位,一个节点执行路径规划,一个节点提供系统的图形视图,等等。
ROS 中节点的使用为整个系统带来了多种好处。由于崩溃被隔离到各个节点,因此具有额外的容错能力。与单片系统相比,代码复杂性降低了。实现细节也被很好地隐藏,因为节点向图的其余部分公开了最小的 API,并且即使在其他编程语言中,也可以轻松替换替代实现。
所有正在运行的节点都有一个图形资源名称,用于向系统的其余部分唯一标识它们。例如,/hokuyo_node可以是广播激光扫描的 Hokuyo 驱动程序的名称。节点还有一个节点类型,它简化了引用文件系统上可执行节点的过程。这些节点类型是包资源名称,其中包含节点包的名称和节点可执行文件的名称。为了解析节点类型,ROS 会搜索包中具有指定名称的所有可执行文件,并选择找到的第一个。因此,您需要小心,不要在同一包中生成具有相同名称的不同可执行文件。
ROS 节点是使用ROS 客户端库(rcl,例如roscpp或rospy)编写的。
ROS 2在设计上采用了一些关键的改进和更新,特别是在节点(nodes)的实现和通信机制方面。在ROS 2中,节点依然是构建和运行机器人应用的基本单元,但与ROS 1相比,它们在多个方面有了显著的改进。
ROS 2节点改进和新特性
1. 改进的通信机制
ROS 2采用了DDS(Data Distribution Service)作为底层的中间件,这是一项面向实时系统的通信标准。与ROS使用的基于TCP/IP的通信相比,DDS提供了更高的性能、更好的可靠性和更灵活的消息传输模式(包括点对点和发布/订阅)。这使得ROS 2能够更好地支持大规模分布式系统和实时应用。
2. 节点自动发现机制
在ROS1中,节点自动发现机制依赖于一个名为ROS Master的中心化名称服务。ROS Master允许节点在启动时注册自己,并发现其他节点,以便它们可以相互通信。ROS Master充当了节点发现的中心节点,同时也带来了更多的可靠性的问题:当ROS Master崩溃的时候,整个系统也将无法工作。
而ROS2则因为采用了基于DDS(Data Distribution Service)的分布式消息传递系统,节点使用DDS的发现协议自动发现彼此,无需中心化的ROS Master。这种方式更加适合分布式系统,提高了系统的可扩展性和容错性。
3. 节点生命周期管理
ROS 2引入了节点生命周期的概念,这是一种管理节点状态(如初始化、激活、停止等)的机制。这允许系统以更可控和可预测的方式管理资源和行为,特别是在需要高度可靠性的应用中。节点生命周期管理还简化了错误处理和系统恢复,提高了系统的整体稳定性和可维护性。
4. 增强的安全性
ROS 2引入了一套安全增强功能,称为SROS(Secure ROS)。这些功能包括节点认证、加密通信和访问控制,可以有效保护机器人系统免受恶意攻击。在机器人越来越多地被应用于安全敏感的环境中,如家庭、医疗和公共空间,这些安全特性变得尤为重要。
5. 实时支持
通过利用DDS的实时通信能力,ROS 2被设计为可以支持实时应用。这意味着开发者可以创建能够满足特定时间约束的节点和系统,这对于控制和其他需要快速响应的任务至关重要。ROS 2还提供了实时调度和内存管理的工具,帮助开发者优化其应用的实时性能。
6. 跨平台支持
ROS 2旨在支持更广泛的操作系统和平台,包括Windows、Linux和macOS,甚至是嵌入式平台。这是通过使用更加便携的代码和依赖项,以及提供对不同操作系统特有功能的抽象来实现的。这种跨平台支持使得ROS 2能够应用于更多种类的机器人项目和环境中。
节点命令行工具
在ROS 2中,提供了一系列命令行工具(CLI)用于管理节点(nodes),这些工具使得开发者可以方便地与ROS 2系统交互,执行各种操作,如列出活动节点、获取节点信息、以及终止节点等。以下是一些主要的ROS 2命令行工具和它们的用途:
启动节点
ros2 run是用于启动ROS 2节点的命令。使用方法:
ros2 run [package_name] [executable_name]
管理节点
ros2 node是一个用于节点管理的命令行工具,它允许用户执行与节点相关的各种操作。
列出节点:
要查看当前活动的节点,可以使用:
ros2 node list
这个命令会列出当前系统中所有活跃的节点名称。
获取节点信息:
要获取特定节点的更多信息,如订阅的主题、发布的主题、提供的服务等,可以使用:
ros2 node info <node_name>
终止节点
在ROS 2中,直接终止节点的命令不像ROS 1中的rosnode kill
那样直观。要终止一个节点,通常需要找到运行该节点的进程,然后使用系统命令(如kill
在Linux上)来终止该进程。可以通过组合使用ps
和grep
命令来查找节点的进程ID,然后使用kill
命令终止它。
例如,如果你的节点名称包含talker
,你可以使用以下命令查找并终止这个节点:
pgrep -f ros2.*talker
这将列出所有名称中包含talker
的ROS 2节点的进程ID。然后,你可以使用kill
命令加上进程ID来终止节点:
kill -SIGINT <process_id>
或者,如果想要终止所有匹配的进程,可以使用:
pkill -f ros2.*talker
作者Blog原文:ROS 2基础概念#2:节点(Node)| ROS 2学习笔记 - HY's Blog