Skip to content

04-命令行工具框架

ros2/ros2cli | DeepWiki

概述

ROS 2 命令行界面 (CLI) 提供了一套用于与 ROS 2 系统交互和管理的命令行工具。它是用户检查、操作和与各种 ROS 2 实体(例如节点、主题、服务、动作和参数)交互的主要界面。

主要特点

  • 基于框架的可扩展架构
  • 一致的命令结构 ros2 <command> <verb> <arguments>
  • 守护进程以提高性能
  • 使用 tab 自动补全命令、动词和参数
  • 支持与所有主要的 ros2 概念进行交互

架构概览

ROS 2 CLI 采用模块化、基于插件的架构设计,便于扩展。

image.png

ros2cli 框架主要分为两部分:

  • 插件系统:发现和加载命令扩展及其动词
  • 节点策略:通过直接节点或守护进程提供 ROS2 图通信

插件系统

ROS 2 CLI 利用 Python 的 entry points 机制实现了一个灵活的插件系统。这使得模块化扩展无需修改核心代码库即可实现。

image.png

插件系统架构和工作流程

1. 入口点注册阶段 (Entry Point Registration)**

setuptools entry_points​ 作为注册中心,包含三种类型的扩展点:

  • ros2cli.command: 注册主命令(如 topicnodeservice
  • ros2cli.extension_point: 定义新的扩展点
  • command.verb: 注册命令的具体功能(如 listechopub

命令和动词是通过每个软件包的 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 → 结果输出 
   ↓               ↓                 ↓ 
解析命令    匹配可用命令/动词    执行具体业务逻辑

扩展接口

image.png

系统定义了两个主要扩展接口:

CommandExtension​ - 实现顶级命令的接口:

  • NAME属性(设置为入口点名称)
  • 用于执行命令的 main(*, parser, args) 方法 VerbExtension​ - 为特定命令实现子命令的接口:
  • NAME属性(设置为入口点名称)
  • 用于执行子命令的main(*, args)方法

节点策略

image.png

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 和守护进程间通信
• 需要时会自动启动守护进程

命令执行流程

image.png

ros2 topic echo /chatter 为例, 不启动守护进程时命令执行的流程:

  1. 用户输入命令:用户在终端输入 ros2 topic echo /chatter

  2. 命令加载与解析

    • ros2 主程序将 topic 部分交给 Command Factory
    • 工厂找到并加载对应的 TopicCommandCommand Implementation​)实例。
    • TopicCommand 解析剩余参数,识别出动词 echo,并加载对应的 EchoVerbVerb Implementation​)实例。
  3. 执行与 ROS 2 交互

    • EchoVerb 开始执行。它通过 Node Strategy(节点策略)创建一个 ROS 2 节点。
    • 使用这个节点向 ROS 2 Graph 订阅 /chatter 话题。
  4. 消息循环显示

    • 一旦有消息发布到 /chatter 话题,ROS 2 Graph​ 会通过回调函数将消息传递给 EchoVerb
    • EchoVerb 将消息内容打印到终端(Display message)。
    • 循环直到用户主动中断命令。

部分命令行工具实现

topic 监控命令 (hz/bw/delay)

image.png

1. 命令行接口

  1. 命令输入:用户在终端输入命令,例如 ros2 topic hz /chatter
  2. 参数解析:CLI 系统解析命令参数
  3. 创建直接节点:系统创建一个 DirectNode(直接节点)

2. 监控逻辑

  1. 订阅主题:该逻辑使用上一步创建的 DirectNode来订阅用户指定的主题(如 /chatter
  2. 统计收集器类:根据解析出的动词(hz/bw/delay),实例化一个对应的统计类
  3. 统计类
    • ROSTopicHz:计算并输出消息发布频率
    • ROSTopicBandwidth:计算并输出主题所占用的网络带宽
    • ROSTopicDelay:计算消息间的延迟或端到端延迟(如果有相关信息)
  4. 时间窗口缓冲:统计收集器类会维护一个时间窗口缓冲区,它会缓存一段时间内收到的消息(包括时间戳、消息大小等元数据)

3. 结果计算与显示

  1. 计算统计量:统计收集器类基于时间窗口缓冲区内的数据,执行特定的算法(如计算平均时间间隔、总数据量等),得到最终的统计结果
  2. 显示结果:计算出的统计结果输出到终端上

基于 VitePress 构建