ROS安装完整指南:Ubuntu 20.04下Noetic从零部署与避坑

📅 发布时间:2026/10/13 22:50:44
ROS安装完整指南:Ubuntu 20.04下Noetic从零部署与避坑
1. 为什么ROS安装值得单独写一篇笔记搞机器人开发的人迟早都会碰到ROS这三个字母。它本质上是一套分布式通信中间件加工具链把机器人上那些零散的传感器驱动、算法模块、执行器控制统一成一种可复用的“节点”结构。你写的每一个功能模块都可以封装成一个节点节点之间通过话题、服务、动作三种方式交换数据谁也不用关心对方跑在哪台机器、用什么语言写的。这套设计放到今天看依然很聪明尤其是当你需要把激光雷达、深度相机、机械臂、底盘控制这些东西拼到一起的时候没有一套统一的通信框架光是接口适配就能把人逼疯。但ROS的安装说实话是劝退新人的第一道坎。它不像装个Python库那样一行命令就完事也不像装个普通软件那样双击下一步。ROS的版本和操作系统版本是强绑定的Ubuntu的每一个发行版几乎都对应着一个特定的ROS发行版选错了就是无尽的依赖冲突。再加上国内网络环境访问官方源的速度问题、密钥配置、环境变量、多版本共存这些细节每一步都可能卡住半天。我见过太多人在安装这一步耗掉一整个周末最后还没跑通一个小乌龟的例程。这篇笔记就是把我自己反复装ROS、帮别人装ROS、在不同机器上装ROS的经验整理出来。目标很明确让你在一台干净的Ubuntu上从零把ROS装好能跑通基本例程并且知道每一步在干什么、为什么这么干。不管你是刚接触机器人的学生还是从嵌入式转过来的工程师只要你想用ROS做点东西这篇内容都能直接照着操作。我会以目前使用最广泛的ROS Noetic搭配Ubuntu 20.04为例来展开同时把版本选择的逻辑讲清楚这样你换别的版本也能自己推导。2. 安装前的整体思路与版本选型2.1 先搞清楚ROS1和ROS2的区别很多人一上来就纠结装ROS1还是ROS2这个问题没有标准答案但有一个判断逻辑。ROS1诞生于2007年经过十几年的发展生态极其成熟网上能找到的教程、开源包、论文配套代码绝大多数都是ROS1的。它的通信基于自定义的TCP协议有一个中心节点叫Master所有节点启动时都要向Master注册。这个设计简单直接但也带来了单点故障的问题Master挂了整个系统就瘫了。ROS2则是从2015年开始重构的底层换成了DDS数据分发服务去掉了中心节点支持实时性和多机通信安全性也更好。但ROS2的生态还在追赶很多经典的功能包要么没有移植要么移植了但文档不全。所以我的建议是如果你的项目依赖大量现成的开源包或者你跟着的教程是老版本的那就老老实实装ROS1如果你是全新项目对实时性有要求或者想面向未来做技术储备那就上ROS2。这篇笔记聚焦ROS1的Noetic版本原因很简单它是ROS1的最后一个长期支持版本支持到2025年稳定性和生态完整度都是最好的。而且Noetic官方支持Python3这对新手来说少了一个大坑早期ROS1版本默认Python2光是处理编码问题就能让人崩溃。2.2 Ubuntu版本和ROS版本的对应关系ROS的每个发行版都和特定的Ubuntu版本绑定这不是随便定的而是因为ROS的二进制包是针对特定Ubuntu版本的库编译的。你可以在Ubuntu 22.04上硬装Noetic但会遇到各种依赖库版本不匹配的问题得不偿失。下面这张表是我整理的常见对应关系建议直接对照选择ROS发行版发布日期支持周期对应Ubuntu版本备注Melodic2018.052023.05Ubuntu 18.04最后一个支持Python2的长期版Noetic2020.052025.05Ubuntu 20.04首个全面支持Python3的ROS1版本Foxy2020.062023.05Ubuntu 20.04ROS2早期长期版Humble2022.052027.05Ubuntu 22.04目前ROS2最推荐的长期版选版本的原则就一条操作系统版本决定ROS版本不要反过来。如果你手头的机器已经装了Ubuntu 20.04那就装Noetic如果是22.04那就装Humble。不要为了装某个ROS版本去降级或升级系统那个成本远高于换一个ROS版本。2.3 安装方式的选择二进制包还是源码编译ROS提供了两种安装方式二进制包apt安装和源码编译。新手一律推荐二进制包原因有三第一快十几分钟就能装完第二稳官方已经帮你处理好了依赖关系第三省心卸载和升级都方便。源码编译适合那些需要修改ROS核心代码、或者要在非官方支持的平台上安装的场景编译一次动辄几个小时而且中间任何一步出错都要从头排查对新手极不友好。我自己的习惯是主力开发机永远用二进制包只有在做特定研究需要改底层的时候才会开一个源码编译的环境。所以这篇笔记的实操部分全部基于apt安装方式。注意安装过程中需要访问官方软件源国内网络环境下建议提前配置好镜像源否则下载速度可能只有几十KB每秒装到一半超时是常事。3. 安装前的系统准备与细节检查3.1 确认系统版本和架构动手之前先确认两件事Ubuntu的版本号和系统架构。打开终端输入lsb_release -a输出里会显示Description和Release确认是Ubuntu 20.04Focal Fossa。然后确认架构uname -m如果是x86_64说明是64位系统可以正常安装。如果是aarch64那是ARM架构比如某些开发板安装方式会有所不同需要额外处理。这一步看起来简单但我遇到过有人拿着Ubuntu 22.04的机器折腾了一下午Noetic最后发现版本根本不匹配白白浪费时间。3.2 配置软件源Ubuntu默认的软件源在国内访问速度不理想建议换成国内镜像。打开“软件和更新”在“Ubuntu软件”标签页里把下载自的地址改成国内的镜像站点。或者直接编辑配置文件sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo sed -i s/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g /etc/apt/sources.list sudo sed -i s/security.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g /etc/apt/sources.list改完之后更新一下sudo apt update sudo apt upgrade这里有个细节apt upgrade可能会更新内核如果你用的是虚拟机或者对内核版本有要求的环境可以先只做apt update等ROS装完再决定要不要升级。我一般会在装ROS之前把系统更新到最新避免因为系统包版本过旧导致依赖冲突。3.3 添加ROS软件源和密钥ROS的软件源不在Ubuntu默认的源列表里需要手动添加。首先是添加密钥这一步是为了验证下载的软件包确实来自官方没有被篡改sudo apt install curl gnupg2 lsb-release curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -如果apt-key提示弃用不用管它在Ubuntu 20.04上依然能用。然后添加软件源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)会自动替换成当前系统的代号比如Focal。添加完之后再更新一次sudo apt update如果这一步报错说找不到Release文件或者密钥验证失败大概率是网络问题或者密钥没导入成功。可以尝试换一个镜像源比如把packages.ros.org换成国内某高校的镜像地址速度会快很多。提示密钥导入失败是新手最常见的卡点之一。如果apt update报“NO_PUBKEY”错误记下错误信息里的密钥ID然后用sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 密钥ID手动导入。4. 核心安装过程与桌面版选择4.1 选择安装包full、desktop还是ros-baseROS的apt包分好几个层级装哪个取决于你的用途ros-noetic-desktop-full包含ROS核心、rqt工具集、rviz可视化、机器人通用库、2D/3D感知和仿真工具。体积最大但最省事新手无脑选这个。ros-noetic-desktop比full少了感知和仿真相关的库适合不需要仿真的场景。ros-noetic-ros-base只有核心通信库和基础工具适合在计算资源受限的嵌入式设备上安装或者你打算自己按需装包。我一般装desktop-full因为rviz和gazebo这些工具迟早要用到与其后面一个个补装不如一次到位。安装命令sudo apt install ros-noetic-desktop-full这个包大概有2GB左右的下载量安装后占用空间在3GB以上所以确保磁盘有足够空间。安装过程中会弹出一些配置选项比如是否启用某些服务默认选择即可。4.2 安装过程中的依赖处理desktop-full会自动拉取大量依赖包包括Boost、Eigen、OpenCV、PCL这些常用的库。正常情况下apt会自动解决依赖关系但如果你之前手动装过某些库的不同版本可能会冲突。遇到依赖错误时先看错误信息里提到的包名用apt-cache policy 包名查看可用版本然后决定是降级还是升级。有一个常见的坑是Python版本冲突。Noetic默认用Python3但如果你系统里同时有Python2和Python3某些包的安装脚本可能会找错解释器。检查一下python3 --version which python3确保python3指向的是系统自带的Python 3.8。如果之前用conda或pyenv改过默认Python建议在装ROS期间先退出这些环境避免路径混乱。4.3 初始化rosdeprosdep是ROS用来管理系统依赖的工具很多功能包在编译前需要用它来安装依赖项。安装和初始化sudo apt install python3-rosdep sudo rosdep init rosdep updaterosdep init会从网上拉取一个配置文件rosdep update会更新本地的依赖数据库。这两步在国内网络下经常超时如果失败就多试几次或者手动配置镜像。rosdep update成功后会显示更新了多少个包的信息看到这个才算完成。注意rosdep init只需要执行一次如果提示“already exists”说明之前已经初始化过了直接执行rosdep update即可。不要反复执行init否则可能覆盖配置文件。4.4 配置环境变量ROS的命令和库不在系统默认路径里需要把环境变量加进去。每次打开终端都要生效所以写进bashrcecho source /opt/ros/noetic/setup.bash ~/.bashrc source ~/.bashrc如果你用的是zsh就改成~/.zshrc。这一步做完之后验证一下printenv | grep ROS应该能看到ROS_DISTROnoetic、ROS_PACKAGE_PATH等变量。如果什么都没有说明source没生效检查一下bashrc里那行路径是否正确。4.5 安装构建工具和依赖最后装几个常用的构建工具后面编译自己的包会用到sudo apt install python3-rosinstall python3-rosinstall-generator python3-wstool build-essential这些工具不是ROS运行必需的但做开发迟早要用。rosinstall用来管理多个源码仓库wstool用来管理工作空间里的包build-essential提供gcc、make这些编译工具。装完之后ROS的安装就算完成了。5. 安装后的验证与首次运行5.1 验证核心命令是否可用打开一个新的终端输入roscore如果看到类似下面的输出说明核心已经正常启动... logging to /home/user/.ros/log/... ROS_MASTER_URIhttp://localhost:11311 process[master]: started with pid [xxxx]roscore是ROS的中心节点所有其他节点启动时都要先连上它。看到它正常输出说明安装没有大问题。按CtrlC退出。5.2 跑通小乌龟例程小乌龟turtlesim是ROS的经典入门例程用来验证话题通信是否正常。打开三个终端分别执行终端1roscore终端2rosrun turtlesim turtlesim_node终端3rosrun turtlesim turtle_teleop_key然后在终端3里按方向键如果小乌龟能跟着动说明ROS的通信机制完全正常。这个例程虽然简单但它验证了节点注册、话题发布订阅、消息传递这一整套流程能跑通就说明安装没问题。5.3 检查环境变量和包路径再确认一下ROS能找到安装的包rospack find turtlesim应该输出/opt/ros/noetic/share/turtlesim。如果报错说找不到包说明ROS_PACKAGE_PATH没设置对回头检查bashrc里的source语句。还可以用rosnode list查看当前运行的节点用rostopic list查看活跃的话题。这些命令在后续开发中会频繁使用现在熟悉一下没坏处。6. 常见问题与排查技巧实录6.1 安装过程中的典型报错下面这张表整理了我遇到过的高频问题以及对应的排查思路报错信息可能原因解决方法E: Unable to locate package ros-noetic-desktop-full软件源没添加成功检查/etc/apt/sources.list.d/ros-latest.list是否存在且内容正确NO_PUBKEY密钥未导入用apt-key adv手动导入错误信息中的密钥IDrosdep update超时网络问题多试几次或配置rosdep镜像源roscore启动后立即退出端口被占用检查11311端口是否被其他程序占用用lsof -i:11311查看rosrun找不到包环境变量未生效重新source bashrc或检查包是否真的安装了6.2 多版本ROS共存的注意事项有时候你需要在同一台机器上装多个ROS版本比如同时有Noetic和Melodic。这种情况下环境变量不能都写进bashrc否则会互相覆盖。我的做法是写一个切换脚本alias ros_noeticsource /opt/ros/noetic/setup.bash alias ros_melodicsource /opt/ros/melodic/setup.bash需要哪个版本就手动source哪个。注意每次切换后要重新打开终端或者手动source因为环境变量是会话级的。6.3 卸载ROS的正确姿势如果装错了版本需要重装卸载要彻底sudo apt remove ros-noetic-* sudo apt autoremove然后把/opt/ros/noetic目录删掉再从bashrc里移除source语句。不删干净的话重装时可能出现文件冲突。6.4 虚拟机安装的额外提醒如果你在虚拟机里装ROS有几个点要特别注意。首先是USB设备直通如果后面要接真实的传感器需要在虚拟机设置里把USB控制器打开否则设备识别不到。其次是显卡加速rviz和gazebo在虚拟机里可能跑得很卡建议分配足够的显存或者干脆用双系统。最后是网络模式NAT模式下虚拟机和宿主机通信没问题但如果你要做多机ROS通信需要改成桥接模式。7. 安装完成后的下一步装好ROS只是起点接下来要做的是建立自己的工作空间。ROS的代码不能随便找个文件夹放必须放在特定的工作空间结构里用catkin工具来编译。标准流程是mkdir -p ~/catkin_ws/src cd ~/catkin_ws/ catkin_make编译完成后工作空间里会生成devel和build两个目录。devel里放的是编译产物和环境变量脚本每次打开终端要source这个工作空间的setup.bash才能找到你自己写的包。我习惯把这一行也加进bashrcecho source ~/catkin_ws/devel/setup.bash ~/.bashrc这样每次打开终端系统ROS和你自己的工作空间都会自动配置好。注意顺序先source系统ROS再source工作空间反过来会被覆盖。工作空间建好之后就可以开始创建自己的功能包了。用catkin_create_pkg命令指定包名和依赖然后往src目录里写代码用catkin_make编译。这个流程我后面会单独写一篇笔记展开这里先把安装这一步彻底搞定。提示如果你打算用Python写节点创建包的时候依赖里加上rospy如果用C加上roscpp。两个都加也没问题编译时会自动处理。8. 我个人在安装环节的几点体会装ROS这件事说难不难说简单也不简单。它不像装个App那样无脑下一步但也没有复杂到需要理解操作系统底层。关键是要有耐心遇到报错不要慌先看错误信息再对照本文的排查表大部分问题都能解决。我自己的习惯是每装完一个ROS环境先跑一遍小乌龟再跑一遍rviz确认可视化工具也能正常工作。rviz的启动命令是rosrun rviz rviz如果它能正常弹出窗口并显示网格说明图形相关的依赖都没问题。这一步很多人会忽略等到后面做项目时才发现rviz打不开又要回头折腾。另外安装过程中产生的日志文件在~/.ros/log目录下如果遇到奇怪的错误可以去那里翻翻日志往往能找到更详细的线索。日志文件会按时间戳命名找最新的那个看就行。最后说一个容易被忽视的点磁盘空间。desktop-full装完之后加上后续编译产生的中间文件一个ROS工作空间很容易占到10GB以上。如果你的根分区比较小建议把工作空间放到单独的数据盘上或者定期清理build和devel目录里不需要的文件。我自己就遇到过因为磁盘满了导致编译失败的情况排查了半天才发现是空间不够。