Ubuntu 上 ROS 入门避坑:古月居 21 讲环境搭建与核心概念实操

📅 发布时间:2026/9/30 5:13:59
Ubuntu 上 ROS 入门避坑:古月居 21 讲环境搭建与核心概念实操
第一次在 Ubuntu 里装 ROS我把终端开了一整晚。不是我不想睡是那句rosdep update一直在转圈我心里还抱着再等等说不定就通了的幻想。第二天顶着黑眼圈去问人得到的回复只有一句你环境变量没配对吧。那种挫败感几乎每个零基础碰 ROS 的人都要交一次学费。后来我顺着古月居《ROS入门21讲》从头到尾实操了一遍才反应过来问题不在我笨而在于这套机器人操作系统的门槛分布得极不均匀——安装和环境相关的坑几乎占了七成精力真正有意思的节点、话题、仿真反而上手很快。这篇笔记就是我完整跑完这套入门课之后整理出来的路线、踩坑记录和关键细节适合刚开始接触 ROS、想在 Ubuntu 上把环境跑起来、又不愿意在配置上无限折腾的人。1. 零基础啃 ROS为什么值得照着古月居这套路线走1.1 入门真正的卡点不在概念难而在环境不听话ROS 这个名字容易让人误会不少人以为它是个操作系统其实它更像是一套跑在 Linux 上的通信中间件加工具链。它的核心思想说穿了很朴素把机器人拆成一堆各司其职的小程序这些小程序之间用一套统一的格式互相传消息。谁负责读传感器谁负责算路径谁负责控制电机各写各的最后用同一套协议接起来就行。这个发布订阅的思路放在生活里就像微信群发消息的人只管往群里扔收消息的人只管从群里拿双方都不需要知道对方是谁。概念一旦讲清楚你会发现并不难。真正劝退新手的是环境。ROS 强依赖 Ubuntu 的版本catkin 编译要配工作空间rosdep要联网拉依赖索引还有一堆环境变量要source。任何一个环节掉链子终端就会甩给你一屏红色报错而且报错信息往往指向的是表象而不是根因。我见过太多人卡在装不上这一步就放弃了其实他们离入门只差一个能跑通的环境。1.2 21讲的知识地图与我的学习节奏古月居这套课的价值在于它把一条相对合理的路径铺好了你不用自己去猜我该先学什么。它大致从认识 ROS、装环境开始接着讲工作空间和功能包然后进入节点、话题、服务、参数这四个核心通信概念再往下是 launch 文件、坐标变换 tf、可视化工具 rviz、仿真器 Gazebo最后落到机器人建模。这条线的顺序是有讲究的先让程序跑起来再理解它们怎么说话最后才去折腾仿真和模型。我自己的节奏是一天两讲讲完必须动手。看视频的时候觉得都懂一旦让你自己敲一遍 launch 文件立刻就会暴露理解上的空洞。我的建议是每看完一讲先把课上的代码原封不动跑通再故意改几个参数看会发生什么。比如讲话题的时候把发布频率从 10Hz 改成 1Hz观察rostopic hz输出的变化这种破坏式验证比反复看视频有效得多。提示不要贪快一次性把所有课看完再动手ROS 的知识是层层依赖的前一讲的命令没跑通后一讲你连终端该敲什么都对不上。2. 环境落地Ubuntu 与 ROS 版本怎么配对才不折腾2.1 版本对应关系是第一步配错了后面全是坑ROS 和 Ubuntu 是强绑定的选错版本官方源里根本没有对应的包你无论怎么折腾都装不上。下面这张对应表建议直接收藏选版本时对着看ROS 版本对应 Ubuntu定位说明ROS 1 Kinetic16.04已停止维护仅老教程使用ROS 1 Melodic18.04已停止维护二手资料较多ROS 1 Noetic20.04ROS 1 的最后一个长期版本ROS 2 Foxy20.04较早的 ROS 2 版本ROS 2 Humble22.04目前主流的 ROS 2 长期支持版ROS 2 Jazzy24.04较新的长期支持版零基础的话如果你跟的是大多数中文入门教程用 Ubuntu 20.04 配 ROS 1 Noetic 是最稳的选择资料最多报错也最容易搜到答案。如果你确定要往 ROS 2 方向走直接上 Ubuntu 22.04 加 Humble省得后面再迁移。我当初图省事装了个版本错配的组合结果连apt install ros-noetic-desktop-full都报找不到包白白浪费了一下午。2.2 一键安装脚本到底帮你做了哪些事手动装 ROS 的官方流程是配源、加密钥、apt update、装包、初始化rosdep、配环境变量一共六大步每一步都有出错的可能。对新手来说我反而推荐先用一键安装脚本把环境铺平把精力留给后面的学习。常见的做法是运行一条脚本命令按提示选择系统和版本脚本会自动完成配源、装包、初始化这些动作wget http://fishros.com/install -O fishros bash fishros脚本里通常会让你选是否更换系统源和安装哪个 ROS 版本。换源这一步别跳过国内直连官方源下载桌面完整版动辄几个 G换到国内镜像之后速度会正常很多。装完之后脚本一般会顺手把source /opt/ros/版本/setup.bash写进~/.bashrc这一步很关键不然后面每开一个新终端你都得手动 source 一次否则就会遇到命令找不到的经典问题。2.3 装完之后的验证清单别急着往下学装完不等于装好我会按下面这个顺序验一遍全过了才算环境合格打开一个新终端确认发行版变量有值echo $ROS_DISTRO正常应该输出noetic或humble之类。启动核心节点管理器roscore。能正常输出日志、卡住不退出说明主节点起来了。另开一个终端跑个自带例子rosrun turtlesim turtlesim_node。屏幕上出现那只小海龟说明基础包完整。检查rosdep是否初始化成功rosdep check turtlesim。这一步会暴露你网络和依赖库的问题。roscore这个环节值得多说一句它是 ROS 1 里所有节点的总调度台话题、服务、参数的注册都绕不开它。所以只要它起不来后面所有东西都跑不了。新手常见的报错是端口被占用或者环境变量没刷新前者用killall -9 roscore清一下后者关掉终端重开就行。3. 打通核心概念节点、话题、服务、参数到底在说什么3.1 节点与话题——ROS 的神经系统节点是 ROS 里最小的运行单元一个可执行程序就是一个节点。你可以把它想象成公司里的一个员工每个人只管自己那摊活。话题是节点之间传消息的通道是一对多的广播模式一个节点往话题里发所有订阅了这个话题的节点都能收到发布者根本不知道订阅者是谁。这种松耦合的好处是你随时可以加一个节点来监听数据也可以随时停掉一个节点不会影响别人。动手才能记住这套东西。跑roscore之后开两个终端一个跑海龟仿真一个跑键盘控制rosrun turtlesim turtlesim_node rosrun turtlesim turtle_teleop_key然后用键盘方向键控制海龟移动。这时候另开一个终端输入rqt_graph你会看到一张图把节点、话题、消息流向全画出来了这一张图比看多少文字描述都直观。想更细地看数据用rostopic echo /turtle1/cmd_vel你每按一次方向键终端里就会打印出速度指令的具体数值linear和angular两个字段就是那一瞬间的线速度和角速度。注意turtle_teleop_key那个终端必须保持焦点才能接收到键盘输入很多人误以为程序坏了其实只是焦点切走了。3.2 服务与参数——一问一答和全局小卖部话题是广播服务则是一问一答。有些场景你需要的是明确的请求响应比如帮我生成一只新海龟这时候用话题就很别扭服务恰好合适。服务由两个节点构成服务端提供能力客户端发请求拿结果调用完这次连接就结束了不像话题那样持续存在。看服务列表用rosservice list调用一个服务长这样rosservice call /spawn x: 2.0 y: 2.0 theta: 0.0 name: turtle2参数则是另一种存在它不传数据流而是存配置。你可以把它理解为挂在主节点上的一个全局小卖部任何节点都能来读写。查看当前所有参数用rosparam list设置和读取分别用rosparam set /turtlesim/background_r 100 rosparam get /turtlesim/background_r设定背景色参数之后海龟窗口不会立刻变色你得再调用一次/clear服务刷新这个参数改了要触发重绘的细节就是实际动手才会撞上的小门槛。区分清楚这四个概念的关系是入门里最容易混的一块话题管数据流服务管一次性调用参数管配置节点管干活。3.3 launch 文件——一次拉起一堆节点的正确姿势如果每跑一个例子都要手动开好几个终端敲命令效率太低launch 文件就是来解决这件事的。它是一个 XML 文件可以把多个节点的启动配置写在一起一条命令全部拉起launch node pkgturtlesim typeturtlesim_node namesim outputscreen/ node pkgturtlesim typeturtle_teleop_key nameteleop outputscreen/ /launch保存到某个功能包的launch目录下用roslaunch 包名 文件名.launch启动。这里有几个新手容易栽的细节type是可执行文件名name是运行时节点名两者经常被搞混outputscreen打开后节点的打印信息才会显示在终端里不开的话你什么都看不到还有 launch 里可以用param传参数、用arg传命令行参数理解这两者的区别一个是给程序的配置一个是给 launch 文件本身的变量能省下不少调试时间。4. 用多只海龟把概念彻底跑一遍4.1 生成多只海龟并用键盘分别控制基础例子跑顺之后我强烈建议自己动手生成多只海龟。这件事看起来简单其实把服务调用、命名空间、话题重映射全串起来了。生成第二只海龟用的是前面提过的spawn服务关键是给它起不同的名字比如turtle2ROS 会自动为它生成一套带命名空间的话题比如/turtle2/cmd_vel。想用键盘分别控制思路是把键盘控制节点和某只海龟的话题对上。可以用重映射参数把turtle_teleop_key的发布话题指向turtle2rosrun turtlesim turtle_teleop_key /turtle1/cmd_vel:/turtle2/cmd_vel这里有个我踩过的坑如果不做重映射键盘发出的指令默认还是发给turtle1你会以为第二只海龟没反应其实是消息发错对象了。多海龟这个练习最锻炼的就是对话题名就是地址这件事的直觉——ROS 里没有玄学谁订阅了哪个话题名谁就能收到数据。4.2 话题录制与回放让数据可以被重放rosbag是 ROS 里我觉得最实用的工具之一它能把话题上流过的数据原封不动录下来事后回放相当于给机器人的一段运行过程做了录像。录制所有话题rosbag record -a如果只想录某几个把话题名跟在后面即可用-O 文件名.bag指定输出名。回放用rosbag play 文件名.bag。这个能力在真实项目里价值巨大传感器数据采集一次成本很高录成 bag 之后你的算法可以反复在同样的数据上调试不用每次都去现场。提示-a录制全部话题会很占硬盘实测录几分钟高频率的激光和摄像头数据就能吃掉好几个 G调试时按需选话题更明智。录完用rosbag info 文件名.bag看一眼它会告诉你包里有哪些话题、每个话题多少条消息、总时长多少这个信息在排查数据到底录没录上时特别有用。5. 进入 Gazebo 仿真与机械臂建模的门槛5.1 Gazebo 环境准备与在线场景学到后半段一定会遇到 Gazebo它是 ROS 生态里最常用的三维仿真器能模拟重力、碰撞、传感器让你在没有实体机器人时也能做实验。装相关功能包在 Noetic 下大致是sudo apt install ros-noetic-gazebo-ros-pkgs ros-noetic-gazebo-ros-control装完先跑一个空世界验证roslaunch gazebo_ros empty_world.launch第一次启动会比较慢因为要加载模型库。如果你的界面卡在加载界面迟迟不动八成是模型文件要从网络拉取而网络不通这时候可以配置本地模型路径或者用国内镜像源解决。Gazebo 还有个常见现象是启动后黑屏或者闪退多半和显卡驱动、图形加速有关虚拟机里跑尤其容易出问题能上物理机尽量用物理机。跑通空世界之后可以加载课程里带的机械臂场景观察机械臂的姿态、关节角度、传感器数据怎么通过话题发布出来。你会发现前面学的话题、参数在这里全能派上用场——rostopic list一敲一大堆关节角度话题就出来了这时候你再看它们就不再是陌生的名词了。5.2 URDF 与 xacro把机器人描述出来Gazebo 里那个机器人是怎么被定义出来的答案是 URDF一种用 XML 描述机器人结构的格式。它规定了机器人由哪些连杆link组成、连杆之间用什么关节joint连接、每个零件的形状、尺寸、质量、外观是什么样。写一个最简单的单连杆模型长这样robot namesimple_arm link namebase_link visual geometrybox size0.2 0.2 0.2//geometry /visual /link /robot真实机器人动辄几十个关节纯手写 URDF 会痛苦到崩溃所以实际项目里几乎都用 xacro它是 URDF 的带变量和宏的加强版可以把重复的结构抽成宏用参数控制尺寸。我的经验是先用最简单的 URDF 把一个方块跑通能显示在 rviz 里再一点点往上加关节和传感器千万别一上来就抄一个复杂的机械臂模型你会完全不知道自己改坏了哪里。6. 主从机设置与那些让我熬夜的报错6.1 主从机通信的配置逻辑机器人上算力有限很多计算会放到一台性能更好的电脑上这时候就要配主从机也就是多台机器共用一个 ROS 主节点。核心是三个环境变量主节点地址ROS_MASTER_URI、本机地址标识ROS_IP或ROS_HOSTNAME。主机的ROS_MASTER_URI指向自己从机指向主机的 IP# 主机 export ROS_MASTER_URIhttp://192.168.1.100:11311 export ROS_IP192.168.1.100 # 从机 export ROS_MASTER_URIhttp://192.168.1.100:11311 export ROS_IP192.168.1.101配置里最容易翻车的是主机名解析。ROS 默认会用主机名做标识如果两台机器互相解析不了对方的主机名通信就会莫名其妙失败表现为能 ping 通但 ROS 连不上。稳妥的做法是都在/etc/hosts里把对方的 IP 和主机名写死同时优先用ROS_IP而不是ROS_HOSTNAME减少出错面。改完记得在每个终端里都确认一下环境变量生效env | grep ROS看一眼最直接。6.2 几个反复出现的报错与我的排查链路我在学习过程中反复撞上的报错就那么几类把它们和根因整理成表遇到时对着查能省很多时间现象常见根因处理方向roscore起不来端口占用或环境变量未刷新killall -9 roscore后重开终端命令找不到setup.bash没被 source检查~/.bashrc里的 source 行rosdep卡住网络拉取索引超时换源或配代理之外的重试策略话题收不到数据名字或命名空间对不上用rostopic list和rqt_graph对照Gazebo 黑屏闪退图形驱动问题优先物理机检查显卡驱动排查这类问题的核心思路我一直坚持先定位层次再缩小范围。报错先分清是环境层source、源、权限、通信层主节点、话题名、网络还是程序层代码逻辑。定位到层次之后用最小的例子去复现比如怀疑是主从机问题就先用rostopic list看从机能不能看到主机的话题能就说明通信通问题在别处。这套方法比无头苍蝇式地乱试有效太多。注意别看到报错就上搜索引擎照抄一堆命令很多所谓解决方案会顺手改掉你的系统配置结果是问题没解决还引入新的干扰先想清楚报错属于哪一层再动手。学完这 21 讲我最大的体会是 ROS 本身并不深它的难度几乎全集中在环境搭建和概念映射上一旦过了那道坎后面都是顺水推舟。我个人的建议是别追求全学完再动手从第一讲开始就让每个终端命令都真实敲一遍哪怕报错也别慌报错才是你真正理解这套系统的入口。真要说经验就是每学一个新概念都逼自己用rostopic、rosservice这些基础命令去看它一次把抽象的名词变成屏幕上真实跳动的数据那才算真的学会了。