1. 为什么还要折腾 Ubuntu 16.04 加 ROS Kinetic 这套老组合先把结论摆在前面如果你手头有必须跑在 ROS Kinetic 上的老代码、老硬件驱动或者某台工控机、某款激光雷达、某个机械臂的官方 SDK 只认 Kinetic那这套环境你绕不过去。ROS Kinetic 是 2016 年随 Ubuntu 16.04 一起发布的长期支持版本官方支持周期到 2021 年 4 月虽然现在早就过了维护期但在工业现场、教学实验室、老设备二次开发这些场景里它依然活着而且活得挺顽强。我自己这几年帮人收拾过不少这类环境有的是实验室传下来的移动底盘有的是产线上还在跑的 AGV代码里一堆kinetic时代的 API直接迁到 Noetic 会编译报错改起来成本比重新装一套老系统高得多。所以这篇就当作一个完整的实操记录把 Ubuntu 16.04 装 ROS Kinetic 这件事从头到尾讲透包括系统怎么选、源怎么配、依赖怎么补、装完怎么验证、出问题怎么查。适合谁看三类人一是刚进实验室、被导师丢了一台老机器让你先把环境搭起来的同学二是需要复现某篇老论文代码、发现依赖全是 Kinetic 的研究者三是做工业设备集成、必须匹配客户现场环境的工程师。如果你只是想学 ROS 入门我建议直接上 Ubuntu 20.04 加 Noetic别碰这套老古董除非你有明确的兼容性需求。这篇文章会覆盖系统安装的关键选择、ROS Kinetic 的完整安装流程、环境变量配置、工作空间初始化、常见报错排查以及几个我踩过的坑。全程给命令、给参数、给理由你照着抄基本能跑通。2. 装系统前的几个关键决策2.1 为什么是 Ubuntu 16.04 而不是 18.04 或 20.04ROS 的版本和 Ubuntu 版本是强绑定的这是新手最容易忽略的一点。Kinetic 只对应 Ubuntu 16.04XenialMelodic 对应 18.04Noetic 对应 20.04。你不能在 18.04 上装 Kinetic官方源里根本没有对应的包硬装会陷入依赖地狱。所以第一步不是装 ROS而是确认你的系统版本。命令行里敲lsb_release -a输出里Release那一行必须是16.04。如果是 16.04.x 的小版本号也没关系比如 16.04.7都兼容。但如果你手上是 18.04 的镜像别想着差不多能用直接换镜像重装省下来的时间比你折腾依赖多得多。这里有个现实问题Ubuntu 16.04 的官方镜像现在还在旧版本归档里能找到但下载速度可能不理想。我的建议是找国内镜像站的历史版本目录速度会好很多。下载的时候认准ubuntu-16.04.7-desktop-amd64.iso这种命名desktop是带图形界面的server是无界面的。做 ROS 开发基本都要图形界面跑 RViz、Gazebo 这些工具所以选 desktop 版。2.2 虚拟机还是物理机这是个真问题很多人上来就在虚拟机里装图省事。我的经验是学习验证可以用虚拟机实际开发强烈建议物理机或者双系统。原因很直接。ROS 里大量用到网络通信节点之间通过 TCP/UDP 通信虚拟机如果网络模式配成 NAT外部设备比如真实的机器人、传感器可能连不上你的节点。而且 Gazebo 这种仿真工具对显卡要求不低虚拟机里的虚拟显卡跑起来卡得让人怀疑人生。我见过有同学在虚拟机里调 Gazebo帧率低到个位数还以为是代码问题折腾了一整天。如果你非要用虚拟机网络模式选桥接模式让虚拟机和宿主机在同一网段这样外部设备能直接访问。显卡方面VMware 和 VirtualBox 都支持一定程度的 3D 加速记得在设置里打开能缓解一部分卡顿。物理机安装的话建议单独分一个区或者干脆用一块独立的硬盘。双系统的好处是保留原来的 Windows坏处是切换麻烦。如果这台机器就是专门做 ROS 开发的直接全盘装 Ubuntu 最省心。2.3 安装时的分区和用户设置分区这块如果你不熟悉 Linux 分区选清除整个磁盘并安装最省事。但如果要手动分区给根目录/至少 30GB/home可以给大一点因为 ROS 的工作空间、编译产物、数据集都堆在 home 目录下很容易就几十个 G。交换分区swap给内存的 1 到 2 倍就行内存大的话给 8GB 足够。用户设置有个细节用户名和密码尽量用纯英文小写别用中文、别用特殊字符。ROS 的很多脚本和路径处理对中文支持不好用户名带中文会在编译时冒出莫名其妙的编码错误。密码也是虽然理论上支持复杂密码但你在终端里频繁 sudo 的时候简单点的密码能省不少事。安装过程中会问你要不要下载更新、要不要装第三方软件这两个都勾上。第三方软件里包含了一些显卡驱动和媒体解码器对后续跑图形工具有帮助。3. ROS Kinetic 安装的完整流程3.1 配置软件源这一步决定下载速度Ubuntu 装好后第一件事是换源。默认的官方源在国内访问很慢换成国内镜像站能快十倍不止。打开软件和更新在Ubuntu 软件标签页里把下载服务器改成国内的镜像站。或者直接改配置文件sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo gedit /etc/apt/sources.list把里面的archive.ubuntu.com和security.ubuntu.com替换成镜像站地址。改完执行sudo apt update sudo apt upgrade这里有个坑apt upgrade可能会更新内核如果你有特定的显卡驱动更新后可能需要重装驱动。如果这台机器已经配好了显卡驱动可以先只做apt update不急着 upgrade。接下来配置 ROS 的源。ROS Kinetic 的源地址是packages.ros.org同样建议换成国内镜像。执行sudo sh -c echo deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu $(lsb_release -sc) main /etc/apt/sources.list.d/ros-latest.list注意这里的$(lsb_release -sc)会自动替换成xenial也就是 16.04 的代号。如果你手敲的时候写错了代号后面apt update会报 404 错误这是最常见的翻车点之一。3.2 添加密钥并更新软件包索引ROS 的软件包是签名的需要先导入公钥否则 apt 会拒绝安装。命令是sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654这个密钥服务器有时候会连不上如果报超时可以换成hkp://pgp.mit.edu:80再试。密钥导入成功后执行sudo apt update这一步如果看到大量Ign或者Err说明源配置有问题回去检查sources.list.d/ros-latest.list里的地址和代号。如果看到Hit和Get说明正常。提示apt update只更新软件包索引不安装任何东西。真正安装是下一步的apt install。很多人把这两个搞混以为 update 就是升级。3.3 安装 ROS Kinetic 的版本选择ROS 的安装包分几个档次按需选安装包包含内容适用场景体积ros-kinetic-ros-base核心通信库、基础工具服务器、嵌入式、只跑节点约 500MBros-kinetic-desktopbase RViz、rqt 等图形工具大多数开发场景约 1.5GBros-kinetic-desktop-fulldesktop Gazebo、导航、感知等仿真、导航、完整开发约 3GB我的建议是直接装 desktop-full除非你明确知道磁盘空间紧张。原因很简单你迟早会用到 Gazebo 做仿真或者用 navigation 包做导航到时候再单独装这些包依赖关系处理起来更麻烦。一次装全省心。命令sudo apt install ros-kinetic-desktop-full这个下载量不小网速一般的话得等一会儿。安装过程中如果卡在某个包上多半是网络问题可以 CtrlC 中断后重新执行apt 会接着没装完的继续。3.4 初始化 rosdep别跳过这步rosdep是 ROS 的依赖管理工具很多包的编译和运行依赖它来安装系统级依赖。装完 ROS 后必须初始化sudo rosdep init rosdep updaterosdep init会从网上拉一个配置文件这一步在国内经常失败报ERROR: cannot download default sources list。解决办法是手动创建配置文件sudo mkdir -p /etc/ros/rosdep/sources.list.d sudo gedit /etc/ros/rosdep/sources.list.d/20-default.list在里面写入官方源地址然后执行rosdep update。如果rosdep update也超时可以多试几次或者换个网络环境。这个步骤不做的话后面编译工作空间时rosdep install会报错很多依赖装不上。注意rosdep update会把数据缓存到~/.ros/rosdep目录下如果更新成功但后面又报找不到依赖可以删掉这个缓存目录重新 update。3.5 配置环境变量让系统认识 ROSROS 装完后命令行里直接敲roscore是找不到的因为可执行文件不在 PATH 里。需要 source 环境变量脚本source /opt/ros/kinetic/setup.bash但每次开终端都敲一遍太麻烦把它写进~/.bashrcecho source /opt/ros/kinetic/setup.bash ~/.bashrc source ~/.bashrc这样每次打开终端自动生效。验证一下printenv | grep ROS应该能看到ROS_DISTROkinetic、ROS_ROOT、ROS_PACKAGE_PATH这些变量。如果什么都没有说明 source 没生效检查.bashrc里的路径对不对。4. 装完之后的验证与工作空间初始化4.1 跑通第一个 ROS 程序环境配好后先验证核心能不能跑起来。开一个终端roscore如果看到类似started core service [/rosout]的输出说明 ROS 主节点起来了。再开一个终端rosrun turtlesim turtlesim_node应该会弹出一个小窗口里面有一只小乌龟。再开第三个终端rosrun turtlesim turtle_teleop_key在这个终端里按方向键乌龟会动。三个终端配合说明 ROS 的节点通信、话题发布订阅都正常。这套流程是 ROS 界的Hello World跑通了基本就稳了。如果turtlesim窗口没弹出来或者报cannot connect to X server多半是图形环境的问题检查是不是在纯命令行界面下跑的或者 SSH 连接时没开 X11 转发。4.2 创建并编译工作空间ROS 的代码不是随便找个目录放就能编译的必须放在工作空间里。标准结构是catkin_ws/src所有功能包放在src下。创建流程mkdir -p ~/catkin_ws/src cd ~/catkin_ws/ catkin_makecatkin_make会在工作空间根目录下生成build和devel两个文件夹。build放编译中间产物devel放编译好的可执行文件和 setup 脚本。编译完成后source 一下source devel/setup.bash同样建议写进.bashrc但要注意顺序先 source ROS 的 setup再 source 工作空间的 setup。因为工作空间的 setup 会继承 ROS 的环境顺序反了会覆盖掉。echo source ~/catkin_ws/devel/setup.bash ~/.bashrc验证工作空间是否生效echo $ROS_PACKAGE_PATH输出里应该包含/home/你的用户名/catkin_ws/src。4.3 用 rosdep 安装功能包依赖当你从别处拿到一个功能包放进src后先别急着catkin_make。先跑rosdep install --from-paths src --ignore-src -r -y这个命令会扫描src下所有包的package.xml把里面声明的依赖自动装好。--from-paths src指定扫描目录--ignore-src表示忽略已经在 src 里的包-r表示遇到错误继续-y表示自动确认。这一步能省掉大量手动装依赖的时间。我见过有人拿到包直接编译报一堆Could not find a package configuration file provided by xxx然后一个个去搜怎么装其实一条 rosdep 命令就解决了。5. 常见报错与排查实录5.1 安装阶段的典型问题问题一apt update报 404 Not Found原因基本是源地址里的 Ubuntu 代号写错了或者镜像站没有对应版本的 ROS 包。检查/etc/apt/sources.list.d/ros-latest.list里的内容确认xenial拼写正确。如果镜像站确实没有换回官方源packages.ros.org试试。问题二apt-key导入密钥超时密钥服务器不稳定是常态。多试几次或者换服务器地址。如果实在导不进来可以临时用--allow-unauthenticated跳过签名检查但这只是权宜之计不推荐长期这么干。问题三rosdep init报权限错误这个命令必须用 sudo因为要往/etc/ros写文件。如果 sudo 也报错检查/etc/ros目录是不是被别的程序占用了或者磁盘满了。5.2 运行阶段的典型问题问题四roscore启动后马上退出看报错信息常见的是端口被占用。ROS 默认用 11311 端口如果之前有 roscore 没关干净会冲突。用lsof -i:11311查一下把占用进程杀掉或者设置ROS_MASTER_URI换个端口。问题五节点之间通信失败多机通信时最常见。检查ROS_MASTER_URI和ROS_IP这两个环境变量。ROS_MASTER_URI指向 roscore 所在机器的地址ROS_IP是本机地址。两台机器要能互相 ping 通防火墙要放行相关端口。我踩过的坑是主机名解析问题/etc/hosts里没配好导致节点找不到对方。问题六编译时内存不足ROS 编译很吃内存尤其是大型功能包。如果机器内存小于 8GBcatkin_make可能因为 OOM 被杀掉。解决办法是减少并行编译的进程数catkin_make -j2-j2表示同时用 2 个进程编译默认是用所有核心数。核心多但内存小的时候这个参数很关键。5.3 常见问题速查表现象可能原因排查命令解决方向roscore 起不来端口占用lsof -i:11311杀进程或换端口找不到 ROS 命令环境变量没 sourceprintenv | grep ROS检查 .bashrc编译报缺依赖rosdep 没跑rosdep check执行 rosdep install节点通信失败网络配置问题ping对方 IP检查 ROS_IP 和 hostsGazebo 卡顿显卡驱动问题glxinfo装闭源驱动中文乱码locale 没配locale设置 en_US.UTF-86. 几个我踩过的坑和实操心得第一个坑是磁盘空间。ROS 的 desktop-full 加上 Gazebo 的模型库再加上你自己的工作空间编译产物很容易吃掉 20GB 以上。我有一次给虚拟机分了 20GB装到一半磁盘满了apt 报了一堆莫名其妙的错误排查半天才发现是空间问题。现在我的习惯是至少给 40GB宽裕点。第二个坑是时间同步。ROS 的很多功能依赖系统时间如果虚拟机挂起后恢复时间可能和宿主机不一致导致 TF 变换报错。装个ntp或者chrony保持时间同步能避免很多玄学问题。第三个坑是Python 版本。Ubuntu 16.04 默认是 Python 2.7 和 Python 3.5 共存ROS Kinetic 主要用 Python 2.7。如果你自己写的脚本用了 Python 3 的语法在 ROS 里跑会报错。写节点脚本时注意 shebang 写#!/usr/bin/env python对应的是 Python 2。第四个心得是备份环境。环境配好后用虚拟机的快照功能存一个干净状态或者用dpkg --get-selections导出软件包列表。后面折腾坏了恢复起来快得多。我见过太多人把环境搞崩了只能重装一装就是大半天。最后一个建议别在生产环境上做实验。如果你这台机器是要跑实际业务的装 ROS 之前先确认好所有依赖别一边跑业务一边装新东西。apt 升级有时候会连带更新一些底层库把原本正常的程序搞挂。稳妥的做法是先在测试机上验证确认没问题再上生产机。这套环境虽然老但把流程走顺了后面做开发就踏实了。Kinetic 的生态很成熟网上资料也多遇到问题基本都能搜到答案。真正麻烦的是那些资料少、用的人少的组合那才叫折腾。