1. 为什么我最终选择ROS Noetic:版本纠结了三天后的答案
先说结论:如果你的系统恰好是Ubuntu 20.04,那么ROS Noetic就是唯一不需要折腾的版本,或者说,Noetic就是为20.04量身定制的ROS发行版。
我在第一次接触这个问题时也纠结过:ROS Melodic不也还行吗?ROS 2到底能不能直接用?说实话,这些念头我都动过,而且都实际试过一遍。最后的结果是,如果你不是为了尝鲜,而是打算老老实实跑SLAM、做机械臂控制、跑仿真环境,那么ROS Noetic是20.04上兼容性最好、资料最多、社区问题沉淀最充分的版本。Melodic官方支持的是Ubuntu 18.04,硬装在20.04上虽然有人成功过,但依赖冲突会以各种诡异的方式出现——我见过有人装完Melodic之后,连系统自带的Python3都被迫降级了,那场面相当壮烈。
ROS 2的情况又不一样,它和ROS 1的架构差异很大,节点通信机制、启动方式、包管理逻辑都不一样。如果你现在看的教程、论文代码、开源项目大部分还是基于ROS 1写的,那直接上ROS 2会让你在复现时痛苦加倍。尤其是ORB-SLAM3、各种VIO算法、老牌的导航栈,绝大多数还是在ROS 1生态里。
所以这篇博文就围绕ROS Noetic在Ubuntu 20.04上的完整安装流程来写。我会把我自己在安装过程中踩过的坑、查过的资料、最后验证可行的步骤都整理出来。不管你是双系统环境,还是VMware虚拟机,核心步骤是通用的,区别只在最后我会单独说明。
什么基础才适合跟着这篇走?我觉得只要你会打开终端、能输命令、遇到错误提示不慌,就够了。不需要你懂Linux内核,不需要你会编译源码,跟着步骤做,大概率能一次搞定。
2. 安装前的系统准备:这几件事不做,后面全是坑
2.1 先确认你的Ubuntu版本真的对得上
很多人一上来就复制粘贴安装命令,结果装到一半发现ROS源不认你的系统版本号,然后就开始怀疑人生。
在终端里执行:
lsb_release -a你会看到类似这样的输出:
No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 20.04.6 LTS Release: 20.04 Codename: focal这里的关键是Codename: focal。ROS Noetic对应的系统代号就是focal,它俩是绑定关系。如果你的Codename显示的是bionic(18.04)或者jammy(22.04),那说明系统版本不对,要么换系统,要么换ROS版本,不要想着强行装。
之前有一位朋友问我说他的Ubuntu 20.04装不上Noetic,远程一看,好家伙,lsb_release -a显示的Release是20.10还是21.04,这种非LTS版本虽然看起来也能用,但ROS官方源里压根没有适配,最后只能老老实实装回20.04 LTS才顺利通过。
提示:如果你是在虚拟机里装的Ubuntu,请务必确认自己在安装系统时选择的是20.04 LTS版本,而不是20.10这类短期版本。二者界面很像,但软件源策略完全不同。
2.2 软件源:国内用户必须处理的头号问题
这一步的重要性怎么强调都不过分。ROS默认的官方源在国内的下载速度,用"龟速"来形容都是客气的。如果你不想在rosdep update阶段等到怀疑人生,请在安装前就把系统的软件源切换为国内镜像。
打开"软件和更新"界面,在"Ubuntu软件"选项卡下,把下载服务器从"archive.ubuntu.com"切换为清华、阿里云或者其他你信任的镜像站。
命令行方式也可以:
sudo sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list sudo apt update切完之后执行sudo apt update,你会发现速度提升了不止一个量级。这一步会直接影响后面所有apt安装的体验,务必优先处理。
2.3 历史的包袱:之前装过ROS?先清理干净
如果你是从别的教程或者自己的折腾中残留了部分ROS组件,建议先彻底清掉。我之前在一台测试机上遇到过残留的ROS Melodic配置,导致ROS Noetic安装完成后,rosversion命令显示的版本信息混乱,某些包在编译时甚至去找Melodic的库文件,那种错误极其难排查。
清理方式如下:
sudo apt purge ros-* sudo apt autoremove sudo rm -rf /etc/ros sudo rm -rf /opt/ros注意,如果你是全新安装系统的干净环境,跳过这一步就好,不用强行执行。但如果你不确定系统里有没有残留,执行一遍也没坏处,唯一要付出的代价是几分钟的等待时间。
2.4 网络环境检查:这一步能避免90%的玄学问题
ROS安装过程中需要访问packages.ros.org、raw.githubusercontent.com等外部资源。其中raw.githubusercontent.com在部分网络环境下访问不稳定,这会导致rosdep init步骤失败。
在开始安装前,可以先测试一下:
ping packages.ros.org ping raw.githubusercontent.com如果你发现第二个ping不通或者超时严重,不要慌,这是常见情况,后面我会专门讲解决方案。现在你只需要知道,rosdep init失败不是一个无解的问题,有成熟的处理办法。
3. 核心安装流程逐段拆解:我的操作步骤实测版
3.1 第一步:开启universe和multiverse软件源
ROS依赖的不少软件包不在Ubuntu默认的main源里,所以需要确保universe和multiverse软件源处于开启状态。
先检查一下:
sudo apt update sudo apt install software-properties-common sudo add-apt-repository universe sudo add-apt-repository multiverseadd-apt-repository universe这行命令的意思是告诉apt,除了官方维护的核心软件包,我也要使用Ubuntu社区维护的软件包。ROS的很多依赖库都在universe源里,不开启的话,后面安装ros-noetic-desktop-full时会报一堆"无法找到软件包"的错误。
3.2 第二步:添加ROS官方软件源
ROS软件源有两种方式添加,我推荐直接用命令行方式。
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'这条命令做了三件事:找到你的系统代号(focal),在/etc/apt/sources.list.d/目录下创建一个名为ros-latest.list的文件,并向其中写入ROS软件源的地址。
然后添加ROS官方的GPG密钥:
sudo apt install curl curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -这里有一点需要说明:如果你的网络环境导致raw.githubusercontent.com无法访问,这一步会有两种表现——要么curl一直卡着不动,要么提示"Could not resolve host"或"Failed to connect to raw.githubusercontent.com port 443"。
这时候有两个替代方案。
第一个方案:使用国内镜像的ROS源,同时处理密钥。比如使用清华源:
sudo sh -c 'echo "deb https://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'密钥添加可以换成:
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654第二个方案:如果你不想换源,只想解决密钥问题,可以先从其他地方下载ros.asc文件,再本地导入:
sudo apt-key add ros.asc核心思路就是让GPG密钥文件能落到本地,形式不重要。密钥的作用是验证软件包在传输过程中没有被篡改,这属于Linux软件包管理的基本信任机制,不是走形式,必须完成。
密钥安装完成后,更新软件包列表:
sudo apt update执行完sudo apt update后,如果你看到类似Get: http://packages.ros.org/ros/ubuntu focal/main amd64 Packages的输出,说明ROS软件源已经正常工作了。
3.3 第三步:安装ROS Noetic——选Desktop Full还是Desktop?
这是新手容易卡住的选择题。ROS Noetic提供了几个安装版本,区别如下:
| 安装包名称 | 包含内容 | 适合场景 |
|---|---|---|
| ros-noetic-desktop-full | ROS核心 + rviz + 仿真工具 + 2D/3D感知库 + 导航栈 | 推荐新手的全功能版 |
| ros-noetic-desktop | ROS核心 + rviz + 仿真工具 | 不需要感知/导航的桌面版 |
| ros-noetic-ros-base | 仅ROS核心,无GUI工具 | 嵌入式/服务端场景 |
我的建议是,如果你想省心和少踩坑,直接装ros-noetic-desktop-full。虽然下载时间会长一些(大约2-4GB的软件包),但这能让你避免后续安装某个功能包时发现缺了一堆底层依赖的尴尬。
安装命令:
sudo apt install ros-noetic-desktop-full在执行这一步的时候,终端会开始大量下载和解压软件包,此时尽量不要中断操作。如果你用的是虚拟机,磁盘空间不够也会在这里暴露——可以提前用df -h检查一下磁盘余量,建议至少保留15GB左右的空间,因为后续编译工作空间还会占用不少。
3.4 第四步:初始化rosdep——新手翻车重灾区
rosdep的作用是帮你自动解决ROS功能包的外部依赖。比如你从GitHub上下载了一个功能包,里面要求某个系统库,rosdep会检查并提醒你安装它。如果没有rosdep,你会在编译各种功能包时反复遇到"找不到头文件""找不到库文件"的错误。
初始化过程:
sudo rosdep init rosdep update这两个命令几乎是整个安装流程中失败率最高的环节。常见错误有两种:
第一种,sudo rosdep init提示无法连接raw.githubusercontent.com。这个刚才说过,网络原因。解决办法是切换网络、使用代理,或者直接修改/etc/hosts文件把raw.githubusercontent.com的IP指向一个能访问的地址。修改hosts的方式不复杂,但要注意IP地址时效性比较强,需要自己实测。
第二种,rosdep update过程中提示超时或者某个yaml文件下载失败。这种情况通常是网络不稳定导致的,可以多试几次,或者使用国内镜像的rosdep资源。
我自己遇到的情况是rosdep update一直卡在某个资源文件的更新上,反复重试无效。后来手动修改脚本,将下载地址指向了国内镜像源,才彻底解决。这个操作的细节稍微繁琐,如果你遇到了,可以搜索"rosdep update 镜像源 方案",能找到不少成熟的解决方案。这里篇幅原因不展开全部步骤,只说一个简单思路:把/usr/lib/python3/dist-packages/rosdistro/__init__.py里的raw.githubusercontent.com替换为镜像地址。
提示:
rosdep update失败不会导致ROS无法运行,它只影响后续编译第三方功能包时的依赖解析。如果你只是安装ros-noetic-desktop-full,且不打算马上编译其他功能包,可以暂时跳过这步,等需要时再回头处理。但既然都已经走到这一步了,我还是建议你一鼓作气搞定它。
4. 安装完成后的环境配置与基础验证
4.1 配置环境变量:为什么每次都要source一下?
ROS安装完成后,它的各种命令、库文件不在系统的默认路径里,需要手动把ROS的环境变量加载进当前终端。这就是source命令干的事。
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc source ~/.bashrc第一行把source语句追加到.bashrc文件里,这样以后每次打开新终端都会自动加载ROS环境。第二行让当前终端立即生效。
这里有一个值得注意的细节:如果你用的是zsh而不是bash,对应的配置文件就变成.zshrc,语句也要调整为source /opt/ros/noetic/setup.zsh。别小看这个区别,我见过有人用的shell是zsh,却往.bashrc里写配置,结果每次开终端都报错且命令找不到,查了半天才发现是shell配置的问题。
4.2 验证安装:用roscore和一个小乌龟程序确认一切正常
环境变量配置完成后,先验证基本框架能不能跑起来。
新开一个终端,执行:
roscore如果一切正常,你会看到类似started core service [/rosout]的输出。这个命令会启动ROS的主节点管理器,相当于ROS系统的大脑,所有节点之间的通信都要通过它来建立连接。
看到roscore正常启动后,另开一个终端,我们来跑一个ROS自带的基础演示——小乌龟仿真器。
rosrun turtlesim turtlesim_node这时会弹出一个窗口,里面有一只静止的小乌龟。再开一个终端,运行:
rosrun turtlesim turtle_teleop_key把焦点切到这个终端上,按方向键,你会发现小乌龟开始动了。
能够看到小乌龟随着按键移动,说明你的ROS Noetic安装是成功的,而且ROS的核心通信机制(话题发布与订阅)也在正常工作了。这个演示虽然简单,但它验证了整个通信链条——从按键节点读取输入、发布话题消息、到仿真器节点订阅话题并改变画面,每一环都是通的。
4.3 安装一些常用工具:让后续开发舒服一点
安装完ROS本体之后,有几个开发中非常常用的小工具,我建议顺手装上:
sudo apt install ros-noetic-rqt ros-noetic-rqt-common-pluginsrqt是ROS的图形化调试工具集,包括rqt_graph(可视化节点通信关系)、rqt_plot(绘制话题数据曲线)、rqt_image_view(查看图像话题)等。对于调试节点通信、查看传感器数据、分析话题频率都极其方便。
另外一个工具是tmux,虽然不是ROS专属,但它在同时操作多个终端时非常好用:
sudo apt install tmux跑ROS程序经常需要同时开三四个终端——一个跑roscore,一个跑主程序,一个跑可视化,一个跑控制命令。tmux可以让你在一个终端窗口里分屏管理这些会话,不用来回切换窗口。
5. 实测过程中最容易翻车的几个问题及排查过程
5.1 roscore启动报错:resource not found
这是我遇到过的一个典型问题。安装完成之后,第一次执行roscore,结果报错:
Resource not found: roslaunch ROS path [0]=/opt/ros/noetic/share/ros ROS path [1]=/opt/ros/noetic/share这个报错看起来像是ROS安装不完整,但实际上多数情况是环境变量没有正确加载,或者是安装desktop-full版本时出现了中断。
我的排查思路是这样的:先确认/opt/ros/noetic/setup.bash文件是否存在,如果存在,说明ROS文件是完整的;再检查~/.bashrc里是否真的包含了source语句;最后确认当前终端是否执行了source ~/.bashrc。
后来发现问题出在我用的是zsh,而source语句被写进了.bashrc,当前终端根本没有加载它。把source语句追加到.zshrc后,问题立刻消失。
如果你确认环境变量没有问题但仍然报这个错,可以试试手动指定ROS根目录:
export ROS_ROOT=/opt/ros/noetic/share/ros如果这样能跑起来,说明你的环境变量里ROS_ROOT没有正确设置,需要重新检查setup.bash的加载情况。
5.2 rosdep update一直卡住,最后试通的办法
rosdep update是另一个让我花了不少时间的环节。它的本质是从raw.githubusercontent.com下载一系列yaml文件,这些文件描述了不同ROS功能包的系统依赖关系。
前文提到了网络问题。我当时的操作是:修改rosdep源码中的下载地址为清华的镜像地址。
具体就是编辑/usr/lib/python3/dist-packages/rosdep2/sources_list.py和/usr/lib/python3/dist-packages/rosdistro/__init__.py,将其中所有raw.githubusercontent.com/ros/rosdistro/master替换为mirrors.tuna.tsinghua.edu.cn/rosdistro/master。
替换完成后,重新执行:
sudo rosdep init rosdep update这一次非常顺利。
值得注意的是,sudo rosdep init和rosdep update之间有一个细节:init只需要执行一次,它会创建/etc/ros/rosdep/sources.list.d/目录和对应的配置文件。如果init已经成功过但update失败,重新执行init会提示文件已存在,这是正常的,直接执行update即可。
5.3 编译功能包时报Python版本相关的错误
ROS Noetic是基于Python 3开发的,这和之前基于Python 2的Melodic有根本性区别。很多从旧教程复制来的命令可能还带着Python 2的痕迹,在Noetic环境下会报错。
比如执行某些工具时报:
ModuleNotFoundError: No module named 'rospkg'这个错误多半发生在使用系统Python 3环境而没有安装rospkg库的情况下。解决办法:
sudo apt install python3-rospkg python3-rosdep python3-catkin-pkg另外,一个常见的坑是catkin_make编译时提示找不到Python解释器。确保你的python3命令指向的是Python 3.8:
python3 --version如果输出的是3.8.x,那就没问题。如果输出了其他的版本,比如3.10或3.11,那说明你的系统中可能存在多个Python版本,需要小心处理。我自己在新装的Ubuntu 20.04上没遇到这个问题,但在升级过的系统上碰到过,最稳妥的解决方式是用update-alternatives把默认Python版本切回3.8。
5.4 虚拟机安装时的GPU兼容性说明
如果你是在VMware或VirtualBox虚拟机里安装,需要注意一点:ROS本身的运行不依赖GPU,但rviz这个3D可视化工具在虚拟机里可能会出现画面撕裂、渲染卡顿甚至闪退的情况。
这不代表你的ROS安装有问题,而是虚拟机的显卡虚拟化能力有限。解决办法有几种:
一是安装VMware Tools或open-vm-tools:
sudo apt install open-vm-tools open-vm-tools-desktop这个包会改善虚拟机的图形显示性能,让rviz的渲染流畅一些。
二是在启动rviz时强制使用软件渲染:
export LIBGL_ALWAYS_SOFTWARE=1 rviz这行命令告诉OpenGL使用软件渲染而不是GPU硬件加速,兼容性更好,代价是性能稍有下降,但对于学习调试来说足够了。
6. 安装完成之后,建议你接着做的事
ROS Noetic装好之后,并不代表万事大吉。如果你想用ROS做实际开发,我建议按下面的顺序接着往下走。
创建并编译一个catkin工作空间。ROS的功能包都放在工作空间里,命名规范通常是catkin_ws,里面有个src目录。创建工作空间的命令如下:
mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src catkin_init_workspace cd ~/catkin_ws catkin_make编译完成后,catkin_make会在~/catkin_ws下生成devel和build两个目录。devel目录里有setup.bash文件,以后你每次写自己的功能包,都需要把这个工作空间的环境也source进去:
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc source ~/.bashrc这里有个顺序问题:如果/opt/ros/noetic/setup.bash和~/catkin_ws/devel/setup.bash都被source,后source的工作空间在ROS环境中拥有更高优先级。也就是说,如果你在~/catkin_ws里的包和系统里的某个同名包,系统会优先使用你自己工作空间里的那个。
我建议你在.bashrc里把ROS的source语句放在前面,工作空间的source语句放在后面,像这样:
source /opt/ros/noetic/setup.bash source ~/catkin_ws/devel/setup.bash然后验证一下工作空间是否正常:
echo $ROS_PACKAGE_PATH输出里应该同时包含/opt/ros/noetic/share和~/catkin_ws/src两个路径,说明ROS环境和工作空间都已经被正确加载。
如果你打算在虚拟机和双系统中选一个作为主力环境,我个人更推荐双系统。虚拟机的好处是快照功能,随时可以回滚到装坏之前的状态,对新手的容错率更高。但虚拟机在运行rviz、Gazebo这类图形密集型程序时性能明显不足,跑ORB-SLAM3这类实时算法也会因为虚拟化层的关系损失不少性能。如果你是想认真学ROS、跑仿真、跑SLAM,给Ubuntu装双系统,把GPU直通给系统,体验会好很多。
7. 如果你遇到没见过的错误,试试这个排查套路
虽然这篇博文覆盖了我遇到的大部分问题,但你实际安装过程中可能会碰到我没写到的报错。这里分享一个通用的排查思路。
第一步,读报错信息本身。大多数报错信息都会直接指出问题所在,比如"无法定位软件包""命令未找到""文件不存在"。不要一看到英文报错就想着复制粘贴去搜索,先自己读一遍,很多时候答案就在报错里。
第二步,确认软件源和网络状态。至少一半的安装问题都能追溯到源配置错误或网络不稳定。sudo apt update是否能正常完成是最基础的健康检查。
第三步,搜索时带上版本号和系统代号。搜索"ROS Noetic 安装 报错"不如搜索"ros noetic resource not found focal"准确。英文搜索资源往往更丰富,ROS社区沉淀了大量问题解答。
第四步,如果确认自己是在干净环境下严格按照入门教程操作的,但仍然失败,那么大概率是教程本身的兼容性问题。换成官方文档重来一遍,往往能豁然开朗。
ROS的官方文档地址是wiki.ros.org/noetic,安装教程页里有完整的步骤。我自己在遇到问题时,优先看的其实是官方文档里的Troubleshooting部分,那里面的内容虽然不多,但每一条都是经过验证的经典方案。
我自己的体会是,ROS安装的难点从来不在命令本身,而在于环境差异。每个人的网络环境、系统状态、历史操作都不一样,同样的命令在不同机器上表现会千差万别。所以在安装过程中遇到报错,不用过度焦虑,冷静下来,按上面的排查思路走,大部分问题都能定位到根源。
如果你按照这篇博文的步骤完成了安装,并且小乌龟跑起来了,那恭喜你,ROS开发的大门已经打开了。接下来值得做的事就很明确了——找一个小项目练手,比如写一个发布消息的节点,订阅一个传感器的话题,跑通一遍消息通信的流程。等这些基础概念都清楚了,再去看那些复杂的SLAM算法、机械臂控制方案,你会发现自己能看懂的内容越来越多,也就真正进入ROS开发的状态了。