☰
ROS 核心概念与计算图:用命令行亲手“看见“机器人通信(二)
2026/10/27 2:00:23 网站建设 项目流程

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 看不到节点?

这是新手问得最多的问题。按顺序查这四步,基本都能解决:

  1. DOMAIN_ID 一致吗:两边echo $ROS_DOMAIN_ID,不一致就互相看不见(默认都是 0);
  2. source 了吗:每个新终端都要source /opt/ros/jazzy/setup.bash,否则命令都找不到;
  3. 容器网络通吗:两个容器默认在不同的 bridge 网络里,DDS 组播发现会失败——要么放进同一 docker 网络,要么 Linux 下--net=host;
  4. 等 2-5 秒:DDS 发现需要几秒钟,刚启动就 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 容器内实测可用。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询