
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显示的是bionic18.04或者jammy22.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-fullROS核心 rviz 仿真工具 2D/3D感知库 导航栈推荐新手的全功能版ros-noetic-desktopROS核心 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.8python3 --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-toolssudo apt install open-vm-tools open-vm-tools-desktop这个包会改善虚拟机的图形显示性能让rviz的渲染流畅一些。二是在启动rviz时强制使用软件渲染export LIBGL_ALWAYS_SOFTWARE1 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开发的状态了。