1. 为什么ROS-Melodic至今仍是很多机器人项目的首选
如果你手头有一台跑着Ubuntu 18.04的工控机或者旧笔记本,想拿它做机器人开发,那ROS-Melodic基本是绕不开的一站。虽然现在ROS2已经铺开好几年了,但大量成熟的SLAM建图包、MoveIt运动规划库、以及各种传感器驱动,在Melodic上的适配度依然是最稳的。我见过不少团队,新板子跑ROS2,老设备继续用Melodic,两套并行跑得挺好。
Melodic Morenia是ROS1的倒数第二个长期支持版本,官方支持周期到2023年5月,但社区维护和大量第三方包的兼容性让它至今仍在服役。它对应的是Ubuntu 18.04 Bionic Beaver,Python版本是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对应Kinetic,20.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?op=get&search=0xC1CF6E31E6BADE8868B172B4F42ED6FBAB17C654' | 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-base
ROS-Melodic提供几个层级的安装选项:
| 安装包 | 包含内容 | 适用场景 |
|---|---|---|
ros-melodic-desktop-full | ROS核心库 + 感知/仿真/导航等常用工具 + 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但这只在当前终端有效。要永久生效,得写进~/.bashrc:
echo "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.bash |
Unable to contact my own server | 网络配置或ROS_MASTER_URI问题 | 检查~/.bashrc里有没有错误的ROS_MASTER_URI设置 |
rosdep: command not found | rosdep没装或PATH问题 | sudo apt install python-rosdep |
ImportError: No module named ... | Python版本混乱 | 确认用的是Python 2.7 |
Could 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_URI=http://<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 2,pip3对应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初始化、环境变量配置,基本上十分钟就能把一台新机器准备好。