1. 为什么2024年还有人死磕ROS Melodic
你如果现在打开搜索引擎搜ROS安装,大概率会看到一堆推荐Noetic甚至ROS2的帖子。但现实情况是,大量实验室设备、工业控制项目、以及某些特定型号的传感器SDK,至今仍然绑死在ROS Melodic这个版本上。我见过太多人上来就装最新版,结果编译驱动时发现官方只支持Melodic,又灰溜溜地重装系统。
Melodic Morenia是2018年5月发布的,官方支持到2023年5月,按道理早该退役了。但为什么还在用?核心原因就一个:生态惯性。很多硬件厂商的ROS驱动包只维护到Melodic,比如某些品牌的激光雷达、工业相机、机械臂控制包。你拿Noetic去编译,轻则报错,重则根本跑不起来。所以如果你手头的设备明确要求Melodic,那就别折腾了,老老实实装Ubuntu 18.04加Melodic。
这篇内容适合谁看?第一类是完全没接触过ROS的初学者,需要一套能跑通的安装流程;第二类是手上有老设备、被迫使用Melodic的开发者;第三类是想在虚拟机里搭个测试环境、不想动主系统的折腾党。我会把安装过程中所有可能卡住你的点都拆开讲清楚,包括源配置、密钥问题、依赖冲突、环境变量设置,以及装完之后怎么验证。
先说一个反直觉的结论:ROS Melodic的安装难点根本不在安装命令本身,而在安装之前的系统准备和安装之后的网络配置。很多人照着官方教程敲命令,五分钟就装完了,然后发现roscore跑不起来、小乌龟出不来、rosdep初始化失败。这些问题百分之九十都出在源、密钥、Python版本、环境变量这四个地方。下面我按实际操作顺序,把每个环节的坑都给你标出来。
2. 装ROS之前必须确认的三件事
2.1 系统版本和架构的硬性匹配
ROS Melodic只支持Ubuntu 18.04(Bionic Beaver),这是硬绑定,没有商量余地。你拿Ubuntu 20.04装Melodic,依赖库版本对不上,装到一半就会报一堆unmet dependencies。同样,Ubuntu 16.04也不行,那是Kinetic的地盘。
怎么确认自己的系统版本?打开终端输入:
lsb_release -a输出里看到Release: 18.04和Codename: bionic就对了。如果是其他版本,别想着绕过,直接重装系统或者开虚拟机。我试过在20.04上强行装Melodic,改了源之后能装上核心包,但rviz和gazebo各种崩溃,折腾两天最后还是重装了18.04。
架构方面,Melodic支持amd64、armhf、arm64。普通笔记本和台式机都是amd64,树莓派之类的ARM板子要选对应架构。输入uname -m查看,x86_64对应amd64,aarch64对应arm64。
注意:如果你用的是WSL(Windows Subsystem for Linux),Ubuntu 18.04的WSL1对ROS支持很差,GUI程序基本跑不起来。WSL2稍微好一点,但USB设备直通和网络配置仍然麻烦。建议还是用虚拟机或者双系统。
2.2 软件源的正确配置方式
Ubuntu默认的官方源在国内访问速度很慢,装ROS这种需要下载大量包的操作,不换源会等到天荒地老。换源这件事本身不难,但很多人换完之后忘了更新缓存,或者换了不完整的源导致后续依赖缺失。
我推荐用国内某高校的镜像源,稳定性和同步速度都经过验证。操作步骤:
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo nano /etc/apt/sources.list把里面的archive.ubuntu.com和security.ubuntu.com替换成镜像站地址。注意不要用某些小站点的源,同步不及时会导致ROS包版本对不上。换完之后必须执行:
sudo apt update sudo apt upgrade这一步会更新所有已安装的包,耗时可能比较长,但必须做。我遇到过有人跳过upgrade直接装ROS,结果因为系统里某个库版本太旧,编译时链接失败。
2.3 磁盘空间和网络环境的预检
ROS Melodic完整安装(desktop-full)大概需要2到3GB磁盘空间,加上后续的依赖和编译缓存,建议预留至少10GB。用df -h看一下根目录剩余空间,不够的话先清理。
网络方面,安装过程中需要从ROS官方源和Ubuntu源下载包。如果你在校园网或公司网络里,确认没有对packages.ros.org做限制。我碰到过某实验室的内网防火墙拦截了ROS源的443端口,导致apt update一直超时,排查了半天才发现是网络策略问题。
另外,安装过程中会用到pip和python-rosdep等工具,确保你的Python环境是干净的。Ubuntu 18.04默认Python 2.7和Python 3.6共存,ROS Melodic的核心工具链主要依赖Python 2.7,但某些包会调用Python 3。不要随意修改系统默认Python版本,否则rosdep会报语法错误。
3. 添加ROS软件源与密钥的完整操作
3.1 sources.list的写入与格式检查
ROS的软件源配置写在/etc/apt/sources.list.d/ros-latest.list文件里。官方推荐用sh -c的方式写入,但很多人复制命令时漏掉了引号或者换行符,导致文件内容不完整。
正确的命令:
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'执行完之后,用cat看一下文件内容:
cat /etc/apt/sources.list.d/ros-latest.list应该输出类似deb http://packages.ros.org/ros/ubuntu bionic main的内容。如果$(lsb_release -sc)没有被正确替换成bionic,说明命令里的引号有问题,手动改成bionic即可。
这里有个细节:有些教程会让你把http改成https,理论上更安全,但某些镜像站不支持https,会导致apt update报证书错误。如果你用的是官方源,http和https都可以;如果用镜像源,先确认它支持哪种协议。
3.2 密钥添加失败的五种常见原因
添加密钥的命令是:
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654这条命令看起来简单,但失败率极高。我总结下来主要有五种情况:
第一种,keyserver连接超时。keyserver.ubuntu.com在国内访问不稳定,换成hkp://pgp.mit.edu:80或者hkp://keyserver.ubuntu.com:80多试几次。如果一直不行,可以用镜像站提供的密钥文件直接导入。
第二种,密钥已过期或被撤销。ROS的签名密钥在2020年更新过一次,旧教程里的密钥ID可能已经失效。上面命令里的C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654是当前有效的密钥。
第三种,apt-key命令被弃用。Ubuntu 18.04上apt-key还能用,但会有警告信息。如果提示apt-key is deprecated,不用管,继续执行即可。
第四种,代理设置问题。如果你之前给apt配过代理,apt-key可能不走代理导致连接失败。检查/etc/apt/apt.conf.d/目录下有没有代理配置文件,临时移走再试。
第五种,系统时间不对。密钥验证依赖系统时间,如果时间偏差太大,会报signature verification failed。用date命令看一下,不对的话用sudo ntpdate time.windows.com同步。
如果以上方法都失败,还有一个终极方案:从ROS官网下载密钥文件,然后手动导入:
wget http://packages.ros.org/ros.key -O - | sudo apt-key add -3.3 更新源时遇到GPG错误的处理
添加完源和密钥后,执行:
sudo apt update如果看到NO_PUBKEY或者GPG error,说明密钥没导入成功。重新执行密钥添加命令,或者用sudo apt-key list查看已导入的密钥,确认F42ED6FBAB17C654在列表里。
还有一种情况是Release file expired,这通常是因为镜像源同步延迟。换一个镜像源,或者等几个小时再试。我遇到过某次镜像站同步出问题,apt update一直报过期,换了另一个源立刻就好了。
4. 正式安装ROS Melodic的三种方案选择
4.1 desktop-full、desktop和ros-base的区别
ROS Melodic提供三种安装包,很多人不知道该怎么选:
| 安装包类型 | 包含内容 | 适用场景 | 下载体积 |
|---|---|---|---|
| ros-melodic-desktop-full | ROS核心库、rviz、gazebo、导航、感知等全套工具 | 初学者、需要仿真和可视化的开发者 | 约2GB |
| ros-melodic-desktop | ROS核心库、rviz及基础工具,不含gazebo | 只需要可视化和基础开发 | 约1GB |
| ros-melodic-ros-base | ROS核心通信库,无GUI工具 | 嵌入式设备、服务器端 | 约300MB |
如果你是第一次装ROS,直接选desktop-full,别犹豫。少装的东西后面用到时再补,依赖关系会让你头疼。我见过有人为了省空间装ros-base,结果后面想跑gazebo仿真,又得一个个补包,反而更麻烦。
安装命令:
sudo apt install ros-melodic-desktop-full这个过程会下载大量包,根据网络情况可能需要20分钟到1小时。中途如果断网,重新执行命令即可,apt会自动续传。
4.2 安装过程中的依赖冲突与解决
在Ubuntu 18.04上装desktop-full,最常见的依赖冲突是python3-rosdep和系统自带的python3版本不匹配。如果报错提示某个包依赖python3:any但无法安装,先执行:
sudo apt --fix-broken install然后再重新安装ROS。这个命令会尝试修复损坏的依赖关系。
另一个常见问题是磁盘空间不足导致dpkg中断。如果安装到一半报No space left on device,清理空间后执行:
sudo dpkg --configure -a sudo apt install -f继续完成安装。
还有一种情况是之前装过其他版本的ROS,残留的配置文件冲突。用dpkg -l | grep ros查看已安装的ROS包,如果有旧版本,先彻底卸载再装Melodic。
4.3 安装完成后的初步验证
装完之后,先别急着配置环境变量,用下面命令确认核心包是否安装成功:
dpkg -l | grep ros-melodic | wc -l正常应该输出几百个包的数量。如果只有几十个,说明安装不完整,重新执行安装命令。
然后检查/opt/ros/melodic/目录是否存在:
ls /opt/ros/melodic/应该能看到setup.bash、bin、lib、share等目录。如果这个目录不存在,说明安装根本没成功,回去看apt的报错信息。
5. 环境变量配置与rosdep初始化
5.1 source命令的正确写法和验证
安装完ROS后,必须把环境变量加载到当前shell里,否则roscore、rosrun这些命令都找不到。临时加载:
source /opt/ros/melodic/setup.bash永久加载,把上面这行加到~/.bashrc文件末尾:
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc source ~/.bashrc验证是否生效:
echo $ROS_DISTRO输出melodic就对了。如果输出为空,说明source没成功,检查~/.bashrc里有没有拼写错误。
这里有个坑:如果你之前装过其他ROS版本,~/.bashrc里可能残留了旧版本的source命令,导致环境变量冲突。用grep ros ~/.bashrc检查一下,把不需要的注释掉。
5.2 rosdep init失败的根因与绕行方案
rosdep是ROS用来安装系统依赖的工具,初始化命令是:
sudo rosdep init rosdep updaterosdep init失败的概率极高,报错通常是ERROR: cannot download default sources list from: https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list。原因很简单:这个文件托管在GitHub上,国内访问不稳定。
解决方案有三种:
第一种,多试几次。有时候网络波动,重试几次就成功了。
第二种,手动创建文件。先创建目录:
sudo mkdir -p /etc/ros/rosdep/sources.list.d/然后手动写入内容:
sudo nano /etc/ros/rosdep/sources.list.d/20-default.list文件内容如下:
# os-specific listings first yaml https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/osx-homebrew.yaml osx # generic yaml https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/base.yaml yaml https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/python.yaml yaml https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/ruby.yaml gbpdistro https://raw.githubusercontent.com/ros/rosdistro/master/releases/fuerte.yaml fuerte保存后执行rosdep update。如果update也失败,说明GitHub的raw内容访问不了,需要换源或者用代理。
第三种,使用国内镜像的rosdistro。某些高校镜像站提供了rosdistro的镜像,把上面文件里的raw.githubusercontent.com/ros/rosdistro/master替换成镜像地址即可。具体地址可以搜索“rosdistro 镜像”找到最新的。
5.3 环境变量冲突的排查思路
如果你在~/.bashrc里同时source了多个ROS版本,或者source了工作空间的setup.bash,可能会出现ROS_PACKAGE_PATH混乱的情况。症状是rospack find找不到明明存在的包。
排查方法:
echo $ROS_PACKAGE_PATH正常应该包含/opt/ros/melodic/share。如果里面混入了其他路径,检查~/.bashrc里的source顺序。一般来说,工作空间的setup.bash要放在ROS系统setup.bash之后source,这样工作空间的包会覆盖系统的同名包。
另外,如果你用了conda或者virtualenv,Python环境可能会干扰ROS的Python工具。建议在装ROS之前先退出conda环境,或者把conda的初始化从~/.bashrc里注释掉。
6. 装完ROS之后必须跑通的小乌龟测试
6.1 roscore启动失败的排查链路
roscore是ROS的核心节点,所有ROS程序运行前都必须先启动它。打开一个终端:
roscore正常输出会显示started core service [/rosout]和ROS_MASTER_URI等信息。如果报错,按下面顺序排查:
第一步,确认环境变量已加载。echo $ROS_DISTRO输出melodic。
第二步,确认端口11311没有被占用。roscore默认监听11311端口,如果被其他程序占用会启动失败。用netstat -tlnp | grep 11311查看,有占用的话杀掉对应进程。
第三步,确认/opt/ros/melodic/目录权限正确。如果你之前用root执行过某些操作,可能导致普通用户无法读取。用ls -la /opt/ros/melodic/检查,权限不对的话用sudo chown -R $USER:$USER /opt/ros/melodic/修复。
第四步,查看~/.ros/目录下的日志。roscore启动失败时会在~/.ros/log/里留下日志文件,里面有详细的错误信息。
6.2 小乌龟节点的运行与键盘控制
roscore跑起来之后,再开一个终端:
rosrun turtlesim turtlesim_node应该会弹出一个蓝色窗口,中间有一只小乌龟。如果窗口没弹出来,检查是不是在WSL或者SSH环境下运行,这些环境没有图形界面,需要额外配置X11转发。
再开第三个终端:
rosrun turtlesim turtle_teleop_key然后点击这个终端,用键盘方向键控制小乌龟移动。如果按键没反应,确认焦点在turtle_teleop_key的终端窗口上,而不是小乌龟的图形窗口。
这个测试看起来简单,但它验证了ROS的三个核心机制:节点通信、话题发布订阅、消息传递。小乌龟能跑通,说明你的ROS安装基本没问题。
6.3 常见运行时错误的快速修复
错误一:[ERROR] [xxx]: Cannot locate node of type [turtlesim_node]
说明turtlesim包没安装。执行sudo apt install ros-melodic-turtlesim补装。
错误二:QXcbConnection: Could not connect to display
图形界面无法显示,通常出现在SSH或WSL环境。如果你在本地Ubuntu桌面环境,检查DISPLAY变量:echo $DISPLAY,应该是:0或类似值。为空的话执行export DISPLAY=:0。
错误三:RLException: [roscore] is already running
说明已经有一个roscore在跑了。用ps aux | grep roscore找到进程号,kill掉再重新启动。或者直接在新的终端里运行其他节点,不需要重复启动roscore。
错误四:小乌龟窗口一闪而过
通常是显卡驱动或OpenGL问题。尝试用软件渲染:export LIBGL_ALWAYS_SOFTWARE=1,然后再运行turtlesim_node。
7. 安装后的收尾工作与长期使用建议
7.1 创建工作空间并编译测试包
ROS装好只是第一步,实际开发需要创建自己的工作空间。标准流程:
mkdir -p ~/catkin_ws/src cd ~/catkin_ws/ catkin_make编译完成后,source工作空间的环境:
source ~/catkin_ws/devel/setup.bash同样把这行加到~/.bashrc里。注意顺序:先source/opt/ros/melodic/setup.bash,再source~/catkin_ws/devel/setup.bash。
验证工作空间是否配置正确:
echo $ROS_PACKAGE_PATH输出里应该同时包含/opt/ros/melodic/share和~/catkin_ws/src。
7.2 常用工具链的补装清单
desktop-full虽然全,但有些常用工具还是需要单独装:
sudo apt install python-rosinstall python-rosinstall-generator python-wstool build-essential这几个是编译和下载ROS包时经常用到的。另外,如果你要用Python 3写ROS节点,还需要装:
sudo apt install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool注意Python 2和Python 3的ROS工具是分开的,别搞混。
7.3 版本锁定与系统更新的注意事项
ROS Melodic已经停止官方支持,这意味着apt upgrade时可能会把某些ROS依赖库升级到不兼容的版本。我的建议是:装好ROS之后,不要随意执行sudo apt upgrade。如果必须更新系统,先用apt-mark hold锁定关键的ROS包:
sudo apt-mark hold ros-melodic-*这样apt upgrade会跳过所有ROS相关的包。需要更新某个ROS包时,手动apt install指定版本。
另外,Ubuntu 18.04的标准支持也已经结束,安全更新需要配置ESM。如果你只是在内网环境跑ROS,不连外网的话问题不大;如果需要联网,建议做好防火墙规则,只开放必要的端口。
7.4 备份与迁移的实操经验
ROS环境配好之后,建议做一次完整备份。最简单的方式是用虚拟机快照,如果你跑在物理机上,可以用tar打包关键目录:
sudo tar -czvf ros_melodic_backup.tar.gz /opt/ros/melodic /etc/ros ~/.ros ~/.bashrc ~/catkin_ws恢复的时候解压到对应位置,然后重新source环境变量即可。注意/etc/apt/sources.list.d/ros-latest.list和密钥也要备份,否则重装系统后还得重新配置源。
我在实际使用中发现,ROS Melodic最稳定的状态就是“装好之后别乱动”。系统更新、Python版本切换、显卡驱动升级,这些操作都有可能破坏ROS的运行环境。如果非要升级,先在虚拟机里测试一遍,确认没问题再动生产环境。这套环境虽然老,但胜在稳定,很多工业场景要的就是稳定,而不是最新。