Skip to content

命令行工具

ROS 2 提供了一套命令行工具,用于对 ROS 2 系统进行自省(introspection)和操作。

这些工具的主入口是 ros2 命令,它提供多种子命令,用于自省和操作节点、话题、服务等。

要查看所有可用的子命令,请运行:

Terminal window
$ ros2 --help

可用的子命令示例包括:

  • action:自省/交互 ROS 动作
  • bag:录制/播放 rosbag
  • component:管理组件容器(component container)
  • daemon:自省/配置 ROS 2 守护进程
  • doctor:检查 ROS 设置中的潜在问题
  • interface:显示 ROS 接口的相关信息
  • launch:运行/自省 launch 文件
  • lifecycle:自省/管理具有托管生命周期(managed lifecycle)的节点
  • multicast:组播(multicast)调试命令
  • node:自省 ROS 节点
  • param:自省/配置节点上的参数
  • pkg:自省 ROS 包
  • plugin:自省 ROS 插件
  • run:运行 ROS 节点
  • security:配置安全设置
  • service:自省/调用 ROS 服务
  • test:运行 ROS launch 测试
  • topic:自省/发布 ROS 话题
  • trace:追踪(tracing)工具,用于获取 ROS 节点执行信息(仅在 Linux 上可用)

要使用命令行工具实现经典的 talker-listener 示例,可以使用 topic 子命令在某个话题上发布和回显(echo)消息。

在一个终端中发布消息:

Terminal window
$ ros2 topic pub /chatter std_msgs/msg/String "data: Hello world"
publisher: beginning loop
publishing #1: std_msgs.msg.String(data='Hello world')
publishing #2: std_msgs.msg.String(data='Hello world')

在另一个终端中回显接收到的消息:

Terminal window
$ ros2 topic echo /chatter
data: Hello world
data: Hello world

ROS 2 通过分布式发现(discovery)机制让节点互相连接。由于不依赖集中式发现服务,节点发现 ROS 图(ROS graph)中所有其他参与者可能需要一些时间。为此,ROS 2 在后台运行一个守护进程(daemon),用于维护 ROS 图的相关信息,从而更快地响应查询(例如节点名称列表)。

当你首次使用 ros2 node list、ros2 topic list 等命令行工具或其他自省命令时,ROS 2 守护进程会自动启动。如果没有正在运行的守护进程,这些工具会在执行请求的命令前,在后台启动一个新的守护进程。

守护进程使用 localhost 网络接口(127.0.0.1)进行通信,并使用 ROS_DOMAIN_ID(见 关于 Domain ID)环境变量作为端口号偏移量。这意味着,如果你想控制特定的守护进程实例(例如使用 ros2 daemon stop),必须确保你的 ROS_DOMAIN_ID 与该守护进程使用的 domain ID 一致。不同的 ROS_DOMAIN_ID 值会在不同端口上运行各自独立的守护进程实例。

你可以运行 ros2 daemon --help 来查看更多与守护进程交互的选项,包括启动、停止或检查守护进程状态的命令。

出于调试目的,可能需要在前台运行 ROS 2 守护进程,这样它的输出会直接打印到 stdout 和 stderr。可以使用 _ros2_daemon 命令来实现,该命令是守护进程本身的入口点:

Terminal window
$ _ros2_daemon --ros-domain-id 0 --rmw-implementation rmw_fastrtps_cpp

这样启动的守护进程不会转入后台(non-daemonized),你可以实时观察所有发现活动和 XML-RPC 请求。请根据你的设置替换 --ros-domain-id 和 --rmw-implementation 的值。

注意:在前台启动守护进程之前,请确保停止任何已有的守护进程实例(ros2 daemon stop),以避免端口冲突。

ros2 命令的源代码可在 ros2/ros2cli 仓库获取。

ros2 工具本身是一个可通过插件扩展的框架。例如,sros2(ros2/sros2)包提供了 security 子命令,只要安装了 sros2 包,ros2 工具就会自动检测到该子命令。