做机器人方向的朋友应该都绕不开ROS这个名字。不管你现在是在学无人机、机械臂还是自动驾驶小车ROSRobot Operating System几乎成了机器人应用开发的标配。这个系列打算从零开始把ROS的学习过程完整记录下来而作为第1篇先解决一件最基础也最劝退的事情在一台干净的Ubuntu 16.04系统上把ROS Kinetic安装好并让官方的小乌龟例程跑起来。Ubuntu 16.04 ROS Kinetic是很多经典教材、论文代码和实验室项目都在使用的组合。我当年第一次接触这套环境时光安装就折腾了大半天键盘敲了一堆命令最后卡在依赖和源的问题上连roscore都起不来。回头看看其实只要理解了安装背后的逻辑整个流程并不复杂但大部分教程只告诉你怎么敲命令没告诉你命令背后的原因一报错就完全懵了。这篇文章会从为什么这个版本组合这么重要讲起一步一步拆解安装原理、核心配置和验证方法最后专门把新手最容易踩的坑列出来。先说一句重要的心里话ROS Kinetic已经在官方生命周期结束后进入停止维护状态如果你是为了学习ROS概念、跑通课程实验、复现已有代码这个组合完全够用但如果是启动全新的商业项目建议直接了解更新的长期支持版本。后面我会专门解释这个取舍的逻辑。现在直接进入正题。1. 版本组合的逻辑为什么是Ubuntu 16.04ROS Kinetic很多新手拿到教程第一反应是直接装最新版不就行了但ROS的生态不像普通App那样新版全面优于旧版。ROS的每个发行版本都和特定Ubuntu系统的系统库版本、Python版本、编译器版本深度绑定。ROS Kinetic Kame发布于2016年目标系统是Ubuntu 16.04 Xenial Xerus两者是官方配对的关系。1.1 ROS版本和Ubuntu版本的绑定关系ROS对Ubuntu的绑定非常严格原因是ROS功能包在编译和运行时依赖底层的系统库比如Boost、OpenCV、PCL、Python版本等。Ubuntu版本变了这些库的版本也会跟着变ROS功能包的二进制包就可能出现依赖冲突而依赖冲突在Linux世界里是最难排查的问题之一。官方对绑定关系的定义很明确ROS发行版对应Ubuntu版本发布时间维护状态Indigo IglooUbuntu 14.04 Trusty2014已停止维护Kinetic KameUbuntu 16.04 Xenial2016已停止维护Melodic MoreniaUbuntu 18.04 Bionic2018已停止维护Noetic NinjemysUbuntu 20.04 Focal2020维护中这张表的实操意义在于你翻开某篇论文或某个开源仓库如果它的代码是在Kinetic上写的那你的Ubuntu系统最好就是16.04强行在18.04或20.04上装Kinetic很大概率会遇到源里找不到软件包、Python版本不兼容、编译报错等一堆问题。我在模拟项目X里就见过有人拿Ubuntu 18.04去装Kinetic折腾了一晚上最后只能重装系统。1.2 这个组合的适用场景与局限性Kinetic这套组合今天依然有价值主要跑在这样的场景一是复现老代码。很多2016-2019年之间的机器人论文代码、比赛代码依赖的就是Kinetic和配套的功能包版本。二是学习ROS 1核心概念。ROS 1的分布式架构、话题通信、服务通信、参数服务器这些概念在Kinetic里体现得非常清晰而且这个版本的资料极其丰富网上随便一搜就是大把教程学习阻力小。三是硬件驱动兼容。不少上一代激光雷达、摄像头、机械臂控制器的驱动包只适配过Kinetic的编译器版本厂商没有再更新。但也要清醒看待它的局限性。第一是软件源已经归档部分二进制包可能要依赖镜像站保留的历史版本才能下载。第二是Python 2的问题。Kinetic时代ROS主力支持Python 2而现在很多新工具链已经全面转向Python 3这会让部分配套脚本显得很老。第三是官方不再提供更新补丁如果做真实产品部署安全和稳定性风险需要自己承担。所以我的建议很直接如果你学习目的是入门和复现就踏踏实实用Ubuntu 16.04 Kinetic如果你确定要跟着新课程从零学一套全新的工具链那就直接考虑更新的版本组合。最忌讳的是教程看多了系统装错了版本不匹配是新手的第一大坑。2. 安装前的准备工作系统环境与软件源安装ROS看起来只是几条命令的事但准备工作其实决定了后面是否顺畅。我说准备工作主要包括系统版本确认、足够的内存和硬盘空间、以及一个能稳定快速下载软件包的软件源配置。2.1 系统基础要求与版本确认ROS Kinetic官方建议使用64位Ubuntu 16.04内存建议2GB以上硬盘剩余空间建议10GB以上。如果你打算后续安装仿真环境、地图构建功能包硬盘最好预留20GB以上因为编译和缓存都会占用大量空间。打开终端先确认你的系统是64位且版本正确uname -m lsb_release -a第一行输出要是x86_64第二行确认Codename是xenial。只要有一个对不上后续安装都会出问题。我见过有人用32位系统硬着头皮装Kinetic结果软件源里找不到对应架构的包直接就是Unable to locate package。另外一个容易被忽略的点是系统语言。turtlesim的显示在某些中文locale下会变成方块乱码这个后面会专门说但如果你能提前在安装时选择英文界面会省掉一个麻烦。当然这不影响安装本身。2.2 更换国内镜像源一份加速配置Ubuntu官方源在国内访问速度不稳定而ROS功能包动辄几百MB如果直接从官方源拉取经常等到怀疑人生。所以安装之前我强烈建议先把Ubuntu的apt源换成国内镜像源。这里以清华镜像源为例。先把官方源备份一份万一以后要恢复也方便sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak然后编辑/etc/apt/sources.list我用的是vim你可以换成自己习惯的编辑器sudo vim /etc/apt/sources.list把文件内容替换为下面的源配置deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted universe multiverse deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted universe multiverse这几行配置分别对应Ubuntu发行版的基础源、更新源、backports源和安全更新源都是日常装软件必需的分支。保存退出后更新一下索引sudo apt-get update注意这时候输入的密码不会显示任何字符这不是键盘坏了是Linux的正常行为直接输入完回车就行。2.3 更新基础软件包源配置好之后顺手把系统现有的软件包更新到最新避免某些基础库版本太老导致ROS依赖解析失败sudo apt-get upgrade这个步骤耗时取决于你的网络和系统情况通常10分钟左右。更新过程中如果出现让选择配置文件如何保留的交互界面一般直接选择保留现有版本即可除非你明确知道要替换哪些配置。我把这一步放在安装之前是因为ROS源里的软件包依赖系统里已有的库和工具如果系统基础包太老安装时apt会尝试一并升级大量依赖容易触发意想不到的冲突。先把基础打稳后面装ROS就顺利很多。3. 核心安装步骤与原理拆解准备工作做完最关键的安装环节来了。很多人照着网上的教程敲命令但不知道每一步在干什么一旦出错就不知道怎么修。我尽量把每条命令的逻辑讲清楚。3.1 添加ROS软件源与密钥ROS官方的软件包并不在Ubuntu默认的源里需要先把ROS的apt源添加到系统中。终端执行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)会自动替换成当前系统的Codename也就是xenial。这样做的好处是脚本不用改来改去换到别的Ubuntu版本时命令也通用。国内访问packages.ros.org有时也不稳定同样可以使用镜像源。原理和我前面换Ubuntu源一样只是把域名换成国内ROS镜像地址。我个人习惯让Ubuntu源走国内镜像ROS源保持官方地址因为ROS官方源在中国大陆还是有比较稳定的访问通道的并且官方源里能第一时间拿到最新版本的功能包。如果你那边实测速度很差可以再用镜像源替换。接着添加ROS源的GPG密钥。这一步的目的是让apt能够验证软件包确实来自ROS官方源防止被篡改sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654密钥的完整编号是C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654这个字符串就相当于ROS官方源的指纹。添加成功后提示里会出现OK字样。有些人在这一步遇到密钥服务器连接超时的问题通常是因为网络对某些端口的访问不稳定。解决的办法比较简单多试几次或者更换一个密钥服务器比如keyserver.ubuntu.com不行就换pool.sks-keyservers.net。但注意不要在网络上随意下载密钥文件来添加那等同于信任一个来历不明的身份证安全风险很大。密钥添加完成后再次更新软件源列表sudo apt-get update这时候你应该能在更新输出中看到packages.ros.org相关的条目说明ROS源已经成功接入了apt系统。3.2 选择安装模式Desktop-Full安装包详解ROS官方提供了几种不同的安装模式新手往往不知道该装哪个。我把主要选项列出来安装包包含内容适合场景ros-kinetic-desktop-fullROS核心机器人常见库仿真工具可视化工具绝大多数学习用户ros-kinetic-desktopROS核心可视化工具不含仿真只做基本验证ros-kinetic-ros-base仅ROS核心通信最小安装嵌入式或极简环境我建议学习用户直接安装第一个sudo apt-get install ros-kinetic-desktop-full这个安装包会带来一大堆好东西ROS核心通信机制、tf坐标变换库、URDF机器人模型解析、常用的传感器驱动、rviz三维可视化工具还有Gazebo仿真器的基础组件。整个安装包体积比较大约1GB多下载需要一些时间。安装过程中apt会自动解析几十个依赖包你不需要一个个手动装。如果你选择了desktop模式而不是desktop-full后面用到Gazebo或某些仿真功能时会遇到找不到功能包的报错那时候再回头补齐会麻烦得多因为依赖关系已经乱了。所以我常说一句话桌面端学习无脑装full版别给自己埋雷。3.3 rosdep初始化与环境变量配置安装完成后下一步是配置rosdep。rosdep是ROS用来解决功能包外部依赖的工具它的作用相当于一个依赖关系管家。很多功能包除了依赖ROS本身的库还依赖系统层面的第三方库rosdep能自动识别并安装这些库。先执行初始化sudo rosdep init rosdep updaterosdep init会下载rosdep的源数据库到系统目录rosdep update则更新本地索引。这两条命令执行后很多功能包才能够在编译前自动安装系统依赖。然后是环境变量配置。ROS命令和执行程序不在系统的默认PATH里需要手动把当前ROS版本的环境设置脚本加载进来。执行echo source /opt/ros/kinetic/setup.bash ~/.bashrc source ~/.bashrc第一行把source命令写入bash的配置文件~/.bashrc这样每次打开终端都会自动加载ROS环境。第二行让当前终端立刻生效。此时可以验证一下ROS环境变量是否正常echo $ROS_DISTRO如果输出是kinetic说明环境变量已经生效。这是一个很有效的自检命令很多网上教程没提但排查问题时会非常有用。3.4 安装常用的ROS开发辅助工具还需要额外安装几个ROS开发时的高频工具包括rosinstall、wstool和build-essential。这些工具分别负责工作空间的批量管理、代码仓库管理和编译基础环境sudo apt-get install python-rosinstall python-rosinstall-generator python-wstool build-essentialpython-rosinstall用于批量安装ROS工作空间里的功能包源码python-wstool用来管理多个git仓库的版本build-essential提供编译所需的gcc/g等工具链。到这里ROS Kinetic的本体安装就完成了。但安装完成不等于能用好还需要用实际例子跑一遍验证安装是否正确这就是下一个小节的内容。4. 安装验证跑通第一个小乌龟例程ROS安装结束后最直观的验证方式就是启动官方自带的小乌龟模拟器。这只乌龟是ROS官方教程里最经典的入门Demo麻雀虽小五脏俱全它能让你快速理解话题通信、节点间数据传递这些核心概念。4.1 启动ROS主节点roscore在正式运行任何ROS程序之前必须启动ROS的核心服务roscore。它提供了节点注册、参数服务器、消息通信等基础功能相当于整个ROS系统的总协调器。打开一个终端输入roscore第一次看到这样的羡慕感是在这里写不下去的... 实际会看到类似这样的输出started core service [/rosout]如果能看到这行说明ROS核心服务已经正常运行。roscore启动后这个终端要保持开着不能CtrlC否则后面所有节点都会断开。很多新手把roscore启动过程和ROS的全部概念混在一起以为ROS就是roscore。其实roscore只是基础设施真正的功能是各种节点带来的。不过初学阶段不用想太多先把这层关系记在脑子里roscore是ROS世界的总闸。4.2 运行turtlesim小乌龟保持roscore运行的终端不动新开一个终端启动乌龟模拟器节点rosrun turtlesim turtlesim_node这时你的屏幕上会弹出一个蓝色背景的窗口中间有一只小乌龟。这只乌龟可以接收速度指令并在窗口中移动和画轨迹。再开一个终端启动键盘控制节点rosrun turtlesim turtle_teleop_key这个终端会进入键盘监听状态使用方向键或WASD控制乌龟方向按上下键前进后退左右键转弯。每按一次键乌龟就在蓝色窗口里动一下拖出一条彩色的运动轨迹。如果乌龟能跟着键盘动说明ROS的节点通信机制已经完整跑通了。这个简单的Demo里其实藏着ROS最核心的通信逻辑turtle_teleop_key节点发布话题turtlesim_node节点订阅这个话题两边的数据通过roscore搭建的通道实时传输。这个模式在后面学习和使用所有ROS功能时都会重复出现。4.3 用常用工具检查系统状态小乌龟跑起来之后我建议再用几个命令行工具检查系统实际状态这些工具以后你会经常用到。新开一个终端先看当前有哪些话题在通信rostopic list输出里会出现/turtle1/cmd_vel、/turtle1/pose、/rosout等话题名称。/turtle1/cmd_vel就是键盘节点发布速度指令的话题/turtle1/pose则是乌龟不断发布自身位置姿态的话题。如果想直接查看话题上正在传输的数据可以运行rostopic echo /turtle1/pose这个命令实时显示乌龟的位置坐标和角度每秒钟刷新多次。当你用键盘指挥乌龟移动时这里的坐标值会跟着变化数据的实时性和流动性一目了然。退出用CtrlC。还能查看整个系统的节点图rqt_graph这会打开一个图形化窗口清晰地展示出节点和话题之间的关系。你会在图上看到teleop_turtle节点通过/turtle1/cmd_vel话题连到turtlesim节点这种可视化的数据流图对理解ROS通信机制帮助巨大后续很多课程和项目都会大量使用rqt_graph来调试节点间的连接问题。到这一步你的ROS Kinetic环境已经验证完毕可以踏踏实实开始后面的学习了。5. 常见问题与排查技巧实录安装ROS的过程中几乎每个人都会遇到几个报错。我把这些年见过最多的、也是我自己踩过的坑集中整理一下方便你遇到了直接对照处理。5.1 apt-get update报错或找不到软件包典型报错信息是Unable to locate package ros-kinetic-desktop-full或者更新时提示The repository ... does not have a Release file这种情况大概率是软件源没有正确添加或者添加后没有执行sudo apt-get update。先检查一下源文件是否生成cat /etc/apt/sources.list.d/ros-latest.list ls /etc/apt/sources.list.d/如果没有源文件重新执行添加源的命令。如果源文件存在但update报错重点关注最后几行输出看看是连接超时还是404错误。404错误通常说明源地址写错了此时对照我上面的格式逐字检查特别是防止引号被复制成中文引号。另外如果之前装过旧版本的ROS或者其它第三方源某些残留的源会和ROS源冲突。最简单的办法是把/etc/apt/sources.list.d/下不需要的.list文件临时改名备份只保留必要的源文件再update试一次。5.2 rosdep init或update失败sudo rosdep init失败的典型提示是ERROR: cannot download default sources list from: https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list这种情况通常是网络无法正常访问该地址导致的。处理方法先尝试重复执行几次等待网络波动过去。也可以稍微等几分钟再试因为这类失败有时是临时的网络抖动。如果长期失败可以考虑检查系统的DNS设置换成更稳定的公共DNS服务器。但有一点必须强调不要为了解决rosdep问题去随便关闭或绕过rosdep。rosdep是ROS依赖管理的重要工具绕开它只会让后面编译功能包时出现更多麻烦。5.3 终端找不到ROS命令输入roscore提示roscore: command not found很可能是环境变量没有加载。先用绝对路径试一下/opt/ros/kinetic/bin/roscore如果这个能运行说明只是环境变量没配置好执行source /opt/ros/kinetic/setup.bash再试roscore正常的话就检查~/.bashrc里是否写入过source那一行。注意echo ... ~/.bashrc如果重复执行会把同一行写入多遍这种重复一般无害但可能会让终端启动时报一些奇怪的变量警告所以如果你看到bashrc里source行很多遍可以手动清理到只剩一行。5.4 小乌龟窗口出现方块乱码turtlesim窗口里的文字在中文环境下经常变成一个个空心的方块看起来像乱码但功能上没毛病就是难看。原因是turtlesim默认使用的字体文件里没有中文位图等宽字型而系统locale又设置为中文。解决方式有两种第一种是临时切换系统的英文语言环境LANGen_US.utf8 rosrun turtlesim turtlesim_node第二种是安装中文字体让turtlesim能显示中文。但实测里很多情况下直接切换语言环境更省事。如果在虚拟机里跑界面UI与实际显示效果可能还会受到虚拟显卡驱动影响那个属于另外的问题了。5.5 安装过程中的其他提醒几点实操经验不是报错但比报错更值得记住第一安装过程中尽量使用官方源或稳定镜像源不要同时混用多个源里手动添加的ROS源因为不同源的软件包版本可能有细微差异混用时长出依赖问题。第二如果你的开发机是虚拟机建议给虚拟机分配至少4GB内存和2个CPU核心否则编译和启动仿真环境时会非常卡。第三系统刚安装完后建议先做一次快照这样万一后面装坏了可以直接回滚到干净状态节省大量重装时间。我还想特别说一句安装ROS最忌讳的是半途而废。很多人安装时报错就烦躁然后四处搜教程一顿乱操作最后把系统搞得更乱。实际上安装ROS的每一步错误信息都明确指向问题了先看报错英文原意再定位到对应步骤一般都能解决。真要解决不了把报错原文复制到社区提问也远比自己瞎试高效。6. 从安装到下一步一个小建议这一篇主要目标是让你把环境跑起来。装好队伍之后你就会发现ROS的学习真正的门槛不在安装而在如何组织一个机器人系统。从下一篇开始我打算聊聊ROS最核心的通信机制——话题与节点用一个最简单的自写Python节点把小乌龟例程里看到的通信逻辑真正变成自己的理解。我个人在实际安装过程中最大的体会是环境配置这种基础工作快的人三五分钟慢的人三五天差别全在遇事不慌按逻辑排查这八个字上。ROS的报错信息是难得的诚实它基本不会误导你只要你愿意耐着性子读一遍。老话说得好装环境是最没有创造性但最磨练耐心的事情之一装成功一次以后后面再遇到任何Linux下的开发环境都会更有底气。希望这篇教程能帮你少走一次我当年走过的弯路。装好以后别急着关窗口多开几个终端按键跑一会儿观察小乌龟的轨迹感受一下ROS的通信节奏这才是这套环境真正有趣的地方。
阅读完成 · 觉得有帮助?