
1. 别急着敲命令先想清楚官方源为什么会卡1.1 官方源的痛装过一次的人都懂这几年只要有人问我“ROS装不上去怎么办”我第一反应不是让他重新输一遍命令而是先问他用的是哪个软件源。官方ROS源放在海外服务器上晚高峰的时候apt update那叫一个痛苦满屏红字进度条半天不动偶尔还直接Failed to fetch。最气人的是明明命令一行都没抄错最后却挂在网络等待上。清华源算是国内最老牌、更新最勤的一组镜像之一。它不只是把ROS的软件包同步了一份连Ubuntu系统本身的软件源也有完整镜像。所以想省心就老老实实把两条链路都换上一条是Ubuntu系统源一条是ROS软件源。只换其中一条安装时依然可能卡在依赖下载上。1.2 清华源到底管哪一段系统源和ROS源是两个东西很多人第一次配置时会把“换源”理解成一个动作其实这里有两套源。Ubuntu系统源负责安装ROS的底层依赖比如编译器、CMake、Python、各种库文件配置文件写在/etc/apt/sources.list里。ROS软件源负责安装ros-noetic-desktop-full这类ROS核心包配置文件写在/etc/apt/sources.list.d/ros-latest.list里。清华源对这两套都提供了镜像地址。系统源用https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ROS源用https://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu。先换系统源再加ROS源两条腿都落地后面安装才会顺。1.3 两条路线手动换源和一键脚本网上现在也能看到“鱼香ROS一键安装”之类的脚本确实方便适合想赶紧把环境跑起来的场景。但如果你是在帮别人装机、做批量部署或者之后想排查问题我建议手动配一次清华源。手动配完你才知道每个文件是干什么的以后遇到NO_PUBKEY、404这类报错不会两眼一抹黑。另外一键脚本通常也会把rosdep、环境变量一起处理掉过程对使用者是黑盒一旦生产环境需要复现反而难定位。所以本文就把手动步骤一条条拆开讲。2. 装之前必须确认的版本对应关系2.1 Ubuntu和ROS版本不能乱配对ROS不是一个“随便装在哪版Ubuntu都能跑”的软件它和Ubuntu版本有严格对应关系。版本对不上最典型的症状是添加源之后apt update出现404或者搜索包的时候找不到ros-noetic-*。Ubuntu版本系统代号对应ROS 1版本20.04focalNoetic18.04bionicMelodic16.04xenialKinetic目前ROS 1里维护最活跃、资料最多的是Noetic对应Ubuntu 20.04。如果你手头是22.04官方并没有对应的ROS 1新版本强行按本文安装会踩不少坑。最稳妥的做法是用Ubuntu 20.04的物理机、虚拟机或Docker容器来装Noetic。2.2 三条命令确认系统代号执行下面的命令先确认你的Ubuntu版本lsb_release -a cat /etc/os-release重点关注Codename或VERSION_CODENAME它会输出focal、bionic这类单词。后面配置系统源和ROS源时这个代号会反复用到。如果提示lsb_release不存在可以先装一下sudo apt update sudo apt install lsb-release2.3 先备份随手能回滚改源之前把/etc/apt/sources.list备份一份。不要嫌麻烦配置写错的时候备份就是你最后的后悔药。sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak备份文件后面加一个日期更方便回滚时辨认sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak.$(date %F)3. 系统源切换这是很多人漏掉的前提条件3.1 直接覆盖sources.list用清华源最干净的做法是把原来的sources.list整个覆盖掉。下面以Ubuntu 20.04focal为例把这四行写进文件sudo tee /etc/apt/sources.list /dev/null EOF deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse EOF如果你是18.04就把focal全部替换成bionic16.04则替换成xenial。这里的main restricted universe multiverse是Ubuntu的软件仓库组件universe尤其重要ROS的很多依赖包都在里面。缺了universe后面装ROS时会提示找不到一堆依赖。3.2 用sed替换旧源适合不想大改的场景如果原来的sources.list里有很多自行添加的条目不想整个覆盖也可以用sed把官方域名替换成清华源sudo sed -i s/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g; s/security.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g /etc/apt/sources.list这条命令会把archive.ubuntu.com和security.ubuntu.com一并替换。但替换完最好打开文件看一眼确认没有残留的http://和https://混用问题。我个人的习惯是直接覆盖配置越干净越容易排查。3.3 apt update验证源改完之后执行sudo apt update正常情况下会看到从mirrors.tuna.tsinghua.edu.cn下载索引速度明显比官方源快。如果之前装过ROS但没卸干净这里可能会报错先不用慌继续看后面ROS源的配置最后再统一处理。这里提醒一句apt update通过之后先不要急着apt upgrade。尤其你是在已有业务的机器上操作时升级系统包可能把内核、图形驱动一起带掉概率不高但没必要在装ROS之前冒险。等ROS装完再按需升级。4. ROS源写入与公钥导入命令只有两行坑却不少4.1 写入ros-latest.listROS源要写在独立文件里不建议塞进sources.list这样以后想换回官方源删一个文件就行不用动系统源。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命令里的$(lsb_release -sc)会自动取当前的系统代号比如20.04就是focal18.04就是bionic。这样写的好处是复制到不同版本的机器上都不会错。写完后可以查看一下cat /etc/apt/sources.list.d/ros-latest.list你应该看到类似这样的一行deb https://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu focal main4.2 导入公钥选对keyserverROS软件包都做了GPG签名apt需要信任对应的公钥才能安装否则更新索引时会出现NO_PUBKEY报错。添加公钥的命令是sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654如果keyserver.ubuntu.com网络不稳定可以换成hkp://pgp.mit.edu:80或keyserver.ubuntu.com不带hkp://前缀再试。公钥导入成功后终端会提示gpg: Total number processed: 1之类的内容。4.3 更新后确认ROS源生效公钥导入后再执行一次sudo apt update这次刷新列表时应该能看到 ROS 源被读取。如果看到类似Get:... https://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu focal/main amd64 Packages就说明ROS源已经生效。此时可以用搜索命令验证一下apt-cache search ros-noetic | head -n 10能搜出东西说明源没有问题。如果你在apt update的最后看到403 Forbidden先别怀疑清华源挂了多半是地址写错比如漏了/ros/ubuntu这一段或者把main写成了其他组件。5. 选择完整版还是极简版再动手安装5.1 安装desktop-full如果你是新手目标是学习ROS、跑仿真、做视觉或者机械臂开发直接安装desktop-full版本准没错。它包含ROS核心、Rviz、Gazebo、turtlesim示例、各种常用库一次到位。sudo apt install ros-noetic-desktop-full这条命令会把几百个软件包装进来下载量不小。好在已经换成清华源按我的实际体验时间主要花在磁盘写入和解压上网络不再是瓶颈。5.2 如果跑服务器或只想试试ros-base更合适如果机器配置很紧张或者你只是需要跑一个ROS节点不需要图形界面和仿真可以装ros-basesudo apt install ros-noetic-ros-base它只包含ROS通信框架、launch工具和基础库模块化开发完全够用。等后面需要可视化或者仿真时再单独安装sudo apt install ros-noetic-rviz ros-noetic-gazebo-ros这样按需安装磁盘占用和系统负担都会小很多。5.3 安装完看看装了哪些包安装结束后用下面的命令确认ROS包数量dpkg -l | grep ros-noetic | wc -l如果输出是几十甚至几百说明安装成功了。也可以直接查看某个核心命令是否存在which roscore如果路径里没有输出说明ROS命令还没有被加入当前shell的环境变量下一步就解决这个问题。6. rosdep初始化我选择先跳过理由在这里6.1 rosdep是给源码编译用的不是给apt用户用的官方教程在安装完ROS后会继续执行sudo apt install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential sudo rosdep init rosdep update很多小白在这里被卡到怀疑人生。实际上rosdep的作用是帮你解析和安装“ROS功能包源码编译时需要的系统依赖”。如果你只是用apt install ros-noetic-desktop-full装好的预编译二进制包ROS本体已经把需要的依赖都带上了rosdep在运行demo阶段根本用不上。我见过太多人把时间耗在rosdep update的网络报错上最后发现ROS早就能跑了。所以我的建议是安装阶段先跳过这一步不影响使用。6.2 如果后面编译源码再考虑配rosdep当你之后从源码编译某些功能包时rosdep才真正派上用场。到那时候你可以再执行rosdep init和rosdep update。这两个命令在部分网络环境下确实容易失败因为默认的20-default.list指向海外地址。遇到失败我的处理习惯是先确认当前网络对海外服务器的访问情况多试几次如果一直失败立刻放弃在安装流程里耗时间转而用apt install ros-noetic-xxx手动补齐缺失的依赖如果必须用rosdep就找一篇针对当前Ubuntu版本、当前rosdep版本的国内镜像配置教程把20-default.list里的索引地址换成镜像地址。不要在这一步“死磕”。rosdep只是一个工具不是为了它才装ROS的。6.3 跳过rosdep对后续有什么影响跳过rosdep后常规的ROS开发场景不受影响。roscore、rosrun、rostopic、rviz、gazebo这些命令全部可以正常使用。你唯一会碰到的问题是从源码catkin_make一个功能包时如果它依赖某个系统库而你没有手动安装编译会在find_package阶段报错。这时候再回头补依赖就行。换句话说rosdep是“省事工具”不是“必要条件”。这个问题想通了安装流程能直接砍掉一大半的痛苦。7. 用两只小乌龟证明ROS真的能跑7.1 把setup.bash写进环境变量ROS安装完成后的核心环境变量脚本是/opt/ros/noetic/setup.bash。每次打开新终端都得先source它否则roscore等命令都会提示找不到。最省事的方法是写进~/.bashrcecho source /opt/ros/noetic/setup.bash ~/.bashrc source ~/.bashrc如果你的默认shell是zsh就改成写进~/.zshrc。加载后运行rosversion -d如果输出noetic说明ROS环境变量已经正确加载。7.2 启动三件套roscore、乌龟节点、键盘遥控ROS的“Hello World”是turtlesim小乌龟。开三个终端分别执行终端1roscore终端2rosrun turtlesim turtlesim_node终端3rosrun turtlesim turtle_teleop_key在终端3里按方向键你会发现终端2弹出的蓝色窗口里小乌龟跟着你的按键动起来了。能走到这一步说明ROS核心、节点通信、键盘控制、图形界面全部正常整个安装链路就已经通了。7.3 小乌龟起不来怎么排查如果终端2报错Package turtlesim not found说明desktop-full没有安装成功或者你只装了ros-base可以补装sudo apt install ros-noetic-turtlesim如果roscore能启动但rosrun turtlesim turtlesim_node显示连接超时检查一下环境变量里是否设置了奇怪的ROS_MASTER_URI。全新安装的机器一般不用管这个但如果你之前手动配过多机通信就要清掉。8. 换源后我实际遇到过的报错按踩坑频率排序8.1 apt update 404版本代号对不上这是换源后最常见的报错。终端里出现404 Not Found且URL路径里能看到/dists/或/pool/多半是系统源和ROS源里的代码有问题。检查一遍/etc/apt/sources.list里的代号是否和当前系统一致/etc/apt/sources.list.d/ros-latest.list里的代码是否自动取成了正确值有没有把20.04的源写到18.04机器上用一条命令列出当前所有源再逐一核对cat /etc/apt/sources.list cat /etc/apt/sources.list.d/*.list8.2 NO_PUBKEY公钥没进对地方apt update时如果提示The following signatures couldnt be verified because the public key is not available: NO_PUBKEY C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654说明公钥没有导入成功。重新执行一次sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654如果网络差多试几次或者换pgp.mit.edu服务器。导入后再sudo apt update一般就能解决。8.3 roscore command not found明明装完了但一执行roscore就说找不到命令。这个问题的原因几乎永远是环境变量没有source。一步步排查ls /opt/ros/noetic/setup.bash echo $ROS_DISTRO如果ROS_DISTRO为空说明/opt/ros/noetic/setup.bash没有被加载。回到刚才的.bashrc配置检查一遍。8.4 Python环境串台Anaconda的锅Noetic版本默认使用Python 3。很多人的机器上装了Anaconda并且把conda的环境变量和PYTHONPATH写进了~/.bashrc这会给ROS带来诡异的问题比如rospkg报错、import rospy失败。处理方式很简单在运行ROS的终端里不要激活conda环境。或者调整~/.bashrc的顺序先source /opt/ros/noetic/setup.bash再启用conda。如果问题已经出现先执行echo $PYTHONPATH正常情况下应为空。如果输出了Anaconda的路径清理掉再重新打开终端。8.5 其他零碎问题apt-key提示deprecated这是Ubuntu 20.04对旧式密钥管理的警告不影响安装忽略即可。安装中途断电或强制中断执行sudo apt --fix-broken install修一遍。之前用官方源装了一半想换清华源先删掉/etc/apt/sources.list.d/ros-latest.list再重新按本文配置最后执行sudo apt update。9. 手动换源和一条龙脚本我现在的选择9.1 手动换源适合谁如果你需要反复给多台机器安装ROS或者在公司内网、离线环境里部署手动换源的价值就体现出来了。清华源地址稳定配置过程可复制而且你清楚自己改了哪些文件出问题时能快速回退。相比之下一键脚本会把多个步骤封装在一起虽然省事但脚本一旦更新了行为或者目标机器环境特殊结果就很难预测。9.2 我现在的装机顺序根据这么多次装机的经验我现在的顺序非常固定备份/etc/apt/sources.list把系统源整体换成清华源添加ROS源并导入公钥安装ros-noetic-desktop-full写setup.bash到.bashrc启动小乌龟验证rosdep等真到了源码编译阶段再处理。这套流程在清华源的加持下网络这块基本不会再出幺蛾子。如果你正好卡在某一步按上面的排查清单逐条过一遍应该比盲目重装系统靠谱得多。