Ubuntu 18.04下ROS-Melodic安装全流程与避坑指南
1. 为什么ROS-Melodic至今仍是很多机器人项目的首选如果你手头有一台跑着Ubuntu 18.04的工控机或者旧笔记本想拿它做机器人开发那ROS-Melodic基本是绕不开的一站。虽然现在ROS2已经铺开好几年了但大量成熟的SLAM建图包、MoveIt运动规划库、以及各种传感器驱动在Melodic上的适配度依然是最稳的。我见过不少团队新板子跑ROS2老设备继续用Melodic两套并行跑得挺好。Melodic Morenia是ROS1的倒数第二个长期支持版本官方支持周期到2023年5月但社区维护和大量第三方包的兼容性让它至今仍在服役。它对应的是Ubuntu 18.04 Bionic BeaverPython版本是2.7和3.6并存这点很关键——很多教程没讲清楚导致后面pip装包时各种冲突。这篇文章面向的是手里已经有Ubuntu 18.04环境、想从零把ROS-Melodic跑起来的开发者。不管你是刚接触ROS的学生还是从Indigo/Kinetic迁移过来的老手下面这套流程和踩坑记录都能直接参考。我会把每一步为什么这么做讲清楚而不是甩几条命令就完事。2. 装之前先把这几个前置条件确认掉2.1 系统版本和架构的硬性检查别急着敲命令先确认你的系统确实是18.04。打开终端lsb_release -a输出里Release那一行必须是18.04。如果是16.04或者20.04这套流程不适用——16.04对应Kinetic20.04对应Noetic源地址和依赖包都不一样。我遇到过有人拿着20.04的系统硬套Melodic教程结果apt update直接报404折腾半天才发现版本对不上。架构方面ROS-Melodic官方支持amd64、armhf和arm64。如果你是在树莓派或者Jetson这类ARM设备上装后面添加源的时候要注意架构标识这个后面会讲。2.2 软件源配置国内网络环境下的必要调整Ubuntu默认的软件源在国外下载速度可能很慢。建议先换成国内镜像源。打开软件和更新图形界面在Ubuntu软件标签页里把下载自改成国内的镜像站点。或者直接编辑/etc/apt/sources.list把archive.ubuntu.com和security.ubuntu.com替换成对应镜像地址。这一步不是ROS特有的但直接影响后面装依赖时的体验。我试过不换源直接装光是ros-melodic-desktop-full那几百个包就能下到怀疑人生。换源之后速度能提升一个数量级。换完源记得更新一下sudo apt update sudo apt upgrade注意apt upgrade会升级系统里所有可升级的包如果你这台机器上有正在运行的服务或者特定版本依赖先确认升级不会破坏现有环境。稳妥起见可以只做apt update升级留到必要时再做。2.3 确认Python环境没有被搞乱Ubuntu 18.04自带Python 2.7和Python 3.6。ROS-Melodic的核心工具链大量依赖Python 2.7但很多第三方库又在往Python 3迁移。装ROS之前先确认python命令指向的是哪个版本python --version which python如果输出是Python 2.7.x那没问题。如果被人改成了Python 3后面rosdep初始化那一步大概率会报错。这种情况要么改回来要么在具体命令里显式用python2。我个人的习惯是保持系统默认不动需要Python 3的时候单独用python3命令。3. 添加ROS软件源与密钥的完整操作3.1 配置sources.list的正确姿势ROS的软件源地址是packages.ros.org。官方推荐用apt-add-repository或者直接写文件。我倾向于直接写文件因为可控性更强sudo sh -c echo deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main /etc/apt/sources.list.d/ros-latest.list这里$(lsb_release -sc)会自动取到bionic这个代号不用手动填。如果你在国内可以把packages.ros.org替换成国内镜像地址速度会快很多。具体镜像地址各个高校和云服务商都有提供选一个延迟低的就行。写完之后检查一下文件内容cat /etc/apt/sources.list.d/ros-latest.list确认里面是deb http://... bionic main这样的格式没有多余空格或者换行错误。3.2 密钥添加失败怎么办添加密钥的命令是sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654这个密钥是ROS软件源的签名密钥没有它apt update会报NO_PUBKEY错误。但实际执行时keyserver.ubuntu.com经常连不上或者超时。我遇到过好几次卡在这里。替代方案是用curl直接从ROS的密钥服务器拉取curl -sSL http://keyserver.ubuntu.com/pks/lookup?opgetsearch0xC1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 | sudo apt-key add -如果这个也不行还有一个办法是从ROS官网的密钥页面下载.asc文件然后sudo apt-key add。总之核心目标是让apt-key list里能看到这个密钥。提示apt-key在新版Ubuntu里已经被标记为废弃但18.04上还能正常用。如果你看到警告信息忽略即可不影响功能。3.3 更新软件包索引并验证源可用密钥和源都配好之后sudo apt update如果这一步没有报错并且输出里能看到packages.ros.org相关的行说明源配置成功了。如果报404 Not Found检查源地址里的代号是不是bionic如果报NO_PUBKEY回到上一步重新添加密钥。我习惯在这一步之后跑一下apt-cache search ros-melodic如果能列出一堆ros-melodic-开头的包说明索引已经建立好了可以进入安装阶段。4. 正式安装ROS-Melodic从桌面完整版到依赖初始化4.1 选哪个安装包desktop-full还是ros-baseROS-Melodic提供几个层级的安装选项安装包包含内容适用场景ros-melodic-desktop-fullROS核心库 感知/仿真/导航等常用工具 Gazebo rqt rviz桌面开发、学习、仿真ros-melodic-desktop核心库 rqt rviz不含Gazebo和导航栈不需要仿真的桌面开发ros-melodic-ros-base仅核心通信库和基础工具嵌入式设备、服务器ros-melodic-ros-core最小化核心特殊定制场景大多数人直接装desktop-full就行省得后面缺东西再补。但如果你是在资源受限的设备上比如只有2GB内存的工控机desktop-full装完可能占好几个G这时候选ros-base更合适需要什么再单独装。安装命令sudo apt install ros-melodic-desktop-full这一步会下载几百个包时间取决于网络。中途如果断网重新跑一遍命令即可apt会自动续传。4.2 rosdep初始化最容易卡住的一步装完主包之后必须初始化rosdep。这个工具用来安装ROS包的系统依赖不初始化的话后面编译工作空间会各种报错。sudo rosdep init rosdep updaterosdep init会在/etc/ros/rosdep/sources.list.d/下创建一个文件指向rosdep的源列表。这一步通常没问题。真正容易卡的是rosdep update它会从多个源拉取依赖规则国内网络环境下经常超时。我试过几种解决办法。第一种是改hosts把raw.githubusercontent.com的IP写进/etc/hosts但IP会变不稳定。第二种是设置代理但这里不展开讲。第三种是用国内镜像的rosdep源具体做法是修改/etc/ros/rosdep/sources.list.d/20-default.list里的URL把raw.githubusercontent.com替换成国内可访问的镜像地址。如果rosdep update反复失败还有一个临时方案多试几次。有时候只是某个源超时重跑就能过。我最多的一次跑了七八遍才成功。注意rosdep update成功后会生成~/.ros/rosdep/sources.cache缓存文件。如果后面换了网络环境或者改了源需要删掉这个缓存重新update。4.3 环境变量配置让终端认识ROS命令装完之后rosrun、roscore这些命令还不在PATH里。需要source一下setup文件source /opt/ros/melodic/setup.bash但这只在当前终端有效。要永久生效得写进~/.bashrcecho source /opt/ros/melodic/setup.bash ~/.bashrc source ~/.bashrc如果你同时装了多个ROS版本或者有工作空间需要叠加~/.bashrc里的source顺序很重要。后source的会覆盖前面的环境变量。一般把/opt/ros/melodic/setup.bash放在最前面工作空间的setup.bash放在后面。4.4 安装构建工具和依赖最后装几个常用的构建工具sudo apt install python-rosinstall python-rosinstall-generator python-wstool build-essential这些包在Melodic里还是Python 2的别装成Python 3的版本。python-rosinstall用来拉取源码包python-wstool管理多个源码仓库build-essential提供gcc、make等编译工具。如果你打算用catkin_make或者catkin build编译工作空间这几个是必须的。5. 验证安装是否真的成功了5.1 跑一个最小化的talker-listener测试装完不验证等于没装。开一个终端roscore如果看到started core service [/rosout]之类的输出说明ROS核心跑起来了。再开两个终端分别跑rosrun roscpp_tutorials talker rosrun roscpp_tutorials listener如果listener终端里能看到hello world的循环输出说明通信正常。这个测试虽然简单但能验证roscore、话题通信、节点发现这一整条链路。如果roscpp_tutorials找不到可能是desktop-full没装全单独装一下sudo apt install ros-melodic-roscpp-tutorials5.2 检查环境变量和关键路径几个值得确认的点echo $ROS_DISTRO应该输出melodic。echo $ROS_PACKAGE_PATH应该包含/opt/ros/melodic/share。which rosrun应该指向/opt/ros/melodic/bin/rosrun。如果这些都对基本可以确认安装没问题了。5.3 常见报错与快速定位报错信息可能原因处理方式roscore: command not found环境变量没source执行source /opt/ros/melodic/setup.bashUnable to contact my own server网络配置或ROS_MASTER_URI问题检查~/.bashrc里有没有错误的ROS_MASTER_URI设置rosdep: command not foundrosdep没装或PATH问题sudo apt install python-rosdepImportError: No module named ...Python版本混乱确认用的是Python 2.7Could not find a package configuration file依赖包缺失用rosdep install补装6. 装完之后马上要做的几件事6.1 创建工作空间并编译一个包试试安装只是第一步真正干活得有工作空间。标准流程mkdir -p ~/catkin_ws/src cd ~/catkin_ws/ catkin_makecatkin_make第一次跑会生成build和devel目录。如果这一步报错大概率是前面rosdep没初始化好或者缺某个系统依赖。编译完之后source一下工作空间source ~/catkin_ws/devel/setup.bash同样写进~/.bashrc但注意顺序放在/opt/ros/melodic/setup.bash后面。6.2 串口和USB设备权限的提前配置做机器人开发免不了要接串口设备、USB摄像头、激光雷达。Ubuntu默认对这些设备的权限管理比较严普通用户可能没权限访问/dev/ttyUSB0。常见做法是把自己加到dialout组sudo usermod -a -G dialout $USER然后注销重新登录生效。另外可以配udev规则给特定设备固定权限和别名。这个不是ROS安装必须的但装完ROS之后迟早要弄提前做了省事。6.3 换掉默认的ROS_MASTER_URI多机通信场景如果你只有一台机器默认的http://localhost:11311就够了。但如果要做多机通信比如一台机器跑roscore另一台跑节点就需要设置ROS_MASTER_URI和ROS_IP。在~/.bashrc里加export ROS_MASTER_URIhttp://roscore所在机器的IP:11311 export ROS_IP本机IP这个配置在单机开发时不要乱设设错了会导致roscore起不来或者节点连不上。我见过有人复制了多机配置到单机上结果roscore一直报Unable to contact my own server排查半天才发现是ROS_MASTER_URI指向了别的机器。7. 几个我踩过的坑和对应的解法7.1 apt update报错“Release file is not valid yet”这个报错通常出现在系统时间不对的时候。Ubuntu的apt会校验软件源的时间戳如果本机时间比源上的时间早就会报这个错。解决方法是同步系统时间sudo apt install ntpdate sudo ntpdate ntp.ubuntu.com或者直接sudo date -s 2024-01-01 12:00:00手动设置。虚拟机里特别容易遇到这个问题因为挂起恢复后时间会漂移。7.2 rosdep update卡在“reading in sources list data from /etc/ros/rosdep/sources.list.d”这个现象基本就是网络问题。rosdep update会依次访问几个源其中raw.githubusercontent.com在国内经常连不上。除了前面说的换镜像源还可以试试在命令后面加--rosdistro melodic明确指定发行版有时候能绕过一些探测步骤。如果实在过不去可以手动下载rosdep的规则文件放到本地然后改sources.list.d里的路径指向本地文件。这个操作稍微麻烦点但一劳永逸。7.3 编译工作空间时提示“Could not find a package configuration file provided by catkin”这个报错说明catkin没找到。检查两点一是/opt/ros/melodic/setup.bash有没有source二是catkin_make命令是不是在~/catkin_ws目录下执行的。catkin_make必须在工作空间根目录跑不能在src里面跑。7.4 Gazebo启动黑屏或者报OpenGL错误desktop-full装了Gazebo但如果在虚拟机或者没有独立显卡的机器上跑Gazebo可能起不来。报错通常是OpenGL相关的。解决办法是装mesa-utils确认OpenGL可用或者在虚拟机里开启3D加速。如果只是学ROS基础不用Gazebo的话可以忽略这个问题。7.5 Python 2和Python 3的pip混用Melodic时代很多包还是Python 2的但你可能需要用Python 3装一些工具。记住pip默认对应Python 2pip3对应Python 3。装ROS相关包用pip装其他工具用pip3。混用会导致包装到了错误的site-packages里运行时找不到。8. 关于Melodic的后续使用建议Melodic虽然官方支持已经结束但社区里大量包仍然可用。我的建议是如果是新项目评估一下能不能上ROS2如果是维护现有项目或者学习经典ROS架构Melodic完全够用。日常使用中尽量把工作空间的依赖用rosdep管理好别手动apt install一堆包然后忘了记录。package.xml里把依赖写清楚换机器的时候rosdep install --from-paths src --ignore-src -r -y一条命令就能补齐。另外Melodic的roscpp和rospy接口和后面Noetic基本一致学会之后迁移成本很低。真正需要重新学的是ROS2的DDS通信模型和colcon构建系统那是另一套东西了。最后分享一个小习惯每次装完ROS我会把整个安装过程的关键命令整理成一个脚本放在~/setup_ros.sh里。下次换机器或者重装系统直接跑脚本省得重新回忆每一步。这个脚本里包括换源、加密钥、装包、rosdep初始化、环境变量配置基本上十分钟就能把一台新机器准备好。