
1. ROS 安装为什么劝退先看清问题的形状玩着游戏听着歌就把 ROS 装好了这句话我第一次看到的时候是有点不服气的。我自己的第一次 ROS 安装经历完全不是这个画风Ubuntu 装完apt update 卡在 0% 一动不动硬着头皮改源改完源 rosdep init 又开始报错来回折腾到凌晨两点最后靠着一堆零散帖子里拼出来的命令才勉强跑通一个小海龟。后来身边做机器人的朋友陆续开始提鱼香ROS一键安装小鱼ROS一键安装这类工具我才意识到ROS 安装这件事情的痛点早就不在 ROM 本身而在于它背后那一长串和环境、网络、版本绑死的准备工作。这篇东西我打算把一行代码装 ROS这件事从头到尾讲透这套一键方案到底替你做了哪些事、为什么它能省时间、什么情况下它会失败、失败了怎么一步步排回来以及装完之后怎么真正把它用起来。适合刚开始接触机器人开发的在校学生也适合从别的地方转过来、被环境配置折磨过的工程师。1.1 版本矩阵Ubuntu 和 ROS 天生是一对一绑定ROS 的安装之所以容易翻车第一个原因就是它对操作系统版本的挑食程度远超一般软件。ROS 每个发行版都会绑定一到两个 Ubuntu 版本而且是硬绑。你在 Ubuntu 22.04 上想装 Noetic基本不用想在 Ubuntu 20.04 上想装 Humble也会一路报依赖冲突。Ubuntu 版本对应 ROS 1对应 ROS 216.04 LTSKinetic无官方支持18.04 LTSMelodicDashing / Eloquent20.04 LTSNoeticFoxy / Galactic22.04 LTS无Humble / Iron24.04 LTS无Jazzy这张表看着简单实际踩坑的地方在于官方支持和我能装上是两回事。ROS 2 早期版本在非匹配 Ubuntu 上偶尔也能靠源码编译凑出来但那个过程动辄几个小时还会因为编译器版本差异报出一堆莫名其妙的错。我一般劝新手别碰源码编译先把版本对齐后面再谈折腾。还有一个容易被忽略的点ROS 1 的 Noetic 是最后一个 ROS 1 版本官方已经停止维护但它的生态和历史教程量仍然是最大的。很多学校的实验指导书、B站上的机械臂教程、机器人小车的资料包写的还是 Noetic。所以我该装哪个这个问题答案往往不取决于哪个更新而取决于你手头的资料是写给谁的。1.2 传统装法要过的四道坎我把传统 apt 安装 ROS 的过程拆开看至少有这么四道坎。第一道是软件源。ROS 官方源packages.ros.org在境外直连下载速度经常是几十 KB 每秒一个ros-desktop-full包下来一两个 G等一晚上都有可能。所以第一件事必然是换成国内镜像源清华、中科大、阿里都有 ROS 镜像换完速度能差十倍以上。第二道是密钥。早期教程里都是apt-key add的方式导入 GPG 密钥但你如果用的是 Ubuntu 22.04 及以上apt-key已经被弃用执行时会报警告而且新的做法要写成带signed-by的 keyring 文件。很多老教程直接照抄新手就在这一步卡住报的那句话还不直观。第三道是 rosdep。sudo rosdep init和rosdep update这两个命令是 ROS 环境里最经典的翻车点。它要从 GitHub 拉一份默认源列表网络稍差就超时报错信息是ERROR: cannot download default sources list from ...。更麻烦的是这两个命令的权限不一样init 要 sudoupdate 不能 sudo很多人混着用最后在~/.ros和/root/.ros下各留一份缓存互相打架。第四道是环境变量。source /opt/ros/xxx/setup.bash这条命令如果忘了写进.bashrc那么每次新开终端都要手动敲一遍否则roscore、rosrun全都会提示未找到命令。新手往往会以为没装好其实只是没加载环境。1.3 一键安装脚本到底替你做了什么理解了上面四道坎你就明白一键脚本存在的意义了。它不是什么黑魔法本质是把检测系统版本、推荐匹配的 ROS 版本、自动替换国内源、写入密钥、执行安装、处理 rosdep 源、把环境变量写进.bashrc这一整套流程串成一个带交互菜单的 shell 脚本。注意一键脚本省的是操作步骤不是解决所有环境问题。显卡驱动、虚拟机 3D 加速、磁盘空间这些系统层面的东西脚本管不了该配还得自己配。我个人的态度是一键脚本适合两类人。一类是完全没接触过 Linux 的小白用它快速获得一个能跑的环境把精力放在学 ROS 的概念上另一类是熟练工装过十几遍环境之后懒得再手敲用脚本省时间。中间夹着的那部分——想理解每一步在干什么的人——最好还是先手动装一遍装废一次再上脚本收获会大很多。2. 一行命令的解剖鱼香ROS一键安装脚本怎么用才不出事说完背景进入正题。这一节我把那行命令一个字一个字拆开讲清楚它为什么长这样以及你在执行之前应该做什么。2.1 那行命令逐字拆解社区里流传最广的命令形式是这一行wget http://fishros.com/install -O fishros . fishros拆开看wget是下载工具http://fishros.com/install是要下载的地址-O fishros表示把下载下来的内容保存成当前目录下一个名叫fishros的文件。注意这里-O是大写字母 O不是数字 0这个我见过有人敲错然后报invalid option一脸茫然。后面的表示前面下载成功了才执行后面。. fishros里的那个点等价于source fishros意思是在当前 shell 进程里执行这个脚本而不是新开一个子进程去跑。为什么必须用.而不是bash fishros这里有个很实际的原因脚本内部在完成安装后有退出动作如果用bash fishros跑退出的是子 shell你当前的终端还在但脚本里那些依赖当前 shell 状态的交互体验会打折而用. fishros跑脚本执行到退出语句时会把你的终端窗口一起关掉。这其实是很多人第一次用这个脚本时的惊吓体验——安装完了终端啪一下没了。提示如果你不想终端被关掉可以改用bash fishros执行效果一样只是环境变量需要你自己再source ~/.bashrc一次或者干脆新开一个终端窗口。2.2 脚本内部的大致流程虽然脚本内容会随版本更新但整体骨架是可以推测出来的基本是这么几步# 1. 读取 /etc/os-release拿到 Ubuntu 版本号 # 2. 弹出菜单让用户选择要装的 ROS 版本 # 3. 备份 /etc/apt/sources.list换成国内镜像 # 4. 写入 packages.ros.org 的 GPG 密钥 # 5. 生成 /etc/apt/sources.list.d/ros-*.list # 6. apt update apt install ros-distro-desktop-full # 7. 手动构造 rosdep 源列表绕开 rosdep init 的网络问题 # 8. 把 source /opt/ros/distro/setup.bash 追加到 ~/.bashrc第 7 步是这套方案最值钱的地方。它实际上是用预先准备好的国内镜像地址直接生成/etc/ros/rosdep/sources.list.d/20-default.list这个文件让rosdep update不去访问那些在国内很难稳定拉取的地址。这一步手动做的话大概是这样的思路sudo mkdir -p /etc/ros/rosdep/sources.list.d # 然后往里面写一份指向国内镜像的源列表 sudo rosdep init # 如果这步报错说明上面已经有文件了跳过 rosdep update如果脚本已经帮你写好这个文件那么sudo rosdep init会提示文件已存在这是正常的不是错误。很多人看到这行提示以为装失败了其实完全没问题。2.3 用别人的脚本之前三个动作先做完我对第三方脚本一直没有敌意但有几个习惯我建议你养成尤其是要把它装在工作用的机器上时。第一个动作是先看再跑。下载下来不着急执行用less fishros翻一遍看它有没有往你系统上装你没预期的东西。这个动作花三十秒能避免很多麻烦。第二个动作是备份关键配置。至少把/etc/apt/sources.list和~/.bashrc各复制一份cp /etc/apt/sources.list ~/sources.list.bak cp ~/.bashrc ~/.bashrc.bak第三个动作是确认能回滚。ROS 的卸载其实挺麻烦的apt remove之后还会有残留的/opt/ros目录和各种依赖。所以我更倾向于在虚拟机上第一次尝试确认没问题了再考虑是不是要在物理机上做。3. 手把手实操从裸机到 rosdep 顺利跑通这一节按顺序把整个流程走一遍。我建议你对照着做每一步都有验证动作做完了确认通过再往下。3.1 系统与虚拟机规格怎么定如果你是虚拟机方案先把配置定好这一步定低了后面天天难受。资源项最低可用我推荐内存4 GB8 GB 起磁盘30 GB60 GB 起CPU 核心24显卡无特殊要求开启 3D 加速网络桥接或 NATNAT 即可内存这一项我要多说一句。跑 ROS 1 的 roscore 加小海龟2 GB 都够。但一旦上 Gazebo 仿真、跑 Nav2 导航栈、或者开 RViz 同时加载点云内存占用会瞬间飙升到 4 GB 以上虚拟机内存给少了直接 OOM 卡死。磁盘同理ROS 本体加各种依赖轻松占掉二三十 GB再加上 Gazebo 的模型库60 GB 是比较舒服的起点。至于显卡如果你是纯命令行学习虚拟机不开 3D 加速也凑合。但只要涉及 Gazebo 或者 RViz就一定把虚拟机设置里的加速 3D 图形勾上否则会遇到 Gazebo 一启动就黑屏、或者 RViz 渲染花屏的问题。3.2 装系统后的第一件事换源系统装好第一件事不是装 ROS是换 apt 源。以 Ubuntu 20.04 为例把/etc/apt/sources.list内容替换成国内镜像下面以清华源为例sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo tee /etc/apt/sources.list 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 sudo apt updateUbuntu 22.04 只需要把上面每一行的focal换成jammy即可。不要图省事把两个版本的源混着写混源轻则更新报错重则依赖关系彻底乱掉最后只能重装系统。换完源执行sudo apt update如果十几秒内跑完并且没有大量Err提示说明源是通的。这一步通过之后再动 ROS顺序千万别颠倒。3.3 一键安装跑起来附手动版命令源通了之后就可以执行那条命令了wget http://fishros.com/install -O fishros . fishros它会弹出一个菜单让你选装 ROS 1 还是 ROS 2、选具体版本、选是否同时配置 rosdep 源。按提示走就行中间需要输入系统密码。如果你想理解每一步到底在做什么我也把手动版的完整流程列一下用 Ubuntu 20.04 装 Noetic 举例# 1. 导入密钥 sudo apt install curl gnupg -y curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc \ | sudo gpg --dearmor -o /usr/share/keyrings/ros-archive-keyring.gpg # 2. 写入 ROS 源 echo deb [signed-by/usr/share/keyrings/ros-archive-keyring.gpg] \ http://packages.ros.org/ros/ubuntu focal main \ | sudo tee /etc/apt/sources.list.d/ros-latest.list # 3. 安装 sudo apt update sudo apt install ros-noetic-desktop-full -y # 4. 环境变量 echo source /opt/ros/noetic/setup.bash ~/.bashrc source ~/.bashrc # 5. 初始化 rosdep sudo apt install python3-rosdep -y sudo rosdep init rosdep update如果你在第一步curl那里就卡住了说明这个地址拉不动那正好说明一键脚本的价值——它把这些访问困难的地址全部替换掉了。3.4 验证安装成功的三个动作装完之后别急着往下走先做三个验证。# 验证一环境变量是否生效 printenv | grep ROS # 应该能看到 ROS_DISTROnoetic、ROS_VERSION1 这类输出 # 验证二核心命令是否存在 which roscore rosrun rospack # 三个路径都应该能打印出来 # 验证三实际跑起来 # 终端 A roscore # 终端 B rosrun turtlesim turtlesim_node第三个验证里如果小海龟窗口弹出来恭喜你环境是通的。如果roscore报错说找不到命令百分之九十九是环境变量没加载执行一次source /opt/ros/noetic/setup.bash再试。3.5 工作空间初始化catkin 与 colconROS 装完只是有了运行时写代码还需要工作空间。ROS 1 用 catkinmkdir -p ~/catkin_ws/src cd ~/catkin_ws catkin_make source devel/setup.bashROS 2 用 colconmkdir -p ~/ros2_ws/src cd ~/ros2_ws colcon build source install/setup.bash这里有个细节值得说ROS 1 的工作空间devel/setup.bash和 ROS 2 的install/setup.bash名字不一样加载顺序也不一样。正确顺序是先 source 系统级环境/opt/ros/...再 source 工作空间环境这样工作空间里的包才能覆盖系统包。搞反了会出现我改了代码怎么没生效的经典问题。4. ROS 1 还是 ROS 2选型、共存与切换装完一个版本之后几乎所有人都会问同一个问题我是不是也该装 ROS 2我把这个问题拆成三部分讲。4.1 按场景选版本的对照表你的场景我的建议原因学校课程、老教材Noetic教程和代码都是写给 ROS 1 的新学机器人开发Humble官方主推长期支持机械臂开发AR3 这类Noetic 或 Humble 都行MoveIt 两个版本都有ESP32 接入micro-ROSHumblemicro-ROS 主要面向 ROS 2小车自主导航仿真Humble Nav2Nav2 是 ROS 2 的导航栈已有的企业项目跟项目走别乱升级这张表里最需要解释的是机械臂开发。MoveIt 在 ROS 1 里叫 MoveIt 1在 ROS 2 里叫 MoveIt 2功能上 ROS 2 版本已经相当成熟但网上大量 AR3、AR4 这类开源机械臂的现成配置包还是 ROS 1 格式。如果你是拿来跑别人的包先看那个包是哪个版本再决定自己装什么别反过来。4.2 一台机器装两个版本怎么隔离ROS 1 和 ROS 2 装在同一个 Ubuntu 上是可行的比如 Ubuntu 22.04 上装 ROS 2 Humble同时用容器或者源码方式跑 ROS 1——但这条路对新手不友好。更稳的做法是版本差异大的时候直接用两台虚拟机各自干净。如果你确实想在一台机器上切换可以把环境变量拆成两个文件# 生成两个独立的环境脚本 echo source /opt/ros/noetic/setup.bash ~/ros1_env.sh echo source /opt/ros/humble/setup.bash ~/ros2_env.sh # 在 .bashrc 里加两个别名切换时重开终端 alias use_ros1source ~/ros1_env.sh alias use_ros2source ~/ros2_env.sh4.3 环境变量冲突的典型表现两个版本同时被 source 进同一个终端会出现一些很难理解的症状。我遇到过最典型的是colcon build编译 ROS 2 的包却报找不到catkin相关的 CMake 变量反过来catkin_make又会加载到 ROS 2 的 Python 路径导致 import 报错。注意.bashrc里绝对不要同时写两行 source。一旦写进去每次开终端都是混乱状态排查起来非常费劲。排查的时候可以用一条命令快速定位echo $ROS_DISTRO echo $ROS_VERSION echo $PYTHONPATH如果ROS_DISTRO显示的是 noetic但你明明想用 ROS 2那就是环境串了开个干净终端重新 source 即可。5. 报错排查实录我踩过的坑和速查表这一节是我觉得最实用的部分。ROS 安装遇到的报错高度集中在几个点上把这几条记住能省掉大量搜索时间。5.1 高频报错速查表报错信息关键词真实原因处理方式无法定位软件包 ros-noetic-desktop-full源没写对或系统版本不匹配检查lsb_release -sc与源里的代号是否一致cannot download default sources listrosdep init 拉取默认列表失败手动创建 20-default.list指向国内镜像The read operation timed outrosdep update 网络超时改换国内 rosdistro 镜像后重试rosrun: 未找到命令环境变量未加载source /opt/ros/distro/setup.bashNo module named rospkgPython 版本混乱确认用 python3 且装的是 python3-rosdepCould not find a package configuration file缺少对应依赖包rosdep install --from-paths src --ignore-src -r -yGazebo 黑屏、闪退虚拟机 3D 加速未开或显卡驱动问题开启 3D 加速或改软件渲染5.2 三个真实案例复现案例一rosdep init 权限混乱。我最早装的时候用sudo rosdep init初始化之后又用sudo rosdep update结果 update 一直报权限错误。原因是 update 应该用普通用户跑缓存写在用户家目录。正确姿势是 init 用 sudoupdate 不带 sudo。如果之前搞错了把/root/.ros删掉重来。案例二更新源之后 apt 报时间错误。有一次虚拟机挂起很久再恢复apt update报签名时间无效。这是虚拟机时钟漂移导致的同步一下时间就好sudo apt install ntpdate -y sudo ntpdate ntp.aliyun.com案例三小海龟跑起来了但键盘控制没反应。turtlesim窗口出来了但用turtle_teleop_key按键不动。这是因为焦点不在终端窗口上键盘事件被小海龟窗口截走了。把鼠标点回终端窗口再按键就正常。这个问题看似低级但真有不少人在这里折腾半小时。5.3 rosdep 与网络源专项排查rosdep 的问题是新手第一大痛点单独说说排查思路。rosdep update本质是去读取一份索引文件然后在本地建立缓存。如果这一步慢可以先用-v看详细过程确认卡在哪一步。常见做法是把索引地址替换成国内托管平台上的镜像副本同时把20-default.list里的地址指向这些镜像。具体操作是编辑/etc/ros/rosdep/sources.list.d/20-default.list把里面的地址替换成镜像地址然后执行rosdep update # 如果之前缓存脏了先删掉 rm -rf ~/.ros/rosdep/sources.cacherosdep install在编译工作空间时也很关键这条命令能自动把包的依赖全装上rosdep install --from-paths src --ignore-src -r -y--ignore-src是必须的否则它会把你自己工作空间里的包也当成待安装依赖直接报错。-r表示遇到失败继续执行-y是自动确认。这三个参数组合基本是标准写法。6. 装完别吃灰从跑通小海龟到接入真实硬件环境装好了很多人反而不知道该干什么。这一节我按从易到难的顺序给几条能马上上手的路径。6.1 五分钟验证小海龟与多海龟小海龟是 ROS 的hello world不只是看个热闹。用 ROS 2 举例ros2 run turtlesim turtlesim_node ros2 run turtlesim turtle_teleop_key想生成多只海龟就调用 spawn 服务ros2 service call /spawn turtlesim/srv/Spawn \ {x: 2.0, y: 2.0, theta: 0.2, name: turtle2}生成之后你会发现键盘控制只管第一只。这时候可以写个小节点去控制 turtle2顺便把话题、服务、参数这三套通信机制都练一遍。我个人的经验是把多海龟的例子里每个话题用ros2 topic echo打出来看一遍比看十页文档都管用。6.2 仿真环境Gazebo 的点云与显卡问题Gazebo 是 ROS 生态里最常用的仿真器。启动命令一般是ros2 launch gazebo_ros gazebo.launch.py第一次启动会去下载模型库如果卡住不动就是模型库地址拉不动。可以把模型库缓存目录提前配置好或者用国内镜像下载一份模型包放到~/.gazebo/models下。Gazebo 在虚拟机里最常见的问题是黑屏。排查顺序是先确认虚拟机设置里开了 3D 加速再确认显卡驱动最后才考虑改成软件渲染。有些场景下软件渲染也能跑只是帧率低到没法用。6.3 对接真实外设前的准备清单当你准备从仿真走向真实硬件下面这些准备工作建议提前做掉。相机方向不管是普通 USB 相机还是工业相机接入 ROS 之前都要先确认能在系统里被识别到再通过image_transport把图像转成 ROS 话题用rosbag record录下来验证数据正常。标定方向相机标定用camera_calibration包IMU 标定用imu_calib这类工具。标定文件一定要版本管理参数丢了重新标一次很耗时。通信方向涉及多机的时候ROS 1 要配ROS_MASTER_URI和ROS_IPROS 2 要配ROS_DOMAIN_ID。主从机配置最容易出的问题是主机能收到从机数据、从机收不到主机数据九成是环境变量的 IP 写错了或者防火墙拦了。嵌入式方向如果用 ESP32 这类单片机接入 ROS 2 做 micro-ROS需要跑一个 agent 做桥梁单片机侧的固件要和 agent 的版本对应版本不匹配会连不上而且报错信息不直观。导航方向小车自主导航仿真一般用 Nav2 加 Gazebo重点在代价地图参数和坐标系变换tf配置新手最容易卡在 tf 树上ros2 run tf2_tools view_frames是排查利器。6.4 一个容易搜错的坑ROS 与 RouterOS最后说一个我自己都被坑过的搜索问题。当你在搜索引擎里输入ROS 路由器相关的关键词出来的结果里有一大半其实是另一个东西——路由器操作系统跟机器人操作系统完全不是一回事。这个坑特别容易发生在你搜ROS 无线中继ROS 设置这类词的时候两种内容混杂在一起翻半天找不到自己想要的。判断方法很简单如果结果里出现的是网络配置、防火墙规则、无线信道这类词那就是路由器系统如果出现的是节点、话题、坐标变换那才是机器人 ROS。搜索时多加一个限定词比如加上节点或者具体的发行版名称命中率会高很多。我自己现在的习惯是环境类问题优先去 ROS 相关的问答社区按发行版标签搜而不是直接全文搜索这样出来的答案基本都对得上版本。毕竟 ROS 这东西版本不对答案就是错的看了白看。在实际操作中我的体会是一键安装脚本真正改变的不是安装这件事本身而是把新手从和环境搏斗的阶段提前推到了理解概念的阶段。装环境这件事有价值但它不该成为入门的第一道门槛。先用一行命令跑起来把 roscore、话题、服务这些概念玩明白等你真的需要定制环境了再回头把每一步拆开看那时候的理解深度会完全不一样。