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版本提供预编译包,自行从源码编译不仅耗时,且容易因依赖库版本冲突而失败。

Ubuntu 22.04 LTS (操作系统层) Linux 内核 进程/网络/驱动管理 网络栈(UDP/TCP) DDS通信基础 设备驱动 摄像头/雷达/串口 环境变量 source /opt/ros/humble/setup.bash ⚠ 防火墙/时间同步 ROS2 Humble (中间件层) rclcpp / rclpy C++ / Python客户端库 DDS 抽象层 rmw_fastrtps_cpp 工具链 rviz2 / gazebo / colcon ament 构建系统 编译/依赖管理 机器人应用层 导航栈(Nav2) 机械臂控制(MoveIt2) 感知(CV/点云) 用户自定义节点 依赖 API调用 版本匹配关系:Ubuntu 22.04 ↔ ROS2 Humble ↔ DDS(FastDDS)↔ 机器人应用

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环境变量未sourceecho $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 empypip3 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。启动后每台机器人上的节点都能运行,但跨机器人的话题订阅失败。逐步排查:

  1. 检查网络连通性:ping 192.168.1.101 成功,排除物理链路问题。
  2. 检查DDS发现:执行 ros2 daemon stop 后重启,问题依旧。
  3. 检查防火墙:发现三台机器均开启了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)纳入版本管理,实现新成员“一键部署”。