命令行工具
ROS 2 提供了一套命令行工具,用于对 ROS 2 系统进行自省(introspection)和操作。
这些工具的主入口是 ros2 命令,它提供多种子命令,用于自省和操作节点、话题、服务等。
要查看所有可用的子命令,请运行:
$ ros2 --help可用的子命令示例包括:
action:自省/交互 ROS 动作bag:录制/播放 rosbagcomponent:管理组件容器(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)消息。
在一个终端中发布消息:
$ ros2 topic pub /chatter std_msgs/msg/String "data: Hello world"publisher: beginning looppublishing #1: std_msgs.msg.String(data='Hello world')
publishing #2: std_msgs.msg.String(data='Hello world')在另一个终端中回显接收到的消息:
$ ros2 topic echo /chatterdata: Hello world
data: Hello worldROS 2 守护进程:后台发现服务
Section titled “ROS 2 守护进程:后台发现服务”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 来查看更多与守护进程交互的选项,包括启动、停止或检查守护进程状态的命令。
在前台运行守护进程
Section titled “在前台运行守护进程”出于调试目的,可能需要在前台运行 ROS 2 守护进程,这样它的输出会直接打印到 stdout 和 stderr。可以使用 _ros2_daemon 命令来实现,该命令是守护进程本身的入口点:
$ _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 工具就会自动检测到该子命令。