ROS 核心概念与计算图:用命令行亲手"看见"机器人通信(二)
通用基础优先 · 第二篇|ROS 通识系列|Docker 实战
一图读懂本文:计算图三问 + 命名/重映射 + 命令行三板斧 + ROS1/ROS2 差异 + 排查小抄。
上一篇我们把 ROS 的"全景地图"画了出来:节点、通信中枢、Topic/Service/Action、消息、参数、Bag。这一篇不空谈,直接开一个 ROS 2 容器,用命令行把这些概念一个个"看见"——这才是建立直觉最快的方式。
ros:jazzy,一条命令就能拿到干净、可复现的 ROS 2 环境,免装系统、免踩依赖坑。一、先把环境跑起来
如果你本机没装 Docker,先装 Docker Engine(桌面版或服务器版均可)。然后:
# 拉取并进入 ROS 2 Jazzy 容器(带 bash) docker run -it --rm --name ros2jazzy ros:jazzysource /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 talkerros2 node list
ros2 node info /talker
概念落地:在数采平台里,一个"读相机"的节点、一个"写 rosbag"的节点、一个"转发关节角"的节点,都是独立的 Node。松耦合、可替换,正是 ROS 的精髓。
三、Topic(话题):节点间的"广播站"
Topic 是异步、流式、多对多的通信。talker 在广播,谁订阅谁就能收到。这正是关节角、图像、力传感器数据的传输方式。
# 终端 B:列出所有话题 ros2 topic listros2 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% 的通信问题都能定位到。rostopic list / echo / hz / pub命令几乎一样,只是前缀ros2→ros,且 ROS 1 需要先在另一终端起roscore。四、Service(服务):一问一答
和 Topic 的"广播"不同,Service 是同步的请求-响应:你问"现在关节角多少?",它答一个值,结束。
# 列出所有服务 ros2 service listros2 service call /talker/describe_parameters rcl_interfaces/srv/DescribeParameters “{}”
Service 适合"短平快"的查询/指令;耗时任务它会卡住调用方,所以才有下面的 Action。
五、Action(动作):带进度汇报的长任务
Action = 目标(goal)+ 持续反馈(feedback)+ 最终结果(result)。机器人"抓取""导航"这种要几秒甚至几分钟的任务,必须用 Action,过程中能看进度、能取消。
# 列出动作 ros2 action listros2 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(可视化),用下面命令能画出实时连接图:
ros2 run rqt_graph rqt_graph # 需 desktop 版镜像 ros:jazzy-desktop图:两个节点通过 /chatter 话题相连;ROS 2 靠 DDS Domain 自动发现,不再有 ROS 1 那种中心 Master。
八、排查小抄:ros2 node list 看不到节点?
这是新手问得最多的问题。按顺序查这四步,基本都能解决:
- DOMAIN_ID 一致吗:两边
echo $ROS_DOMAIN_ID,不一致就互相看不见(默认都是 0); - source 了吗:每个新终端都要
source /opt/ros/jazzy/setup.bash,否则命令都找不到; - 容器网络通吗:两个容器默认在不同的 bridge 网络里,DDS 组播发现会失败——要么放进同一 docker 网络,要么 Linux 下
--net=host; - 等 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 是什么。