尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Ubuntu 20.04 安装 ROS Melodic:跨版本兼容实践与排坑指南
年前接了一个老项目的维护工作代码是基于 ROS Melodic 写的但手上这台机器装的是 Ubuntu 20.04官方对口的 ROS 版本是 Noetic。项目里有个自研功能包只适配 Melodic迁到 Noetic 的改动量不算小于是我把目光转向了社区里不少人验证过的一条路在 Ubuntu 20.04 上硬装 ROS Melodic。整个过程折腾了差不多两天踩了不少坑也理清了很多版本适配背后的逻辑。这篇就把我的实际安装过程、每一步为什么这么做以及问题排查经验完整记录下来给同样被版本错位困扰的朋友一个参考尤其是那些老项目代码依赖 Melodic、又不想重装系统的场景。顺便说一句这是一套“非官方组合”的安装方案官方只支持 Ubuntu 18.04 配 Melodic。能在 20.04 上装成功靠的是把 ROS 软件源手动指向 Bionic 仓库。这种做法能解决大部分核心组件安装但也会带来一些依赖和 Python 版本上的坑。你如果只是想跑通 roscore、rviz、rqt 和常规功能包这套方案完全够用如果是长期开发环境我建议你读完这篇再决定要不要这么干。1. 为什么要在 20.04 上装 Melodic先搞清楚版本适配这件事1.1 官方版本对应关系与“错位安装”的由来ROS 1 的每个发行版都有严格对应的 Ubuntu 版本官方只针对特定组合做测试和发布。Melodic 对应的系统是 Ubuntu 18.04Bionic而 Ubuntu 20.04Focal对应的 ROS 1 版本是 Noetic。这个对应关系不是随便定的每个 ROS 版本编译时都链接了特定版本的系统库、Python 解释器和 Boost 库换到另一个系统版本上二进制包的依赖很可能对不上。ROS 版本官方支持的 Ubuntu 版本系统代号首要 Python 版本Melodic18.04BionicPython 2.7Noetic20.04FocalPython 3.8所以你在 20.04 上直接执行官方 Melodic 安装教程到添加软件源那一步就会出问题lsb_release -sc返回的是focalapt 会认为你想装的是 Noetic 的包虽然也能装但装出来的版本不对。正确做法是把软件源里的系统代号手动写死成bionic让 apt 去 Melodic 的二进制仓库拉包。这就是整个“错位安装”的基本原理。1.2 这种装法的风险和使用场景我先把话说清楚这不是官方推荐方式能成功但有代价。最大的风险集中在两点第一是依赖解析冲突。Melodic 的二进制包在编译时依赖 Ubuntu 18.04 的库版本比如 Boost 1.65而 20.04 自带的是 Boost 1.71。大部分核心包不受影响但一些依赖特定版本库的扩展包装不上或者运行时报错。第二是 Python 版本断层。Melodic 生态大量工具基于 Python 2而 20.04 已经默认移除 Python 2需要额外处理。那什么场景下值得冒这个险我总结下来主要有三类一是老项目代码用了 Melodic 专属功能包迁移成本高像我遇到的情况二是团队统一用 Melodic 开发新机器临时加入三是只想跑一个基于 Melodic 的仿真或算法验证用完了就扔。如果你是想从零开始学 ROS完全没有历史包袱我建议直接上 Noetic 或 ROS 2没必要自找麻烦。2. 装之前的环境检查与软件源配置2.1 确认系统版本和基础环境在动手之前先花两分钟确认系统环境避免装到一半发现基础条件不对。我这次是在一台全新安装的 Ubuntu 20.04.6 上操作的之前没有装过任何 ROS 版本这点很重要。如果机器上已经装了 Noetic 或其他 ROS 发行版再装 Melodic 会造成环境变量和二进制包冲突处理起来非常痛苦不如先把旧的清干净。cat /etc/os-release重点看VERSION_ID是不是 20.04。顺便检查一下网络能不能正常访问packages.ros.org这一步可以用 curl 测试curl -I http://packages.ros.org/ros/ubuntu如果返回 200 OK说明网络链路没问题。我在实际操作中发现这一步多花 10 秒钟能避免后面很多莫名其妙的报错。另外建议先把系统自带的软件源更新一遍sudo apt update sudo apt upgrade -y这里有个细节系统升级后内核可能会更新如果机器需要重启才能加载新内核就重启一下再继续。虽然这不是安装 ROS 的必要条件但干净、稳定的系统环境能减少变量。我遇到过在旧内核状态下编译某些功能包时出现奇怪的链接错误重启之后就好了。提示如果机器之前配置过其他 ROS 源比如 Noetic 或国内镜像建议先检查/etc/apt/sources.list.d/下是否有ros-latest.list之类的文件确认没有重复源配置否则 apt 更新时会出现源冲突警告。2.2 修改 apt 源指向 bionic这是整个安装流程的核心操作也是很多人搞错的地方。ROS 官方安装教程里的命令是sudo sh -c echo deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main /etc/apt/sources.list.d/ros-latest.list在 20.04 上直接跑这条命令$(lsb_release -sc)会替换成focal最终写入的软件源就变成了 Noetic 的源。我们要的是 Melodic必须手动指定bionicecho deb http://packages.ros.org/ros/ubuntu bionic main | sudo tee /etc/apt/sources.list.d/ros-latest.list注意一个关键点这里只是把 ROS 软件源指向 bionic系统本身的 Ubuntu 软件源保持 focal 不动。也就是说绝大多数系统库还是从 20.04 官方源安装只有 ROS 相关包从 bionic 仓库拉取。这种混合源方案能让 apt 同时满足两边的依赖比把整个系统源改成 bionic 要安全得多。千万不要把/etc/apt/sources.list里的系统源也改成 bionic那会导致系统库大规模降级甚至让桌面环境崩溃属于自杀式操作。2.3 安装基础依赖工具在添加 ROS 源之前先把后续会用到的工具装上。Ubuntu 20.04 最小安装可能缺curl、gnupg2这些基础包apt 添加密钥时也会用到sudo apt update sudo apt install -y curl gnupg2 lsb-release有些教程会让你装python3-apt、python3-pip之类的包暂时不用着急后面处理 rosdep 时再装。另外20.04 默认没有python命令指向 Python 2这个后面处理 Python 依赖时再解决现在不用管。3. 核心安装步骤与 python 依赖处理3.1 添加 ROS 软件源与密钥软件源配置好了下一步是添加 ROS 官方仓库的 GPG 密钥让 apt 信任这个源。ROS 官方文档给出的传统做法是sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654这条命令会从 Ubuntu 密钥服务器拉取 ROS 的 GPG 公钥。有些网络环境下连接 keyserver 会比较慢可以多试几次。如果实在连不上也可以直接从 ROS 官方 GitHub 仓库下载公钥文件再导入curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -下载如果超时多试几次或者手动下载ros.asc文件到本地后执行sudo apt-key add ros.asc。密钥添加成功后执行sudo apt update这时候 apt 会去读取 bionic 仓库的包索引。正常情况下你会看到大量ros-melodic-*的包出现在可安装列表里。如果这里报错或者列表里看不到 melodic 包大概率是软件源地址写错了回头检查一下 ros-latest.list 的内容。有一个细节值得注意apt-key这种方式在新版 apt 中被标记为弃用但 Ubuntu 20.04 仍然支持。ROS 官方源目前还是用这个机制没有强制切换到新的 signed-by 方式所以按上面的命令操作即可不用额外折腾。3.2 选择安装版本为什么我推荐 desktop 而不是 desktop-fullROS 官方提供三种安装粒度区别如下包名包含内容适用场景ros-melodic-ros-baseROS 核心 通信基础只跑 roscore 和命令行工具ros-melodic-desktop核心 rqt、rviz、tf、常用消息大多数开发场景够用ros-melodic-desktop-fulldesktop gazebo、仿真相关需要完整仿真环境很多教程上来就让装 desktop-full这也是一般 Ubuntu 18.04 上的标准做法。但在 20.04 上我强烈建议只装 desktop不要装 desktop-full。原因在于 desktop-full 包含 gazebo 仿真套件而 gazebo 在 20.04 上的版本与 bionic 仓库里的ros-melodic-gazebo-*存在依赖冲突。我在第一次尝试时执行了sudo apt install ros-melodic-desktop-full结果 apt 报了一串依赖错误核心是ros-melodic-gazebo-ros依赖的某些库在 focal 中版本对不上。当时我尝试强制安装差点把系统的 gazebo 环境搞坏。如果你确实需要 gazebo更稳妥的做法是装完 desktop 后单独安装自己需要的仿真功能包遇到依赖冲突时单独处理而不是一次性把所有包都拉进来。所以我最终的安装命令是sudo apt install ros-melodic-desktop这条命令安装的包包括 roscore、rviz、rqt、tf、常见传感器消息等个人实际使用下来对大部分 ROS 开发场景已经完全够用。安装过程会拉取几百个依赖包耗时取决于网络状况。装完后确认一下关键包是否就位dpkg -l | grep ros-melodic | head -20提示如果 apt 在安装过程中提示某些依赖无法满足不要加--fix-broken或者强制安装选项硬上。正确的做法是先记下报错信息中的包名用apt-cache policy 包名查看可用版本再根据具体冲突原因决定是跳过这个包还是手动处理依赖。3.3 处理 python 2/3 依赖问题Melodic 时代的很多 ROS 工具链是基于 Python 2 编写的比如rosdep、rosinstall_generator、wstool这些。在 Ubuntu 18.04 上这些工具对应的是python-rosdep、python-rosinstall这类包名。但在 20.04 上apt 源里已经没有 Python 2 版本的这些包了直接执行sudo apt install python-rosdep会提示找不到软件包。这也是 Ubuntu 20.04 装 Melodic 时最典型的坑之一。正确的做法是安装 Python 3 版本的对应工具。ROS 官方源里其实提供了 Python 3 版本的 rosdep 等工具包sudo apt install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool python3-catkin-tools这些包会从刚才添加的 bionic 源里安装。装完之后rosdep命令就可以用了只是它是以 Python 3 解释器运行的。这时候如果系统里还有残留的python命令指向 Python 2可能会导致某些老脚本执行时报语法错误。我实测的情况是rosdep 初始化、更新、按依赖安装这些核心功能在 Python 3 下都能正常工作不需要再折腾 Python 2。但如果你编译某个功能包时它的CMakeLists.txt或 setup.py 里写死了#!/usr/bin/env python会调用系统的 Python 2而这个在 20.04 上是不存在的。遇到这种情况可以临时安装python2包并手动建立软链接sudo apt install python2 sudo ln -s /usr/bin/python2 /usr/bin/python不过这只是权宜之计。从个人经验看Melodic 核心功能对 Python 2 的依赖并没有想象中那么强大部分问题在安装 Python 3 工具链后都消失了真到某些老包必须用 Python 2 时再补也不迟。4. rosdep 初始化与工作空间验证4.1 rosdep 初始化、更新及常见网络问题rosdep 是 ROS 的依赖管理工具作用是根据功能包的 package.xml 自动安装系统依赖。安装完 Melodic 后首先要做的是初始化和更新sudo rosdep init这一步会创建/etc/ros/rosdep/sources.list.d/目录并写入默认的源列表。正常情况下应该看到如下输出writing /etc/ros/rosdep/sources.list.d/20-default.list done然后执行更新rosdep update这一步会把 rosdistro 仓库的数据拉取到本地。问题往往出在这里rosdep 默认从 GitHub 的raw.githubusercontent.com拉取数据在国内网络环境下经常超时报错信息类似于ERROR: unable to process source [file:///home/xxx/.ros/rosdep/sources.cache] ERROR: error loading sources list: urlopen error [Errno 110] Connection timed out我前后试了四五次都没成功后来换了两个思路。第一个思路是把源列表里的 URL 指向国内镜像。编辑/etc/ros/rosdep/sources.list.d/20-default.list把里面的https://raw.githubusercontent.com/ros/rosdistro/master/...替换成可访问的镜像地址或者干脆用本地文件。第二个思路是手动git clonerosdistro 仓库到本地然后修改 20-default.list 指向本地路径这样完全不依赖外网。具体操作是先克隆仓库git clone https://github.com/ros/rosdistro.git ~/rosdistro然后把 20-default.list 里的 URL 改成类似file:///home/你的用户名/rosdistro/rosdep/sources.list.d/20-default.list以及把yaml file:///home/你的用户名/rosdistro/rosdep/osx-homebrew.yaml osx之类的条目改成对应的本地路径。修改后重新执行sudo rosdep update就能跑通。这个方法虽然有点绕但适合网络不稳定的场景。需要提醒的是 rosdep update 在大多数情况下是必需的因为后续编译功能包时要靠它解析依赖关系。如果只是运行系统自带的核心功能不做第三方包的编译这个环节暂时卡住也不影响 roscore 的启动但建议还是尽早解决。4.2 环境变量配置与第一个工作空间rosdep 处理好之后配置环境变量。Melodic 安装完成后环境变量脚本在/opt/ros/melodic/setup.bash把它写入 shell 配置这样每次打开终端都能自动加载echo source /opt/ros/melodic/setup.bash ~/.bashrc source ~/.bashrc这时候验证一下版本rosversion -d正常输出melodic。再试一下roscore开一个终端执行roscore看到started core service [/rosout]之类的日志就说明核心启动成功。这里有个常见小坑如果你刚才配置环境变量之前已经开了多个终端那些终端不会自动加载新配置要么source ~/.bashrc要么重开终端。接下来创建第一个工作空间用来验证 catkin 编译系统是否正常mkdir -p ~/catkin_ws/src cd ~/catkin_ws catkin_makecatkin_make会生成build和devel目录如果一切顺利最后会看到类似[build] [devel]完成的提示。这个工作空间以后就是你的主要开发目录把功能包放进src后再次执行catkin_make就能编译。编译完成后把工作空间的环境变量也加到.bashrcecho source ~/catkin_ws/devel/setup.bash ~/.bashrc source ~/.bashrc4.3 catkin_make 编译验证第一次catkin_make通常是最容易出问题的环节。我在 20.04 上遇到的最典型报错是找不到catkin_pkg模块错误信息类似ImportError: from catkin_pkg.package import parse_package failed这是因为 catkin_make 依赖的 Python 模块没有装全。解决方法就是提前安装 Python 3 版本的 ros 构建相关依赖sudo apt install python3-catkin-pkg python3-rospkg python3-empy这几个包是编译功能包的核心依赖缺了任何一个都会在编译时报错。装完之后重新执行catkin_make一般就能顺利通过。如果是在虚拟机上操作catkin_make过程中 CPU 占用会比较高属正常现象。另外不要在/opt/ros目录下直接建工作空间那属于系统目录普通用户没有写权限而且会和系统安装的 ROS 文件混在一起清理起来很麻烦工作空间一律建在用户目录下。5. 实际使用中的问题排查记录5.1 启动 roscore、rviz 的常见报错安装完成后进入日常使用阶段还是有几个高频问题值得提前了解。第一个是roscore启动后立刻退出没有任何明显报错。这种情况一般发生在端口被占用ROS 默认 master 端口是 11311如果有其他进程占用了这个端口roscore 起不来。排查方式lsof -i :11311或者换个端口试试roscore -p 11312看到 master 进程正常起来说明端口冲突后续节点的 ROS_MASTER_URI 也要同步改。第二个高频问题是 rviz 启动时报 OpenGL 错误尤其是在虚拟机或远程桌面环境下Could not initialize OpenGL这通常是图形加速环境缺失导致的。解决办法是安装 Mesa 软件渲染库sudo apt install mesa-utils然后在启动 rviz 前加上环境变量让 OpenGL 走软件渲染export LIBGL_ALWAYS_SOFTWARE1 rviz实测这个办法在 VMware 里能稳定跑起来但帧率会低一些。如果是实机带独立显卡一般不存在这个问题。第三个常见问题是启动节点时提示找不到功能包比如Resource not found或package [xxx] not found。大部分原因是环境变量没加载确认ROS_PACKAGE_PATH里是否包含你的工作空间和/opt/ros/melodic/shareecho $ROS_PACKAGE_PATH如果发现缺失重新source ~/catkin_ws/devel/setup.bash。还有一种情况是功能包没有编译先catkin_make再试。5.2 功能包编译时的依赖缺失实际编译一个功能包时最常见的问题是find_package阶段报缺失依赖。比如某个功能包依赖tf2_sensor_msgs但你没装对应的二进制包CMake 会提示找不到。这时的解决办法是用 rosdep 来自动检查并安装cd ~/catkin_ws rosdep install --from-paths src --ignore-src --rosdistro melodic -y这个命令会扫描src目录下所有功能包的依赖并自动安装缺失的系统库。但注意一点rosdep 数据源是基于 bionic 的有些依赖在 focal 软件源里不存在。遇到这种情况rosdep 会提示APT package not found。我的处理方法是先手动查看包名然后用apt-cache search找替代包。比如 bionic 源里的某个库在 focal 中被改名或合并了可能需要手动换成对应的 focal 版本再装。这类问题没有统一解法只能逐个分析但好在 20.04 上常见的 ROS 生态包大多都有替代方案。5.3 卸载与重装注意事项如果你在 20.04 上折腾了一阵发现不满足需求想卸载 Melodic 换回 Noetic 或者重装有些事情需要额外注意。卸载命令是sudo apt remove ros-melodic-*但光这样还不够以下几个残留位置需要手动清理。首先是/etc/ros/rosdep/sources.list.d/下的 rosdep 配置其次是~/.ros目录下的日志和缓存还有就是你加在.bashrc里的source /opt/ros/melodic/setup.bash和source ~/catkin_ws/devel/setup.bash这两行不删掉的话后续安装其他 ROS 版本会互相干扰。如果你是在一台新机器上尝试发现装完 rosdep 初始化始终卡住或者 desktop 安装后频繁出现依赖问题我的个人建议是别硬修直接重装系统或者换官方支持的版本组合。Ubuntu 20.04 装 Melodic 本质上是在兼容性边缘上跳舞能用但不够优雅。我自己在这个环境里运行了一个多月核心功能稳定没出大问题但每次装第三方功能包时都要额外关注依赖版本这种隐性成本只有用的时候才体会得到。这里额外分享一个小技巧如果你只是需要临时跑一个基于 Melodic 的项目又不想污染宿主机环境可以考虑用容器方案在容器里装 Ubuntu 18.04 和 Melodic干净隔离用完即弃比在宿主机上折腾轻松得多。这个思路在团队协作时尤其好用把容器配置提交到代码仓库新成员拉下来直接就能跑彻底告别环境搭建地狱。回到标题本身。如果你已经决定在 Ubuntu 20.04 上安装 ROS Melodic那就是一个“确认风险 按步骤操作 逐个解决依赖问题”的过程核心是三点软件源指向 bionic、Python 依赖用 python3 替代、rosdep 网络问题用镜像或本地方案解决。这三关过了系统就能正常跑起来。我个人在实际安装中的体会是整个过程最耗时间的不是安装命令本身而是排查依赖冲突和理解版本错位的逻辑。把上文的思路理清了大部分问题都能顺藤摸瓜解决希望这篇记录能给你省下排查的时间。
RELATED

相关推荐

MUC18抗体:一种从黑色素瘤标志物到肥胖治疗靶点的多功能研究工具如何发挥作用?

MUC18抗体:一种从黑色素瘤标志物到肥胖治疗靶点的多功能研究工具如何发挥作用?

MUC18(又称CD146)是一种细胞黏附分子,于1987年作为黑色素瘤标志物被发现。近三十余年的研究揭示了其在胚胎发育、免疫应答及肿瘤、炎症等过程中的多重功能。中科院生物物理研究所的最新研究发现,MUC18在脂肪组织中高表达&#xff…

📅 2026/10/15 14:01:49
MySQL作业复盘:从建表到索引的SQL实战笔记

MySQL作业复盘:从建表到索引的SQL实战笔记

最近课程正好告一段落,MySQL作业也交到了第二次。说实话,第一次作业大多数人还能靠“照着课件把建表语句抄一遍”混过去,到了第二次就明显分层了:有人半小时写完,有人对着报错刷了一晚上网页。这份作业日期是2025年12月…

📅 2026/10/15 14:01:49
CD146配对抗体:一种靶向代谢调控的新型工具如何干预肥胖及其并发症?

CD146配对抗体:一种靶向代谢调控的新型工具如何干预肥胖及其并发症?

CD146(又称MCAM)是一种细胞黏附分子,在黑色素瘤等肿瘤中被发现,近年来其功能研究已拓展至代谢调控领域。研究者揭示,CD146在脂肪组织中高表达,是脂肪细胞因子ANGPTL2的新型受体,通过促进白色脂肪…

📅 2026/10/15 14:01:49
MORE NEWS

更多资讯

📰

CSkin实战:WinForm自绘控件换肤与DPI适配避坑指南

简介:CSkin是一套面向C# WinForm开发者的UI库源码,旨在解决原生控件界面简陋、定制成本高的问题,适用于需要快速构建美观桌面应用的中高级程序员。压缩包共包含2000个文件,其中以gif、png、jpg等图片资源(超过1200个&a…

📰

编程基础:变量数据类型与类型转换全解析

1. 变量与数据类型基础概念在编程世界中,变量就像是一个个贴了标签的储物柜,而数据类型则决定了这个柜子里能放什么、怎么放。我刚开始学编程时,最常犯的错误就是把字符串当数字用,或者把浮点数当整数处理,结果程序跑起…

📰

插件生态深度解析:从plugins、SDK到CLI的架构设计与实战排查

1. 插件生态的底层逻辑与核心价值1.1 为什么“plugins”成了现代工具的标配打开任何一个现代开发工具,不管是代码编辑器、构建系统还是云平台控制台,你几乎都能找到一个叫“plugins”的入口。这个词本身没什么神秘的,就是“插件”的复数形式&…

📰

无头显搞定Unity VR开发:模拟输入与交互调试指南

简介:一套面向Unity VR开发者的无头显配置实战资料包,专为游戏开发者和沉浸式体验创作者打造,解决没有头显硬件时仍能在桌面环境预览、调试虚拟现实项目的问题,适合具备一定Unity基础的中高级开发者使用。压缩包共2000个文件&…

📰

AI工程从零开始:重建可验证的系统决策链

1. 项目概述:这不是“从零开始造轮子”,而是重建AI工程的底层认知框架“AI Engineering from Scratch”这个标题,乍看像极了那些教人手写反向传播、用NumPy搭Transformer的教程——但如果你真这么理解,就彻底误读了它的分量。我带…

📰

SQLite+FTS5+BM25构建轻量级上下文引擎

1. “context-mode”到底是什么?别被术语唬住,它本质是让工具真正“听懂你话”的底层机制刚看到“context-mode”这个词,我第一反应也是皱眉——又一个听着高大上、查资料时满屏英文缩写和抽象定义的词。但做技术十多年,踩过无数命…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬