
做机器人和自动驾驶方向开发的几乎没有绕开ROS的可能。我用的是Ubuntu 20.04对应版本锁定在ROS Noetic这是ROS1的最后一个长期支持版本官方支持周期一直持续到2025年社区生态非常成熟教程多、坑少特别适合新手入门也适合老手用来快速搭原型。这篇文章是我在虚拟机里完整走了一遍安装流程之后整理出来的从系统检查、软件源配置、核心安装到环境初始化和验证每一步都贴了实际的终端命令和踩坑记录按这个顺序操作下来基本不会出大问题。如果你正好在用Ubuntu 20.04或者正纠结版本怎么选这篇可以直接照着抄。1. 装之前先搞清楚为啥是Ubuntu 20.04 Noetic1.1 ROS版本与Ubuntu版本的对应关系ROS的版本号和Ubuntu的发布节奏是绑定的官方会针对特定的Ubuntu版本提供支持并非任意组合都能用。Ubuntu 20.04对应的是ROS Noetic Ninjemys发布于2020年是ROS1系列的收官之作。后续虽然还有ROS2的Foxy、Galactic、Humble、Iron但它们的架构和ROS1差别很大很多老项目、论文开源代码、工业案例用的还是ROS1而Noetic就是ROS1里面最值得长期使用的版本。TurtleBot、Fetch、UR机械臂这类经典机器人平台的驱动和SLAM算法基本都能在Noetic上找到完整支持。再加上这个版本对Python 3的支持已经非常完善不再像Melodic那样Python 2和Python 3混着来省去了很多切换解释器的麻烦。对于学术研究、课程作业和中小型项目来说选Noetic是目前最稳妥的方案。1.2 我的实际测试环境我这次安装所用的环境是VMware虚拟机建议分配的资源如下至少4GB内存双核CPU硬盘空间30GB以上。因为ROS Noetic的桌面完整版安装包体积很大加上编译工作空间时还会产生大量文件磁盘太小会非常难受。另外如果你的电脑是NVIDIA显卡并且后续想在仿真环境里用GPU加速虚拟机和物理机的性能差距就很明显了建议直接装双系统。不过无论是虚拟机还是双系统Ubuntu 20.04系统本身的安装步骤都不会影响ROS的安装过程只要系统能正常联网后面的大流程一致。装Ubuntu的过程这里不展开讲网上有大量图文教程注意区分UEFI和Legacy启动模式就行。2. 配置软件源先让apt能顺利找到ROS包2.1 更换Ubuntu系统源Ubuntu默认的apt源在国外国内网络环境下访问很慢尤其在使用apt update和后续安装ROS时会频繁超时所以在开始安装ROS之前第一步是把apt源切换到国内镜像。这一步虽然不是ROS安装的必需步骤但直接影响后续体验不做的话很容易卡在下载阶段。我这里以阿里云镜像为例sudo sed -i s/archive.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list sudo apt update如果你的系统是Ubuntu 20.04的某个后续小版本软件源配置文件中可能已经写了某个特定的镜像地址这种情况下建议直接编辑文件。打开/etc/apt/sources.list把里面所有archive.ubuntu.com和security.ubuntu.com替换成mirrors.aliyun.com即可。注意如果你使用清华源、中科大源也可以关键是保持apt源和后面的ROS源尽量在同一个网络环境下减少跨网访问不稳定导致的各种报错。2.2 添加ROS Noetic软件源ROS的软件包并不在Ubuntu官方源里需要手动添加ROS官方的软件源。先执行下面这行命令把ROS源写入到/etc/apt/sources.list.d/目录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 20.04它会输出focal因此最终写入的源地址就是http://packages.ros.org/ros/ubuntu focal main。这种方式比手动写死版本号更可靠复用到其他Ubuntu版本时也不容易出错。如果官方源在你的网络环境下速度不理想可以把packages.ros.org替换为国内镜像源比如清华源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中科大源也是常用选择地址为https://mirrors.ustc.edu.cn/ros/ubuntu。我推荐直接把这一步做了能省掉后面apt update时漫长的等待。2.3 添加ROS源密钥添加软件源后还需要导入公钥否则apt在读取软件包列表时报错。新版Ubuntu推荐使用gpg导入密钥但很多教程直接使用apt-key仍然是兼容的方式sudo apt install curl curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -这一步很可能遇到网络问题导致ros.asc下载失败。解决办法是可以先单独将ros.asc文件下载到本地再导入或者使用sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654这种方式从备用密钥服务器获取。注意apt-key在Ubuntu 22.04之后已被标记为deprecated但在20.04上仍然可以正常工作。追求规范的话也可以使用/etc/apt/keyrings/目录配合signed-by参数不过这个对新手来说复杂一些建议按上面的方式操作。完成密钥导入后执行sudo apt update。正常情况下更新列表会出现大量ros-noetic开头的软件包信息说明ROS源已经生效。3. 正式安装ROS Noetic完整命令一步步来3.1 安装桌面完整版ROS Noetic提供多种安装模式常见的有ros-noetic-desktop-full、ros-noetic-desktop和ros-noetic-ros-base。如果你想用Gazebo做仿真、用RViz做可视化、用MoveIt做机械臂规划那就直接安装desktop-full它包含所有常用功能包、插件和可视化工具对新手来说最省心。sudo apt update sudo apt install ros-noetic-desktop-full这一步下载量很大通常在2GB到3GB之间具体取决于网络速度。安装过程中会询问是否继续输入y回车即可。如果你的网络条件一般建议在终端前盯着一旦卡在下载界面不要贸然按CtrlC可能是网络减速多等一会会有进展。确实长时间无响应时可以按CtrlC取消然后更换为国内源再执行一次。安装完成后可以在/opt/ros/noetic/目录下看到完整的文件结构包括bin、lib、share等子目录这代表ROS主体程序已经就绪。3.2 安装常用的Python依赖和构建工具ROS Noetic是ROS1中全面转向Python 3的版本因此还需要安装一些常用的构建工具和依赖库否则后续创建工作空间和编译代码时会缺这缺那sudo apt install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential其中build-essential会安装GCC、G、make等基础编译工具链虽然Ubuntu系统可能自带但显式安装一次更保险。rosinstall和wstool是用于管理多包源码的工具在拉取第三方功能包源码时很常用。4. 环境变量与依赖初始化这一步漏了后续全乱4.1 初始化rosdep很多新手在这里直接卡住后续运行rosdep命令时会报各种错误。rosdep是ROS的依赖管理工具它能够自动解析功能包所依赖的系统库和其他ROS包在编译源码、安装第三方包时几乎是必需的。先执行初始化sudo rosdep init rosdep updaterosdep init会在/etc/ros/下创建rosdep的源配置目录并把rosdistro的默认源列表写入文件。如果这一步报错例如提示ERROR: cannot download default sources list from https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list大多是网络访问不稳定所致解决办法我在第6部分详细列出。这里先提醒一点不要使用sudo rosdep update后续会解释为什么。4.2 配置用户环境变量ROS安装完成后需要让每个终端打开时自动加载ROS的环境变量echo source /opt/ros/noetic/setup.bash ~/.bashrc source ~/.bashrcsetup.bash文件位于/opt/ros/noetic/下它设置了ROS_ROOT、ROS_PACKAGE_PATH、CMAKE_PREFIX_PATH等一系列环境变量。如果没有source这个文件运行roscore会提示找不到命令。如果你用的是zsh而不是bash则对应修改~/.zshrcecho source /opt/ros/noetic/setup.bash ~/.zshrc source ~/.zshrc4.3 创建工作空间ROS中的代码都组织在“工作空间”workspace中最常用的是catkin工作空间。创建一个自己的catkin_ws是后续开发任何功能包的起点mkdir -p ~/catkin_ws/src cd ~/catkin_ws/ catkin_make source devel/setup.bashcatkin_make第一次运行时会创建一个devel目录里面存放编译生成的可执行文件和setup脚本。如果这一步出现python: cant open file /usr/bin/catkin_make类似错误说明catkin工具没有安装完整可以手动补装sudo apt install ros-noetic-catkin装好之后重新执行catkin_make即可。编译完成后再把工作空间的环境变量加入bashrcecho source ~/catkin_ws/devel/setup.bash ~/.bashrc source ~/.bashrc这里有个很容易踩的坑如果既source了系统ROS的setup.bash又source了工作空间的setup.bash顺序不要搞反工作空间的优先级应该更高所以在.bashrc里工作空间的source命令要放在/opt/ros/noetic/setup.bash之后。5. 装完怎么验证用一只小乌龟跑通全流程5.1 测试roscore验证安装是否成功最直接的方法是启动ROS的主节点管理器roscoreroscore如果一切正常终端里会显示类似下面这样的信息started core service [/rosout]这代表ROS主节点已经运行起来。这里需要注意roscore启动后这个终端会一直占用不要关掉它接下来需要新开终端执行其他命令。5.2 启动Turtlesim小乌龟Turtlesim是ROS自带的仿真节点用来测试ROS通信机制再合适不过。新开一个终端运行rosrun turtlesim turtlesim_node屏幕上会出现一个蓝色背景的窗口窗口中央是一只小乌龟。再新开一个终端运行rosrun turtlesim turtle_teleop_key此时用键盘上的方向键控制乌龟移动如果乌龟实时响应说明ROS的核心通信机制已经完全跑通。还可以在第三个终端中运行rostopic list查看当前所有活跃的话题用rostopic echo /turtle1/pose查看乌龟实时坐标直观感受ROS节点间基于话题topic的松耦合通信方式。5.3 测试RViz和Gazebo如果安装了desktop-fullRViz和Gazebo应该已经存在。运行下面的命令快速验证rosrun rviz rviz这个命令启动后会在左上角看到版本号。同样的方式可以启动Gazeboroslaunch gazebo_ros empty_world.launch这一步会打开一个空的世界环境第一次启动可能较慢因为需要加载大量模型库和插件耐心等即可。Gazebo环境是后续做机器人仿真、SLAM测试的常用工具能正常打开就说明常用组件没问题。6. 安装中遇到的坑问题现象、排查思路、解决办法6.1 rosdep init失败这是出现频率最高的问题具体现象为ERROR: cannot download default sources list from: https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list Website may be down.原因基本确定是网络无法稳定访问raw.githubusercontent.com。我试过两种有效对策。第一种手动下载20-default.list文件并放到指定位置。先从能访问的源获取该文件内容保存到本地然后执行sudo mkdir -p /etc/ros/rosdep/sources.list.d/ sudo cp ~/下载/20-default.list /etc/ros/rosdep/sources.list.d/ sudo rosdep fix-permissions第二种使用国内一些开源爱好者维护的rosdepc工具这个项目提供与rosdep相同功能的国内可用版本可以直接用Python的pip安装pip3 install rosdepc sudo rosdepc init rosdepc update日常使用中用rosdepc install命令替代rosdep install即可效果基本一致。这种方式省时省力尤其适合国内网络环境下快速解决依赖问题。我个人的实际使用体验是rosdepc经过团队持续维护对Noetic的支持也比较完善。6.2 rosdep update卡住不动即便rosdep init成功rosdep update也可能长时间停在没有反应或者会在某个包列表上反复重试。现象往往是这样reading in sources list data from /etc/ros/rosdep/sources.list.d/20-default.list Hit https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/base.yaml ...base.yaml、python.yaml这些文件都在GitHub上网络环境不稳定时自然慢。如果不想换工具可以修改/etc/ros/rosdep/sources.list.d/20-default.list中的URL把其中所有raw.githubusercontent.com/ros/rosdistro/master前缀替换为可访问的镜像地址例如gitee.com上的rosdistro镜像。替换后重新执行rosdep update速度会明显改善。6.3 不要用sudo rosdep update很多教程为了绕过权限问题直接写sudo rosdep update这会在实际使用中埋坑。原因是root用户的HOME目录和普通用户的HOME目录不同rosdep执行时会访问$HOME/.ros/rosdep目录用root执行后生成的缓存文件归属root后续普通用户再执行rosdep或运行某些功能包时会遇到权限报错。如果你已经用root执行过处理办法是删除当前用户的~/.ros目录后重来rm -rf ~/.ros rosdep update如果提示Permission denied可以检查一下~/.ros目录下的文件属主必要时用sudo chown -R 用户名:用户名 ~/.ros改回权限。6.4 安装时网络中断apt残留锁文件安装ros-noetic-desktop-full时如果你按CtrlC中断了下载再次运行apt命令时可能提示E: Could not get lock /var/lib/dpkg/lock-frontend这是apt进程残留导致的。处理方法是sudo killall apt apt-get sudo rm /var/lib/dpkg/lock-frontend sudo dpkg --configure -a sudo apt update sudo apt install ros-noetic-desktop-full个人建议尽量不要在安装过程中频繁中断这类问题虽然能解决但容易破坏dpkg的依赖状态。6.5 catkin_make时找不到Python解释器在某些环境中系统可能同时存在Python 2和Python 3导致catkin编译时出现Python版本混乱的报错。Ubuntu 20.04默认的python命令可能指向Python 2但ROS Noetic基于Python 3需要显式指定catkin_make -DPYTHON_EXECUTABLE/usr/bin/python3如果这个报错频繁出现建议检查一下python3软链接是否存在。多数情况下安装了python3-rosdep、python3-catkin-pkg等包后问题自然解决。6.6 常见问题速查表问题现象主要原因解决办法sudo rosdep init报错cannot download网络无法稳定连接GitHub手动放置配置文件或使用rosdepcrosdep update长时间无反应默认源访问慢替换源地址为国内镜像或使用rosdepcroscore: command not found没有source setup.bash检查.bashrc并重新source无法启动turtlesim窗口缺少桌面完整版图形支持安装ros-noetic-desktop-fullapt更新时提示缺少公钥密钥未正确导入使用apt-key adv重新导入编译时提示找不到某个功能包未安装对应ROS包或未source工作空间sudo apt install ros-noetic-包名检查source顺序6.7 卸载ROS的方法如果哪天需要彻底清理ROS环境或者安装失败不想折腾了可以按下面的步骤卸载sudo apt purge ros-noetic-* sudo rm -rf /etc/ros sudo rm -f /etc/apt/sources.list.d/ros-latest.list sudo apt autoremove提醒一句复制粘贴这个命令时要小心特别是ros-noetic-*前面的purge参数它会删除所有以该前缀开头的ROS软件包同时清理公共配置。操作前先确认自己的个人代码已经备份到工作空间外部。7. 装好之后一些实际使用建议ROS环境搭好不是终点而是起点。很多读者后续会碰到的典型需求我在标题相关的搜索热词里也看到了比如ORB-SLAM3部署、Cartographer建图、海康相机驱动、机械臂控制等这些项目都要在ROS环境正常的基础上再做二次开发。因此建议在开始这些项目之前先把ROS的核心机制弄透。7.1 先跑一遍官方示例除Turtlesim外ROS还自带很多示例包。可以运行roslaunch ros_tutorials turtlesim turtle_sim_demo.launch这类演示也可以下载turtlebot3仿真包在Gazebo里跑一个小车导航仿真。这个过程会涉及URDF建模、TF坐标系、激光雷达数据和/cmd_vel速度控制比单纯看教程理解快得多。7.2 养成source环境变量的好习惯多终端操作时每个新打开的终端都要确认环境是否正常出现command not found时第一反应不应该是重新安装ROS而是检查echo $ROS_DISTRO是否显示noetic。没有的话就手动source /opt/ros/noetic/setup.bash再检查.bashrc中的source命令是否被注释掉了。7.3 学习几个高频命令rospack find可以查看某个功能包的路径roscd可以直接进入功能包目录rosnode list和rostopic list可以检查当前运行的节点和话题rqt_graph可以可视化节点之间的通信连接。这些命令在后续做SLAM、机械臂控制时每天都会用到值得花点时间先熟悉。7.4 善用一键安装脚本提速如果你看了上面整个流程仍然觉得繁琐也可以考虑用鱼香ROS社区维护的一键安装脚本它在国内网络环境下做了大量适配wget http://fishros.com/install -O fishros . fishros执行后会弹出交互菜单选择ROS一键安装脚本会自动完成软件源切换、密钥导入、rosdep初始化等步骤。但我的个人看法是手动安装至少要走一遍原因不只是理解原理更重要的是遇到报错时你知道去改哪个文件脚本成功安装完后出问题反而容易束手无策。最后再分享一点小经验我前后在不同机器上装过很多次ROS Noetic最深的体会就是网络环境决定安装的顺利程度而安装过程中的大多数报错都出在rosdep和环境变量上并非ROS本体有什么大坑。只要把软件源切好、密钥导入成功剩下的就是等待下载而已。真正花时间的反而是后续把摄像头、激光雷达、机械臂这些硬件接入ROS的过程。装好环境的第一个礼拜我不建议急着去跑别人的SLAM算法包应该先从写好一个最简单的talker和listener节点开始明白ROS节点之间如何发布和订阅消息再逐步深入到仿真、建图和导航。这样后面分析问题会清晰得多。