本文档记录了在 Docker 容器环境中,从海量容器中快速定位目标容器,到进入容器内部验证 ROS2 工作流 Topic 的完整操作流程,并附带了 ROS2 常用命令速查表,方便日常开发与调试。
📋 前置条件
- 已通过
docker部署了包含 ROS2 Humble 的容器。 - 宿主机上可能同时运行多个容器,需要从中筛选出目标。
- 容器内 ROS2 环境已正确安装。
🚀 验证步骤
1️⃣ 从众多容器中筛选目标
当 docker ps 列出大量容器时,使用筛选命令能帮你快速锁定目标。
方法一:使用 grep 进行关键词匹配(最通用)
可以匹配容器名称、镜像名或状态中的任意文本:
bash
# 示例:筛选名称或镜像中包含 "ros" 的容器
docker ps | grep ros
# 示例:筛选你工作流相关的关键词
docker ps | grep lululemon
docker ps | grep workflow
方法二:使用 --filter 参数(Docker 原生推荐)
Docker 官方提供了精准的过滤参数,结果更干净:
| 常用过滤方式 | 命令示例 | 说明 |
|---|---|---|
| 按容器名称 | docker ps --filter "name=ros" |
筛选名称中包含 ros 的容器 |
| 按镜像名称 | docker ps --filter "ancestor=osrf/ros" |
筛选使用 osrf/ros 镜像的容器 |
| 按状态 | docker ps --filter "status=running" |
只显示运行中的容器 |
| 组合使用 | docker ps --filter "name=ros" --filter "ancestor=osrf/ros" |
同时满足多个条件 |
进阶技巧:只显示关键信息
如果觉得输出列太多,可以结合 --format 只显示容器 ID 和名称:
bash
docker ps --format "table {{.ID}}\t{{.Names}}" | grep ros
预期输出示例:
CONTAINER ID NAMES
6dec4400deca my_ros_container
记录下容器 ID(如 6dec4400deca),后续将使用它进入容器。
2️⃣ 进入容器终端
使用 docker exec 以交互式 bash 方式进入容器:
bash
docker exec -it 6dec4400deca bash
成功进入后,命令行提示符会变为容器内的状态,例如 root@6dec4400deca:/#。
3️⃣ 验证 ROS2 环境(如需要)
如果在后续步骤中提示 ros2: command not found,请先加载 ROS2 环境变量:
bash
source /opt/ros/humble/setup.bash
(建议将这条命令写入 ~/.bashrc,避免每次手动执行)
4️⃣ 列出所有活跃的 Topic
在容器内执行以下命令,查看当前 ROS2 系统中所有正在发布的 Topic:
bash
ros2 topic list
预期输出(节选):
/parameter_events
/rosout
/teleoperation/master/lululemon/workflow_state
/teleoperation/master/lululemon/workflow_cmd
...
可以看到,我们关心的 Topic 名称为 /teleoperation/master/lululemon/workflow_state。
5️⃣ 过滤特定工作流 Topic
若 Topic 列表较长,可以使用 grep 快速过滤出包含 workflow 的条目:
bash
ros2 topic list | grep workflow
预期输出:
/teleoperation/master/lululemon/workflow_state
/teleoperation/master/lululemon/workflow_cmd
这确认了工作流相关的 Topic 已正常存在。
6️⃣ 查看 Topic 详细信息
为了进一步验证该 Topic 的数据类型、发布者、订阅者等信息,使用 ros2 topic info 命令:
bash
ros2 topic info /teleoperation/master/lululemon/workflow_state
预期输出示例:
Type: workflow_interface/msg/WorkflowState
Publisher count: 1
Subscription count: 2
- Type:表示该 Topic 使用的消息类型。
- Publisher count:当前发布该 Topic 的节点数量。
- Subscription count:当前订阅该 Topic 的节点数量。
若输出显示了以上信息,则证明该 Topic 已正常通信,工作流状态数据正在被正确发布和订阅。
7️⃣ 进一步验证(可选)
查看 Topic 发布频率
bash
ros2 topic hz /teleoperation/master/lululemon/workflow_state
实时打印 Topic 数据
bash
# 持续打印
ros2 topic echo /teleoperation/master/lululemon/workflow_state
# 只打印一条
ros2 topic echo /teleoperation/master/lululemon/workflow_state --once
查看是哪个节点在发布该 Topic
bash
# 先列出所有节点
ros2 node list
# 查看某个节点的详细信息(包含发布/订阅的 topic)
ros2 node info /your_node_name
📚 附录:ROS2 常用命令速查表
🔧 节点操作
| 命令 | 说明 |
|---|---|
ros2 run <包名> <节点名> |
运行指定包中的节点 |
ros2 launch <包名> <launch文件> |
启动 launch 文件(可一次启动多个节点) |
ros2 node list |
列出所有运行中的节点 |
ros2 node info <节点名> |
查看节点的订阅/发布/服务/参数详情 |
📡 Topic 操作
| 命令 | 说明 |
|---|---|
ros2 topic list |
列出所有活跃的 topic |
ros2 topic info <topic名> |
查看 topic 的消息类型和发布/订阅者数量 |
ros2 topic hz <topic名> |
查看 topic 的发布频率(Hz) |
ros2 topic echo <topic名> |
实时打印 topic 数据(加 --once 只打印一条) |
ros2 topic pub <topic名> <msg类型> <数据> |
手动向 topic 发布消息 |
🔌 Service 操作
| 命令 | 说明 |
|---|---|
ros2 service list |
列出所有可用的 service |
ros2 service type <service名> |
查看 service 的 .srv 类型 |
ros2 service call <service名> <srv类型> <数据> |
手动调用 service |
⚡ Action 操作
| 命令 | 说明 |
|---|---|
ros2 action list |
列出所有 Action |
ros2 action info <action名> |
查看 Action 详情 |
ros2 action send_goal <action名> <类型> <数据> |
发送 Action 目标 |
⚙️ 参数操作
| 命令 | 说明 |
|---|---|
ros2 param list |
列出节点的参数 |
ros2 param get <节点名> <参数名> |
读取参数值 |
ros2 param set <节点名> <参数名> <值> |
设置参数值 |
ros2 param dump <节点名> |
导出节点参数到文件 |
💾 录制与回放
| 命令 | 说明 |
|---|---|
ros2 bag record <topic名> |
录制 topic 数据为 bag 文件 |
ros2 bag record -a |
录制所有 topic |
ros2 bag play <bag文件> |
回放 bag 文件 |
ros2 bag info <bag文件> |
查看 bag 文件信息 |
✅ 验证结论
通过以上步骤,我们成功:
- 在众多容器中快速筛选并定位到目标容器。
- 进入运行中的 Docker 容器。
- 验证并加载了 ROS2 环境变量。
- 列出所有 Topic 并过滤出工作流相关的 Topic。
- 获取了特定 Topic 的详细信息、发布频率及实时数据。
- (可选)确认了发布该 Topic 的节点。
这表明 ROS2 环境在容器内运行正常,且工作流 Topic 已正确配置并处于活动状态。
💡 温馨提示
- 如果执行
ros2命令时提示command not found,请先执行source /opt/ros/humble/setup.bash加载环境变量(或将其写入~/.bashrc)。 - 容器 ID 每次启动可能不同,请以实际
docker ps筛选结果为准。 - 若筛选容器时发现目标容器未显示,请尝试使用
docker ps -a查看所有容器(包括已停止的),确认容器是否处于运行状态。 - 若 Topic 不存在,请检查相应节点是否已启动,或 Topic 名称是否拼写正确。
- 使用
ros2 topic echo时注意数据量,频繁打印可能影响系统性能,建议加上--once参数进行单次查看。
文档编写日期:2026-09-07
适用 ROS2 版本:Humble Hawksbill