04-命令行工具框架
概述
ROS 2 命令行界面 (CLI) 提供了一套用于与 ROS 2 系统交互和管理的命令行工具。它是用户检查、操作和与各种 ROS 2 实体(例如节点、主题、服务、动作和参数)交互的主要界面。
主要特点
- 基于框架的可扩展架构
- 一致的命令结构
ros2 <command> <verb> <arguments> - 守护进程以提高性能
- 使用 tab 自动补全命令、动词和参数
- 支持与所有主要的 ros2 概念进行交互
架构概览
ROS 2 CLI 采用模块化、基于插件的架构设计,便于扩展。

ros2cli 框架主要分为两部分:
- 插件系统:发现和加载命令扩展及其动词
- 节点策略:通过直接节点或守护进程提供 ROS2 图通信
插件系统
ROS 2 CLI 利用 Python 的 entry points 机制实现了一个灵活的插件系统。这使得模块化扩展无需修改核心代码库即可实现。

插件系统架构和工作流程
1. 入口点注册阶段 (Entry Point Registration)**
setuptools entry_points 作为注册中心,包含三种类型的扩展点:
ros2cli.command: 注册主命令(如topic,node,service)ros2cli.extension_point: 定义新的扩展点command.verb: 注册命令的具体功能(如list,echo,pub)
命令和动词是通过每个软件包的 setup. py 文件中的入口点注册的:
python
# 定义入口点
entry_points={
# 主命令注册 (ros2cli.command)
# 向 `ros2`命令行工具注册一个名为 `topic`的子命令,当用户输入 `ros2 topic`时,会调用 `TopicCommand`类
'ros2cli.command': [
'topic = ros2topic.command.topic:TopicCommand',
],
# 定义一个新的扩展点命名空间 ros2topic.verb
'ros2cli.extension_point': [
'ros2topic.verb = ros2topic.verb:VerbExtension',
],
# 具体功能实现 (ros2topic.verb)
'ros2topic.verb': [
'bw = ros2topic.verb.bw:BwVerb',
'delay = ros2topic.verb.delay:DelayVerb',
'echo = ros2topic.verb.echo:EchoVerb',
'find = ros2topic.verb.find:FindVerb',
'hz = ros2topic.verb.hz:HzVerb',
'info = ros2topic.verb.info:InfoVerb',
'list = ros2topic.verb.list:ListVerb',
'pub = ros2topic.verb.pub:PubVerb',
'type = ros2topic.verb.type:TypeVerb',
],
} 2. 扩展加载阶段 (Extension Loading)
CLI Extension Loader 在运行时:
- 扫描所有已安装包的 entry_points
- 动态发现和加载可用扩展
- 实例化扩展对象
3. 命令执行阶段 (CLI Execution)
用户输入 → Command Parser → Command Executor → 结果输出
↓ ↓ ↓
解析命令 匹配可用命令/动词 执行具体业务逻辑 扩展接口

系统定义了两个主要扩展接口:
CommandExtension - 实现顶级命令的接口:
- NAME属性(设置为入口点名称)
- 用于执行命令的
main(*, parser, args)方法 VerbExtension - 为特定命令实现子命令的接口: - NAME属性(设置为入口点名称)
- 用于执行子命令的
main(*, args)方法
节点策略

ROS 2 CLI 需要与 ros2 graph 交互才能执行大多数命令。 CLI Command 通过 NodeStrategy 接口来执行与 ROS 2 Graph 的连接操作,连接方式分为两种:
- 直接连接(DirectNode):CLI 命令直接创建一个独立的 ROS 2 节点并接入系统;
- 守护进程连接(DaemonNode):CLI 命令不直接创建节点,而是通过一个 XML-RPC Server 与一个长期运行、具备网络感知能力的节点(NetworkAwareNode)进行通信。
| 策略类型 | 描述 | 特点 |
|---|---|---|
| 直接节点策略 | 每次命令执行时创建一个新的ROS 2节点 | • 实现较简单但开销较大 • 由于需要创建/销毁节点,重复命令执行较慢 • 在守护进程不可用时仍可工作 |
| 守护进程节点策略 | 与持久的守护进程进行通信 | • 为重复命令提供更好的性能 • 保持与 ROS 2 图的持久连接 • 使用 XML-RPC 接口在 CLI 和守护进程间通信 • 需要时会自动启动守护进程 |
命令执行流程

以 ros2 topic echo /chatter 为例, 不启动守护进程时命令执行的流程:
用户输入命令:用户在终端输入
ros2 topic echo /chatter。命令加载与解析:
ros2主程序将topic部分交给 Command Factory。- 工厂找到并加载对应的
TopicCommand(Command Implementation)实例。 TopicCommand解析剩余参数,识别出动词echo,并加载对应的EchoVerb(Verb Implementation)实例。
执行与 ROS 2 交互:
EchoVerb开始执行。它通过 Node Strategy(节点策略)创建一个 ROS 2 节点。- 使用这个节点向 ROS 2 Graph 订阅
/chatter话题。
消息循环显示:
- 一旦有消息发布到
/chatter话题,ROS 2 Graph 会通过回调函数将消息传递给EchoVerb。 EchoVerb将消息内容打印到终端(Display message)。- 循环直到用户主动中断命令。
- 一旦有消息发布到
部分命令行工具实现
topic 监控命令 (hz/bw/delay)

1. 命令行接口
- 命令输入:用户在终端输入命令,例如
ros2 topic hz /chatter - 参数解析:CLI 系统解析命令参数
- 创建直接节点:系统创建一个 DirectNode(直接节点)
2. 监控逻辑
- 订阅主题:该逻辑使用上一步创建的
DirectNode来订阅用户指定的主题(如/chatter) - 统计收集器类:根据解析出的动词(
hz/bw/delay),实例化一个对应的统计类 - 统计类:
ROSTopicHz:计算并输出消息发布频率ROSTopicBandwidth:计算并输出主题所占用的网络带宽ROSTopicDelay:计算消息间的延迟或端到端延迟(如果有相关信息)
- 时间窗口缓冲:统计收集器类会维护一个时间窗口缓冲区,它会缓存一段时间内收到的消息(包括时间戳、消息大小等元数据)
3. 结果计算与显示
- 计算统计量:统计收集器类基于时间窗口缓冲区内的数据,执行特定的算法(如计算平均时间间隔、总数据量等),得到最终的统计结果
- 显示结果:计算出的统计结果输出到终端上