2、环境搭建:安装ROS2、Gazebo、rviz2及SLAM相关依赖包
2.1 核心原理:为什么环境搭建是SLAM学习的“第一道门槛”
SLAM(同步定位与建图)本质上是一个多传感器数据融合 + 实时计算的系统工程。在ROS2中运行SLAM,至少需要三个层面的软件支撑:通信中间件(ROS2)、仿真环境(Gazebo)、可视化与调试工具(rviz2)。三者缺一不可——没有Gazebo,你无法在无实体机器人的情况下验证算法;没有rviz2,你无法“看见”激光雷达点云、机器人位姿和地图构建过程;而ROS2本身则负责将传感器数据、算法节点和可视化工具连接成一张实时数据流网络。
环境搭建的核心难点并非“安装”本身,而是版本匹配。ROS2的发行版(如Humble、Iron)与Ubuntu系统版本严格绑定,Gazebo的版本又依赖ROS2的接口版本,而rviz2和SLAM工具包(如slam_toolbox、navigation2)则必须与ROS2的API兼容。任何一层版本错位,都会导致节点无法通信、插件加载失败或仿真崩溃。
| 软件组件 | 推荐版本 | 说明 |
|---|---|---|
| Ubuntu | 22.04 LTS | ROS2 Humble官方支持 |
| ROS2 | Humble Hawksbill | LTS版本,支持至2027年 |
| Gazebo | Gazebo 11(经典版) | 与ROS2 Humble通过gazebo_ros_pkgs桥接 |
| rviz2 | 随ROS2 Humble安装 | 无需单独安装 |
| slam_toolbox | ros-humble-slam-toolbox | 2D激光SLAM主流工具 |
| navigation2 | ros-humble-navigation2 | 后续导航课程需要 |
2.2 方法流程:从零开始搭建完整SLAM开发环境
环境搭建遵循“由底向上、逐层验证”的原则。每一步安装后都应立即验证,避免将多个问题叠加后难以排查。以下是经过验证的完整流程:
步骤一:配置Ubuntu软件源与系统更新
sudo apt update && sudo apt upgrade -y
sudo apt install -y software-properties-common curl gnupg lsb-release
步骤二:安装ROS2 Humble(桌面完整版)
# 添加ROS2软件源
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 > /dev/null
# 安装ROS2 Humble桌面版(包含rviz2、demo、tutorials)
sudo apt update
sudo apt install -y ros-humble-desktop
# 安装构建工具与依赖
sudo apt install -y python3-argcomplete python3-colcon-common-extensions python3-rosdep
步骤三:安装Gazebo 11与ROS2桥接包
# Gazebo 11(Ubuntu 22.04仓库自带)
sudo apt install -y gazebo11
# ROS2与Gazebo的桥接包(提供话题转换、URDF加载等)
sudo apt install -y ros-humble-gazebo-ros-pkgs ros-humble-gazebo-ros2-control
步骤四:安装SLAM相关依赖包
# 2D SLAM工具包(核心)
sudo apt install -y ros-humble-slam-toolbox
# 导航框架(后续章节需要,提前安装)
sudo apt install -y ros-humble-navigation2 ros-humble-nav2-bringup
# 机器人模型与URDF工具
sudo apt install -y ros-humble-urdf ros-humble-xacro ros-humble-robot-state-publisher
# 激光雷达仿真插件(Gazebo中使用)
sudo apt install -y ros-humble-gazebo-ros-pkgs ros-humble-velodyne-simulator
# 键盘控制(手动控制机器人移动)
sudo apt install -y ros-humble-teleop-twist-keyboard
步骤五:初始化rosdep并配置环境变量
# 初始化rosdep(用于后续编译时自动解析依赖)
sudo rosdep init
rosdep update
# 将ROS2环境变量写入bashrc(每次终端自动加载)
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
echo "source /usr/share/gazebo/setup.sh" >> ~/.bashrc
source ~/.bashrc
2.3 案例场景:验证环境是否真正“跑通”
安装完成后,必须通过一个最小闭环测试来验证所有组件能否协同工作。以下测试模拟了SLAM运行时的核心数据流:
验证步骤:启动仿真环境并观察数据
# 终端1:启动一个空世界(验证Gazebo与ROS2桥接)
ros2 launch gazebo_ros empty_world.launch.py
# 终端2:查看当前活跃话题(应能看到 /clock、/rosout 等)
ros2 topic list
# 终端3:在Gazebo中手动添加一个差速驱动机器人模型
# (可通过gazebo_ros的spawn_entity服务实现)
ros2 run gazebo_ros spawn_entity.py -file turtlebot3_waffle.urdf -entity my_robot
# 终端4:启动rviz2并添加LaserScan显示
rviz2
如果一切正常,你将在rviz2中看到机器人的激光雷达点云数据,并且可以通过键盘控制机器人移动。此时,SLAM所需的数据链路已经打通:Gazebo仿真出激光雷达数据 → 通过gazebo_ros桥接发布到/scan话题 → rviz2订阅并可视化。
- rviz2中看不到机器人模型:检查是否启动了robot_state_publisher节点,且URDF文件路径正确。
- /scan话题无数据:确认Gazebo中是否真正加载了带激光雷达插件的模型,而非空世界。
- 节点启动报“package not found”:执行
source /opt/ros/humble/setup.bash后重试,或检查包名拼写。 - Gazebo启动后黑屏/崩溃:尝试
export LIBGL_ALWAYS_SOFTWARE=1解决显卡驱动问题。
2.4 误区与复盘:环境搭建中最容易踩的“坑”
根据大量学习者的反馈,环境搭建阶段最常见的误区集中在以下四个方面:
| 误区 | 后果 | 正确做法 |
|---|---|---|
| 混用ROS1和ROS2环境变量 | 命令找不到、节点崩溃 | 严格区分终端,使用 source /opt/ros/humble/setup.bash |
| 忽略Gazebo与ROS2的桥接包 | Gazebo启动但话题为空 | 必须安装 ros-humble-gazebo-ros-pkgs |
| 使用sudo pip安装Python包 | 破坏系统Python环境 | 使用apt安装ROS2相关Python包 |
| 不验证就进入下一章 | SLAM算法无法运行却不知原因 | 务必完成2.3节的最小闭环测试 |
复盘建议:环境搭建不是“一次性”工作。当你后续编译自己的功能包时,可能还需要安装额外的依赖(如 ros-humble-cartographer 或 ros-humble-laser-filters)。建议养成一个习惯:每安装一个新包,立即用 ros2 pkg list | grep 包名 验证是否安装成功。这能帮你将“环境问题”和“代码问题”快速隔离,大幅提升调试效率。
- ☐
ros2 --version输出包含ros-humble - ☐
gazebo --version输出 Gazebo 11.x - ☐
rviz2能正常启动并显示界面 - ☐
ros2 pkg list | grep slam_toolbox有输出 - ☐
ros2 pkg list | grep gazebo_ros有输出 - ☐ 通过2.3节测试,rviz2中能看到激光雷达点云