1. 为什么2024年还有人折腾 Ubuntu 16.04 ROS Kinetic先把结论摆在前面如果你手上没有必须依赖 Kinetic 的存量代码、没有指定要跑在 Ubuntu 16.04 上的老硬件、也没有维护一套已经上线多年的机器人系统那这套组合大概率不该是你的第一选择。但现实情况是很多实验室的工控机、某些型号的移动底盘、一批早期采购的传感器驱动确实还锁死在这个环境里。我见过太多人一上来就装最新版结果驱动编译不过、SDK 只提供 16.04 的 deb 包、厂家技术支持一句“我们只测过 Kinetic”就把你堵回来了。所以这篇内容不是劝你复古而是帮你把“不得不装”这件事一次做对。ROS Kinetic Kame 是 2016 年发布的版本官方支持周期早就结束了它的软件源、密钥、依赖链都停留在那个年代。直接照搬当年的教程十有八九会卡在apt update报错、rosdep init连不上、Python 版本冲突这几个经典坑上。我会把整个安装过程拆成“系统准备—源配置—核心安装—环境验证—常见故障”这条链路每一步都告诉你为什么这么做以及实测中容易翻车的地方。适合读这篇的人有三类一是刚进实验室、被导师丢了一台老机器的新人二是需要复现某篇老论文代码的研究者三是维护存量机器人系统、不敢轻易升级的工程师。如果你属于这三类那接下来的内容能帮你省下至少一整天的排查时间。如果你只是想学 ROS我建议直接上 Ubuntu 20.04 Noetic那套组合的坑少得多社区资料也更新。2. 装系统之前必须想清楚的三个问题2.1 是装双系统、虚拟机还是直接裸机这个问题看起来是安装方式的选择实际上决定了你后面调试的体验。我的建议很明确如果这台机器就是拿来跑机器人的直接裸机装 Ubuntu 16.04。原因在于 ROS 大量依赖串口、USB、网口和实时性虚拟机里 USB 设备透传经常掉线网口桥接也会引入额外延迟调试底盘的时候你会被这些玄学问题折磨到怀疑人生。如果只是学习、跑跑仿真、看看代码那虚拟机完全够用而且更安全。用 VMware 或 VirtualBox 都行分配 4GB 以上内存、40GB 以上磁盘、开启 3D 加速。这里有个细节VirtualBox 对 USB 3.0 的支持在老版本上不太稳如果你要在虚拟机里接激光雷达建议把 USB 控制器设成 2.0虽然慢一点但不容易断。双系统适合既想保留 Windows 办公、又要一定性能的场景。分区的时候给 Ubuntu 至少留 50GB/home单独分一个区这样以后重装系统数据还在。注意 Ubuntu 16.04 的安装器对 UEFI 和 Legacy 引导的处理比较敏感如果 Windows 是 UEFI 启动Ubuntu 也务必用 UEFI 模式安装否则装完可能进不去 Windows。2.2 硬件兼容性里最容易被忽略的两点第一是显卡。Ubuntu 16.04 自带的 nouveau 开源驱动对较新的 N 卡支持很差装完可能黑屏或者分辨率异常。如果你要用 Gazebo 做仿真、或者跑视觉算法建议装完系统后立刻换官方闭源驱动。但注意16.04 的“附加驱动”里推荐的版本可能偏旧新卡需要手动装这一步后面会细说。第二是网卡。有些新笔记本的无线网卡在 16.04 内核里没有驱动装完发现连不上 WiFi。这种情况要么用有线网要么提前准备好对应网卡的驱动 deb 包用 U 盘拷进去。我踩过一次坑一台新机器装完 16.04 完全没有网络最后是靠手机 USB 共享网络临时救急才把驱动装上。所以装系统前先确认你的网卡型号在 16.04 内核4.4 或 4.15里有没有支持。2.3 磁盘分区与系统语言的选择分区方案我一般这么分/给 30GB/home给剩余大部分swap给内存的 1 到 2 倍如果内存 16GB 以上swap 给 8GB 就够。/boot单独分 500MB 到 1GB尤其是用 UEFI 的时候EFI 分区一定要留够不然以后内核更新多了会塞满。系统语言建议装英文。不是崇洋媚外而是中文环境会导致终端里某些路径出现中文、rosdep处理路径时偶尔出问题而且报错信息搜起来也麻烦。装完英文系统后如果需要中文输入法再单独配这样最省心。时区选 Shanghai键盘布局选 English (US)这些都不影响后续使用。3. 配置软件源整个安装里最容易翻车的一步3.1 换国内镜像源的正确姿势Ubuntu 16.04 默认的官方源在国内访问很慢装 ROS 之前先把系统源换成国内镜像。编辑/etc/apt/sources.list把archive.ubuntu.com和security.ubuntu.com替换成镜像站地址。这里要注意16.04 的代号是xenial别手滑写成别的。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换完源之后apt update如果报Release file expired或者404多半是镜像站已经不再同步 xenial 了。这是老版本系统最常见的问题——很多镜像站早就把 16.04 的源下架了。解决办法是换一个还在保留旧版本的镜像或者用官方 old-releases 地址。我实测下来old-releases.ubuntu.com是最稳的虽然慢但至少不会 404。3.2 ROS 源的添加与密钥问题ROS Kinetic 的源地址是packages.ros.org。添加源的标准命令是sudo sh -c echo deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main /etc/apt/sources.list.d/ros-latest.list然后添加密钥。这里就是第一个大坑当年教程里用的apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80现在基本连不上了因为那个密钥服务器早就关了。你会卡在gpg: keyserver timed out上。正确的做法是用hkp://keyserver.ubuntu.com:80或者直接下载密钥文件导入sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654如果还是超时就用 curl 直接拉密钥再导入curl -sSL http://keyserver.ubuntu.com/pks/lookup?opgetsearch0xC1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 | sudo apt-key add -注意这个密钥 ID 是 ROS 官方仓库的签名密钥网上流传的版本有好几个认准F42ED6FBAB17C654这个尾号。密钥导入失败的话后面apt update会直接报NO_PUBKEYROS 根本装不了。3.3 更新时依赖冲突的处理sudo apt update之后如果提示某些包有依赖问题先别急着apt upgrade。老系统升级全量包很容易把内核或者图形驱动搞崩。我的习惯是只更新必要的索引不盲目升级。如果确实需要升级先sudo apt-mark hold住内核相关包避免升级后进不了系统。另外16.04 的apt在处理 HTTPS 源时偶尔会因为证书过期报错。如果遇到Certificate verification failed可以临时用 HTTP 源或者更新ca-certificates包。这些都是老系统的通病心里有数就行。4. 安装 ROS Kinetic 桌面完整版4.1 选哪个安装包ros-base 还是 desktop-fullROS 的安装包分几个档次很多人不看清楚就装结果要么功能不全要么臃肿。简单说安装包包含内容适用场景ros-kinetic-ros-base核心通信库、基础工具服务器、嵌入式、只跑节点ros-kinetic-desktopbase rviz、rqt 等可视化工具一般开发ros-kinetic-desktop-fulldesktop Gazebo、导航、感知等仿真、导航、完整开发新手直接上desktop-full省得后面缺东西再补。命令是sudo apt install ros-kinetic-desktop-full这个包很大下载加安装可能要半小时到一小时取决于网速。安装过程中如果卡在某个包上多半是源的问题检查一下是不是镜像站同步不全。4.2 安装过程中报错怎么读安装时最常见的报错是依赖不满足比如ros-kinetic-desktop-full : Depends: ros-kinetic-xxx but it is not going to be installed。这种一般是某个底层依赖在 16.04 上版本对不上。解决办法是先单独装那个缺失的包看它具体报什么再逐个解决。还有一种情况是磁盘空间不足。desktop-full装完大概占 2GB 到 3GB加上依赖可能更多。如果/分区给得太小装到一半就No space left on device。这时候要么清理空间要么重新分区没有捷径。我个人的经验是装之前先df -h看一眼根分区剩余空间留足 10GB 以上比较稳妥。另外安装过程中不要中断中断后dpkg可能处于损坏状态需要用sudo dpkg --configure -a修复再sudo apt install -f补依赖。4.3 初始化 rosdep 的替代方案rosdep是 ROS 用来管理系统依赖的工具标准初始化命令是sudo rosdep init rosdep update但这两条命令在 Kinetic 上现在几乎必挂。rosdep init会去访问一个国外的 raw 文件地址经常超时rosdep update要拉好几个 yaml 文件也容易失败。我的处理方式是先试标准命令如果rosdep init报ERROR: cannot download default sources list就手动创建目录和文件sudo mkdir -p /etc/ros/rosdep/sources.list.d sudo curl -o /etc/ros/rosdep/sources.list.d/20-default.list https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list如果 curl 也拉不下来就找一台能访问的机器把文件下好拷过来。rosdep update失败的话可以多试几次或者改成本地缓存模式。这个工具在 Kinetic 上确实折腾但导航、仿真这些功能又离不开它所以只能耐心搞定。5. 环境变量配置与安装验证5.1 source 命令该写在哪里装完 ROS 后每次开终端都要source /opt/ros/kinetic/setup.bash才能用roscore这些命令。手动敲太麻烦写进~/.bashrc里echo source /opt/ros/kinetic/setup.bash ~/.bashrc source ~/.bashrc这里有个细节如果你以后要建自己的工作空间工作空间的setup.bash也要 source而且顺序要在系统 ROS 之后。所以~/.bashrc里最好把系统 ROS 的 source 放在前面工作空间的放后面。另外如果你用 zsh 而不是 bash对应的文件是~/.zshrc命令换成setup.zsh。提示不要图省事把source写进/etc/bash.bashrc这种全局文件多用户环境下容易互相干扰而且出问题不好排查。5.2 用 roscore 和小海龟做冒烟测试验证安装是否成功最经典的方法就是跑roscore和小海龟。开三个终端# 终端1 roscore # 终端2 rosrun turtlesim turtlesim_node # 终端3 rosrun turtlesim turtle_teleop_key如果能看到蓝色窗口里出现一只小海龟并且用方向键能控制它移动说明 ROS 核心、通信、消息机制都正常。这一步看着简单但它验证了roscore能启动、节点能注册、话题能通信是整条链路的最小闭环。如果roscore启动报Command roscore not found说明环境变量没生效检查~/.bashrc里的 source 路径对不对。如果小海龟窗口出不来可能是图形驱动问题试试export LIBGL_ALWAYS_SOFTWARE1用软件渲染。如果方向键控制没反应确认终端 3 是不是焦点窗口turtle_teleop_key只接收当前终端的按键。5.3 检查关键依赖是否齐全跑完小海龟再顺手检查几个常用工具在不在rospack find rviz rosrun rqt_graph rqt_graphrviz是可视化工具rqt_graph能画出节点和话题的连接图。这两个能正常打开说明desktop-full装得比较完整。如果rospack报找不到包多半是安装时漏了用apt install补上对应的ros-kinetic-xxx包即可。另外建议装一下python-rosinstall、python-rosinstall-generator、python-wstool、build-essential这几个工具后面建工作空间、编译代码都要用sudo apt install python-rosinstall python-rosinstall-generator python-wstool build-essential6. 那些年我在 Kinetic 上踩过的坑6.1 apt update 报 NO_PUBKEY 的完整排查这个报错我遇到过不下十次表现是apt update最后提示某个 ROS 源的公钥不可用。根因就是密钥没导入成功或者导入的密钥和源不匹配。排查链路是这样的先看报错里的密钥 ID 是多少然后确认这个 ID 是不是 ROS 官方的如果是重新导入如果导入命令超时就换密钥服务器或者用 curl 拉。还有一种隐蔽情况密钥导入了但apt缓存里还记着旧的失败状态。这时候sudo apt clean清一下缓存再sudo apt update就好了。如果还不行检查/etc/apt/sources.list.d/ros-latest.list里的地址是不是写错了比如把xenial写成了bionic那密钥对不上是必然的。6.2 rosdep update 超时的几种绕法rosdep update超时是 Kinetic 用户的老朋友了。它要访问raw.githubusercontent.com和几个 yaml 文件网络稍微不稳就失败。我试过几种办法一是多试几次有时候就是运气问题二是改 hosts 把域名指到能访问的 IP但这个 IP 会变不长久三是找台网络好的机器跑一遍把~/.ros/rosdep目录整个拷过来这是最稳的。具体操作是在能成功的机器上执行rosdep update然后把~/.ros/rosdep/sources.cache和~/.ros/rosdep/sources.list.d打包拷到目标机器的对应位置。这样目标机器不用联网也能用 rosdep。这个方法我在好几台内网机器上都验证过很管用。6.3 Python 版本冲突导致的诡异报错Ubuntu 16.04 默认 Python 是 2.7ROS Kinetic 也主要基于 Python 2。如果你后来手动装了 Python 3 并改了默认指向rosdep、roslaunch这些工具可能就会报语法错误或者模块找不到。表现是明明装好了一跑就SyntaxError或者ImportError。解决办法是确认/usr/bin/python指向的是 Python 2.7而不是 3.x。用python --version看一眼如果是 3.x用update-alternatives切回来或者直接改软链接。ROS Kinetic 时代的东西基本都是 Python 2 写的别跟它较劲顺着它来最省事。6.4 显卡驱动与 Gazebo 黑屏Gazebo 在虚拟机或者驱动不对的机器上经常黑屏、闪退。如果是虚拟机先确认开了 3D 加速如果是物理机检查显卡驱动。N 卡的话装完闭源驱动后 Gazebo 一般就正常了。A 卡在 16.04 上驱动支持一般可能需要用开源驱动加软件渲染。还有一个常见原因是 OpenGL 版本不够。Gazebo 7Kinetic 配套版本需要 OpenGL 2.1 以上。用glxinfo | grep OpenGL version查一下如果版本太低要么升级驱动要么在虚拟机设置里调高图形支持。实在不行就export LIBGL_ALWAYS_SOFTWARE1强制软件渲染虽然慢但至少能跑起来看效果。7. 装完之后该做的几件事7.1 建一个自己的工作空间系统 ROS 装好后实际开发都在自己的工作空间里。标准流程是mkdir -p ~/catkin_ws/src cd ~/catkin_ws/ catkin_make source devel/setup.bashcatkin_make第一次跑会生成build和devel目录。之后每次新建包、改代码都要重新catkin_make并 source。建议把source ~/catkin_ws/devel/setup.bash也写进~/.bashrc放在系统 ROS 的 source 后面。这里有个小技巧catkin_make默认用全部 CPU 核心编译老机器上可能卡死。可以用catkin_make -j2限制并行数或者catkin_make -DCMAKE_BUILD_TYPERelease开优化。编译大工程的时候内存不够也会失败加 swap 或者减少并行数都能缓解。7.2 备份一个干净的快照如果你是在虚拟机里装的装完验证通过后立刻打一个快照。这一步能救命——后面不管你把环境搞得多乱一键就能回到干净状态。物理机的话可以用timeshift或者dd做个系统镜像。我自己的习惯是装完系统、装完 ROS、跑通小海龟之后立刻备份。因为后面装各种驱动、SDK、第三方库很容易把依赖搞乱有个干净快照心里踏实。这个习惯帮我省过好几次重装的时间。7.3 记录你的环境信息最后建议把关键版本信息记下来内核版本uname -r、ROS 版本rosversion -d、Python 版本、显卡驱动版本。以后出问题搜资料、问别人的时候这些信息能帮大忙。尤其是 Kinetic 这种老版本不同小版本之间行为可能有差异把环境说清楚别人才能准确帮你。我在实际维护老系统的过程中最大的体会是老版本的问题八成不是技术难而是资料过期。网上大部分 Kinetic 教程都是 2016 到 2018 年写的里面的源地址、密钥服务器、依赖版本早就变了。所以遇到报错别慌先判断是不是“时代变了”导致的再针对性解决。把源、密钥、rosdep 这三关过了Kinetic 其实很稳跑个几年都没问题。