ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

一行命令搞定ROS安装:鱼香ROS一键安装全解析

一行命令搞定ROS安装:鱼香ROS一键安装全解析 搞了两天没搞定的事小鱼用一行命令帮你做完了。先说说我自己的经历。最开始学ROS的时候我自己手动装ROS Noetic光配置源、处理依赖冲突、等编译就折腾了一个周末。装完了还有一堆环境变量要设置更别提中间还遇到好几次下载包到一半就断开的情况。后来在群里看到有人用了鱼香ROS的一键安装抱着试试看的心态在自己电脑上重装了一遍从头到尾十几分钟中间只需要回答几个交互问题剩下的事情全都自动化处理了。这篇文章就来说说鱼香ROS一键安装这个工具它到底帮你做了什么为什么要这样装完整实操过程是什么样以及装了这么多次之后我自己总结出来的避坑经验。不管你是刚接触ROS的新手还是之前在手动安装上栽过跟头的老手只要目标是把ROS快速、干净地跑起来这篇内容应该能帮到你。1. 为什么说ROS安装是一道“劝退关”1.1 原生安装路上的“五座大山”先别急着跑那条命令我觉得有必要先讲清楚ROS安装之所以劝退了那么多人真不是大家动手能力差而是原生安装这条路本身就布满了雷。我把它总结成“五座大山”。第一座山是系统版本匹配。ROS不是一个独立运行的软件它和Ubuntu版本、内核版本、Python版本深度绑定。ROS 1 Noetic需要Ubuntu 20.04ROS 2 Humble要求Ubuntu 22.04如果你拿一个Ubuntu 18.04去装Noetic第一步就会在添加软件源的时候得到一堆404因为官方源里根本没有对应的包。很多人一开始就倒在这一步装之前根本没意识到操作系统和ROS版本之间是强绑定关系。第二座山是软件源问题。ROS默认的软件源是官方源在国内网络环境下下载速度经常只有几十KB/s。ROS整个生态装下来要拉取的包数量非常多动辄几百个光是等待下载就足够让人崩溃。手动安装的办法是把源替换成国内镜像但不同发行版的镜像源写法不一样Ubuntu源和ROS源的配置又是两套体系写错一个地方后面全盘皆输。第三座山是依赖地狱。ROS底层依赖Boost、OpenCV、Eigen等一大堆第三方库还会依赖Python的不同版本。安装过程中经常会出现某个依赖版本冲突apt告诉你“需要 foo 但是将安装 bar”这时候绝大多数新手是一脸懵的。手动装的话你得自己一个个去查、去调搞不好还会把系统里原来好好的包给升级坏掉。第四座山是编译时间。如果走源码编译的方式装ROS光编译核心功能就要几十分钟到一个多小时电脑性能弱一点的话两个小时都正常。而且编译过程中一旦报错排查起来非常耗时日志里几百上千行输出根本不知道该看哪一行。第五座山是环境变量配置。就算你千辛万苦把包都装好了还要手动配置ROS的环境变量包括source各种setup.bash设置ROS_MASTER_URI、ROS_HOSTNAME等。很多人装完ros跑roscore报错说找不到命令十有八九就是环境变量没配好。这五座大山叠加在一起就是很多人学ROS卡住的第一道坎。1.2 ROS版本与Ubuntu系统的匹配关系这里单独拉一节出来说因为版本匹配问题真的是最容易被忽略的。我见过太多人上来就问“我能不能在Ubuntu 22.04上装ROS Noetic”这句话本身就是个坑。ROS 1的最后版本是Noetic官方规定的首选系统是Ubuntu 20.04ROS 2目前的主力长期支持版本是Humble对应Ubuntu 22.04。除了这几个还有一些过渡版本比如ROS 2 Foxy对应Ubuntu 20.04。我把比较常见的对应关系整理成一张表方便你参考ROS版本对应的Ubuntu版本支持状态适用场景ROS 1 NoeticUbuntu 20.04维护期快结束老教学项目、论文复现ROS 2 FoxyUbuntu 20.04已停止维护ROS 2学习过渡期ROS 2 HumbleUbuntu 22.04长期支持LTS最推荐的学习版本ROS 2 IronUbuntu 22.04短期支持尝鲜新特性为什么会有这种绑定关系因为ROS的二进制包都是针对特定Ubuntu发行版编译的底层链接的库版本不一样换个系统就可能加载失败。这一点很像手机App对Android版本的要求低版本系统装不了新版App强行装也会闪退。所以在选型的时候我的建议很直接如果你是全新开始直接选Ubuntu 22.04加ROS 2 Humble这套组合是当前时代的主流社区资料多官方支持周期也长。如果你是在校学生、需要复现很多教材里的ROS 1例子那就用Ubuntu 20.04加ROS 1 Noetic这个组合目前还有大量课程在用。顺便说一句如果你以后想做Gazebo仿真版本匹配更要慎重Gazebo 11配Noetic、Gazebo 11或Ignition配Humble都是常见组合一块选好能省很多事。1.3 前期手动安装踩过的真实教训手动安装ROS的教程网上多得是但为什么成功率不高因为教程往往默认你的环境是“干净”的而现实里的Ubuntu环境往往用了一阵子、装过一些别的东西。比如你之前装过Anaconda把系统的Python指到了conda环境再去装ROS非常容易遇到模块路径混乱的问题比如你装过OpenCV的另一个版本ROS编译的时候检测到版本不对直接报错再比如你之前在软件源列表里改过源跟ROS源混在一起后apt update直接报公钥错误。我自己手动装翻车最惨的一次是在一台Ubuntu 20.04上装Noetic装完之后创建空工作区也报一堆找不到头文件。后来查来查去发现是之前装某个深度学习框架的时候把系统里关键的编译工具链给影响到了。这种问题你让新手去排查真的就是在劝退。而一键安装工具为什么能规避这些因为它自己有一套完整的依赖检查和处理流程后面我详细展开。简单说把专业运维做的事交还给脚本成功率自然就上来了。2. 鱼香一键安装一条命令背后的门道2.1 一行命令拆开来看到底干了什么第一次看到鱼香的安装命令很多人会觉得玄乎就一行wget加一个source怎么能搞定那么多事其实这一条命令只是一把钥匙真正的核心是它拉下来的那个脚本。wget http://fishros.com/install -O fishros . ./fishroswget把服务器上的安装脚本下载到本地命名为fishros符号表示前面的命令成功执行后才执行后面. ./fishros是用source方式在当前shell中执行脚本。为什么用source而不是直接bash执行这一点很关键source会在当前shell进程里执行脚本这样脚本里设置的环境变量能保留下来。如果换成bash fishros脚本在子进程里跑完环境变量就丢了最终等于白装。下载下来的这个脚本本身是个终端菜单程序。运行后会弹出一个交互选择界面让你选择要安装的内容例如ROS 1、ROS 2、Gazebo、常用工具和依赖库甚至还有嵌入式开发板相关的配置。选完编号后面就是脚本自动清理旧配置、自动切换镜像源、自动调用apt安装依赖包整个过程基本不用人盯。这背后的设计思路其实就是把“人工配置流程”翻译成“自动执行流程”。资深开发者手动安装时做的事情脚本都会做检查系统版本、配置apt源、安装ros-key、更新源、批量安装ROS核心包、初始化rosdep、设置环境变量。只不过脚本把这些步骤固化了还做了很多人容易漏掉的容错处理。用一句话总结就是手动装ROS是在做系统运维而一键安装是在使用一个成熟工具。2.2 核心能力拆解换源、依赖、版本、rosdep鱼香安装工具最核心的几个能力我逐一拆开说。第一个是自动换源。脚本会检测你当前的系统版本然后自动把ROS源和apt源配置成国内镜像这一步解决的就是前面说的“软件源”问题。镜像源配置完成之后下载速度能有非常明显的变化我自己实测从几十KB/s提升到几MB/s这个差距在实际安装体验上是天壤之别。当然它也支持手动指定源适合一些特殊网络环境。第二个是依赖管理。ROS安装过程中需要处理大量依赖脚本内置了对不同Ubuntu版本、不同ROS版本的依赖关系清单遇到缺的依赖会直接用apt补齐。它还能处理一部分常见的冲突比如检测到你已经装过某些版本的库导致冲突时会先提示你处理还是强制覆盖。这一点对不熟悉apt依赖机制的新手尤其友好。第三个是版本选择。脚本支持安装ROS 1和ROS 2的多个版本你不需要自己记哪个版本配哪个Ubuntu系统菜单里会有清晰提示。菜单会显示当前系统适合装哪些版本比如识别到Ubuntu 20.04就会推荐Noetic和Foxy识别到Ubuntu 22.04就会推荐Humble和Iron基本上不会给你选错的机会。第四个是rosdep初始化。rosdep是ROS里用来管理依赖的包管理器很多手动安装教程会在这里卡住因为rosdep update在国内网络环境下经常超时。鱼香脚本会帮你配置rosdep的源并执行初始化成功率对比手动操作提升非常明显。这一点很多从手动安装转过来的用户会特别有感触因为以前卡得最久的就是这一步。2.3 一键安装与手动安装的对比我从自己的体验出发把两种方式做一个实际对比这样你理解起来更直观对比维度手动安装鱼香一键安装需要提前了解版本匹配知识必须否则寸步难行不需要菜单会提示软件源配置手写源文件容易出错自动检测并配置镜像依赖冲突处理自己排查难度极大脚本自动处理常见冲突全程耗时以Noetic为例2-6小时看网络情况5-15分钟新手平均成功率很低反复翻车非常高基本一次过环境变量配置手动source容易漏自动写入bashrc排错成本极高日志难读选项清晰可重跑脚本这个表格不是说手动安装一无是处。如果你之后想做ROS相关的深度开发手动装一遍能让你对系统结构有更深的理解但那是“学习”阶段该做的事不是“使用”阶段该做的事。工具存在的意义就是把人从繁琐的重复劳动里解放出来把精力留给真正重要的机器人开发本身。3. 完整实操记录从零到ROS跑起来3.1 环境准备虚拟机、双系统与最低配置在真正跑一键安装之前先搞定运行环境。这里分两种情况说。如果电脑性能还可以内存16G以上硬盘有足够剩余空间直接用虚拟机装Ubuntu是很省事的选择。虚拟机的好处是不影响主系统想删就删适合新手反复折腾。我自己在VMware和VirtualBox里都试过Ubuntu 22.04虚拟机里跑ROS 2 Humble完全没问题。虚拟机设置里给Ubuntu分的内存建议8GCPU核数至少2个磁盘建议60G起。别嫌给得大ROS装完、再加Gazebo和几个仿真包轻松吃掉二十几个G留出余量后面才不焦虑。如果是深度学习方向需要GPU加速那就建议双系统。虚拟机里用NVIDIA的GPU做ROS加深度学习仿真会非常痛苦驱动和Cuda都要额外处理性能也打折扣。双系统安装稍微复杂但装完之后运行ROS和Gazebo的体验会顺滑很多。至于双系统怎么装网上教程很多注意Ubuntu分区的时候给根分区和home分区留足空间就行。很多人问最低配置到底要多低。给一个我实测过的大致门槛CPU i3级别及以上内存4G起步硬盘剩余30G以上。低于这个配置跑小乌龟和Rviz勉强可以但要跑Gazebo仿真或者SLAM建图就比较吃力了。如果你手头就是这么一台机器也先不用气馁ROS学习初期的很多基础概念在小乌龟和Rviz里就能掌握等后面需要重仿真了再想着换机器。3.2 交互式安装全程实录环境准备好之后整个安装流程就是下面这些步骤。我在一台Ubuntu 20.04的全新虚拟机里实际跑了一次下面就是当时的完整过程。第一步打开终端确认系统能联网然后执行安装命令wget http://fishros.com/install -O fishros . ./fishros第一次执行的时候wget会显示下载脚本的进度条脚本不大几百KB左右网络正常几秒钟就下载完了。下载完成后自动进入脚本界面。第二步脚本会检查你的系统版本。看到类似下面的输出说明检测通过了[INFO] 检测系统版本: Ubuntu 20.04.6 LTS [INFO] 检测系统架构: x86_64如果系统不是Ubuntu或者版本太老脚本会给出提示并中止。这一步可以避免很多人瞎装的问题版本不对直接拦住而不是装到一半才报错。顺便提一句树莓派、Jetson这种ARM架构设备脚本也有对应适配但选项会有所不同这里就以x86的Ubuntu为例。第三步出现选择菜单大概长这样请选择要安装的内容 1. ROSROS 1 发行版如 Noetic 2. ROS 2ROS 2 发行版如 Humble 3. Gazebo仿真环境独立安装 4. 基础工具与依赖库 ... 请输入对应的数字这里输入1进入ROS安装然后脚本会让你继续选择具体版本。如果刚才检测到的是Ubuntu 20.04它会推荐Noetic如果是Ubuntu 22.04则会推荐Humble。我当时选择的是Noetic因为要配合课程里的ROS 1教程。如果你想学ROS 2输入2之后选择Humble即可。第四步选择安装模式。通常会有“桌面完整版”和“基础版”两种桌面完整版会包含Rviz、Gazebo、各种可视化工具和常用功能包占用空间大一些基础版只有核心功能适合对体积敏感的场景。新手我建议直接选桌面完整版因为后面做仿真、可视化几乎一定会用到Rviz和Gazebo后面单独补反而麻烦。第五步脚本自动开始配置源、更新源、安装依赖包。这个过程终端会滚动输出大量日志你要做的就是等。我当时实测Noetic完整版下载加安装大概花了十来分钟主要时间花在apt下载上。中间如果网络出现波动脚本会自动重试几次比手动装省心很多。第六步安装完成后脚本会询问是否把环境配置写入shell配置文件。这一步一定选是否则每次打开新终端都要手动source。如果误选了否之后可以自己在配置文件里补上ROS 1补source /opt/ros/noetic/setup.bashROS 2补source /opt/ros/humble/setup.bash。第七步脚本提示安装完成建议重启终端。到这一步安装流程就全部结束了此时你打开一个新终端输入rosversion -dROS 1或者printenv ROS_DISTROROS 2就能看到当前版本信息。3.3 小乌龟测试最简单的安装验金石安装完成之后怎么判断真的装好了我推荐用ROS最经典的入门例子小乌龟仿真器。打开第一个终端启动ROS核心roscore看到类似下面的输出说明ROS主节点启动了started core service [/rosout]然后打开第二个终端启动小乌龟节点rosrun turtlesim turtlesim_node这时桌面上会弹出一个蓝色背景的窗口中间有一只小乌龟。再打开第三个终端启动键盘控制节点rosrun turtlesim teleop_turtle在第三个终端里按键盘上的方向键小乌龟就会在窗口里移动还能画出运动轨迹。如果这三步都正常说明ROS的安装、节点通信、话题机制都是OK的可以放心往下学。ROS 2的命令略有不同不需要roscore而是直接source /opt/ros/humble/setup.bash ros2 run turtlesim turtlesim_node ros2 run turtlesim turtle_teleop_keyROS 2节点之间由DDS自动完成通信这也是ROS 2和ROS 1在架构上的一个明显差别。小乌龟测试虽然看起来简单但它验证的是整条通信链路比单纯看安装日志可靠得多。凡是装完说“好像有问题”的我第一件事就问小乌龟跑起来没有跑不起来说啥都白搭。3.4 环境变量配置与版本混装问题安装的时候脚本虽然会帮我们配置环境变量但理解这个机制依然是必要的因为后面开发经常要跟它打交道。在Ubuntu终端里输入以下命令可以查看当前ROS版本echo $ROS_DISTRO如果输出noetic说明当前shell已经加载了ROS 1 Noetic的环境。ROS 1的核心环境变量主要是ROS_ROOT、ROS_PACKAGE_PATH、ROS_MASTER_URI等。ROS 2不一样它依赖的是AMENT_PREFIX_PATH这些变量。环境变量的加载原理其实很简单安装的ROS包放在/opt/ros/目录下这个目录里有一个setup.bash文件里面配置了各种路径和环境变量。我们在~/.bashrc里加一行source /opt/ros/noetic/setup.bash每次打开新终端就会自动加载。如果哪一天你打开终端却运行不了ros命令第一反应就是检查~/.bashrc里有没有这一行或者当前终端有没有手动source过。还有一个很容易忽略的坑如果同一台电脑上同时装了ROS 1和ROS 2两个版本的setup.bash都写在~/.bashrc里后加载的那个会把环境变量覆盖成自己的版本导致你每次想用另一个版本还得手动source。我的建议是新手不要在同一台机器上混装ROS 1和ROS 2这两个版本的命令体系差异很大混着用非常容易出现“明明装了却命令不存在”的诡异问题。如果你确实有双版本需求建议用官方推荐的Docker方式隔离各跑各的互不干扰。4. 安装与使用中的高频问题排查4.1 网络问题下载失败、卡住、源不可用鱼香一键安装虽然解决了源的问题但受网络环境影响依然会出现下载失败。最常见的情况是脚本在执行apt更新时卡住或者某些包下载到一半报出类似“Failed to fetch”的错误。我自己的处理方法是先确认网络能正常访问镜像源ping mirrors.aliyun.com如果ping不通检查一下网络连接。虚拟机用户特别容易出现NAT模式下DNS解析异常可以试着重置一下虚拟网卡或者把Ubuntu的DNS改成公用DNS。如果网络正常但还是下载失败多半是镜像源的某个节点暂时不可用退出脚本重新执行一次脚本会重新选择可用镜像。还有个比较隐蔽的问题有些校园网、公司内网会对特定域名做限制导致wget下载脚本的时候一直超时。这种情况我的建议是换一个网络环境再试或者用手机热点试一次。别小看这一步我见过好几个人的问题就是卡在这里。你可能会觉得这种问题很蠢但真实环境里就是会存在提前有心理准备能省不少时间。4.2 磁盘空间不足的检查与清理如果ROS装到一半报磁盘空间不足这也是常见问题。特别是虚拟机场景下虚拟磁盘默认容量有限Ubuntu系统加桌面环境、开发工具占掉大半再装ROS很容易不够。遇到这个情况要么扩容虚拟磁盘要么清理现有空间。清理可以用系统自带的磁盘分析工具看一下哪些目录占空间大比较常见的重灾区是apt安装包缓存。安装完之后清理一下sudo apt clean这个命令释放的是apt下载的deb安装包缓存不影响已安装软件释放几个G是很正常的。另外日志文件、旧内核也可以清理但新手不建议乱动内核相关的东西。如果你想省心最简单的办法就是一开始把虚拟磁盘给够Ubuntu系统盘直接干到80G基本就不会在为空间发愁了。ROS这个生态就是很占空间尤其是装了Gazebo模型库之后认识这个事实比到处找清理技巧更重要。4.3 与Anaconda等Python环境的冲突这是我在实际帮别人排查时碰到次数最多的一个问题。很多学ROS的人同时也是学深度学习的系统里装了Anaconda而且大概率在shell配置文件里自动加了conda的初始化配置导致每次打开终端默认进入base环境。ROS和Anaconda的冲突主要在Python路径上。conda环境的Python是它自己的一套系统原本的Python是/usr/bin/python3。ROS的很多工具链依赖的是系统Python和对应的pip包如果你在conda环境下去编译ROS功能包经常会报出找不到module、找不到Python头文件之类的错误。最简单的处理办法是关掉conda的自动激活改成手动激活conda config --set auto_activate_base false然后每次要用conda环境的时候手动执行conda activate环境名。这样平时终端里用的就是系统PythonROS相关操作不会受干扰做深度学习的时候再单独激活conda环境两边互不打扰。这个方法我已经在很多机器上验证过目前是最省事的。如果你不想改配置文件也可以在运行ROS命令前手动conda deactivate退出base环境但这样就容易忘不如一劳永逸改掉自动激活。4.4 安装验证失败的常见排查清单小乌龟跑不起来的排查我整理几条经验。roscore启动后马上退出的先看日志提示。常见原因有ROS日志目录权限有问题或者磁盘满了。删除~/.ros目录这个目录是运行时临时生成的删了没影响再启动roscore一般能解决。rosrun提示找不到turtlesim包的说明环境变量没有正确加载。先确认一下echo $ROS_PACKAGE_PATH里有没有包含/opt/ros/noetic/share路径如果没有就重新source一下setup.bash。小乌龟窗口弹出来但是一片黑色的在虚拟机里比较常见这是显卡驱动或者OpenGL渲染的问题不影响节点运行。可以先忽略继续学习如果实在介意在虚拟机设置里把3D加速关掉再重新启动或者换一个窗口管理器。另外还有一个我见过多次的情况安装完成之后用户没关终端直接就在原来的终端里运行ros命令结果提示找不到命令。这不是安装失败而是当前终端没有加载新的环境变量。关掉终端重新开一个问题就没了。别看这个原因简单实际遇到的人不少。5. 装完之后的学习路径参考5.1 用Rviz与Gazebo把“仿真感”拉满装好ROS不是终点而是起点。很多人的误区是装完就不知道干什么了我建议把官方经典的案例按顺序跑一遍。除了前面说的小乌龟接着一定要接触Rviz。启动Rviz的方式很简单rosrun rviz rviz然后把小乌龟的坐标变换话题添加进去你就能在Rviz里看到小乌龟的三维位姿。这个案例虽然简单但能让你第一次把ROS的“话题”和“坐标变换”这两个核心概念真正可视化地理解。很多人在文字层面理解不了什么是tf树到Rviz里拖一拖、转一转一下就明白了。再进一步把Gazebo跑起来在仿真的环境里加载一个机器人模型。Gazebo对新手来说上手会有一点门槛但它是后面做自主导航、机械臂仿真绕不开的工具。鱼香一键安装里也有Gazebo的安装选项建议单独选一次。Gazebo首次启动下载模型库可能会很慢国内网络环境下尤其明显这一点要有心理准备可以手动配置模型库的镜像路径。5.2 创建第一个工作空间与功能包可视化案例跑通之后下一步是搭建你自己的开发环境。所谓工作空间就是ROS项目的根目录ROS 1的标准名称一般叫catkin_ws。创建并初始化一个ROS 1工作空间mkdir -p ~/catkin_ws/src cd ~/catkin_ws catkin_makecatkin_make第一次运行会在src目录下生成CMakeLists.txt表示空间初始化成功。之后在src目录里创建自己的功能包cd ~/catkin_ws/src catkin_create_pkg test_pkg roscpp rospy std_msgs这个命令创建了一个名为test_pkg的功能包依赖roscppC接口、rospyPython接口和std_msgs标准消息包。创建完后回到工作空间编译cd ~/catkin_ws catkin_make每次编译完记得source一下devel目录下的setup.bashsource ~/catkin_ws/devel/setup.bash对于ROS 2流程相似但命令不同用colcon build替代catkin_make用ros2 pkg create替代catkin_create_pkg。整体思路一致一个工程目录、一个源码目录、一个编译命令。第一次完整走通这套流程之后ROS开发的基本节奏你就掌握了后面所有项目都是这个模式的变体。5.3 学习路径与心态建议最后根据我的经验给一条比较平缓的学习路径。第一个阶段把基本功打牢理解节点、话题、服务、参数这四个ROS核心概念。不要急着写代码先用命令行工具观察它们怎么工作拿小乌龟和Rviz反复练习。这个阶段的主要目标是看明白“数据是怎么在节点之间流动的”。第二个阶段尝试写自己的第一个发布者和订阅者节点。可以从Python版本开始代码简单理解起来直观。ROS 1就是写talker和listenerROS 2就是写publisher和subscriber官方文档都有完整的示例。别光看教程一定要自己敲一遍哪怕照抄敲完再跑通的感觉完全不一样。第三个阶段做一个小型机器人仿真项目。比如让两轮机器人模型在Gazebo里动起来然后加一个激光雷达插件做建图。再进阶一点就是导航和路径规划。到这个阶段你已经从“会用ROS”迈向了“真做机器人”这个坎越过去后面基本就通了。第四个阶段如果学ROS 2可以深入看一下DDS通信机制以及QoS策略如果学ROS 1可以研究一下launch文件的组织方式。到这个阶段你已经不被“安装”这件事挡住了后面每一次踩坑都是真正的学习机会。我个人的体会是ROS学习中最劝退的往往不是概念有多难而是环境搞不定、例子跑不起来、出错没人问。鱼香一键安装至少帮你把最前面的那道墙拆了让你能把精力放在真正重要的机器人编程和算法上。装完之后别急着看一堆高级资料先跑一跑小乌龟、开一开Rviz、碰一碰Gazebo让这套工具链在你心里建立起一个感性的认识再回去看书你会有非常不一样的理解。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进