1. 为什么装 ROS 之前必须先看版本对应关系
很多人第一次在 Ubuntu 上安装 ROS,卡住的地方根本不是命令敲错,而是版本选错了。ROS 的发行版和 Ubuntu 的版本是硬绑定的,你拿 Ubuntu 22.04 去装 ROS Noetic,或者拿 Ubuntu 20.04 去装 ROS 2 Humble,十有八九会在 apt 依赖解析阶段直接报一堆"无法满足的依赖",然后就开始怀疑人生。所以在敲第一条命令之前,先把版本这关过了,能省掉后面至少一半的排查时间。
1.1 ROS 1 和 ROS 2 到底该选哪个
这是新手问得最多的问题。简单说,ROS 1 是上一代架构,核心靠一个叫 roscore 的中心节点做通信中介;ROS 2 是重写过的架构,底层换成 DDS 做去中心化通信,实时性、多机协同、安全性都强不少。现在新开的项目、尤其是机械臂、移动机器人、工业场景,基本都往 ROS 2 靠。但现实里很多成熟的开源代码、老教程、实验室遗留项目还跑在 ROS 1 上,所以你选哪个,取决于你要复现的东西是什么。
我个人的判断逻辑是这样:
- 如果你手上的教程、代码仓库、课程用的是
catkin_make、roscore、rosrun这一套,那就是 ROS 1,别犹豫,装对应的 Noetic。 - 如果看到的是
colcon build、ros2 run、rclcpp、rclpy这些,那就是 ROS 2,Ubuntu 22.04 配 Humble 是当前最稳的组合。 - 如果纯新手想系统学,我建议直接上 ROS 2 Humble,生态文档现在很完整,社区活跃度也高。
1.2 版本对应表与选型建议
下面这张表建议存下来,装机前对照一遍:
| Ubuntu 版本 | 代号 | 推荐 ROS 1 | 推荐 ROS 2 | 状态 |
|---|---|---|---|---|
| 18.04 | bionic | Melodic | 无 | 已停止维护 |
| 20.04 | focal | Noetic | Foxy | Noetic 仍广用,Foxy 已 EOL |
| 22.04 | jammy | 不支持 | Humble | 当前主流组合 |
| 24.04 | noble | 不支持 | Jazzy | 较新,生态跟进中 |
这里有个细节要提醒:ROS Noetic 是 ROS 1 的最后一个版本,官方支持周期已经结束,但因为大量存量项目还在用,它依然是装机量最大的 ROS 1 发行版。ROS 2 这边,Humble 是 LTS,支持到 2027 年,Jazzy 是较新的 LTS,但部分第三方包跟进还没那么全。所以如果你不是特别追新,Ubuntu 22.04 + Humble 是最不容易踩坑的组合。
1.3 硬件和磁盘空间的实际要求
官方文档写的要求往往偏保守。实际跑下来我的经验是:
- 磁盘:只装
ros-<distro>-desktop-full大概要 1.5 到 3 GB,但你要是顺手把 Gazebo、rviz、各种工具包都装上,再加上编译工作空间的build、devel目录,20 GB 是起步,建议给根分区留 40 GB 以上。 - 内存:纯跑节点 4 GB 能开机,但要开 Gazebo 仿真或者 rviz 看点云,8 GB 是底线,16 GB 会舒服很多。
- 虚拟机还是双系统:新手练手用 VMware 或 VirtualBox 装 Ubuntu 完全够用,分配 4 核 CPU、8 GB 内存、60 GB 磁盘,记得装 VMware Tools 让剪贴板和分辨率正常。缺点是 Gazebo 仿真在虚拟机里会掉帧,真要做仿真建议双系统或者有独显的机器。
注意:虚拟机里装 ROS 时,网络模式建议用 NAT,桥接模式在某些校园网或企业网环境下会拿不到 IP,后面 apt 更新会直接失败。
2. 系统准备:把地基打牢再动手
我见过太多人直接跳过这一步,上来就加 ROS 源,结果 apt update 卡在某个国外的地址上,进度条纹丝不动,最后放弃。其实系统准备做扎实了,后面安装 ROS 的顺畅度完全不一样。这一步主要干三件事:换源提速、更新索引、补齐基础依赖。
2.1 换源:让 apt 提速的第一件事
Ubuntu 默认的软件源在国内访问速度经常很感人。换成国内镜像以后,apt 下载速度能从几十 KB/s 提到几 MB/s。我一般用清华源或者中科大源。备份原来的源列表,然后替换:
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo nano /etc/apt/sources.list把里面的archive.ubuntu.com、security.ubuntu.com替换成镜像地址就行。懒得手动改的,直接在图形界面里操作:打开"软件和更新",在"Ubuntu 软件"标签页把下载服务器改成清华或阿里,系统会自动帮你改好源列表。这个方式对新手更友好,不容易改错格式。
改完源必须更新索引,否则改了个寂寞:
sudo apt update sudo apt upgrade -yupgrade这一步会拉不少包,看你原来的系统有多旧,慢的话等十几分钟很正常。别嫌烦,这一步是为了让系统里所有已安装包都到最新,减少后面 ROS 安装时的依赖冲突。
2.2 补齐基础依赖和常用工具
ROS 的安装脚本和后续开发会用到一堆基础工具,缺一个就得临时补。我习惯一次性装齐:
sudo apt install -y curl wget git build-essential cmake python3-pip \ python3-dev python3-rosdep python3-argcomplete vim net-tools这里解释下为什么是这几个:curl用来下载密钥和脚本,wget备用,git拉代码用得上,build-essential和cmake是编译 ROS 包的核心工具链,python3-dev是编译 Python 扩展的头文件,net-tools里的ifconfig在排查网络和主从机配置时很实用。很多人编译 ROS 功能包时报 CMake 相关错误,追根溯源就是build-essential没装全。
顺便说一句,git装好后建议配置一下用户名和邮箱,不然提交代码时会报错:
git config --global user.name "你的名字" git config --global user.email "你的邮箱"2.3 输入法与中文环境的兼容性处理
这一块算是容易被忽略的坑。Ubuntu 下装搜狗输入法或者配置中文输入,本身不难,但要留意它和 ROS 某些 GUI 工具(比如 rviz、qt 相关界面)的输入法插件可能冲突。我第一次配好中文输入后打开 rviz,界面直接崩了,查日志才发现是 fcitx 的 qt 插件问题。
解决办法是安装 fcitx 的 qt 支持包:
sudo apt install fcitx-frontend-qt5然后在环境变量里指定:
export QT_IM_MODULE=fcitx export GTK_IM_MODULE=fcitx export XMODIFIERS=@im=fcitx写进~/.bashrc或者~/.profile都行。如果你的 ROS 工具压根不涉及图形界面,这块可以先跳过,不影响核心功能。
提示:环境变量写多了容易乱,建议在
~/.bashrc里用注释把不同用途的配置分段,比如# 输入法、# ROS,以后出问题好定位。
3. ROS 1 Noetic 安装全流程(Ubuntu 20.04)
假设你的系统是 Ubuntu 20.04,要装 ROS Noetic,接下来这几步一步步来就行。整个流程分四块:加源、装包、初始化 rosdep、配环境变量。我按实际操作的顺序展开,每一步都说明它在干什么。
3.1 添加官方软件源与密钥
ROS 的包不在 Ubuntu 默认仓库里,得先把官方源加进来。第一步装 curl 并配置密钥:
sudo apt install curl -y curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -apt-key add是告诉系统"来自这个签名的包是可信的",不加密钥的话 apt 会因为签名验证失败拒绝安装。如果这条命令报错或者卡住,多半是那个 GitHub 地址访问不稳定,这种情况下我推荐直接用国内的 ROS 镜像源,把签名问题绕开。
换成清华源的写法:
sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ $(lsb_release -cs) main" > /etc/apt/sources.list.d/ros-latest.list'中科大源同理,把地址换成mirrors.ustc.edu.cn/ros/ubuntu/即可。加完源再更新一次:
sudo apt update这一步如果报NO_PUBKEY错误,说明密钥没导入成功,回到密钥那一步重来,或者用镜像站的密钥。
3.2 apt install 与依赖版本选择
ROS 安装包分三个层级,选哪个直接影响你后面能用多少东西:
| 安装包名 | 包含内容 | 适用人群 |
|---|---|---|
| ros-noetic-ros-base | 核心通信库、基础工具 | 服务器部署、追求精简 |
| ros-noetic-desktop | 加上 rviz、rqt 等图形工具 | 一般开发 |
| ros-noetic-desktop-full | 再加上 Gazebo、感知、导航等 | 新手、做仿真 |
新手直接上 full,一条命令搞定:
sudo apt install ros-noetic-desktop-full -y这个包体积不小,下载加安装大概一两个 GB,视网络情况可能要十几分钟到半小时。装的过程中注意看输出,如果有 E: 开头的错误,多半是依赖冲突或者源没更新。装完可以用下面这条命令确认核心目录存在:
ls /opt/ros/noetic/看到setup.bash、bin、share、include这些目录,说明主体安装成功了。
3.3 rosdep 初始化与卡点处理
rosdep是 ROS 的依赖管理工具,编译功能包时它负责帮你自动安装缺失的系统依赖。初始化分三步:
sudo apt install python3-rosdep -y sudo rosdep init rosdep updaterosdep init会在/etc/ros/rosdep/sources.list.d/下创建20-default.list,里面指向几个配置文件地址。rosdep update则是去拉取这些文件到本地缓存。这两步是最容易卡的地方,常见问题有两种。
第一种:sudo rosdep init报ERROR: cannot download default sources list。原因基本就是那个默认地址访问不通。解决思路有两个,一是手动创建目录和文件,把地址内容换成国内镜像版本;二是干脆用下一节讲的一键脚本,它内置了镜像处理。
第二种:rosdep update超时或者中途断掉。这个多半是网络抖动,我的经验是多试几次,或者挑网络空闲的时段跑。如果反复失败,同样可以考虑镜像方案。
注意:
rosdep update生成的缓存放在~/.ros/目录下,之后如果换了用户或者删了家目录,这一步得重做。
3.4 环境变量写入与验证
装完的 ROS 还不能直接用,得告诉 shell 去哪找命令。临时生效这么写:
source /opt/ros/noetic/setup.bash但这样关了终端就没了,所以要写进~/.bashrc:
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc source ~/.bashrc验证一下,看环境变量有没有配好:
echo $ROS_DISTRO输出noetic就对了。再跑个roscore试试:
roscore终端刷出一堆启动日志,最后停在started core service [/rosout],说明核心节点跑起来了。按 Ctrl+C 退出,接下来就可以跑小海龟验证完整链路。
4. ROS 2 Humble 安装全流程(Ubuntu 22.04)
如果你的系统是 Ubuntu 22.04,想装 ROS 2 Humble,整体思路和 ROS 1 类似,但源配置和环境变量的路径不一样,别把两套命令混着敲。下面这套是我在实际机器上反复验证过的流程。
4.1 启用 Universe 仓库与添加 ROS 2 源
Ubuntu 的universe仓库里有一些 ROS 2 需要的系统包,先确认它开了:
sudo apt install software-properties-common -y sudo add-apt-repository universe -y接着下载 ROS 2 的密钥,注意 ROS 2 用的是 keyring 方式而不是老的apt-key:
sudo apt update && sudo apt install curl -y sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg然后添加源。这里$(. /etc/os-release && echo $UBUNTU_CODENAME)会自动取到jammy,不用手写:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null同样,如果这个 GitHub 地址拉不动,可以把上面的源地址换成国内镜像的 ROS 2 地址,密钥也要用镜像站提供的版本,两个必须配套,不然签名照样过不了。
4.2 安装桌面版与开发工具
Humble 的安装包和 ROS 1 命名规则不同,常用的是这两个:
sudo apt update sudo apt install ros-humble-desktop -yros-humble-desktop包含了 rviz2、demo 节点、rqt 这些,够日常学习和开发用。如果你需要做仿真,再补一个:
sudo apt install ros-humble-gazebo-ros-pkgs -y开发过程中还会用到 rosdep 和编译工具:
sudo apt install python3-colcon-common-extensions python3-rosdep -y sudo rosdep init rosdep updatecolcon是 ROS 2 的编译工具,取代了 ROS 1 的catkin_make,colcon-common-extensions里带了常用插件,装上是省事的做法。
4.3 环境变量与安装验证
ROS 2 的环境变量文件路径是/opt/ros/humble/setup.bash:
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc source ~/.bashrc验证方式和 ROS 1 不太一样,ROS 2 没有roscore,直接跑个 demo:
ros2 run demo_nodes_cpp talker看到它每隔一秒打印一条Publishing: 'Hello World: N',就说明通信正常。另开一个终端跑:
ros2 run demo_nodes_py listener如果 listener 终端能收到 talker 发的消息,说明发布订阅链路通了,安装完全成功。
提示:ROS 1 和 ROS 2 可以装在同一台机器上共存,但千万不要在同一个终端里同时 source 两套 setup.bash,环境变量会互相覆盖,导致命令找不到或者节点通信异常。要切换时新开终端。
5. 一键安装脚本:鱼香ROS 的用法与判断
热词里高频出现"鱼香ROS一键安装",这个工具在国内 ROS 圈知名度确实高。对完全不想折腾源和依赖的新手来说,它是个省事的选项。但我不建议你只会用它,因为它把很多细节藏起来了,一旦出问题你不知道从哪查。所以我更推荐的方式是:先看懂它做了什么,再用它。
5.1 脚本到底替我们干了什么
这个脚本的核心逻辑其实不复杂,它把前面几节的手动步骤自动化了,主要包括:
- 检测当前系统版本,自动匹配能装的 ROS 发行版,避免版本选错。
- 配置软件源和密钥,并且内置了国内镜像地址,绕开了访问不稳定的默认地址。
- 处理 rosdep 的初始化和更新,这一步是它最大的价值点,因为手动搞这个最容易失败。
- 顺手把环境变量写进
~/.bashrc,装完不用手动配。 - 提供常用工具的快捷安装入口,比如换源、装输入法、装 Docker 之类。
它本质上就是一个封装好的 shell 脚本集合,跑的时候会拉取一些文件到本地。理解了这一点,你就不会被"一键"两个字唬住,出问题也敢自己查。
5.2 使用步骤与几个必须留意的点
使用方式通常是在终端里执行一条包含脚本地址的命令,然后跟着交互菜单选。因为脚本地址会更新,我不在这里贴死,你去它的项目页面拿最新命令是最稳妥的。执行时我提醒几点:
第一,脚本需要 sudo 权限,会问你要密码,正常输入即可。但执行前建议先把~/.bashrc备份一份:
cp ~/.bashrc ~/.bashrc.bak万一脚本写坏了环境变量,直接还原就行,这是个低成本的保险。
第二,跑完脚本后一定新开一个终端验证,不要在当前终端直接测,因为环境变量是写入文件后由新 shell 加载的。
第三,脚本安装的发行版是它根据你系统判断的,不能跨版本装。Ubuntu 24.04 上它不会给你装 Noetic,这是正常的,不是 bug。
5.3 脚本安装和手动安装怎么选
我的建议是分场景:
| 场景 | 推荐方式 | 理由 |
|---|---|---|
| 第一次装、纯学习 | 手动安装 | 过程走一遍,后面排查有底 |
| 重装、赶时间 | 一键脚本 | 省掉 rosdep 这些磨人的步骤 |
| 服务器批量部署 | 手动写脚本 | 可控、可审计 |
| 教学演示 | 一键脚本 | 节省课堂时间 |
手动装过一次之后,你会发现脚本的价值和局限在哪。真正做项目时,环境问题还得靠自己对每个环节的理解去排查,一键工具救不了所有场。
6. 装完必做:验证与第一个工作空间
装完不验证,等于没装。很多人报告"ROS 装好了"然后跑程序报错,一问才发现环境变量没配、工作空间没建。这一节把装完必须做的几件事捋清楚,照着做能快速确认环境是全的。
6.1 跑通小海龟确认核心链路
小海龟(turtlesim)是 ROS 的"Hello World",它同时验证了节点、话题、话题订阅发布这一整套通信机制。ROS 1 的操作是三个终端:
# 终端 1 roscore # 终端 2 rosrun turtlesim turtlesim_node # 终端 3 rosrun turtlesim turtle_teleop_key第三个终端里用方向键,如果小海龟跟着动,说明从节点启动到话题通信全通了。ROS 2 里对应的是:
# 终端 1 ros2 run turtlesim turtlesim_node # 终端 2 ros2 run turtlesim turtle_teleop_key同时可以用ros2 topic list看当前有哪些话题,用ros2 node list看有哪些节点,这些命令是日常调试的基本功,趁早熟悉。
6.2 创建自己的编译工作空间
ROS 1 用 catkin:
mkdir -p ~/catkin_ws/src cd ~/catkin_ws/ catkin_make source devel/setup.bashROS 2 用 colcon:
mkdir -p ~/ros2_ws/src cd ~/ros2_ws colcon build source install/setup.bash这里有个关键点:工作空间的setup.bash必须 source,而且要在系统级/opt/ros/...之后 source,否则你新建的包不会被找到。顺序不能反。
建议把工作空间的 source 也写进~/.bashrc,但注意路径要对:
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc注意:工作空间重装或者换了名字后,
~/.bashrc里那条旧路径会报文件不存在的错,虽然不影响使用但很烦人,记得顺手删掉。
6.3 常用工具速览
装完之后这几个工具你会反复用到,提前知道它们干什么能少走弯路:
- rviz:三维可视化,看传感器数据、机器人模型、坐标系变换。
- rqt:图形化调试工具集,能看节点树、话题、参数,比命令行直观。
- Gazebo:物理仿真,做机器人运动学和传感器仿真用。
- rosbag:录包回放,调试算法时把真实数据录下来反复跑,特别有用。
这些工具在 desktop-full 或 desktop 里通常都带了,rosrun rviz rviz或者rviz2直接能开。第一次打开可能会卡一下,因为它在初始化图形后端,属正常现象。
7. 常见问题与排查速查表
前面讲的都是顺利情况,实际装的时候大概率会碰到一些报错。这一节是我攒下来的高频问题集合,按现象给排查思路,比你在论坛里翻帖子快得多。
7.1 apt 相关报错怎么定位
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
E: 无法定位软件包 ros-noetic-... | 源没加或没 update | 检查 sources.list.d 下的 ros 源文件,重新 apt update |
NO_PUBKEY | 密钥没导入 | 重新导入密钥,或换镜像站配套密钥 |
| 依赖冲突装不上 | 系统包版本太旧 | 先apt upgrade全量更新 |
| 卡在下载没速度 | 默认源慢 | 换国内镜像源 |
排查 apt 问题有个通用套路:先看错误是"找不到包"还是"依赖冲突",前者是源的问题,后者是版本的问题,方向完全不同。找不到包别急着换方法,先apt-cache policy 包名看系统里认不认这个包。
7.2 环境变量相关的典型坑
命令找不到是最常见的一类问题。rosrun: command not found、roscore: command not found,八成是~/.bashrc没配或者新终端没加载。排查顺序:
echo $ROS_DISTRO没输出说明没 source。再确认~/.bashrc里那条 source 路径对不对:
grep ros ~/.bashrc路径写错、写成/opt/ros/noetic/setup.zsh、或者手滑多打了个空格,都会导致加载失败。改完记得开新终端验证,别在当前终端纠结。
还有一种隐蔽情况:系统装了多个 ROS 版本,~/.bashrc里 source 了两个,后 source 的覆盖前面的,结果你以为在跑 Noetic,实际跑的是别的版本。用echo $ROS_DISTRO确认当前实际生效的版本。
7.3 rosdep 反复失败的应对
rosdep 失败基本围绕网络。除了前文说的镜像方案,还有几个实操技巧:多执行几次rosdep update,它的缓存是增量更新的,中断后重跑能接着来;把系统时间校准一下,证书验证对时间敏感,时间不准会导致下载校验失败:
sudo apt install ntpdate -y sudo ntpdate ntp.aliyun.com如果实在搞不定 rosdep,临时应对办法是编译时跳过它:catkin_make前用rosdep install --from-paths src --ignore-src -r -y单独处理,或者手动装缺失的依赖。这不是长久之计,但能让你先把项目跑起来。
7.4 虚拟机和远程连接的连带问题
虚拟机装 Ubuntu 的读者容易碰到两类问题。一类是 SSH 连不上,先确认openssh-server装了没:
sudo apt install openssh-server -y sudo systemctl status ssh再确认虚拟机网络模式,NAT 模式下宿主机要连虚拟机得配端口转发,桥接模式则要求虚拟机和宿主机在同一网段。另一类是分辨率或剪贴板异常,装好 VMware Tools 或 open-vm-tools 后重启即可:
sudo apt install open-vm-tools open-vm-tools-desktop -y远程操控 ROS 还涉及主从机配置,核心是设置ROS_MASTER_URI和ROS_IP两个环境变量。这块内容较多,等基础环境稳了再研究,先把单机跑通。
8. 装完之后往哪走:几条实用的进阶路线
ROS 装好只是起点,真正的学习在后面。根据自己的方向选一条线深入,比漫无目的地刷教程效率高得多。
8.1 嵌入式方向:micro-ROS 与单片机
如果你做的是嵌入式,micro-ROS 值得关注。它让 ESP32 这类单片机也能接入 ROS 2 网络,省掉了自己写通信协议的麻烦。基本流程是在主机上跑 micro-ROS agent,单片机侧刷带 micro-ROS 客户端的固件,两者通过串口或 UDP 通信。上手前先把主机环境跑通,确保ros2 topic list能看到 agent 建立的节点,再折腾固件,否则出问题分不清是主机还是设备的问题。
这条线的坑主要在环境一致性和串口权限。串口设备默认要 root 权限,加个 udev 规则或者把用户加进 dialout 组能解决:
sudo usermod -aG dialout $USER改完要重新登录才生效,很多人改完没重登就报权限错误,白白浪费时间。
8.2 机械臂与仿真方向
机械臂相关的开发,通常是先在 Gazebo 里仿真,跑通算法再上真机。典型流程是获取目标机械臂的 URDF 模型,配好控制器插件,在 Gazebo 里加载,然后用 MoveIt 做运动规划。这中间的坐标系变换(TF)是最容易出错的地方,模型加载后机械臂扭曲、乱飞,基本都是 URDF 里的关节坐标系定义有问题。
仿真的好处是安全,撞了重开就行;坏处是虚拟环境和真机有差距,动力学参数、摩擦力、传感器噪声都不一样。所以我的经验是:算法逻辑在仿真里调,参数标定一定要拿真机数据做,别指望仿真参数直接搬。
8.3 感知与实机接入
涉及相机、雷达这类传感器的项目,驱动安装是第一步。以常见的工业相机为例,厂商一般会提供 ROS 驱动包,编译后通过 launch 文件启动,再用image_view或 rviz 确认图像能出来。标定是绕不开的环节,相机内参、外参、和机械臂的手眼标定,每一项都有专门的工具包。标定的精度直接决定后续抓取的准确度,这块没捷径,只能按流程一步步测。
实机调试有个通用原则:先保证数据通路畅通,再谈算法。传感器数据能不能进 ROS,话题能不能正常发布,rviz 里能不能看到,这三步过了,才轮得到上算法。顺序搞反了,会在错误的地方debug半天。
如果让我给刚装完 ROS 的人一句建议,那就是别急着装一堆包,先把小海龟、话题、节点、工作空间这几样东西玩熟,把rosrun、rosnode、rostopic、roslaunch这几个命令用顺手。环境问题永远会遇到,但只要你清楚每一步在干什么,就没有解决不了的。我刚开始装的时候也在 rosdep 那卡了大半天,后来回头看,那些踩过的坑恰恰是最值钱的部分。