
1. 为什么ROS入门第一步总是卡在安装上搞机器人开发的人绕不开ROS这个中间件框架。不管你是做移动机器人导航、机械臂控制还是多传感器融合ROS基本是默认的起点。但很多人第一次接触ROS热情满满地打开终端结果在安装环节就被各种依赖冲突、源配置错误、密钥报错给劝退了。这不是个别现象我见过太多人在这一步反复折腾好几天。这篇文章面向的是完全没碰过ROS、刚装好Ubuntu 18.04的新手也适合那些之前装过但失败了想重新理清思路的人。我会把ROS Melodic在Ubuntu 18.04上的完整安装过程拆开讲清楚包括每一步为什么这么做、可能遇到什么坑、怎么排查。你照着走一遍大概率能一次装好。先说清楚一个基本事实ROS的版本和Ubuntu版本是强绑定的。ROS Melodic对应Ubuntu 18.04ROS Noetic对应Ubuntu 20.04ROS Kinetic对应Ubuntu 16.04。你不能在18.04上装Noetic也不能在20.04上装Melodic。这个绑定关系是ROS的设计决定的因为ROS底层依赖大量系统库和Python版本不同Ubuntu版本的底层环境差异很大。所以第一步不是急着敲命令而是确认你的系统版本对不对。lsb_release -a这条命令会输出你的Ubuntu版本信息。看到Release: 18.04就对了。如果是其他版本要么换系统要么换对应的ROS版本别硬来。另外ROS Melodic已经停止官方维护了但它的软件源和安装包依然可用社区支持也还在。对于学习和中小型项目来说Melodic完全够用。如果你用的是新硬件或者需要长期维护的项目可以考虑Ubuntu 20.04 Noetic的组合但那是另一篇文章的事了。2. 安装前的系统准备与环境检查2.1 确认系统架构和网络环境在开始安装之前有几个前置检查必须做。首先是系统架构ROS Melodic支持amd64和arm64但大部分人在amd64上跑。确认一下uname -m输出x86_64就是amd64架构没问题。然后是网络。ROS的安装包从官方源拉取国内直连速度可能很慢甚至超时。你可以先测试一下网络连通性ping -c 3 packages.ros.org如果延迟很高或者丢包严重建议换国内镜像源。国内有几个高校和云服务商提供了ROS镜像速度会快很多。具体换源的方法后面会讲。还有一个容易被忽略的点磁盘空间。ROS完整安装大概需要2-3GB的空间加上后续你自己的工作空间和依赖包建议至少留出10GB的可用空间。用df -h看一下根目录的剩余空间。2.2 更新系统基础包在装ROS之前先把系统自带的包更新到最新状态。这一步不是可选的因为ROS依赖很多系统库如果系统库版本太旧后面会出现依赖冲突。sudo apt update sudo apt upgrade -yapt update是刷新软件源索引apt upgrade是升级已安装的包。注意这两个命令的区别很多人搞混。update不会安装任何东西只是更新可用包的列表upgrade才会实际升级。注意如果你之前改过系统的软件源比如换成了某些第三方源建议先检查一下/etc/apt/sources.list文件确保没有冲突的源。有些第三方源会覆盖系统库导致ROS安装时依赖解析失败。升级完成后建议重启一次系统确保所有更新生效特别是内核相关的更新。2.3 检查Python版本ROS Melodic默认使用Python 2.7这一点必须提前知道。Ubuntu 18.04自带的Python版本就是2.7和3.6共存。ROS Melodic的核心工具如rosdep、rospy都是基于Python 2.7的。如果你把系统默认Python改成了3.x安装过程中会出现各种奇怪的错误。检查当前默认Python版本python --version如果输出Python 2.7.x就对了。如果输出的是Python 3.x你需要把默认Python改回2.7或者至少在安装ROS期间保持2.7为默认。改默认Python的方法sudo update-alternatives --config python然后选择Python 2.7对应的编号。不过我要提醒一句改系统默认Python有风险某些系统工具依赖Python 3。更稳妥的做法是不改默认而是在需要的时候显式调用python2。ROS安装脚本本身会处理这个问题只要你没手动破坏Python环境一般不会出问题。3. 配置ROS软件源与密钥的完整流程3.1 添加ROS软件源ROS的软件源不在Ubuntu默认的源列表里需要手动添加。官方推荐的方式是用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会输出你的Ubuntu代号18.04的代号是bionic所以最终写入的文件内容是deb http://packages.ros.org/ros/ubuntu bionic main。文件放在/etc/apt/sources.list.d/目录下命名为ros-latest.list这样不会污染系统的主源列表。如果你在国内建议把packages.ros.org替换成国内镜像地址。比如某些高校的镜像站提供的ROS源速度会快很多。替换后的命令类似sudo sh -c echo deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu $(lsb_release -sc) main /etc/apt/sources.list.d/ros-latest.list具体用哪个镜像你可以根据自己网络环境测试一下。换源之后记得sudo apt update刷新一下。3.2 添加ROS软件源密钥软件源配置好之后还需要添加对应的GPG密钥。密钥的作用是验证软件包的签名确保你下载的包没有被篡改。没有密钥的话apt update会报错说源没有签名验证。sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654这个密钥ID是ROS官方源的签名密钥。执行成功后会输出gpg: key F42ED6FBAB17C654: public key Open Robotics infoosrfoundation.org imported之类的信息。如果密钥服务器连接超时可以换一个keyserver试试sudo apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654或者直接用curl下载密钥文件然后导入curl -sSL http://keyserver.ubuntu.com/pks/lookup?opgetsearch0xC1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 | sudo apt-key add -这几种方式效果一样哪个能通用哪个。实操心得密钥导入失败是安装ROS时最常见的报错之一。报错信息通常是NO_PUBKEY或者The following signatures couldnt be verified。遇到这种情况先检查密钥是否真的导入成功了用apt-key list查看已导入的密钥列表。如果列表里没有ROS的密钥说明导入失败换keyserver重试。3.3 刷新软件源索引密钥添加完成后刷新一下源索引sudo apt update这一步如果没报错说明源配置和密钥都没问题。如果报错仔细看错误信息通常是以下几种NO_PUBKEY密钥没导入成功回到上一步重新导入404 Not Found源地址写错了检查Ubuntu代号是否正确Connection failed网络问题换镜像源或者检查网络4. 安装ROS Melodic的三种方案与选择建议4.1 完整桌面版安装ROS Melodic提供几种安装选项最常用的是ros-melodic-desktop-full包含了ROS核心库、常用工具、仿真环境和导航栈等。对于初学者和大多数开发者来说直接装完整版最省事。sudo apt install ros-melodic-desktop-full -y这个包比较大下载加安装大概需要十几分钟到半小时取决于网络速度。安装过程中会提示确认磁盘空间输入y继续。安装完成后可以用以下命令验证核心包是否安装成功dpkg -l | grep ros-melodic如果输出了一堆ros-melodic-开头的包说明安装成功了。4.2 精简版与基础版的选择如果你的磁盘空间紧张或者只需要ROS的核心通信功能可以选择精简版sudo apt install ros-melodic-desktop -ydesktop版本不包含仿真和导航相关的包体积小一些。还有更精简的ros-melodic-ros-base只包含ROS核心库和通信机制适合在嵌入式设备或者服务器上部署。选择哪个版本取决于你的用途。做仿真和导航必须装desktop-full只做话题通信和节点开发ros-base就够介于两者之间选desktop。安装选项包含内容适用场景体积ros-melodic-desktop-full核心库工具仿真导航学习、仿真、完整开发约2.5GBros-melodic-desktop核心库工具部分仿真基础开发、无导航需求约1.5GBros-melodic-ros-base核心库通信机制嵌入式、服务器部署约500MB4.3 安装过程中的依赖处理安装过程中apt会自动处理依赖关系。但有时候会出现依赖冲突特别是你之前手动装过某些库的不同版本时。常见的报错是Depends: xxx but it is not going to be installed。遇到依赖问题先尝试sudo apt --fix-broken install这条命令会尝试修复损坏的依赖关系。如果还不行用aptitude来安装它会给出更灵活的依赖解决方案sudo apt install aptitude sudo aptitude install ros-melodic-desktop-fullaptitude在遇到依赖冲突时会提供多个解决方案你可以选择降级或替换某些包。不过要小心别把系统关键库给降级了。5. 初始化rosdep与环境变量配置5.1 rosdep的安装与初始化rosdep是ROS用来管理系统依赖的工具。当你在工作空间中编译某个包时rosdep会自动检查并安装该包所需的系统依赖。安装ROS主包之后rosdep可能还没初始化需要手动执行sudo apt install python-rosdep -y sudo rosdep init rosdep updaterosdep init会创建/etc/ros/rosdep/sources.list.d/目录并写入默认的源配置。rosdep update会从远程拉取依赖数据库并缓存到本地。注意rosdep init和rosdep update在国内网络环境下经常失败因为默认的源在国外。报错通常是ERROR: unable to process source或者ERROR: cannot download default sources list。解决办法是换国内镜像源具体方法后面会讲。如果rosdep init提示File exists说明之前已经初始化过了不用重复执行直接跑rosdep update就行。5.2 配置环境变量ROS安装完成后需要把ROS的环境变量添加到shell的配置文件中这样每次打开终端都能自动生效。echo source /opt/ros/melodic/setup.bash ~/.bashrc source ~/.bashrc第一行是把source命令追加到~/.bashrc文件末尾第二行是让当前终端立即生效。如果你用的是zsh对应的文件是~/.zshrc。验证环境变量是否生效echo $ROS_DISTRO如果输出melodic说明配置成功。还可以用printenv | grep ROS查看所有ROS相关的环境变量。5.3 安装构建工具如果你打算编译ROS包还需要安装python-rosinstall、python-rosinstall-generator、python-wstool和build-essentialsudo apt install python-rosinstall python-rosinstall-generator python-wstool build-essential -y这些工具在后续创建工作空间和编译包时会用到。build-essential提供了gcc、g、make等编译工具ROS的C包编译离不开它。6. 安装后的验证与常见问题排查6.1 验证ROS核心功能安装完成后别急着关终端先验证一下ROS能不能正常跑。最经典的方式是跑一个小海龟仿真打开第一个终端roscore如果输出类似started core service [/rosout]的信息说明ROS核心节点启动成功。打开第二个终端rosrun turtlesim turtlesim_node应该会弹出一个窗口里面有一只小海龟。打开第三个终端rosrun turtlesim turtle_teleop_key然后在这个终端里按方向键小海龟就会移动。如果这三步都成功了说明ROS安装完全没问题。6.2 常见报错与解决方法即使按照步骤来也可能遇到各种报错。我把最常见的几个问题和解决方法整理成表格报错信息原因解决方法E: Unable to locate package ros-melodic-desktop-full源没配置好或没update检查/etc/apt/sources.list.d/ros-latest.list重新apt updateNO_PUBKEY F42ED6FBAB17C654密钥未导入重新执行apt-key adv命令导入密钥rosdep: command not foundrosdep未安装sudo apt install python-rosdepERROR: cannot download default sources listrosdep源被墙换国内镜像源或手动配置roscore: command not found环境变量未生效检查~/.bashrc中source命令重新sourceImportError: No module named rospyPython版本不对确认默认Python是2.76.3 rosdep update失败的解决方案rosdep update失败是国内用户最常遇到的问题。默认的源在GitHub上国内访问不稳定。解决方法有两种第一种是换国内镜像源。修改/etc/ros/rosdep/sources.list.d/20-default.list文件把里面的URL替换成国内镜像地址。具体地址可以搜索rosdep 国内镜像找到最新的可用地址。第二种是手动下载依赖数据库。先在一台能正常访问的机器上执行rosdep update然后把~/.ros/rosdep/目录下的文件拷贝到目标机器上。这个方法的缺点是数据库不会自动更新需要定期手动同步。实操心得如果你在公司内网或者网络受限的环境下安装ROS建议提前把ROS的deb包和rosdep数据库都下载好离线安装。在线安装在这种环境下几乎不可能成功。7. 安装完成后的下一步该做什么ROS装好只是起点接下来你需要创建工作空间、学习基本概念、跑通第一个自己的节点。我建议的路径是这样的先花半天时间把ROS的核心概念搞清楚节点、话题、服务、参数服务器、消息。这些概念不理解后面写代码就是照抄出了问题也不知道怎么排查。然后创建工作空间mkdir -p ~/catkin_ws/src cd ~/catkin_ws/ catkin_makecatkin_make是ROS的构建工具第一次执行会在devel目录下生成环境配置脚本。之后每次打开新终端除了source ROS的系统环境还要source你自己的工作空间环境source ~/catkin_ws/devel/setup.bash同样把这行加到~/.bashrc里省得每次手动敲。再然后试着写一个最简单的发布者和订阅者节点用Python或C都行。跑通之后你对ROS的理解会从概念层面落到实操层面。最后说一个我踩过的坑很多人装完ROS之后过段时间系统更新了或者装了其他软件导致ROS环境被破坏。最常见的是Python版本被改、系统库被升级导致不兼容。所以装好ROS之后建议做一个系统快照或者记录下关键包的版本出问题了可以快速回滚。另外如果你用的是虚拟机建议给虚拟机分配至少4GB内存和20GB磁盘否则编译大型ROS包时会非常卡。我试过在2GB内存的虚拟机上编译导航栈直接卡死。硬件资源这块别省该给够就给够。