开头
Ubuntu 20.04装ROS Noetic这件事,我前前后后在不同的机器上折腾了不下二十次,有全新裸机、双系统、虚拟机,也有从ROS Melodic升级上来的老环境。说“亲测有效”不是标题党,而是每一步都真实跑过,踩过的坑比安装步骤本身还值得记录。
这篇文章写给谁看?简单说三类人:第一类是刚接触ROS、想在Ubuntu 20.04上搭好环境开始学习的小白;第二类是准备在20.04上跑ORB-SLAM3、机械臂控制、移动机器人导航等项目的开发者,因为很多ROS1项目现在依然依赖Noetic;第三类是装了又卸、卸了又装,被各种报错折磨到怀疑人生的“折腾党”。如果你属于其中任何一类,这篇文章应该能帮你少走不少弯路。我会把安装思路、完整步骤、环境验证、常见报错一次性讲完,尽量做到照着敲命令就能跑通。
1. 安装前的准备与思路
1.1 为什么是ROS Noetic,它现在还值得装吗
先回答一个很多人会问的问题:都什么年代了,为什么还在装ROS Noetic,不直接上ROS 2?
Noetic是ROS1的最后一个长期支持版本,发布于2020年5月,官方支持周期到2025年5月。它对应的操作系统就是Ubuntu 20.04(Focal Fossa)。虽然ROS 2是现在的趋势,但ROS1在过去十几年里沉淀了海量代码,从SLAM算法(ORB-SLAM3、Cartographer、LOAM)、导航栈(move_base、navigation2的前身)、机械臂控制(MoveIt、ar3机械臂)到各种仿真环境(Gazebo、Stage),大量项目至今仍然只在ROS1上验证过。我身边很多做移动机器人和机械臂的团队,生产环境里跑的还是Noetic。
所以我的建议很明确:如果你要复现论文代码、接手别人项目,或者课程教材用的是ROS1,那就老老实实装Noetic;如果是从零开始做新项目并且不需要老代码,可以考虑ROS 2。但今天的主题是Noetic,装好它之后想再学ROS 2,环境互不冲突,完全可以共存。
1.2 三种安装路线,选对能省一半时间
ROS Noetic的安装方式主要有三条路线,我分别说下适用场景:
- 官方源安装:直接用
packages.ros.org的源配合apt install。优点是版本最权威、更新及时,缺点是在国内网络环境下经常慢到怀疑人生,apt update的时候很可能卡住或者超时。 - 国内镜像源安装:把ROS软件源换成清华TUNA或中科大的镜像,本质和官方源一样,就是换了个更快的地方下载。这是我最推荐的方式,也是本文的主体步骤。
- 一键安装脚本:网上有热心开发者做的一键配置脚本,本质是把换源、添加密钥、安装核心包、初始化rosdep打包成了一条龙操作。优点是省事,缺点是出了问题你不知道它到底改了什么,排错时等于黑盒操作,所以我不建议新手直接用它。
对于大多数人,用国内镜像源手动安装是成功率最高、可排查性最强的方案。接下来的步骤完全围绕这条路线展开。
1.3 开始之前先检查三件事
安装前务必确认系统版本、Python版本和磁盘空间,这三点能避免一半以上的安装失败。
lsb_release -a python3 --version df -hlsb_release -a查看Ubuntu版本,必须显示Focal Fossa(20.04)。如果你用的是Ubuntu 22.04,对应的是ROS 2 Humble,硬装ROS Noetic会有一堆依赖问题,别浪费时间。python3 --version确认是3.8系列,因为Noetic是ROS1里第一个完全基于Python 3的版本,如果系统默认Python被改成2.7,后续rosdep和catkin都会报错。df -h确认磁盘剩余空间,完整安装ROS Noetic desktop-full版大概需要4-5GB,空间太紧容易在安装中途失败,而且排错特别痛苦。
2. 完整安装步骤:从换源到验证
2.1 先更新Ubuntu软件源
ROS的安装过程会从Ubuntu软件源拉取很多依赖库,所以第一步先确保系统的apt源可用、索引是最新的。这一步很多人跳过,结果后面安装rosdep时遇到各种“404 Not Found”或“Unable to locate package”。
sudo apt update sudo apt upgrade -yupgrade会把系统现有软件升级到新版本,耗时取决于网络状况,如果机器有正在运行的重要服务,建议先确认再升级。我一般会在新装好的系统上直接执行,因为环境干净,升级不会引发冲突。如果Ubuntu 20.04不是最新版本,upgrade有可能推送内核更新,这不会影响后面的ROS安装。
2.2 配置ROS软件源和密钥
这里要注意,ROS软件源和Ubuntu软件源是两回事。Ubuntu软件源是系统通用库,在/etc/apt/sources.list配置;ROS软件源是新增的独立行,通常放在/etc/apt/sources.list.d/ros-latest.list文件里。很多人以为改一下系统源就完事了,结果apt找不到ros-noetic-desktop-full,就是这里漏了。
官方源(能连外网时用):
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu focal main" > /etc/apt/sources.list.d/ros-latest.list'国内镜像源(强烈推荐):
清华源、中科大源二选一即可。我在华北地区实测下来清华源速度比较稳定,南方用户中科大源也不差。
# 清华源 sudo sh -c 'echo "deb https://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu focal main" > /etc/apt/sources.list.d/ros-latest.list' # 或者中科大源(任选其一,不要两个都写) sudo sh -c 'echo "deb https://mirrors.ustc.edu.cn/ros/ubuntu focal main" > /etc/apt/sources.list.d/ros-latest.list'然后添加ROS的GPG密钥。ROS官方密钥服务器是keyserver.ubuntu.com,这一步有时候会超时,多试几次或者换成国内可访问的keyserver:
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654看到输出里出现gpg: Total number processed: 1或者imported: 1就说明密钥添加成功。添加完密钥后再执行一次sudo apt update,如果能刷出大量ros-noetic相关的包,说明ROS源已经生效。
2.3 安装ROS Noetic完整版
现在进入真正下载和安装的环节。我装的是desktop-full版,它包含ROS核心功能、rviz、Gazebo仿真器、turtlesim小乌龟示例、以及图像处理相关的依赖包。虽然ros-noetic-ros-base更小更快,但学ROS和跑仿真的话,desktop-full一步到位更省心。
sudo apt install ros-noetic-desktop-full -y这一步会拉取大量依赖包,输出几百行滚动信息是正常的,总下载量大。等它跑完,确认没有红色报错信息。安装完成后,你可以看一下/opt/ros/noetic目录是否已经存在:
ls /opt/ros/noetic这个目录是ROS安装的根目录,后续source环境变量、查找包都会用到它。有的新手问过为什么装完没看到“ROS图标”或者“启动器”,其实ROS本身就不是一个“软件产品”,而是一套运行在Linux环境下的工具框架,所以它的存在形式就是目录、可执行文件和库文件。
2.4 初始化rosdep,解决依赖管理
rosdep是ROS生态里很重要的一个工具,它负责自动解决某个包在编译或运行时的系统依赖。比如某个ROS包需要OpenCV或者PCL,rosdep会读取包的配置文件,自动帮你安装对应版本的底层库。如果不初始化rosdep,后面创建catkin工作空间、编译别人的源码包时经常会卡在依赖解析上。
sudo rosdep init rosdep updaterosdep init会把rosdep的基础配置文件抓取到本地/etc/ros/rosdep/sources.list.d/,rosdep update则是更新具体的依赖索引。这两个命令在默认网络环境下很容易超时,因为rosdep的数据源托管在GitHub上。如果你遇到了超时,先不要着急重装系统,把配置改到国内可访问的镜像源即可:
# 先把初始配置拉下来 sudo rosdep init # 如果init已成功但update失败,则修改rosdep的源配置 # 编辑 /usr/lib/python3/dist-packages/rosdep2/sources_list.py 和 gbpdistro_support.py # 以及 /usr/lib/python3/dist-packages/rosdistro/__init__.py # 把里面的 raw.githubusercontent.com 替换为可访问的镜像域名这个“改文件换源”的方法在两条命令都失效时比较稳定,不过这属于备用方案。实际上,我自己实测更多用的是rosdep update多试几次、或者在某些时间段(比如早晨网络状况好)执行,成功率也很高。如果你确实嫌麻烦,还可以使用社区里开发者整理的rosdepc工具,它把rosdep的默认源直接指向了国内镜像。
2.5 配置环境变量
ROS的环境变量靠shell的setup.bash脚本注入。在.bashrc里添加一行,让每次打开终端自动加载ROS环境,不然每次都要手敲source,非常容易忘。
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc source ~/.bashrc.bashrc是bash终端的启动配置文件,写在里面的命令每次新开终端都会自动执行。这里有一个常见的坑:如果你同时装了ROS和Anaconda,Anaconda的base环境也可能往.bashrc里写初始化脚本,两者叠加时很容易出现ROS命令找不到。遇到这种情况,不要慌,先检查.bashrc里的行顺序,确保ROS的source在conda初始化之前。
2.6 安装rosinstall等常用构建工具
构建ROS工作空间还需要几个辅助工具,顺手一起装上:
sudo apt install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential -y这些工具分别是干什么的呢?rosinstall和rosinstall-generator用于根据.rosinstall文件批量下载和更新源码,wstool管理多仓库工作区,build-essential是编译C++代码必备的gcc、g++、make工具链。虽然初次安装用不到全部,但后面编译ORB-SLAM3或Ar3机械臂项目时都会用到,现在装好省得以后再折腾。
3. 实操验证:确认环境真正跑通
3.1 启动roscore
安装完成后,最直接的验证方法就是启动ROS核心服务roscore。单独开一个终端,执行:
roscore正常启动后,终端会输出一段类似“started core service [/rosout]”的日志,并且会一直在前台运行。这条命令其实启动了ROS的master节点和rosout日志节点,整个ROS通信网络都依赖这个核心服务。如果这个起不来,后面所有rosrun、roslaunch都会报[rosmaster] Exception之类的不靠谱错误。
如果你的终端提示roscore: command not found,几乎可以肯定是环境变量没有正确source。重新执行一下source /opt/ros/noetic/setup.bash,再确认.bashrc那行写对没有。
3.2 小乌龟验证核心通信
核心服务跑起来之后,再开两个新终端,分别执行:
rosrun turtlesim turtlesim_node以及:
rosrun turtlesim turtle_teleop_key第一条命令会弹出一个蓝色背景的小乌龟窗口,第二条命令让你用方向键控制乌龟移动。按几次方向键,如果小乌龟真的动了,说明节点启动、话题通信、消息传递全部正常。我个人把这当作“ROS安装成功的体检报告”,因为turtlesim是官方自带的示例,不涉及任何第三方依赖,如果这里的通信链路坏了,那就是系统环境的问题;如果这里正常,你的ROS Noetic基本算是装好了。
3.3 创建工作空间,为项目开发做好准备
验证完小乌龟,我建议顺手把catkin工作空间建好,因为几乎所有ROS1项目都会在这个结构里编译运行。先创建目录结构:
mkdir -p ~/catkin_ws/src cd ~/catkin_ws/ catkin_makecatkin_make执行完会生成devel和build两个目录。build是编译过程的中间产物,devel里存放编译出的可执行文件和setup脚本。然后source开发空间的环境:
source devel/setup.bash这里有个细节:如果后面你在src里放了新功能包,重新编译之后一定要再次source devel/setup.bash,否则新包可能找不到。更省心的做法是把source命令也写进.bashrc,不过要注意先source ROS系统环境再source自己的工作空间:
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc source ~/.bashrc可以验证一下当前环境变量:
echo $ROS_PACKAGE_PATH输出里应该包含/opt/ros/noetic/share和/home/你的用户名/catkin_ws/src。如果只看到系统的ROS路径,说明工作空间没有正确source。
3.4 快速查看版本信息
最后加一个确认版本的小技巧:
rosversion -d终端会输出noetic。这表示当前ROS_DISTRO环境变量生效,系统确实运行在Noetic环境下。如果你安装了多个ROS版本,这个方法可以快速告诉你“当前终端正在使用哪一个ROS”。
4. 安装中的常见报错与排查记录
4.1 报错速查表
我把自己和帮朋友排查过程中遇到的典型报错整理成了一张表,按“报错现象 → 原因 → 解决办法”的顺序排列,方便你对应着查:
| 报错现象 | 根本原因 | 解决办法 |
|---|---|---|
E: 无法定位软件包 ros-noetic-desktop-full | ROS软件源没有正确添加,或apt索引未更新 | 检查/etc/apt/sources.list.d/ros-latest.list是否存在,执行sudo apt update;确认Ubuntu版本是20.04 |
W: GPG error: ... The following signatures couldn't be verified | ROS密钥未导入或过期 | 重新执行apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 |
sudo rosdep init一直卡住或提示网络错误 | GitHub访问受限 | 多试几次,或用rosdepc替代,或修改rosdep源指向国内镜像 |
rosdep update报unable to process source或超时 | 依赖索引更新失败 | 检查DNS,确保raw.githubusercontent.com可以解析;或换源/重试 |
新开终端找不到roscore | 环境变量未写入.bashrc | 检查~/.bashrc中是否有source /opt/ros/noetic/setup.bash,执行source ~/.bashrc |
ROS_MASTER_URI为空或一直报无法连接master | 多个版本ROS环境冲突、端口被占用 | 确认roscore在后台运行;检查8090端口和ROS_MASTER_URI=http://localhost:11311 |
编译工作空间时catkin_make报找不到Python | 系统默认python被修改或Anaconda干扰 | 确认python3 --version是3.8;暂时注释掉.bashrc里conda初始化后再source |
这张表覆盖了安装过程中80%以上的问题。剩下的20%大多与个人系统环境特殊配置有关,比如防火墙、代理、自编译内核等,处理思路仍然遵循“看日志、定位步骤、针对性修复”的方法,不要一上来就重装系统。
4.2 Python版本和Anaconda冲突
ROS Noetic要求Python 3,如果你的机器上还装了Anaconda,很容易发生一系列的“灵异事件”。我在一台配置了Anaconda的机器上安装时,遇到catkin_make出现ModuleNotFoundError: No module named 'catkin_pkg',排查后发现是因为终端默认进入了conda的base环境,Python解释器路径变成了Anaconda目录下的python3,它根本找不到系统级的catkin_pkg。
这个问题的解决思路比较直接:写一个专门的ROS环境脚本,或者创建conda虚拟环境时带上--clone base的方式隔离,再或者就是在编译工作空间之前先执行conda deactivate。我个人比较建议在安装和学习ROS的阶段,把.bashrc里的conda自动激活关掉,避免每次开终端都默认进入base,需要的时候再手动conda activate。
4.3 双系统和虚拟机环境的注意事项
在双系统环境下,有一个容易忽略的问题:不少双系统用户把系统装完之后会手动改主板的启动项或者修改/etc/default/grub,如果grub配置出现问题,开机可能进不了系统,这在安装ROS之前就应该处理好。另外,如果你使用虚拟机(VMware或VirtualBox)安装Ubuntu 20.04,建议给虚拟机分配至少4GB内存和20GB磁盘,否则编译大一点的功能包时内存和磁盘同时飙升,系统会直接卡死。我在虚拟机里安装时还遇到过一条额外的坑:默认的虚拟显卡驱动在运行rviz时画面闪烁,后面装了open-vm-tools和桌面环境增强组件才稳定下来。
如果你后续要用Gazebo做机器人仿真,显卡驱动很重要。比如热词里有人提过apt install nvidia-driver-535给Ubuntu 20.04装NVIDIA驱动,如果确认要在本机跑Gazebo或rviz这类图形密集型应用,建议先装好显卡驱动再装ROS,否则仿真渲染会比较吃力。
4.4 卸载重装时如何清理干净
如果安装过程中途失败,或者你改了太多源配置想重来,建议先把ROS卸载干净再重新安装,避免残留文件造成新老冲突。
sudo apt remove ros-noetic-* -y sudo apt autoremove -y sudo rm -rf /etc/ros sudo rm -f /etc/apt/sources.list.d/ros-latest.list如果你之前创建过~/catkin_ws,建议一并备份或删除,因为工作空间里的build和devel缓存可能会把旧的编译配置保留下来。
5. 装完之后,我还推荐你顺手做这几件事
5.1 安装常用辅助包:rviz、gazebo、tf、navigation
desktop-full虽然已经打包了常用的核心工具,但实际做项目还要装一些常用的功能包。下面这几个是我在机器人项目里经常用的,现在装好,后面省事:
sudo apt install ros-noetic-rviz ros-noetic-gazebo-ros ros-noetic-tf2 ros-noetic-tf2-ros ros-noetic-navigation -yrviz是ROS的可视化工具,用来显示点云、地图、机器人模型;gazebo-ros是Gazebo与ROS通信的桥梁,做仿真避不开;tf2负责坐标变换管理,做SLAM、导航时特别重要;navigation是移动机器人的导航栈,包含gmapping、amcl、move_base等核心节点。这些包装好之后,你就能直接启动一个仿真小车的完整SLAM和导航流程了。
5.2 让turtlesim显示中文或无画面时的处理
偶尔有新手告诉我“小乌龟画面出来了但是是黑屏”或者“窗口没弹出来”,这大概率是图形环境问题。你可以试试:
export LIBGL_ALWAYS_SOFTWARE=1 rosrun turtlesim turtlesim_nodeLIBGL_ALWAYS_SOFTWARE=1强制使用软件渲染,在虚拟机或者没有显卡驱动的机器上,这个参数可以救急。如果你在远程SSH环境(没有桌面)里跑turtlesim,默认是不会弹窗的,需要加-p参数或者使用xvfb虚拟显示。不过在本地桌面系统上,直接跑就行。
5.3 写给初学者:从turtlesim接着往哪走
很多初学者装完Noetic后很开心,然后就没有然后了,不知道下一步该学什么。我的建议是:装好小乌龟之后,跟着官方教程走一遍ROS核心概念的入门。比如rosnode list、rostopic list、rostopic echo /turtle1/cmd_vel,亲手看一下小乌龟移动时,话题数据是怎么流动的。这比直接背命令有用得多,它会帮你建立“节点-话题-消息”这个ROS基本模型。等这个模型建立起来了,再碰rviz、tf、URDF、Gazebo就会顺畅很多。
最后说一点个人体会。我在折腾ROS Noicet的过程中最深的感受是:大部分安装失败的案例,其实不是步骤本身多难,而是环境不干净、源不通、版本信息不匹配导致的连锁反应。所以不管你是第一次装还是第N次装,先花五分钟把系统版本、网络状况、Python版本这三件事确认清楚,成功率就上去了一半。装完之后也不要急着跑复杂项目,先用小乌龟把通信链路验证好,再逐步扩展工具链。希望这篇文章能帮你顺利进入ROS的世界。