使用命令行工具解析数据(Introspection)
ROS 2 包含一套用于与 ROS 2 系统交互的命令行工具。
译者注:此处“与 ROS 2 系统交互”翻译自“introspecting a ROS 2 system”。尽管“introspecting” 一词在某些领域中被翻译为“内省”,但是译者认为已有的翻译仅仅是使用中文汉字替代原词,并未传达出这个词汇的实际含义。至少对于译者而言,“自省某个系统”是一种完全不知所云的说法。 考虑到本页面的内容和情景,译者认为“解析数据”、“与系统交互”更能表达这个词汇在中文中实际对应的操作。后续你将进一步理解“introspect”具体是在做什么。
使用
工具的主要入口是 ros2
命令,它本身有各种子命令,用于解析和处理节点、topic、service等。
运行如下命令,可以看到所有可用的子命令:
ros2 --help
一些可用的子命令包括:
action
: 与 ROS actions 交互bag
: 录制或播放 rosbagcomponent
: 管理 component containersdaemon
: 与 ROS 2 daemon 交互doctor
: 检查 ROS 配置中潜在的问题interface
: 列出 ROS interfaces 和相关信息launch
: 运行/检查 launch filelifecycle
: 通过 lifecycles 管理 nodesmulticast
: Multicast debugging commandsnode
: 与 ROS nodes 交互param
: 配置 node 的参数pkg
: 与 ROS packages 交互run
: 运行 ROS nodessecurity
: 配置 security 有关的参数service
: 与 ROS services 交互test
: 运行 ROS launch testtopic
: 与 ROS topics 交互trace
: 在 ROS nodes 运行期间追踪运行情况的工具(tracing tool) (仅在 Linux 上可用)wtf
:doctor
的别名
样例
使用 topic
子命令可以用于在一个 topic 上发布和显示消息,这样可以生成典型的 talker-listener 示例的 talker端。
在一个终端中发布消息:
$ 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')
在另一个终端中显示消息,用来充当 listener 端:
$ ros2 topic echo /chatter
data: Hello world
data: Hello world
样例之下的细节
ROS 2 使用分布式发现的方式(distributed discovery process)来使节点相互连接。 这个过程特意不使用中心化的发现机制,因此 ROS 节点发现 ROS graph 中的其他参与者可能需要一些时间。 因此,后台有一个长时间运行的守护进程(daemon),用于存储有关 ROS graph 的信息,以提供更快的查询响应,例如节点名称列表。
当第一次使用相关命令行工具时,守护进程会自动启动。
你可以运行 ros2 daemon --help
以获取与守护进程交互的更多选项。
实现(Implementation)
ros2
命令的源码位于 https://github.com/ros2/ros2cli.
ros2
命令已经实现为一个可以通过插件扩展的框架。
例如,如果安装了 sros2 包,那么 ros2
工具会自动检测到 sros2
包提供的 security
子命令。