1. 为什么这个老版本组合至今还有人折腾
Ubuntu 18.04 加上 ROS Melodic,放在今天看确实是一套“老古董”级别的组合了。Ubuntu 18.04 的标准支持周期在 2023 年就已经结束,ROS Melodic 的官方维护也同步停止。按理说,新项目应该直接上 Ubuntu 20.04 + Noetic 或者 Ubuntu 22.04 + Humble。但现实情况是,我身边仍有不少人在装这套环境,原因也很实在:手头有台老机器跑不动新系统、实验室的师兄传下来的代码只兼容 Melodic、某些工业设备的驱动包只提供了 Melodic 版本的二进制、又或者某门课程的大作业明确要求用这个版本提交。
我自己就踩过这个坑。去年帮一个做移动机器人导航的朋友复现一套旧算法,代码仓库最后一次提交是 2020 年,package.xml里写死了melodic的依赖,换到 Noetic 上编译直接报了一堆 API 不兼容的错误。折腾了半天,最后还是老老实实装回 Ubuntu 18.04 + Melodic,半小时搞定。所以这套教程不是“考古”,而是实实在在的刚需。
这篇文章面向的是刚接触 ROS 的新手,以及需要快速搭好旧版本环境的老手。我会从系统准备一路讲到环境验证,把每一步背后的逻辑讲清楚,把容易翻车的地方提前标出来。你跟着走一遍,基本能一次装好,不用反复重装系统。核心关键词就三个:Ubuntu 18.04、ROS Melodic、环境配置,全文围绕它们展开。
需要提前说明的是,ROS Melodic 的安装依赖官方软件源,而官方源在国内访问速度可能不理想。我在实操部分会给出替换为国内镜像源的方案,这是提升安装成功率最有效的一步,后面会详细讲。
2. 装之前必须搞清楚的几件事
2.1 版本对应关系不能乱点鸳鸯谱
ROS 的每个发行版都和特定的 Ubuntu 版本强绑定,这不是随便搭配的。Melodic 对应的是 Ubuntu 18.04(Bionic Beaver),再往前的 Kinetic 对应 16.04,往后的 Noetic 对应 20.04。你如果在 18.04 上硬装 Noetic,或者在 20.04 上装 Melodic,依赖关系会直接崩掉,因为底层的 Boost、Python 版本、编译器版本都不一样。
Melodic 用的是 Python 2.7 作为默认的 Python 环境,这一点特别重要。很多新手装完之后发现rosrun跑 Python 脚本报语法错误,八成是因为脚本里用了 Python 3 的语法,而 Melodic 默认调的是 Python 2。这个坑我在第 5 节会专门讲怎么处理。
| ROS 发行版 | 对应 Ubuntu 版本 | 默认 Python | 官方维护状态 |
|---|---|---|---|
| Kinetic | 16.04 | Python 2.7 | 已停止 |
| Melodic | 18.04 | Python 2.7 | 已停止 |
| Noetic | 20.04 | Python 3 | 维护中 |
| Humble | 22.04 | Python 3 | 维护中 |
看这张表就明白了,Melodic 是最后一个以 Python 2 为默认环境的 ROS1 版本。如果你的代码里有大量 Python 2 的写法,那 Melodic 几乎是唯一选择。
2.2 硬件和系统的最低要求
ROS Melodic 本身对硬件要求不高,但 Ubuntu 18.04 的桌面版跑起来还是需要一点资源的。我实测下来,虚拟机里分配 2 核 CPU、4GB 内存、40GB 硬盘就能流畅运行,但如果要跑 Gazebo 仿真或者 RViz 可视化,内存最好给到 8GB,否则会卡到怀疑人生。显卡方面,如果用虚拟机,3D 加速要打开,不然 RViz 渲染会出问题。
系统语言建议在安装 Ubuntu 时就选英文,或者至少把 locale 设成en_US.UTF-8。中文 locale 在某些情况下会导致 ROS 的日志输出乱码,虽然不影响功能,但排查问题时看着难受。这个细节很多人不注意,等到出问题再改就麻烦了。
2.3 网络环境对安装成功率的影响
这是决定安装顺利与否的关键因素。ROS 的安装包托管在官方软件源上,国内直连的速度可能非常慢,甚至中途断连导致apt报错。我的经验是,安装前先把软件源换成国内镜像,这一步能让下载速度从几十 KB/s 提升到几 MB/s,安装时间从一小时缩短到十分钟以内。
具体换哪个镜像,我一般用清华或者中科大的,这两个更新比较及时,包也全。换源的方法在下一节会给出具体命令。这里先记住一个原则:系统源和 ROS 源都要换,只换一个是不够的。
提示:换源之前先备份原始文件,改坏了还能还原。命令是
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak。
3. 从零开始的完整安装流程
3.1 系统更新与软件源替换
装好 Ubuntu 18.04 之后,第一件事不是急着装 ROS,而是先把系统更新到最新状态,并且把软件源换掉。打开终端,按顺序执行下面的命令。
先备份系统源文件:
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak然后用编辑器打开源文件:
sudo gedit /etc/apt/sources.list把里面的内容全部替换成清华镜像的地址(针对 18.04 版本):
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse保存退出后,执行更新:
sudo apt update sudo apt upgradeapt upgrade这一步可能会花几分钟,取决于你系统有多旧。更新完成后,建议重启一次,确保内核和驱动都生效。
这里有个细节要注意:bionic-security这一行不能少,它包含了安全补丁。有些人图省事只写前三行,结果装某些依赖时提示找不到包,就是因为安全源没配。
3.2 添加 ROS 软件源和密钥
系统源搞定后,接下来配置 ROS 的源。Melodic 的包在官方源里的路径是packages.ros.org,国内同样有镜像。我用的是清华的 ROS 镜像,命令如下:
sudo sh -c 'echo "deb https://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ bionic main" > /etc/apt/sources.list.d/ros-latest.list'接着添加官方密钥,这一步是为了验证包的签名,不能跳过:
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654如果密钥服务器连不上(这种情况偶尔会发生),可以换成备用地址:
sudo apt-key adv --keyserver 'hkp://pgp.mit.edu:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654密钥添加成功后,再更新一次源:
sudo apt update这一步如果看到有packages.ros.org或者镜像地址的包列表被读取,就说明源配置成功了。如果报错说密钥无效或者找不到,八成是密钥没加对,重新执行上面的密钥命令即可。
3.3 安装 ROS Melodic 主体
源配好之后,安装本身其实很简单。Melodic 提供了几个不同完整度的安装选项,我列个表对比一下,你根据自己的需求选。
| 安装选项 | 命令 | 包含内容 | 适用场景 |
|---|---|---|---|
| Desktop-Full | ros-melodic-desktop-full | 基础+工具+仿真+感知 | 推荐,功能最全 |
| Desktop | ros-melodic-desktop | 基础+工具+可视化 | 不需要仿真的场景 |
| ROS-Base | ros-melodic-ros-base | 基础通信库 | 嵌入式或服务器 |
| 单独包 | ros-melodic-<包名> | 指定功能包 | 按需安装 |
对新手来说,直接上 Desktop-Full,省得后面缺东西再补。命令是:
sudo apt install ros-melodic-desktop-full这个包比较大,下载加安装大概需要 2-3GB 的空间。换成国内源之后,网速快的话十分钟左右能搞定。安装过程中如果弹出配置选项,一路回车用默认值就行。
安装完成后,可以用下面的命令确认一下核心包是否装上了:
apt list --installed | grep ros-melodic如果能看到一长串ros-melodic-开头的包,说明主体安装成功。
3.4 初始化 rosdep 并配置环境变量
rosdep是 ROS 用来管理依赖的工具,装完主体后必须初始化一次,否则后面编译功能包时会报依赖缺失。命令如下:
sudo rosdep init rosdep updaterosdep init这一步在国内经常失败,因为要访问国外的服务器。如果报错说连接超时,可以手动创建配置文件绕过。具体做法是:
sudo mkdir -p /etc/ros/rosdep/sources.list.d sudo gedit /etc/ros/rosdep/sources.list.d/20-default.list然后在文件里写入以下内容:
# os-specific listings first yaml https://mirrors.tuna.tsinghua.edu.cn/rosdistro/rosdep/osx-homebrew.yaml osx # generic yaml https://mirrors.tuna.tsinghua.edu.cn/rosdistro/rosdep/base.yaml yaml https://mirrors.tuna.tsinghua.edu.cn/rosdistro/rosdep/python.yaml yaml https://mirrors.tuna.tsinghua.edu.cn/rosdistro/rosdep/ruby.yaml gbpdistro https://mirrors.tuna.tsinghua.edu.cn/rosdistro/releases/fuerte.yaml fuerte保存后再执行rosdep update,走清华镜像就顺畅多了。
接下来配置环境变量,让终端每次启动都能找到 ROS 的命令:
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc source ~/.bashrc验证一下是否生效:
printenv | grep ROS如果输出里有ROS_DISTRO=melodic、ROS_ROOT、ROS_PACKAGE_PATH这些变量,就说明环境配置成功了。
3.5 安装编译工具和依赖
最后一步是装一些常用的构建工具,方便后面自己创建功能包:
sudo apt install python-rosinstall python-rosinstall-generator python-wstool build-essential这几个工具的作用分别是:rosinstall用来批量拉取源码包,wstool管理多个源码仓库,build-essential提供 gcc、g++、make 等编译工具。装完这些,整个 ROS 开发环境就算齐活了。
4. 装完之后怎么验证环境是否正常
4.1 跑一个最小示例确认通信正常
环境装好了不代表能用,得实际跑一下才知道。ROS 自带了一个经典的小例子,就是小海龟仿真器。打开三个终端,分别执行下面的命令。
第一个终端启动 ROS 核心节点管理器:
roscore看到输出里有started core service [/rosout]就说明核心起来了。
第二个终端启动小海龟节点:
rosrun turtlesim turtlesim_node这时候应该会弹出一个窗口,里面有一只小海龟。
第三个终端启动键盘控制节点:
rosrun turtlesim turtle_teleop_key把鼠标焦点放在第三个终端上,按方向键,小海龟就会动起来。如果小海龟能跟着按键走,说明 ROS 的通信机制完全正常,安装成功。
4.2 用命令行工具检查节点和话题
小海龟跑起来之后,可以顺便熟悉几个常用的排查命令。新开一个终端,执行:
rosnode list应该能看到/rosout、/turtlesim、/teleop_turtle三个节点。
再看话题列表:
rostopic list会列出/turtle1/cmd_vel、/turtle1/pose等话题。想实时看小海龟的位置数据,可以执行:
rostopic echo /turtle1/pose终端会不断刷出 x、y、theta 的数值。按 Ctrl+C 停止。
这几个命令是日常开发中用得最多的,建议现在就记熟。后面调试自己的机器人时,rosnode和rostopic能帮你快速定位问题出在哪个环节。
4.3 创建工作空间测试编译流程
验证完基本通信,再走一遍工作空间的创建和编译流程,确保构建工具没问题。依次执行:
mkdir -p ~/catkin_ws/src cd ~/catkin_ws/ catkin_makecatkin_make如果顺利跑完,会在devel和build目录下生成一堆文件。然后 source 一下工作空间的配置:
source devel/setup.bash再检查环境变量:
echo $ROS_PACKAGE_PATH如果输出里包含了/home/你的用户名/catkin_ws/src,说明工作空间已经生效。这一步很关键,因为以后你自己写的功能包都要放在这个src目录下编译。
注意:每次新开终端都要 source 工作空间的
setup.bash,否则找不到自己编译的包。嫌麻烦的话,可以把这行也加到~/.bashrc里,但要注意顺序,必须放在系统 ROS 的 source 之后。
5. 那些年我踩过的坑和排查方法
5.1 rosdep update 反复失败怎么办
这是新手遇到最多的一个问题,表现是执行rosdep update时卡住不动,或者报ERROR: unable to process source。根本原因是它要访问的几个国外地址不稳定。
除了前面说的换镜像源,还有一个办法是修改rosdep的超时设置。打开/usr/lib/python2.7/dist-packages/rosdep2/目录下的几个文件,把里面的DOWNLOAD_TIMEOUT从默认的 15 秒改大一些,比如 60 秒。具体涉及sources_list.py、gbpdistro_support.py、rep3.py这几个文件。改完之后再跑rosdep update,成功率会高很多。
如果还是不行,可以多试几次,或者换个时间段再试。我实测下来,早上七八点的时候网络相对通畅,一次过的概率比较大。
5.2 Python 版本冲突导致的报错
Melodic 默认用 Python 2.7,但 Ubuntu 18.04 系统里同时装了 Python 3.6。如果你在脚本里写了print("hello")这种 Python 3 的语法,用rosrun跑的时候会报SyntaxError。解决办法有两个:一是把脚本改成 Python 2 的写法,二是显式指定用 Python 3 运行。
改脚本的话,把print语句改成 Python 2 的形式,或者直接在文件开头加上:
#!/usr/bin/env python注意这里写的是python而不是python3,因为 Melodic 环境下python指向的是 2.7。
如果确实需要用 Python 3,可以在 CMakeLists.txt 里指定,或者用python3命令直接运行脚本,但这样就用不了 ROS 的 Python 2 接口了。所以最稳妥的办法还是统一用 Python 2 写 ROS 节点。
5.3 常见问题速查表
我把安装和使用过程中遇到的高频问题整理成了一张表,方便你对照排查。
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
apt update报 404 | 源地址写错或版本不匹配 | 检查 sources.list 里的 bionic 拼写 |
rosdep init找不到命令 | 没装 python-rosdep | sudo apt install python-rosdep |
roscore启动报端口占用 | 已有 roscore 在运行 | killall roscore后重试 |
rosrun找不到包 | 没 source 环境 | 执行source /opt/ros/melodic/setup.bash |
| 编译报缺少依赖 | rosdep 没初始化 | 重新执行rosdep update |
| RViz 打不开或黑屏 | 显卡驱动或 3D 加速问题 | 虚拟机里开启 3D 加速 |
| 小海龟窗口不显示 | 显示环境变量问题 | 检查echo $DISPLAY是否有值 |
这张表建议收藏,遇到问题先查一遍,能省不少搜索时间。
5.4 几个容易被忽略的实操心得
第一个心得是关于磁盘空间的。Desktop-Full 装完之后,/opt/ros目录大概占 2GB 左右,加上系统本身和后续编译产生的文件,建议给根目录至少留 30GB 空间。我见过有人只分了 20GB,编译到一半提示空间不足,只能删东西腾地方,很狼狈。
第二个心得是关于虚拟机的。如果你用 VMware 或 VirtualBox,安装 Ubuntu 时建议选“稍后安装操作系统”,然后手动指定 18.04 的镜像。自动检测有时候会识别错版本,导致装出来的系统有问题。另外,虚拟机的网络模式选 NAT 就行,桥接模式在某些网络环境下会连不上外网。
第三个心得是关于备份的。装好 ROS 环境之后,强烈建议给虚拟机拍个快照,或者用tar把/opt/ros目录打包备份。以后环境搞坏了,直接还原,不用重装。这个习惯能帮你省下大量时间,尤其是当你装了一堆第三方依赖之后。
6. 环境搭好之后可以往哪走
环境跑通只是起点,接下来你可以根据自己的方向深入。做移动机器人的话,可以研究navigation功能包,它包含了建图、定位、路径规划一整套方案。做机械臂的话,moveit是绕不开的,Melodic 版本的 MoveIt 功能相当完整。想做视觉的话,cv_bridge和image_transport是把 OpenCV 和 ROS 连起来的桥梁。
我个人的建议是,先别急着上大项目,花半天时间把 ROS 的官方教程过一遍。roscpp和rospy的基础用法、话题和服务的区别、参数服务器的使用,这些概念打牢了,后面学什么框架都快。官方教程里的代码都是可以直接跑的,边看边敲,比光看文档强十倍。
另外,Melodic 虽然停止维护了,但社区里积累的资料非常丰富,遇到问题基本都能搜到答案。搜索的时候把关键词加上melodic和ubuntu18.04,能过滤掉很多不相关的干扰结果。如果英文资料看着吃力,国内几个技术社区里也有不少中文的踩坑记录,质量参差不齐,但参考价值还是有的。
最后再分享一个小技巧:把常用的命令做成别名,能省不少敲键盘的时间。比如在~/.bashrc里加上:
alias cw='cd ~/catkin_ws' alias cs='cd ~/catkin_ws/src' alias cm='cd ~/catkin_ws && catkin_make' alias sw='source ~/catkin_ws/devel/setup.bash'这样以后切换工作空间、编译、source 环境,几个字母就搞定了。我用了好几年,回不去了。