做机器人相关开发,绕不开ROS。而ROS Melodic作为Ubuntu 18.04上的经典版本,至今仍是很多教材、开源项目和老牌设备驱动默认依赖的环境。我见过太多人卡在安装这一步,要么是apt源没配好导致依赖装不上,要么是rosdep初始化和更新怎么都过不去,最后折腾一晚上连roscore都没拉起来。这篇文章把我这些年反复装Melodic踩过的坑、验证过的流程全部整理出来,从系统准备到环境变量配置,每一步都写清楚为什么要这么做,照着走基本能一次过。
1. 安装前必须做好的系统准备
1.1 确认你的Ubuntu版本,别装错发行版
ROS Melodic官方只支持Ubuntu 18.04 Bionic Beaver,这是最容易翻车的一个点。很多人拿着Ubuntu 20.04甚至22.04的机器去装Melodic,然后用各种奇奇怪怪的第三方源硬装,最后依赖关系乱成一锅粥。
先执行这个命令确认系统版本:
lsb_release -a如果输出里能看到Codename: bionic,那没问题,放心往下走。如果是focal(20.04)、jammy(22.04)甚至更新的版本,我建议你直接装对应版本的ROS发行版(Noetic对应20.04,Humble对应22.04),或者装个Ubuntu 18.04的虚拟机来用Melodic。别跟系统版本较劲,ROS和Ubuntu版本是严格绑定的,强行跨版本安装后续会不断出现依赖地狱。
另外,如果你是在VMware或VirtualBox里装Ubuntu 18.04,记得装好VMware Tools或增强功能,否则窗口分辨率调不了,复制粘贴也不方便,后面复制命令会很难受。
1.2 换软件源,apt这一步顺不顺全看它
这一步决定了你后面apt update和apt install的速度与稳定性。默认的Ubuntu官方源在国内访问很慢,而Melodic的安装包本身也在Ubuntu源里,源慢了整个安装过程会被无限拉长。
把/etc/apt/sources.list换成国内镜像源,我比较推荐清华源或中科大源。操作方式很简单,先备份原文件:
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak然后用编辑器打开,把内容替换成对应的镜像源。以清华源为例,Ubuntu 18.04的源配置是这样的:
sudo vim /etc/apt/sources.list写入以下内容:
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这里有个细节要注意:bionic-security不要漏掉。有些精简教程会把-security那行省略,结果装某些依赖时就会报404或者找不到包,因为安全更新源是独立走的。
改完之后执行:
sudo apt update sudo apt upgrade -yapt upgrade是为了把系统自带的基础包更新到最新,避免后续依赖版本过旧。执行完后建议顺手装几个基础工具,后面都会用到:
sudo apt install -y curl wget vim git2. ROS Melodic核心安装流程拆解
2.1 添加ROS软件源和密钥
这一步两个关键操作:添加ROS官方源的镜像地址、添加密钥。很多教程只给了官方源,国内网络下apt update经常卡住或者超时,所以这里直接用中科大或者清华的ROS镜像源。
顺序很重要,先添加源地址:
sudo sh -c 'echo "deb https://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu bionic main" > /etc/apt/sources.list.d/ros-latest.list'注意这里用的是>而不是>>,意思是覆盖写入。如果之前残留过其他ROS源配置,先用这个命令清掉再写新的:
sudo rm -f /etc/apt/sources.list.d/ros-latest.list然后添加密钥。ROS官方给的密钥服务器地址在某些网络环境下经常连不上,所以我习惯直接从镜像站下载密钥文件:
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.key | sudo apt-key add -如果这一步提示curl: (7) Failed to connect,说明GitHub的raw域名在你的网络下访问不了,别慌,换成下面的方式,直接从清华镜像站拉密钥:
wget https://mirrors.tuna.tsinghua.edu.cn/ros/ros.key -O - | sudo apt-key add -然后再执行:
sudo apt update这时能看到apt源里出现了ROS相关的包信息。执行apt policy ros-melodic-desktop-full可以提前确认包是否存在以及版本号,如果输出里有Candidate: 1.4.1-0*,说明源已经生效了。
提示:如果
apt update时提示NO_PUBKEY,说明密钥没加成功。重新执行一次密钥添加命令,然后再update。
2.2 选择安装版本:desktop-full还是desktop
ROS Melodic的安装包分好几个版本,最常用的是这两个:
ros-melodic-desktop-full:完整版,包含ROS、rqt、rviz、机器人通用仿真库Gazebo、导航包、SLAM功能包等,体积大,但装完基本什么都能干。ros-melodic-desktop:精简版,只有ROS核心、rqt、rviz,不含Gazebo和导航相关功能包。
我个人的建议是:如果你的硬盘空间充足(至少需要10GB以上),直接装desktop-full。原因很现实,后面做机器人仿真、跑SLAM算法、加载地图都用得上这些功能包,分开装的话依赖关系非常复杂,不如一步到位。
安装命令很简单:
sudo apt install -y ros-melodic-desktop-full这一步会下载大量软件包,耗时取决于你的网络状况,通常在10到30分钟之间。下载过程中会出现一堆Get:xx的进度提示,那是正常的,别中途Ctrl+C中断。
如果安装过程中报依赖错误,比如The following packages have unmet dependencies,一般是因为某些依赖包的版本不对。优先尝试修复:
sudo apt --fix-broken install然后再重新安装。
2.3 安装完成后立刻做:rosdep init和update
rosdep是ROS的依赖管理工具,后续编译工作空间、安装功能包依赖时都会用到。每次新环境都要先初始化再更新。
很多人在这里卡到怀疑人生,因为rosdep update要访问GitHub的ros/rosdistro仓库,网络环境不好的时候基本必失败。先按标准流程走一遍,看看你的网络情况:
sudo rosdep init rosdep updatesudo rosdep init的作用是下载rosdep的源列表文件到/etc/ros/rosdep/目录。如果提示ROS distro was already initialized,说明之前初始化过,直接跳过。
如果rosdep update卡住或报错,报错信息里通常有unable to access RAW_GITHUBusercontent.com或者Failed to download target platform data for osx这种字样,说明是网络问题。解决思路有两个:
第一个方案:手动修改rosdep的源列表地址,把GitHub链接替换成国内的镜像地址。
编辑这个文件:
sudo vim /etc/ros/rosdep/sources.list.d/20-default.list里面的内容原本是这样的:
# os-specific entries 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 # newer distributions (Groovy, Hydro, Oneiric) ... yaml https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.yaml把其中所有https://raw.githubusercontent.com/ros/rosdistro/master/替换成https://ghproxy.com/https://raw.githubusercontent.com/ros/rosdistro/master/,或者直接用Aalborg大学、Tokyo大学的镜像。
第二个方案:如果你不想折腾这些,直接用国内社区维护的rosdepc工具,这个在机器人开发圈子里用得很多,用法和rosdep完全一致:
sudo pip3 install rosdepc sudo rosdepc init rosdepc update注意:如果系统里还没装pip3,先执行:
sudo apt install -y python3-pip我实测下来,rosdepc的更新速度和稳定性都很好,基本不会出现超时的问题。这个工具不是我凭空推荐的,它是开源社区维护的一个rosdep替代工具,国内不少机器人实验室都在用。
2.4 环境变量配置,让ROS命令全局可用
安装完成后ROS的可执行文件在/opt/ros/melodic/bin目录下,环境变量默认没有加载,所以你要手动配置。
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc source ~/.bashrc这一步执行完后,新打开的终端就能直接使用roscore、rosrun这些命令了。验证一下:
which roscore如果输出/opt/ros/melodic/bin/roscore,说明环境变量配置成功。
这里有个细节:每次修改~/.bashrc后,要么重新打开终端,要么执行source ~/.bashrc,否则当前的终端会话不会加载新的环境变量。
3. 工作空间初始化与核心组件校验
3.1 创建catkin工作空间
ROS的代码组织方式是以catkin工作空间为单位的。所谓工作空间就是存放功能包的目录结构,标准格式必须有src子目录。
创建一个自己的工作空间:
mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src catkin_init_workspace然后回到工作空间根目录,执行首次构建:
cd ~/catkin_ws catkin_make这一步会在~/catkin_ws下生成build和devel两个目录。devel目录里面有setup.bash,这是你后面每次写代码编译后都要用的环境文件。
把工作空间的环境变量也加载进去:
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc source ~/.bashrc顺序不能反:必须先source /opt/ros/melodic/setup.bash再source ~/catkin_ws/devel/setup.bash。因为工作空间的setup.bash是基于ROS主目录的,如果只加载工作空间的,会出现ROS_ROOT、ROS_PACKAGE_PATH这些变量没定义的情况。
3.2 验证安装:运行小乌龟测试
装完Ros之后最直观的验证方法就是跑一次小乌龟节点,这也是我每次给新环境做体检的标准动作。
新开三个终端(终端快捷键Ctrl+Alt+T):
第一个终端启动ROS主节点:
roscore看到started core service [/rosout]这段话后,主节点已经跑起来了。这里要提醒一下:roscore运行时会占住当前终端,不要关掉它。
另一个终端启动小乌龟模拟器:
rosrun turtlesim turtlesim_node这时应该会弹出一个蓝色背景的窗口,中间有一只小乌龟。如果窗口没弹出来,检查一下DISPLAY环境变量,特别是虚拟机用户,可能是图形界面转发没配好。
再开一个终端,启动键盘控制节点:
rosrun turtlesim turtle_teleop_key然后在这个终端里按方向键,小乌龟就会跟着动。能控制乌龟移动,说明ROS核心通信机制、节点间通信、话题收发都是正常的。
我们还可以顺便看一眼ROS的通信机制,用命令查看当前运行的节点和话题:
rosnode list rostopic list如果能看到/turtle1/cmd_vel这个话题,那说明整个系统链路是完全通的。
3.3 检查Python环境与版本兼容性
ROS Melodic默认使用Python 2.7,很多教程在讲Melodic时都会强调这一点。Ubuntu 18.04系统自带的Python版本有2.7和3.6,两个版本共存。ROS Melodic的核心组件大部分基于Python 2,但一些工具(比如catkin_make)也能在Python 3下运行。
实际操作中容易出现的问题是:如果你之前装过Anaconda或Miniconda,并且把conda的Python环境路径写进了~/.bashrc,那么新终端里默认的python很可能指向conda而不是系统自带Python。这样就会导致rosdep、catkin_make这些依赖Python的工具报各种莫名其妙的错误。
一个很典型的报错是:
ModuleNotFoundError: No module named 'rospkg'原因就是当前终端用的Python环境里没有装rospkg这个包。解决办法也很简单,把conda的自动激活关掉,在~/.bashrc里注释掉conda初始化相关的那几行,然后重新开终端。如果你一定要用conda环境,那就进入conda环境后手动安装依赖:
pip install rospkg但我个人建议:做ROS开发时尽量用系统Python,不要混用conda环境,因为conda里的很多包版本和ROS的依赖有冲突,查找问题会非常痛苦。
4. 安装过程中最常见的坑与排查方法
4.1 密钥无效:NO_PUBKEY错误
执行sudo apt update时如果看到类似这样的输出:
W: GPG error: https://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu bionic InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY F42ED6FBAB17C654这是ROS源的GPG密钥没有正确导入。直接复制报错里的KEY编号,执行:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F42ED6FBAB17C654然后再sudo apt update,一般就能解决。如果keyserver.ubuntu.com连不上,换成hkp://pgp.mit.edu:80再试一次。
4.2 rosdep update失败的完整解决方案
rosdep update失败是最常见的安装杀手,报错形式也多种多样。常见的几种:
ERROR: unable to process source [https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/osx-homebrew.yaml]: Failed to download target platform data for osxERROR: error loading sources list: The read operation timed outrosdep update: the first time this command is run, it needs to initialize itself
这几个错误背后其实都是一个问题:rosdep需要从GitHub拉取描述文件,但你的网络访问不了GitHub或者访问极其缓慢。
第一种解决方式:修改/etc/hosts文件,给GitHub的域名做IP映射。先查一下raw.githubusercontent.com的IP,可以用这个命令:
ping raw.githubusercontent.com如果ping不通,就去网上找一个可用的IP,然后写入/etc/hosts:
sudo vim /etc/hosts加入类似这样的内容:
185.199.108.133 raw.githubusercontent.com但这种方法的问题是GitHub的CDN节点会变,IP可能失效,治标不治本。
第二种解决方式:换用前面提到的rosdepc工具。这个工具的详细介绍我就不重复了,用法和rosdep一字不差,但内部访问的是国内源。实测下来,整个rosdepc update过程稳定且快速。
第三种解决方式:手动准备缓存文件,然后把rosdep指向本地目录。这个方法的操作步骤复杂,适合离线安装场景,日常使用没必要。
注意:不管用哪种方式,
rosdep、rosdepc这些工具本质都是帮你自动分析和安装功能包的依赖关系,千万别因为更新失败就跳过这步。后面编译别人的功能包时,缺依赖的情况会非常普遍,有个能用的依赖管理工具能省很多事。
4.3 虚拟机环境下的显示问题
如果你是在VMware里装Ubuntu 18.04跑ROS,启动rviz或Gazebo时偶尔会遇到黑屏或者无响应的情况。这通常不是ROS的问题,而是虚拟机3D加速没开。
解决办法:
VMware菜单里选择"虚拟机" -> "设置" -> "显示器",勾选"加速3D图形"。如果是VirtualBox,需要安装增强功能(Guest Additions),然后在设置里把显卡控制器改为"VBoxSVGA"并开启3D加速。
另外,虚拟机内存建议分配4GB以上,因为Gazebo和rviz都是内存大户,内存不足时启动速度会慢到让你以为卡死了。
4.4 磁盘空间不足导致安装中断
ros-melodic-desktop-full装完大概占用6到8GB,加上系统本身5GB左右,你的根分区至少要有20GB剩余空间。如果安装时提示No space left on device,清理一下apt缓存:
sudo apt clean sudo apt autoremove再查看磁盘空间:
df -h如果根分区确实太小,最省事的方法是扩虚拟机的磁盘容量,或者重新创建虚拟机时就把磁盘设大点。我见过有人在40GB磁盘的虚拟机上装Melodic,装完Gazebo再启动直接就爆盘了,后面跑仿真各种异常。
5. 补充技巧:如何避免重装时重复踩坑
5.1 一键安装脚本是否靠谱
最近网上很流行那种"鱼香ROS一键安装"脚本,包括对应的一键安装命令,很多入门者看到了就直接用。我的态度是:这个工具本身做得非常用心,对国内用户确实能一键装好ROS,省掉了换源、加Key、处理rosdep这一大堆麻烦。
但它有两个需要注意的地方:
一是它会自动修改你的软件源和环境配置,如果你是一个喜欢自己掌控一切细节的人,可能会觉得不够透明。二是这个工具支持的发行版和ROS版本经常更新,使用前最好去它的文档确认一下参数含义,别拿着老旧命令就去跑。
如果你能理解它每一步在做什么,那用它来提速没问题。如果你完全不了解换源、加Key这些流程,我建议还是先手动走一遍安装流程,出了问题你至少知道去哪个环节找。装了ROS你后面要天天跟它打交道,环境是怎么来的都不清楚,排错会很痛苦。
5.2 保存一份可复用的环境快照
如果你用虚拟机装ROS,我强烈建议在安装完成、跑通小乌龟测试之后,关闭虚拟机,然后给虚拟机做一个快照(VMware的"快照"功能或VirtualBox的快照)。这样后面就算把ROS环境搞坏了,比如装包时把系统依赖搞崩了、误删了某个配置,一键就能恢复到一个干净可用的状态。这个习惯我保持了好几年,省了不知道多少重装系统的时间。
如果是物理机上装的Ubuntu,可以用timeshift或systemback做系统备份,效果类似。ROS开发中改环境是家常便饭,一个可回滚的备份就是后悔药。
5.3 装完Melodic后建议立刻做的配置
装完ROS之后,有几件事最好一次性配置好,不然用的时候总是临时抱佛脚:
安装常用开发工具:
sudo apt install -y python-catkin-tools python3-catkin-tools python3-osrf-pycommon sudo apt install -y net-tools htop terminatorterminator是个非常好用的终端工具,可以分屏,ROS开发时经常要同时开三四个终端,分屏终端能大幅提升效率。
设置别名,把常用命令简化。在~/.bashrc末尾加上:
alias cm='cd ~/catkin_ws && catkin_make' alias cs='cd ~/catkin_ws/src' alias rosc='roscore'保存后执行source ~/.bashrc生效。这些小技巧用久了就会觉得真香。
6. 常见问题速查表
为了方便排查,我把安装过程中最常见的问题和解决办法汇总成了一张表,建议收藏备用。
| 问题现象 | 可能原因 | 解决办法 |
|---|---|---|
| apt update提示NO_PUBKEY | 密钥未导入 | 用apt-key adv导入报错中提示的KEY |
| apt install时报unmet dependencies | 依赖包版本冲突 | 执行sudo apt --fix-broken install后再装 |
| roscore提示command not found | 环境变量没有配置 | 执行source /opt/ros/melodic/setup.bash |
| rosdep update一直超时 | 无法访问GitHub | 使用rosdepc替代,或修改源地址为国内镜像 |
| 启动rviz窗口闪退 | 虚拟机3D加速未开启或显卡驱动问题 | 开启虚拟机3D加速,或更新GPU驱动 |
| 编译功能包时找不到ros/ros.h | ROS环境未加载 | 确认~/.bashrc里有source /opt/ros/melodic/setup.bash |
| catkin_make报Python3和Python2冲突 | conda环境或python指向错误 | 关掉conda,使用系统默认Python |
| 小乌龟窗口不显示 | DISPLAY环境变量异常 | 检查图形界面配置,虚拟机开启3D加速 |
7. 写在最后的个人体验
ROS Melodic从2018年发布到现在已经有年头了,但它的稳定性和庞大的生态依然是很多老项目的首选。装好一个干净的Melodic环境只是万里长征第一步——后面编译功能包、调试话题、跑仿真,每一步都会遇到新的问题。
我自己的习惯是:每次新装完环境,先跑一遍小乌龟测试确认通信正常,再把roscore、rosrun、rostopic这几个最基础命令用熟,最后才往工作空间里放自己的代码。基础打牢了,后面的学习和开发才会顺。
如果你在安装过程中遇到这篇文章里没提到的问题,别急着重装系统,先去翻ROS官方wiki的Troubleshooting页面,再查一下终端里完整的报错信息,绝大多数问题都能在社区里找到答案。装ROS这件事,耐心比技术更重要。