【ROS2】 Jazzy + TurtleBot3 自动建图完整指南

这篇指南将带你从零开始,在 ROS2 Jazzy 环境下,使用 TurtleBot3 完成自动探索建图。我们将从源码编译 explore_lite 包开始,解决常见的依赖和编译问题,并最终实现机器人的全自动建图。

🛠️ 第一步:获取源码并清理环境

首先,我们需要获取专为 ROS2 适配的 explore_lite 源码,并清理掉任何可能引起冲突的旧文件。

# 1. 进入工作空间的 src 目录
cd ~/turtlebot3_ws/src

# 2. 删除旧的或错误的包,确保环境干净
rm -rf m-explore m-explore-ros2 explore_lite

# 3. 使用国内镜像加速,克隆 ROS2 版本的 explore_lite
git clone https://ghfast.top/https://github.com/robo-friends/m-explore-ros2.git
🔨 第二步:安装依赖并重新编译

这是解决“找不到包”或“消息包丢失”等报错的核心步骤。我们将彻底清理缓存,安装依赖,并正确编译。

# 1. 返回工作空间根目录
cd ~/turtlebot3_ws

# 2. 强制删除旧的构建产物和日志,防止缓存干扰
rm -rf build/explore_lite build/explore_lite_msgs \
       install/explore_lite install/explore_lite_msgs \
       log

# 3. 安装系统依赖 (如果提示 rosdep 未找到,请先运行: sudo apt install python3-rosdep)
rosdep install --from-paths src --ignore-src -r -y

# 4. 编译 explore_lite 及其消息包
colcon build --packages-select explore_lite_msgs explore_lite

# 5. 编译成功后,刷新当前终端的环境变量
source install/setup.bash
🚀 第三步:启动自动建图(四终端法)

现在,环境已经准备就绪。请打开 4个 新的终端,并按顺序执行以下命令。

终端 1:启动 Gazebo 仿真环境

export TURTLEBOT3_MODEL=waffle_pi
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py

终端 2:启动 SLAM 建图

# 修正点:直接使用 slam_toolbox 的原生启动文件,更稳定
ros2 launch slam_toolbox online_async_launch.py use_sim_time:=true

终端 3:启动 Nav2 导航栈

作用:提供代价地图 (/global_costmap/costmap),这是 explore_lite 能够工作的先决条件。

ros2 launch nav2_bringup navigation_launch.py use_sim_time:=true

终端 4:启动自动探索节点

ros2 run explore_lite explore --ros-args -p costmap_topic:=/global_costmap/costmap
📊 第四步:启动 RViz 进行监控

最后,打开第五个终端,启动 RViz 来可视化整个过程。

rviz2

在 RViz 中,你需要手动添加以下显示项来观察效果:

  • Map: 话题为 /map,查看 SLAM 构建的地图。
  • LaserScan: 话题为 /scan,查看雷达数据。
  • Map: 话题为 /global_costmap/costmap,查看导航用的代价地图。
  • RobotModel: 显示机器人模型。

💡 一键启动脚本

每次手动打开四个终端确实很麻烦。下面是一个 Bash 脚本,可以帮你一键启动所有节点。

1. 创建脚本文件

在你的主目录下创建一个名为 start_auto_mapping.sh 的文件。

nano ~/start_auto_mapping.sh
2. 粘贴脚本内容

将以下内容复制并粘贴到文件中,然后按 Ctrl+O 保存,再按 Ctrl+X 退出。

#!/bin/bash

# ==========================================
# TurtleBot3 自动建图终极修复版 (解决 No frontiers found)
# ==========================================

echo "----------------------------------------"
echo "🚀 正在初始化环境..."
export TURTLEBOT3_MODEL=waffle_pi
source /opt/ros/jazzy/setup.bash
source ~/turtlebot3_ws/install/setup.bash

# --- 第一步:启动 Gazebo 仿真 ---
echo "[1/4] 启动 Gazebo 世界..."
gnome-terminal --tab --title="1. Gazebo World" -- bash -c '
    source /opt/ros/jazzy/setup.bash;
    source ~/turtlebot3_ws/install/setup.bash;
    export TURTLEBOT3_MODEL=waffle_pi;
    ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py;
    exec bash'

sleep 8

# --- 第二步:启动 SLAM Toolbox ---
echo "[2/4] 启动 SLAM Toolbox (Mapping模式)..."
gnome-terminal --tab --title="2. SLAM Toolbox" -- bash -c '
    source /opt/ros/jazzy/setup.bash;
    source ~/turtlebot3_ws/install/setup.bash;
    ros2 launch slam_toolbox online_async_launch.py use_sim_time:=true;
    exec bash'

sleep 3

# --- 第三步:启动 Nav2 (SLAM模式) ---
echo "[3/4] 启动 Nav2 (启用 SLAM 模式)..."
gnome-terminal --tab --title="3. Nav2 Stack" -- bash -c '
    source /opt/ros/jazzy/setup.bash;
    source ~/turtlebot3_ws/install/setup.bash;
    export TURTLEBOT3_MODEL=waffle_pi;
    
    # 核心:必须使用 bringup_launch.py + slam:=True
    ros2 launch nav2_bringup bringup_launch.py \
        use_sim_time:=true \
        slam:=True \
        params_file:=$(ros2 pkg prefix nav2_bringup)/share/nav2_bringup/params/nav2_params.yaml;
    exec bash'

echo "⏳ 等待 Nav2 完全初始化 (15秒)..."
sleep 15

# --- 第四步:启动 RViz2 ---
echo "[4/4] 启动 RViz2 可视化..."
gnome-terminal --tab --title="4. RViz2 View" -- bash -c '
    source /opt/ros/jazzy/setup.bash;
    source ~/turtlebot3_ws/install/setup.bash;
    rviz2 -d $(ros2 pkg prefix nav2_bringup)/share/nav2_bringup/rviz/nav2_default_view.rviz;
    exec bash'

sleep 2

# --- 第五步:启动 Explore Lite (关键修复) ---
echo "[5/5] 启动 Explore Lite 自动探索 (带边界检测优化)..."
gnome-terminal --tab --title="5. Explore Lite (AUTO)" -- bash -c '
    source /opt/ros/jazzy/setup.bash;
    source ~/turtlebot3_ws/install/setup.bash;
    
    # 关键参数修复:
    # 1. min_frontier_size: 防止小边界被忽略
    # 2. frontier_timeout: 避免因短暂无边界而停止
    # 3. costmap_updates_topic: 确保接收地图更新
    ros2 run explore_lite explore \
        --ros-args \
        -p use_sim_time:=true \
        -p robot_base_frame:=base_link \
        -p costmap_topic:=/global_costmap/costmap \
        -p costmap_updates_topic:=/global_costmap/costmap_updates \
        -p min_frontier_size:=0.5 \
        -p frontier_timeout:=5.0 \
        -p visualize:=true;
    exec bash'

echo "----------------------------------------"
echo "✅ 所有节点已启动!"
echo "💡 操作提示:"
echo "1. 如果机器人不动,在 RViz 中点击 '2D Goal Pose' 给个初始方向"
echo "2. 观察 Costmap 中是否有灰色未知区域(必须有!)"
echo "----------------------------------------"
3. 赋予脚本执行权限
chmod +x ~/start_auto_mapping.sh
4. 如何使用

以后,你只需要在任意终端中运行以下命令,所有四个终端就会自动弹出并启动相应程序:

source ~/start_auto_mapping.sh

注意:这个脚本假设你使用的是 gnome-terminal。如果你使用的是其他终端(如 konsolexterm),需要相应地修改脚本中的命令。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐