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 + ROS2 Humble为例)
软件组件推荐版本说明
Ubuntu22.04 LTSROS2 Humble官方支持
ROS2Humble HawksbillLTS版本,支持至2027年
GazeboGazebo 11(经典版)与ROS2 Humble通过gazebo_ros_pkgs桥接
rviz2随ROS2 Humble安装无需单独安装
slam_toolboxros-humble-slam-toolbox2D激光SLAM主流工具
navigation2ros-humble-navigation2后续导航课程需要
ROS2 SLAM 环境依赖关系与数据流 应用层(SLAM算法与工具) slam_toolbox navigation2 rviz2(可视化) teleop_twist_keyboard 中间层(ROS2 Humble 核心通信) rclcpp / rclpy DDS(FastDDS) tf2(坐标变换) 仿真与驱动层(数据源) Gazebo 11(物理仿真) gazebo_ros_pkgs(桥接) 激光雷达/里程计插件 /scan /odom /map 数据流方向:Gazebo 仿真 → ROS2 话题/变换 → SLAM 算法 → rviz2 可视化

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中能看到激光雷达点云