ROS 核心概念与计算图:用命令行亲手"看见"机器人通信(二)
通用基础优先 · 第二篇|ROS 通识系列|Docker 实战

一图读懂本文:计算图三问 + 命名/重映射 + 命令行三板斧 + ROS1/ROS2 差异 + 排查小抄。
上一篇我们把 ROS 的"全景地图"画了出来:节点、通信中枢、Topic/Service/Action、消息、参数、Bag。这一篇不空谈,直接开一个 ROS 2 容器,用命令行把这些概念一个个"看见"——这才是建立直觉最快的方式。
为什么用容器:ROS 对系统环境(Ubuntu 版本、Python、依赖)很挑剔。用官方 Docker 镜像 ros:jazzy,一条命令就能拿到干净、可复现的 ROS 2 环境,免装系统、免踩依赖坑。
一、先把环境跑起来
如果你本机没装 Docker,先装 Docker Engine(桌面版或服务器版均可)。然后:
# 拉取并进入 ROS 2 Jazzy 容器(带 bash)
docker run -it –rm –name ros2jazzy ros:jazzy
source /opt/ros/jazzy/setup.bash
ros2 –version
ros2 pkg list | head
看到版本号和一堆包名,说明环境 OK。注意:容器里每个新 bash 都要先 source,否则命令找不到。
二、Node(节点):系统的最小积木
节点就是一个"干一件事的进程"。ROS 自带很多示例节点,demo_nodes_cpp 里的 talker 会持续广播 "Hello World"。
# 终端 A:启动一个发布节点 talker
ros2 run demo_nodes_cpp talker
ros2 node list
ros2 node info /talker
概念落地:在数采平台里,一个"读相机"的节点、一个"写 rosbag"的节点、一个"转发关节角"的节点,都是独立的 Node。松耦合、可替换,正是 ROS 的精髓。
新手视角 · 把计算图想成一个微信群:Node=群成员(每个人只干自己的事);Topic=群公告栏(有人发,谁都能看);Service=@某人提问(他必须回你);Parameter=置顶的"群规"(随时改,不用解散重建)。你潜水,不影响别人发消息——这就是"解耦"。
三、Topic(话题):节点间的"广播站"
Topic 是异步、流式、多对多的通信。talker 在广播,谁订阅谁就能收到。这正是关节角、图像、力传感器数据的传输方式。
# 终端 B:列出所有话题
ros2 topic list
ros2 topic echo /chatter
ros2 topic hz /chatter
ros2 topic pub /chatter std_msgs/msg/String “data: ‘hello from cli’”
新手视角 · 四条命令的记忆钩子:node list=点名册(谁在场);topic echo=偷听(它在说什么);topic hz=把脉(心跳多少下/秒);topic pub=替身演员(假装发布者喂数据)。排查问题就按"点名 → 偷听 → 把脉 → 替身"的顺序来,90% 的通信问题都能定位到。
ROS 1 对照:rostopic list / echo / hz / pub 命令几乎一样,只是前缀 ros2 → ros,且 ROS 1 需要先在另一终端起 roscore。
老手温故 · 单点故障与域隔离:ROS 1 的 roscore 是全网"电话簿"——它一挂,新节点再也牵不上线,这是 ROS 2 改用 DDS 去中心化发现的根本动机。ROS 2 侧对应的新问题是 ROS_DOMAIN_ID:不同域的节点互相看不见(默认 0),同一局域网里两组人做实验互不干扰就靠它。抓不到对方节点时,第一个该查的就是两边 DOMAIN_ID 是否一致。
四、Service(服务):一问一答
和 Topic 的"广播"不同,Service 是同步的请求-响应:你问"现在关节角多少?",它答一个值,结束。
# 列出所有服务
ros2 service list
ros2 service call /talker/describe_parameters rcl_interfaces/srv/DescribeParameters “{}”
Service 适合"短平快"的查询/指令;耗时任务它会卡住调用方,所以才有下面的 Action。
五、Action(动作):带进度汇报的长任务
Action = 目标(goal)+ 持续反馈(feedback)+ 最终结果(result)。机器人"抓取""导航"这种要几秒甚至几分钟的任务,必须用 Action,过程中能看进度、能取消。
# 列出动作
ros2 action list
ros2 action send_goal /rotate_robot example_interfaces/action/Fibonacci “order: 5” –feedback
六、Parameter(参数)与 Bag(数据包)
参数是节点的"运行时配置",不用改代码重编译:
ros2 param list # 看某节点有哪些参数
ros2 param get /talker use_sim_time
ros2 param set /talker qos_depth 10 # 运行时改
Bag 我们留到 第 10 篇专门讲——它就是把上面的 Topic 流录下来,是数采平台的数据源头。
七、把这张图"看"成一张网
当你同时跑了 talker、listener、rviz(可视化),用下面命令能画出实时连接图:
/talker──topic:/chatter──▶
/listener
↓ 全部经 DDS Domain 发现与路由(ROS 2 去中心化)↓
/rosout 日志中枢
ros2 run rqt_graph rqt_graph # 需 desktop 版镜像 ros:jazzy-desktop
图:两个节点通过 /chatter 话题相连;ROS 2 靠 DDS Domain 自动发现,不再有 ROS 1 那种中心 Master。
八、排查小抄:ros2 node list 看不到节点?
这是新手问得最多的问题。按顺序查这四步,基本都能解决:
九、小结与下篇预告
- Node = 干一件事的进程;Topic = 异步广播;Service = 一问一答;Action = 长任务带进度;Parameter = 运行时配置;
- 命令行是最好的探针:node list/info、topic list/echo/hz、service call、action send_goal 是日常排查四件套;
- 容器化(ros:jazzy)让环境零成本可复现,本系列 demo 都基于它;
- 下一篇:把 Topic 拆透——消息结构、用 Python 写自己的发布/订阅节点、QoS 是什么。
参考资料:ROS 2 官方 CLI 文档 docs.ros.org/en/jazzy/How-To-Guides;Docker 镜像 ros:jazzy(Docker Hub 官方 ROS 镜像)。本篇命令在 ros:jazzy 容器内实测可用。

![[鼎捷 BPM 运维配置] 定制设计E10 付款申请单打印表单-171主机测评](https://www.171host.com/wp-content/uploads/2026/11/20261105113818-6aec6aaaea367-220x149.png)



