2. 环境搭建:Ubuntu系统安装、ROS2发行版选择、安装配置、验证安装及常见问题
2.1 核心原理:为什么ROS2与Ubuntu深度绑定
ROS2并非一个独立的操作系统,而是一套运行在Linux之上的机器人中间件框架。它依赖Linux内核提供的进程调度、网络协议栈、设备驱动(如摄像头、激光雷达、串口)以及权限管理机制。Ubuntu因其对硬件驱动的高兼容性、稳定的LTS(长期支持)版本策略,以及ROS2官方持续提供预编译二进制包,成为绝大多数机器人开发者的首选宿主系统。
理解这一层关系至关重要:ROS2的节点(Node)本质上是Ubuntu系统中的普通进程,节点间的通信(话题、服务、动作)依赖底层网络栈(DDS协议)。因此,Ubuntu系统的网络配置、防火墙规则、时间同步(NTP)都会直接影响ROS2通信的稳定性。例如,若Ubuntu防火墙未开放DDS使用的UDP端口(7400-7500范围),则会出现“节点能启动但互相发现不了”的典型故障。
版本选择原则:ROS2每个正式版本都对应一个特定的Ubuntu LTS版本。例如,Humble Hawksbill对应Ubuntu 22.04(Jammy),Iron Irwini对应Ubuntu 24.04(Noble)。选择原则是:优先使用与ROS2版本匹配的Ubuntu LTS,而非最新版Ubuntu。因为ROS2官方只对特定Ubuntu版本提供预编译包,自行从源码编译不仅耗时,且容易因依赖库版本冲突而失败。
2.2 方法流程:从零到可用的完整安装路径
环境搭建遵循“先系统、后ROS2、再验证”的三段式流程。每一步都有明确的检查点,避免在错误基础上叠加问题。
2.2.1 Ubuntu系统安装要点
- 镜像选择:从Ubuntu官网或国内镜像站(如清华、阿里)下载 ubuntu-22.04.3-desktop-amd64.iso,校验SHA256哈希值确保文件完整。
- 磁盘分区:建议为Ubuntu分配至少80GB空间,其中
/根分区50GB、/home分区30GB(存放源码和数据集)。若与Windows双系统,需先关闭Windows快速启动,否则Ubuntu无法挂载NTFS分区。 - 网络配置:安装时连接有线网络或配置WiFi,确保能访问外网。后续ROS2安装需要从packages.ros.org下载软件包。
- 软件更新:安装完成后立即执行
sudo apt update && sudo apt upgrade -y,将系统内核和基础库更新到最新稳定版。
2.2.2 ROS2发行版选择与安装
截至2025年,ROS2的LTS版本为Humble Hawksbill(2022-2027)和Iron Irwini(2024-2028)。对于教学和多数工业项目,推荐使用Humble,因其生态最成熟、教程资源最丰富。安装过程分为四步:
# 1. 设置软件源(使用国内镜像加速)
sudo apt install software-properties-common curl
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/ros2.list
# 2. 更新源并安装ROS2基础版(桌面版含可视化工具)
sudo apt update
sudo apt install ros-humble-desktop python3-argcomplete
# 3. 安装开发工具(编译工作空间用)
sudo apt install ros-dev-tools python3-colcon-common-extensions
# 4. 配置环境变量(写入~/.bashrc实现自动加载)
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc
版本选择决策表:
| 需求场景 | 推荐版本 | 理由 |
|---|---|---|
| 教学/学习 | Humble | 教程多、社区活跃、兼容Ubuntu 22.04 |
| 工业量产 | Iron | 支持至2028年,修复更多已知Bug |
| 最新功能探索 | Jazzy | 对应Ubuntu 24.04,但生态尚在完善 |
2.3 案例/场景:双系统与虚拟机的典型安装对比
以一位学生和一位工程师的实际场景为例,展示不同环境下的安装策略差异。
场景A:学生笔记本(Windows + Ubuntu双系统)
- 使用Rufus制作启动U盘,BIOS设置为UEFI模式,关闭Secure Boot(否则NVIDIA驱动和ROS2的某些内核模块无法加载)。
- 安装时选择“Install Ubuntu alongside Windows Boot Manager”,自动分区。
- 安装完成后,在Ubuntu中执行
sudo apt install ros-humble-desktop,耗时约15分钟(取决于网速)。 - 验证:运行
ros2 run demo_nodes_cpp talker,在另一终端运行ros2 run demo_nodes_cpp listener,看到“I heard: Hello World”即成功。
场景B:工程师工作站(纯Ubuntu + 远程开发)
- 直接安装Ubuntu 22.04 Server版,再手动安装
ubuntu-desktop-minimal以节省资源。 - 配置SSH服务,使用VS Code Remote-SSH进行远程开发。
- 安装ROS2时额外安装
ros-humble-turtlebot3-gazebo用于仿真测试。 - 设置
export ROS_DOMAIN_ID=42避免与同网段其他机器人冲突。
常见误区:不要直接在Windows的WSL2中安装ROS2用于机器人实机控制。WSL2的网络层与宿主机隔离,导致DDS发现协议无法广播到物理网卡,节点间通信会间歇性失败。若仅用于学习命令行,WSL2可接受;但涉及真实硬件(如连接激光雷达)时,必须使用原生Ubuntu或虚拟机(VMware/VirtualBox)的桥接网络模式。
2.4 误区/复盘:安装失败的五大根因与排查路径
根据社区数千条问题帖统计,ROS2安装失败可归为以下五类。掌握这些根因,能快速定位问题。
| 故障现象 | 根因 | 排查命令 | 解决方案 |
|---|---|---|---|
Package 'ros-humble-desktop' has no installation candidate | 软件源未正确添加或系统版本不匹配 | cat /etc/os-release 检查版本;ls /etc/apt/sources.list.d/ | 重新执行添加源的命令,确认是Ubuntu 22.04 |
ros2: command not found | 环境变量未source | echo $ROS_DISTRO 输出为空 | 执行 source /opt/ros/humble/setup.bash 并写入~/.bashrc |
| 节点启动后互相发现不了 | 防火墙拦截UDP组播 | sudo ufw status 查看防火墙状态 | sudo ufw allow 7400:7500/udp 或直接 sudo ufw disable(仅限内网) |
编译工作空间时报错 ModuleNotFoundError: No module named 'em' | Python依赖缺失 | pip3 list | grep empy | pip3 install empy==3.3.4(注意版本必须为3.x) |
| rviz2启动崩溃 | GPU驱动问题或OpenGL版本过低 | glxinfo | grep "OpenGL version" | 安装NVIDIA官方驱动:sudo ubuntu-drivers autoinstall |
2.4.1 复盘:一次典型的“安装成功但无法通信”排障过程
某次在实验室部署三台机器人,均安装Ubuntu 22.04 + ROS2 Humble。启动后每台机器人上的节点都能运行,但跨机器人的话题订阅失败。逐步排查:
- 检查网络连通性:
ping 192.168.1.101成功,排除物理链路问题。 - 检查DDS发现:执行
ros2 daemon stop后重启,问题依旧。 - 检查防火墙:发现三台机器均开启了ufw,且未放行UDP端口。执行
sudo ufw allow 7400:7500/udp后,通信立即恢复。
复盘结论:ROS2的DDS默认使用UDP端口7400-7500进行组播发现和用户数据传输。Ubuntu桌面版默认防火墙未启用,但服务器版或手动开启ufw后就会拦截。在部署多机系统时,应提前规划防火墙规则,或统一使用 ROS_DOMAIN_ID 隔离不同网络段的机器人。
2.5 验证安装的完整检查清单
安装完成后,不要急于开始写代码。用以下清单逐项验证,确保环境健康:
- 版本检查:
ros2 --version应输出ros2 0.xx.x及对应发行版名称。 - 环境变量:
printenv | grep ROS应显示ROS_DISTRO=humble、ROS_PACKAGE_PATH等。 - C++接口测试:运行
ros2 run demo_nodes_cpp talker,终端周期性输出Publishing: "Hello World"。 - Python接口测试:运行
ros2 run demo_nodes_py listener,能收到talker的消息。 - 可视化工具:启动
rviz2,界面能正常打开并显示3D视图。 - 命令行工具:
ros2 topic list能看到/chatter话题;ros2 node list能看到/talker和/listener节点。 - 编译测试:创建一个临时工作空间,执行
colcon build能成功生成build/、install/、log/目录。
最终建议:完成上述验证后,建议立即对Ubuntu系统做一次快照(若使用虚拟机)或备份关键配置文件(/etc/apt/sources.list.d/、~/.bashrc)。这样即使后续安装其他软件导致系统损坏,也能快速恢复到干净的ROS2环境。对于团队开发,可将环境搭建写成Shell脚本(如 setup_ros2.sh)纳入版本管理,实现新成员“一键部署”。