
如果你在搜索引擎里敲下 ROS2 几个字大概率会被菜鸟教程安装教程入门21讲这些词包围。我当年也是这样走过来的在 Ubuntu 22.04 上安装 ROS2 Humble先是被Unable to locate package教育了一晚上后来又被节点、话题、服务、参数、DDS 这一串概念打懵。直到我翻开一本不怎么厚的书才突然觉得 ROS2 机器人编程这件事是有主线的。这本书叫A Concise Introduction to Robot Programming with ROS2中文可以译成《ROS2 机器人编程简明导论》。它不是 ROS2 命令手册也不是那种能当枕头用的百科全书而是把从环境搭建到写一个能跑起来的机器人程序这条路上最关键的东西按一条清晰主线捋了一遍。我读完的直观感受是如果你之前被各种碎片化教程劝退过这本书能帮你把那些散落的概念像拼图一样拼起来。它适合刚接触机器人编程的人也适合已经从 ROS1 转过来但一直没系统捋清 ROS2 设计思路的开发者。下面我就结合自己的实际折腾经历聊聊这本书为什么值得读以及围绕它该怎么配套动手。1. 从装不上 ROS2到读完一本书我的入门复盘先交代背景。我是在折腾完 ROS1 的 Melodic、Noetic 之后才开始碰 ROS2 的。本来以为只是换了个壳结果一上来就被安装和各种新版概念惹毛了。网上教程很多但每篇教的版本都不一样Foxy、Galactic、Humble、Rolling光搞清楚这些词就花了两天。好不容易装完立刻又被rclpy、launch、colcon、ament这些名词淹没。那段时间我最大的感受是不是我不努力是没人告诉我该按什么顺序学。后来我在一次项目里需要把一套旧代码迁移到 ROS2硬着头皮去读官方文档。官方文档当然全面但全面到你不知道该先看哪页。最后还是朋友塞给我一本 PDF就是这本A Concise Introduction to Robot Programming with ROS2。书不厚内容却意外地有针对性。它不是把 ROS2 的每个功能都讲到而是把一个机器人程序从零到能跑涉及的核心环节全部按顺序讲了一遍。1.1 为什么简明反而是最稀缺的市面上讲 ROS2 的书和视频其实不少但大多存在两个极端要么太厚事无巨细地罗列 API读两百页还在讲配置环境要么太单薄只教你怎么跑turtlesim换个真实场景就不会了。这本书的定位恰好卡在中间书名里的 Concise 不是删减而是提炼。它把你必须知道的东西和你以后用到了再查的东西分得很清楚。我用一个类比形容这种感受学 ROS2 像学做菜。很多教程是先学切墩三年再开始炒菜而这本书是今天先教你把一盘番茄炒蛋做熟再慢慢告诉你什么时候该练雕花。先建立整体脉络再往里面填细节对初学者来说这个顺序太重要了。1.2 这本书不是 ROS2 命令手册我在读之前也犯过同样的错误以为读完就能背下所有ros2命令。实际上书里并没有把每个命令都列一遍它更强调的是一套编程思维——你写的一个节点运行起来应该是什么样发布者、订阅者、服务端、客户端之间是怎么协作的以及为什么 ROS2 要这么设计。想查命令的话官方文档永远是最全的但理解设计思路这件事确实是这本小书给了我最扎实的框架。2. 先把环境装明白Ubuntu 22.04 ROS2 Humble 实录看书的前提是环境能跑起来。ROS2 目前最主流的学习组合其实是 Ubuntu 22.04 Humble因为 Humble 是 LTS 版本支持周期长社区资料也最多。很多热词里出现ubuntu 22.04 安装 ros2 e: unable to locate package这几乎是我见过最多的安装报错。这里把完整流程和排查思路写清楚你至少能少折腾一周。2.1 版本选择为什么我建议从 Humble 而不是 Jazzy 开始ROS2 的版本名是按字母顺序排的每一个版本都有对应的 Ubuntu 系统。选择版本时最重要的一点是你的系统版本要能装对应的 ROS2 发行版。比如 Ubuntu 22.04 对应 HumbleUbuntu 24.04 对应 JazzyUbuntu 20.04 对应 Foxy。如果你用的是 22.04硬去装 Jazzy 的源是装不上的。ROS2 发行版对应 Ubuntu类型我的建议Foxy FitzroyUbuntu 20.04LTS已停止维护老设备可以考虑新人不推荐Humble HawksbillUbuntu 22.04LTS支持到 2027 年目前入门首选Jazzy JaliscoUbuntu 24.04LTS较新24.04 用户可以选它Rolling 等非 LTS跟随开发版滚动更新不建议学习阶段使用如果你电脑是 Ubuntu 22.04老老实实装 Humble 就好。支持时间长意味着你换电脑、换环境之前这套配置还能持续用下去。社区里遇到问题搜到的答案大多也是 Humble这会省掉很多找资料的时间。2.2 安装步骤与 unable to locate package 排查过程Humble 的官方安装步骤网上能搜到很多但真正执行起来最容易被卡住的是源没有配好。下面是一套我实测可以走通的最小流程sudo apt update sudo apt install software-properties-common curl -y sudo add-apt-repository universe sudo apt update然后添加 ROS2 软件源。先下载 ROS2 的 GPG keysudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg再把源写入列表。注意下面这个命令会动态获取当前系统的 CodenameUbuntu 22.04 输出的是jammyecho deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main | sudo tee /etc/apt/sources.list.d/ros2.list /dev/null接着更新并安装sudo apt update sudo apt upgrade sudo apt install ros-humble-desktop如果你执行到sudo apt install ros-humble-desktop时出现E: Unable to locate package ros-humble-desktop不要急着怀疑版本不对。按这个顺序排查确认/etc/apt/sources.list.d/ros2.list文件存在并且内容里的 Ubuntu Codename 是jammy。如果写着focal说明你用了 Ubuntu 20.04 的源。重新执行sudo apt update观察输出里有没有包含packages.ros.org/ros2/ubuntu的条目。如果没看到说明源根本没生效。确认系统时间正确。时间偏差太大会导致 key 校验失败表面症状也是软件包找不到。这套排查思路我在各个群里回答过不下十次绝大多数人都是第一步或者第二步出了问题。2.3 用 turtlesim 验证安装是否正常装完以后先别急着看书打开终端测试一条龙source /opt/ros/humble/setup.bash ros2 run turtlesim turtlesim_node再开一个终端source /opt/ros/humble/setup.bash ros2 run turtlesim turtle_teleop_key如果能看到小乌龟出现并且可以键盘控制方向说明核心功能已经正常。这时候你可以顺手体验几个高频命令ros2 node list ros2 topic list ros2 topic echo /turtle1/pose当你看到/turtle1/pose不断输出小乌龟的位置和角度时恭喜你ROS2 的通信机制已经在你的电脑上跑起来了。这个过程也是这本书开篇大概率会带你做的事。别小看这只小乌龟它背后藏着节点、话题、发布和订阅最朴素的原型。3. 节点、话题、服务、参数这本书讲解核心概念的方式ROS2 入门的第一道坎就是这几个抽象概念。很多人看文档看不下去是因为文档一上来就用精确但晦涩的语言说节点是负责计算的可执行文件话题是节点间通信的通道。每个字都认识连起来不知道在说什么。这本书的处理方式更接地气它会把一个机器人想象成一个团队节点是团队里的成员话题是成员之间的广播服务则是点对点的请求。3.1 把节点想象成车间里的工人一个机器人系统里通常运行着很多程序每个程序负责一件事有的读激光雷达有的做定位有的控制电机。在 ROS2 里每个这样的程序就是一个节点。节点之间相互独立又可以通过通信机制协作。书里强调了一个很关键的点节点不是线程也不是函数它是一个可以独立加载、独立启停的进程单元。这个设计让系统变得非常灵活。比如你写了一个相机驱动节点换相机型号时不用重写整个系统只需要替换这个节点或者通过参数改变配置。我第一次意识到节点是可替换的时才真正理解为什么 ROS2 的程序设计风格长那样。3.2 话题是广播服务是打电话话题和服务是 ROS2 通信的两大主力很多人一开始分不清。我自己的理解方式是话题是广播。一个节点往某个话题上发布消息所有订阅了这个话题的节点都能收到。发布者并不知道有哪些订阅者订阅者也不在乎发布者是谁。服务是打电话。客户端发起请求服务端处理完返回响应这是一问一答的模式适合我需要你现在算个结果给我的场景。这本书没有陷入协议细节而是用类似这样的生活化类比把两者的区别讲透了。它还点出一个初学者很容易忽略的重点话题适用于持续产生的数据流比如里程计、激光扫描服务适用于偶发的请求比如帮我规划一条路径把机械臂切换到夹取姿态。场景用对了设计自然就顺了。3.3 用一个发布订阅例子串起全部概念光看文字不够动手写一个最简单的发布订阅节点才是真懂。下面是我根据书中思路改的一个最小 Python 发布者代码量很小import rclpy from rclpy.node import Node from std_msgs.msg import String class Talker(Node): def __init__(self): super().__init__(talker) self.pub self.create_publisher(String, hello_topic, 10) self.timer self.create_timer(1.0, self.publish_message) def publish_message(self): msg String() msg.data hello from ros2 self.pub.publish(msg) def main(argsNone): rclpy.init(argsargs) node Talker() rclpy.spin(node) rclpy.shutdown()这个程序做了几件小事定义了一个名为talker的节点创建一个向hello_topic话题发布消息的发布者然后每 1 秒触发一次回调函数发布消息。rclpy.spin(node)的作用是让节点持续运行、等待事件。这里有太多人可以展开讲但你先把它当成程序启动后别退出的咒语就行。写完以后用colcon build编译再在另一个终端里运行一个订阅者或者直接用命令行观察ros2 run your_package talker ros2 topic echo /hello_topic当你在终端里看到data: hello from ros2一条条刷出来发布订阅这个模型就真正长在你脑子里了。3.4 为什么要先理解通信模型再写业务很多新手一开始写节点喜欢把逻辑全塞进一个大的循环里用全局变量互相传数据这在 ROS1 时代还能忍在 ROS2 里会很难维护。原因是 ROS2 基于 DDS 设计它对节点之间的通信质量有更细的控制消息要不要可靠、要不要保留历史缓存、适合局域网的哪个网段发现。这些概念听起来复杂但书里会先让你建立一个认知——ROS2 的通信模型是系统的地基而不是可选配件。地基打歪了后面写再牛的算法也跑不起来。我看过不少人在项目里遇到订阅回调不触发消息丢失之类的问题最后发现都是没有理解 QoS 的设置。这本书没有把 DDS 讲成玄学但会让你知道有 QoS 这回事并且知道什么时候该去查文档这一点已经能帮你少踩很多坑。4. 命令、launch、参数与工具链从会跑示例到会调试读完概念之后接下来要解决的是效率问题。同一个功能有人用ros2 node list和ros2 topic info五分钟定位问题有人只能对着屏幕发呆。这本书在核心通信概念讲完之后自然会过渡到命令行工具、launch 文件和可视化调试工具这个节奏很对我胃口。4.1 高频 ros2 命令清单虽然这本书不是命令手册但有些命令你几乎每天都会用到。我根据自己的使用频率整理了一份清单你可以当速查表用命令作用使用频率ros2 node list查看当前所有运行节点极高ros2 node info node查看节点的话题、服务、动作接口高ros2 topic list查看当前所有话题极高ros2 topic echo topic打印话题上实时发布的消息极高ros2 topic pub topic type手动发布一条消息到话题中ros2 service list查看所有可用服务高ros2 service call service type手动调用服务中ros2 param list查看节点参数高ros2 launch pkg file启动 launch 文件极高对初学者来说ros2 topic echo是调试的王牌。只要你怀疑某个数据没进来先topic list看看话题在不在再topic echo看看数据量基本能定位八成问题。这个方法也是书里在讲调试工具时反复强调的不要靠猜先让数据说话。4.2 launch 文件为什么比一条条敲命令好用当你需要同时启动好几个节点时就会感受到 launch 文件的美妙。比如要跑一个小乌龟加键盘控制手动要开两个终端用 launch 只需一个命令。下面是一个非常精简的launch.py示例from launch import LaunchDescription from launch_ros.actions import Node def generate_launch_description(): return LaunchDescription([ Node( packageturtlesim, executableturtlesim_node, nameturtle1 ), Node( packageturtlesim, executableturtle_teleop_key, outputscreen ), ])保存为my_turtle.launch.py然后ros2 launch my_turtle.launch.py写代码的人最反感动不动开一堆终端launch 文件就是解决这个痛点的标准姿势。这本书会结合一个稍微完整的机器人示例展示 launch 的用法包括怎样传参数、怎样设置命名空间。学完之后你自己搭一套仿真机器人时会更顺畅。4.3 RViz2 与 Gazebo可视化与仿真怎么配合热词搜索里频繁出现 rviz2安装使用ros2 和 gazebo.launch.py说明仿真和可视化是很多人在 ROS2 路上绕不开的部分。简单说RViz2 是用来看数据的激光点云、TF 变换、地图、机器人模型都在里面显示Gazebo 是用来造环境的物理仿真、传感器仿真、碰撞检测都靠它。我习惯把两者配合使用Gazebo 负责提供一个接近真实的世界机器人模型在里面运动RViz2 负责展示算法看到的世界比如代价地图、全局路径、局部路径。这本书会帮你把这两个工具的角色区分布置得很清楚但不会让你一开始就沉进去研究每个按钮。因为你现阶段需要的只是看到机器人动起来的正反馈而不是变成一个仿真软件专家。4.4 这本书对工具链的取舍我认为这本书最聪明的地方在于对工具链做了取舍。它没有试图把所有插件都介绍一遍而是挑选了一个从空白环境到机器人跑起来的必需组合turtlesim 练手、RViz2 看数据、Gazebo 做仿真。至于其他扩展工具书里会提到但不展开读者真正遇到时再向着官方文档的方向找。这种做法极大降低了初学者的认知负担同时也给后续进阶留了钩子。5. 学完这本书之后的路导航、机械臂视觉抓取与 Micro-ROS一本简述性质的书不可能把你直接变成机器人算法工程师但它能给你画出一张足够清晰的地图让你知道接下来要往哪里走。搜索热词里有很多 ros2路径规划 ros2机械臂视觉抓取仿真 micro-ros ros2 esp32s3 这类需求正好对应读完这本书之后的三个典型进阶方向。5.1 NAV2、SLAM 与路径规划为什么说它们是下一站机器人要自主移动光会发话题和服务还不够还需要解决我在哪、我要去哪、怎么去的问题。工程上最常用的是 SLAM 建图加 NAV2 导航。这本书最后会或多或少提到这些方向但不会深入到公式层面。等你把基础概念弄扎实再去看 NAV2理解起来会快很多。先分清三个坐标map地图坐标、odom里程计坐标、base_link机器人本体坐标。然后搞清楚 TF 变换再看全局规划器、局部规划器、代价地图之间的关系。搜索里有个八叉树地图导航那是用 OctoMap 做三维环境表示的方向属于 SLAM 的延伸需要先有激光或深度相机的数据基础。总之读完书后你对话题、节点、TF 有了直觉再啃这些就不会像看天书。5.2 机械臂视觉抓取的常见套路MoveIt 相机标定 手眼标定另一个热门方向是机械臂视觉抓取搜索热词里的机械臂视觉抓取仿真就是这个。大致套路是用相机识别物体位姿把像素坐标转换到机械臂坐标系再让 MoveIt 规划抓取轨迹。这里核心难点不是控制而是坐标变换。你需要做相机标定得到内参再手眼标定得到相机相对机械臂末端的变换关系这些在 ROS2 里都有对应工具。而理解这些坐标变换的前提恰恰是理解 ROS2 的 TF 树和消息流。这本书在入门阶段帮你建立的节点思维到了 MoveIt 的世界里一样适用每个模块是一个节点输入输出靠话题和服务沟通整个系统的骨架依旧是 ROS2 那套东西。5.3 Micro-ROS从机器人到单片机的连接如果你做的是小尺寸机器人很可能会接触到 Micro-ROS。ROS2 原生需要完整的 Linux 环境而一颗单片机往往塞不下完整的 ROS2所以 Micro-ROS 被用来连接 STM32、ESP32 这类嵌入式设备和上位机。搜索热词里出现 micro-ros ros2 esp32s3 vscode platformio说明已经有不少人在尝试用 PlatformIO 在 ESP32-S3 上跑 Micro-ROS。读完这本书后你对话题和服务已经有了感觉再去看 Micro-ROS 的例程会清楚认识到它本质上还是节点在通信只是运行环境从 Ubuntu 变成了实时操作系统。如果你对嵌入式感兴趣这个方向是个很好的落地场景。5.4 怎么保持项目驱动的学习节奏我的经验是学完基础概念后的两周内一定要找一个具体项目练手不然知识点会快速蒸发。项目不一定要大可以是一个让机器人模拟器里沿着一条走廊走的小目标。你只需要完成启动 Gazebo 仿真环境、读取激光话题、发布速度指令这就逼你自己把节点、话题、launch、参数全部串一遍。这个项目的重要性在于它让你把看书懂了变成动手会了。很多人在这一步之前都是看无数教程但从来不写然后在真实项目里被砸得晕头转向。这本书能帮你压缩看书的时间但它替代不了写代码的这一下。6. 我的阅读建议如果你也想靠这本书入门 ROS2最后分享一些我自己读完这本书又在多个项目里踩过坑之后的阅读建议。这些建议不特殊但如果你照做会走得比大多数自学的人稳。6.1 阅读顺序不要跳章尤其不要跳过环境搭建我见过太多人买完书直接翻到写一个发布订阅那章跳过前面的环境准备结果代码写完编译不过回头又不知道错在哪里。ROS2 的每个章节是层层递进的不理解节点和话题后面的 launch 会让你一头雾水不跑通 turtlesim看了 RViz2 也想象不出数据怎么流动。我的建议是老老实实按顺序读边读边敲。敲完一个示例就用ros2 node list和ros2 topic list看看系统里发生了什么比单纯看书有感觉十倍。6.2 写代码 画图 做实验三件事缺一不可我自己的学习习惯是准备一个白纸本每学一个新概念就画一张对应的节点和话题图。比如画一个按钮节点和电机节点中间用一条话题线连起来上面标注消息类型。这个过程会逼你把抽象概念转成具体结构效果比抄十遍代码都好。书里肯定也有配图但真正长在脑子里的图应该是你自己画的。画完再改动一个小细节比如把话题名改掉、把回调频率加快然后观察系统行为变化。实验成本这么低想不通的时候就直接跑一下。6.3 遇到问题先看日志再搜索别急着重装ROS2 的报错信息虽然不总是友好但大多数都能在终端日志里找到线索。很多人一遇到问题就认为是环境坏了马上重装系统。实际上节点起不来、消息收不到大部分是因为命名空间不对、可执行文件没有编译、或者环境变量没有 source。我建议的排查路径是先看终端尾部 20 行日志判断是编译问题还是运行问题再用ros2 node list和ros2 topic list对比看节点有没有起来实在定位不了把日志原文加上版本信息扔到社区搜索。这个过程往往比重装有效得多。这本书在讲调试工具时会引导你建立这种先看数据再下结论的习惯这个习惯越早建立越好。6.4 没有机器人硬件也能学得很好最后想说一个很多人纠结的问题我没有机器人实体学 ROS2 是不是空中楼阁我的回答是仿真环境已经把绝大多数核心链路提供给你了。Gazebo 可以模拟传感器和物理世界RViz2 可以显示定位和导航数据MoveIt 的仿真接口也能验证机械臂路径规划算法。硬件上的差异主要体现在电机控制和传感器标定这些环节而这些等你有硬件了再补完全来得及。如果你也想试试这条路我的建议很简单先装环境再跟着那本书把turtlesim跑起来然后自己改一改代码让乌龟走一个正方形。完成这一步你就已经站在很多研一新生的前面了。