说实话,看到“Ubuntu 20.04 装 ROS Melodic”这个组合,估计不少人会先愣一下。官方版本映射里,Ubuntu 18.04 对应的是 Melodic,20.04 对应的是 Noetic,这两个本来就不是一家人。但现实中真有人必须这么干,比如我接手的那个某跨平台系统的老包,依赖库只适配到 Melodic,项目代码又是基于 Ubuntu 20.04 环境跑的,没办法重装系统,只能硬着头皮在这个不兼容的组合里找活路。
这篇内容就是我个人安装全过程的记录。我会从版本选型开始,把软件源配置、依赖冲突处理、环境变量设置、功能验证这些环节全部拆开讲,每一步都会说明“为什么这么做”,遇到的典型报错也会整理成速查表。如果你也面临类似处境,这篇东西应该能让你少走不少弯路。如果你还没开始装,那先看完第一章,可能你会选择另一条更省事的路。
1. 先讲清楚版本对应:为什么这是“反常识”的组合
1.1 官方版本和 Ubuntu 版本的关系
ROS 每个发行版都有固定的官方搭档系统版本。Melodic 是 2018 年发布的,当时搭档的是 Ubuntu 18.04 Bionic;Noetic 是 2020 年发布的,搭档的是 Ubuntu 20.04 Focal。官方二进制源里,packages.ros.org下的仓库是按 Ubuntu 代号组织的,比如bionic、focal,每个仓库下的 ROS 包版本是不一样的。
很多人搞混的原因其实很常见:手头教程是 2019 年左右写的,那时实验室主流就是 Melodic,照着教程装到了 20.04 上发现“软件包无法定位”。或者在某个开源项目里复制了一段 Dockerfile,里面写的是 melodic,但宿主机是 20.04,于是想当然地执行同一个命令。说白了,不是大家不懂版本,而是老教程的惯性太大。
1.2 为什么我还要硬装 Melodic
我自己的情况是:某个模拟项目 X 的核心库只发布了 Melodic 版二进制,Noetic 没有对应适配,代码里又用了不少老 API。直接换 Noetic 意味着要改大量源码,时间成本太高。身边人建议装 18.04,但机器上还有别的开发环境,重装系统不现实。所以我的目标很明确:在尽量不动系统其他环境的前提下,把 Melodic 的核心运行环境装起来,能跑通已有代码和仿真就行。
1.3 三条路线的取舍
当时我列了三个方案:
| 方案 | 优点 | 缺点 | 我的判断 |
|---|---|---|---|
| 改用 Noetic | 官方支持、安装省心 | 老代码和依赖可能大面积不兼容 | 不适合当前项目 |
| Docker 跑 18.04 + Melodic | 环境隔离、不影响宿主 | 每次进容器要配置共享和 GUI,性能有损耗 | 可用但麻烦,不符合零学习成本预期 |
| 20.04 强装 Melodic | 保留原生系统,直接跑 | 依赖冲突多、非官方支持 | 风险最高,但成功后的使用体验最好 |
最后我选了第三条。坦率讲,这条路最折腾,但走通之后确实最顺手。如果你也决定走这条路,建议做好心理准备:安装过程中会遇到不少依赖冲突,关键是有耐心,别被报错吓住。
2. 安装前准备:环境检查与依赖补齐
2.1 检查 Ubuntu 版本与系统状态
开工前先确认系统的确切版本,这决定了后续处理方式。我用的命令:
lsb_release -a输出里Codename如果是focal,就是标准的 20.04。这一步很有必要,因为有些人装了 Linux Mint 或者换过软件源,系统代号可能并不是 focal,这会影响后续的软件源匹配。
接着检查系统里有没有装过残留的 ROS:
ls /opt/ros/如果目录里已经有melodic或noetic的残留文件,最好清干净再开始,避免新旧包混在一起导致冲突。清理方法是删除/opt/ros下对应目录,同时清掉~/.bashrc里的 ROS 环境变量相关行。我这次是全新环境,没遇到残留,但清理这一步值得养成习惯。
2.2 确认基本编译工具和网络
Melodic 的二进制包依赖编译工具链。在 20.04 上如果之前没装过开发包,先补齐基础工具:
sudo apt update sudo apt install curl wget git build-essential cmakebuild-essential和cmake后面在编译部分软件时需要,curl用来下载密钥。这些都属于标准操作,不装后面会踩不少缺命令的坑。
2.3 Python 兼容层:这个坑容易被忽略
这里必须多说一句。Ubuntu 20.04 默认不再预装 Python 2,而 Melodic 的很多工具脚本基于 Python 2 编写,比如rosdep、rospkg等。不是说没有 Python 2 就完全装不了,但后面跑rosdep和编译带 Python 节点的包时一定会碰到问题。
我的处理方式:
sudo apt install python2 python2.7如果系统里/usr/bin/python这个软链接不存在,需要手动建一个:
sudo ls -l /usr/bin/python* sudo ln -s /usr/bin/python2.7 /usr/bin/python这里要特别小心:不要随意把系统的python指向 Python 2,因为 Ubuntu 20.04 很多系统工具默认用 Python 3,贸然改写/usr/bin/python可能影响系统行为。我的做法是先用ls /usr/bin/python*看现状,如果系统里没有python这个链接,建一个指向 Python 2.7;如果已经有链接指向 Python 3,就不要动它,后面通过虚拟环境或者按需调用来解决。
3. 软件源与密钥:最关键的一步
3.1 添加 ROS Bionic 软件源
官方源默认会根据当前系统代号决定仓库路径,在 focal 下只能找到 Noetic 的包。为了让 apt 能搜索到 Melodic 的包,需要手动把软件源指定为 bionic 并对准 ROS 专用仓库。
这里有个特别注意:只添加 ROS 官方仓库的 bionic 源,不要把 Ubuntu 本身的 bionic 仓库加进来,否则整个系统会被降级成 18.04 的依赖状态,那会是一场灾难。正确的做法:
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu bionic main" > /etc/apt/sources.list.d/ros-melodic.list'之所以要把这个源单独放在ros-melodic.list,而不是追加到sources.list,是为了以后方便管理。如果装完想卸载,直接删掉这个文件即可,不会污染系统主源。
3.2 导入 GPG 密钥
ROS 仓库的包都需要验证签名。Ubuntu 20.04 上apt-key的远程添加方式有时会遇到超时问题,我推荐用 curl 下载密钥后再添加:
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -如果你那边raw.githubusercontent.com访问不稳定(这个情况很常见),就换备用方式:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654我实际测试时,第二种方式在我的网络环境下更稳定。需要注意密钥文件是公开资源,不存在安全隐患,添加后可以通过以下命令确认:
sudo apt-key list | grep ROS看到包含ROS关键字的密钥输出,说明导入成功。
3.3 更新软件源并确认包名存在
在软件源和密钥都就位后,执行:
sudo apt update这一步如果报Release file is not yet valid或Unable to locate package ros-melodic-desktop-full,通常都是密钥过期或源路径写错了。更新完成后,检查一下 Melodic 的包列表:
apt-cache search ros-melodic | head -20如果能看到一堆ros-melodic-xxx开头的包,说明源配置成功。我当时看到这个列表时心里就踏实了一半。
4. 依赖冲突破解:从 ros-core 到桌面完整版的实际安装过程
4.1 先安装 ros-melodic-ros-core:最小内核
这一步是整个安装过程的关键策略。很多人在 20.04 上装 Melodic 死磕desktop-full,结果一大坨依赖一起涌进来,报错信息铺满屏幕,根本无从下手。我的做法是指定最小安装目标,先装 ROS 核心:
sudo apt install ros-melodic-ros-core这个包包含roscpp、roslaunch、rospack等核心组件,是 ROS 能跑起来的最小集合。在执行过程中,apt 可能提示有依赖无法满足,比如libpython2.7版本不匹配。这时候不要直接apt install -f,先看清缺哪些包,再单独安装这些缺失项。
我遇到的情况是python-roslib这个包在 focal 仓库里版本太新,和 Melodic 不兼容。解决方案是先卸载系统里已有的新版本工具,再指定版本安装:
sudo apt install python-roslib=1.14.6-1这个版本号可能因环境而异,用apt-cache policy python-roslib查看可用版本,手动选一个老一点的即可。这步解决后,ros-melodic-ros-core就能顺利安装。
4.2 安装 ros-melodic-ros-base:通信与基础工具
核心装好后,接着装ros-melodic-ros-base,它包含ros_comm通信框架、roslaunch的完整支持、日志管理等功能。这部分对日常使用很重要,因为后面运行节点、写 launch 文件都依赖它。
sudo apt install ros-melodic-ros-base到这里没有出现大的冲突。需要注意的是这个阶段可能自动安装了不少 Python 2 相关的包,系统里会同时存在 Python 2 和 Python 3 两套生态,千万别去卸载任何一个,Melodic 依赖其中一部分,系统工具依赖另一部分,两边都得留着。
4.3 安装桌面完整版:重重阻碍与取舍
ros-melodic-desktop-full包含了rqt、rviz、gazebo、turtlesim等大量工具和仿真环境。这部分在 20.04 上安装时需要处理真实存在的依赖冲突,其中比较典型的是libgazebo系列库和libignition的版本冲突——focal 里的 Gazebo 版本太新,跟 Melodic 配套的仿真库不兼容。
我尝试直接安装:
sudo apt install ros-melodic-desktop-full结果报了几十行依赖错误,核心问题集中在libgazebo9-dev需要老版本的libignition-math3,而 20.04 的软件源里已经是libignition-math6了。这属于“系统基础库版本回退”问题,强行让 apt 降级安装会动摇系统其他包,风险太大。
这里我分享自己的处理策略:不是所有组件都必须一次到位。我拆开安装,先单独装没有冲突的部分:
sudo apt install ros-melodic-rviz ros-melodic-rqt ros-melodic-turtlesim这三个在 focal 仓库里能找到兼容的依赖版本,安装正常。而gazebo和与其强依赖的仿真包确实装不上,最终我放弃了这个组件,改用了轻量替代方案。如果你的项目不依赖 Gazebo 仿真,整体影响其实很小。如果你真的需要 Gazebo,我的建议是用 Docker 单独跑一个 18.04 容器来用,而不是在宿主机上死磕。
5. 环境变量、rosdep 与 catkin 工作区配置
5.1 bashrc 环境变量配置
安装完成后,需要让终端能找到 ROS 的命令和库文件。在~/.bashrc末尾追加:
source /opt/ros/melodic/setup.bash export ROS_DISTRO=melodicsetup.bash这个文件在安装 ROS 核心包时已经生成。追加后执行:
source ~/.bashrc然后验证:
roscore如果终端能正常启动roscore,说明核心环境已经可用。这一步我遇到过环境变量没配置好导致command not found的情况,检查方式就是确认~/.bashrc里的 source 路径是否存在,并且没有拼写错误。
5.2 rosdep init 与 update 排错
接下来需要初始化rosdep,它负责解析包的依赖关系。这里有个坑:在 20.04 上如果之前装了 Noetic 相关的python3-rosdep,再配置 Melodic 会有版本冲突。先把旧工具卸载干净:
sudo apt remove python3-rosdep然后安装适用于 Python 2 的版本:
sudo apt install python-rosdep接着初始化:
sudo rosdep init rosdep update我实际执行rosdep update时遇到了下载失败的问题,错误信息基本是网络无法连接到某个 GitHub 原始地址。这类问题没有统一的解决方案,但有两个可落地的处理方向:一是检查网络环境是否能正常访问相关域名;二是通过网络设置中的代理服务来规避这个下载失败问题。这里我不建议反复硬试,遇到一次失败可以先缓存确认,再考虑调整。
要说明的是,rosdep主要用于后续编译源码包时自动拉取依赖,如果你只是安装现成的二进制包,暂时不跑rosdep update也不影响核心使用。我当时缓了一天,换了一个网络时段再执行就成功了,大家遇到时可以稍微有点耐心。
5.3 建立 catkin 工作区
ROS 项目需要在 yaml 里配置的CATKIN_WS下编译。创建一个标准的 catkin 工作区:
mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src catkin_init_workspace cd ~/catkin_ws catkin_makecatkin_init_workspace会在src下生成一个CMakeLists.txt链接文件,catkin_make完成初始化编译。这一步如果提示缺少catkin命令,需要确认ros-melodic-catkin包是否已安装:
sudo apt install ros-melodic-catkin工作区建好后,在~/.bashrc中追加:
source ~/catkin_ws/devel/setup.bash这样以后在这个工作区里就能直接编译运行自己的功能包了。
6. 跑通验证:roscore、turtlesim 与关键包检查
6.1 启动 roscore
配置完成后,第一步验证就是启动 ROS 主节点:
roscore如果终端里出现started core service [/rosout]之类的信息,并且进程能保持运行,说明核心装好了。我第一次在 20.04 上跑起来时,心里那根弦就算放下了。
需要提醒的是,roscore启动后不要慌着关掉它。如果要测试其他节点,需要另外开一个终端。我经常会遇到有人在一个终端里又开roscore又跑节点,结果互相干扰,这个顺序要注意。
6.2 小乌龟测试
打开新终端,先确认环境变量生效:
source ~/.bashrc然后启动小乌龟节点:
rosrun turtlesim turtlesim_node不出意外的话,会弹出一个画布,上面有一只小乌龟。再开一个终端,运行键盘控制节点:
rosrun turtlesim turtle_teleop_key此时可以用方向键控制乌龟移动,如果画面有反应,说明rosmaster、节点通信、话题订阅这套体系全部正常。这个测试虽然简单,但它验证的不只是“能启动”,而是整个通信链路是否畅通。我见过有人roscore能跑,但节点之间无法通信,这种问题往往会出在环境变量没全量 source 上。
6.3 检查关键包列表
最后做一个系统性的确认,看看核心包是否都在:
rospack find roscpp rospack find rospy rospack find tf rospack find urdf这四个分别代表 C++ 接口、Python 接口、坐标变换和最基础的机器人描述格式。如果都能返回对应路径,说明安装基本完整。我当时查到一个问题:rospy在 Python 2 和 Python 3 之间需要选择正确的解释器,用python2 -c "import rospy"能通过,但用python3就不行。这是因为 Melodic 的 Python 节点默认基于 Python 2。如果你的代码是 Python 3 的,要么在 launch 文件里显式指定解释器,要么后续单独做适配。
7. 安装过程中遇到的坑:问题与排查速查表
7.1 典型报错与解决办法
这几类问题是我实际遇到频率最高的,整理成表方便对照:
| 错误现象 | 原因分析 | 解决办法 |
|---|---|---|
E: 无法定位软件包 ros-melodic-desktop-full | 软件源没有指定为 bionic,apt 在 focal 仓库里只找到了 noetic | 检查/etc/apt/sources.list.d/下的 ROS 源配置,确保是deb http://packages.ros.org/ros/ubuntu bionic main |
Command 'roscore' not found | 环境变量没有 source,或者~/.bashrc中配置路径错误 | 检查/opt/ros/melodic/setup.bash是否存在,source 后再试 |
rosdep update下载失败 | 网络无法稳定访问 GitHub 原始资源 | 检查网络连通性或代理设置;可先跳过,不影响二进制包直接使用 |
安装desktop-full时 Gazebo 系列依赖冲突 | focal 源中libignition-math6与 Melodic 依赖的libignition-math3不兼容 | 放弃 Gazebo 组件,单独安装 rviz/rqt/turtlesim;必要时用 Docker 备胎 |
ImportError: No module named rospkg | 缺少rospkg工具包 | 执行sudo apt install python-rospkg |
catkin_make后devel/setup.bash不存在 | 编译未完全成功,原因可能是 workspace 路径中有中文或空格 | 严格使用纯英文路径重建工作区 |
7.2 几条实用避坑经验
第一,不要一上来就追求 desktop-full。这是个非常现实的经验。ros-core + ros-base 已经覆盖了绝大多数开发场景,等真正需要某个组件时再单独安装,这样依赖冲突的排查范围会小很多。
第二,不要在同一个终端里同时运行多个 ROS 命令。我见过有人在同一个终端里又跑 roscore 又开节点,结果日志互相覆盖,报错了还找不到在哪一行。正确做法是每个节点一个终端,或统一用roslaunch启动。
第三,在 20.04 上装 Melodic 属于“非常规操作”,不要升级系统里的基础开发库。在我用sudo apt upgrade时,有几次差点把 ROS 核心包的依赖一起升级掉,很容易破坏已装好的环境。建议把核心 ROS 软件包标记为 hold:
sudo apt-mark hold ros-melodic-*这一步能有效防止后面系统更新时连带把 ROS 包拆散。
第四,遇到疑难报错时,多查看日志而不是反复重装。ROS 的日志默认在~/.ros/log目录下,很多启动失败的真实原因都写在日志里。反复remove+install通常解决不了问题,还会浪费时间。
最后再分享一个实用小技巧:如果你只是想让某个历史包跑起来,但又在 20.04 上装 Melodic 卡了太久,完全可以考虑用容器作为备胎方案。我后来遇到实在装不上的专用仿真包时,就是用容器单独跑了一个 18.04 + Melodic 环境,宿主系统里保留现有核心环境。两条路并行,既保证了旧代码能跑,又不用牺牲新系统。
这篇内容基本是我这次安装过程的全记录,从版本选型、环境准备、源配置、依赖处理到最后的验证测试,每一步踩过的坑、绕过的弯都写出来了。如果你也是被老项目绑住不得不在 20.04 上用 Melodic,希望这篇东西能帮你省下几个晚上的折腾时间。