【ROS2 】Jazzy TurtleBot3从零搭建自定义 Gazebo 迷宫仿真世界 (Sugar Maze)在 ROS2 机器人开发中Gazebo 仿真往往是算法验证的第一站。很多同学在尝试加载自定义地图World时常遇到“文件不存在”、“编译报错”或“网络超时”等问题。本文基于Ubuntu 24.04 ROS2 Jazzy环境手把手带你解决 TurtleBot3 仿真包下载难题并创建一个专为避障与导航设计的“糖豆人风格”迷宫世界。️ 第一步解决网络问题与源码获取由于国内网络访问 GitHub 经常超时直接git clone极易失败。我们需要借助代理工具加速。同时针对 ROS2 Jazzy 版本必须拉取对应的jazzy-devel分支。1. 进入工作空间源码目录cd~/turtlebot3_ws/src2. 使用镜像源克隆代码# 克隆支持 Jazzy 的仿真包分支gitclone https://github.com/ROBOTIS-GIT/turtlebot3_simulations.git 提示如果上述链接失效可尝试将https://ghproxy.com/替换为https://mirror.ghproxy.com/。3. 安装依赖并编译下载完成后必须重新编译才能让系统识别新的路径。# 返回工作空间根目录cd~/turtlebot3_ws# 安装依赖 (注意指定 rosdistro 为 jazzy)rosdepinstall-i--from-path src--rosdistrojazzy-y# 编译colcon build --symlink-install# ⚠️ 关键步骤刷新环境变量否则找不到 launch 文件source~/.bashrc️ 第二步创建自定义迷宫世界 (Sugar Maze)我们将创建一个名为sugar_maze.world的文件。这个迷宫设计遵循以下规范通道宽度1.2米TurtleBot3 直径约 0.14m通过非常丝滑。墙体尺寸厚度 0.2m高度 1.0m。视觉风格外围红墙内部灰墙起点有标记。1. 编写 World 文件在终端中创建并编辑文件mkdir-p~/turtlebot3_ws/worldsnano~/turtlebot3_ws/worlds/sugar_maze.world将以下 XML 代码完整复制进去并保存 (CtrlO,Enter,CtrlX)sdfversion1.6worldnamesugar_maze!-- 基础环境地面与光照 --includeurimodel://ground_plane/uri/includeincludeurimodel://sun/uri/include!-- 设计规范 通道宽: 1.2m | 墙厚: 0.2m | 墙高: 1.0m 原点: 迷宫中心 (0,0) --!-- 1. 外围边界墙 (10m x 10m 区域) --!-- 北墙 --modelnameouter_wall_northpose0 5.1 0.5 0 0 0/poselinknamelinkcollisionnamecollisiongeometryboxsize10.4 0.2 1/size/box/geometrysurfacefrictionodemu100/mumu250/mu2/ode/friction/surface/collisionvisualnamevisualgeometryboxsize10.4 0.2 1/size/box/geometrymaterialambient0.8 0.2 0.2 1/ambient/material!-- 红色 --/visual/link/model!-- 南墙 --modelnameouter_wall_southpose0 -5.1 0.5 0 0 0/poselinknamelinkcollisionnamecollisiongeometryboxsize10.4 0.2 1/size/box/geometrysurfacefrictionodemu100/mumu250/mu2/ode/friction/surface/collisionvisualnamevisualgeometryboxsize10.4 0.2 1/size/box/geometrymaterialambient0.8 0.2 0.2 1/ambient/material/visual/link/model!-- 东墙 --modelnameouter_wall_eastpose5.1 0 0.5 0 0 0/poselinknamelinkcollisionnamecollisiongeometryboxsize0.2 10.4 1/size/box/geometrysurfacefrictionodemu100/mumu250/mu2/ode/friction/surface/collisionvisualnamevisualgeometryboxsize0.2 10.4 1/size/box/geometrymaterialambient0.8 0.2 0.2 1/ambient/material/visual/link/model!-- 西墙 --modelnameouter_wall_westpose-5.1 0 0.5 0 0 0/poselinknamelinkcollisionnamecollisiongeometryboxsize0.2 10.4 1/size/box/geometrysurfacefrictionodemu100/mumu250/mu2/ode/friction/surface/collisionvisualnamevisualgeometryboxsize0.2 10.4 1/size/box/geometrymaterialambient0.8 0.2 0.2 1/ambient/material/visual/link/model!-- 2. 内部主干道 (构建迷宫骨架) --!-- 水平主路 --modelnamemain_hall_northpose0 2.5 0.5 0 0 0/poselinknamelinkcollisiongeometryboxsize7.6 0.2 1/size/box/geometry/collisionvisualgeometryboxsize7.6 0.2 1/size/box/geometrymaterialambient0.5 0.5 0.5 1/ambient/material/visual/link/modelmodelnamemain_hall_southpose0 -2.5 0.5 0 0 0/poselinknamelinkcollisiongeometryboxsize7.6 0.2 1/size/box/geometry/collisionvisualgeometryboxsize7.6 0.2 1/size/box/geometrymaterialambient0.5 0.5 0.5 1/ambient/material/visual/link/model!-- 垂直主路 --modelnamemain_hall_centerpose0 0 0.5 0 0 0/poselinknamelinkcollisiongeometryboxsize0.2 5.6 1/size/box/geometry/collisionvisualgeometryboxsize0.2 5.6 1/size/box/geometrymaterialambient0.5 0.5 0.5 1/ambient/material/visual/link/model!-- 3. 细节区域 --!-- 十字路口隔断 --modelnamecross_road_eastpose3.0 0 0.5 0 0 0/poselinknamelinkcollisiongeometryboxsize0.2 3.6 1/size/box/geometry/collisionvisualgeometryboxsize0.2 3.6 1/size/box/geometry/visual/link/modelmodelnamecross_road_westpose-3.0 0 0.5 0 0 0/poselinknamelinkcollisiongeometryboxsize0.2 3.6 1/size/box/geometry/collisionvisualgeometryboxsize0.2 3.6 1/size/box/geometry/visual/link/model!-- 环形通道区 --modelnameloop_northpose2.5 3.5 0.5 0 0 0/poselinknamelinkcollisiongeometryboxsize5.0 0.2 1/size/box/geometry/collisionvisualgeometryboxsize5.0 0.2 1/size/box/geometry/visual/link/modelmodelnameloop_eastpose4.5 2.5 0.5 0 0 1.57/pose!-- 旋转90度 --linknamelinkcollisiongeometryboxsize2.0 0.2 1/size/box/geometry/collisionvisualgeometryboxsize2.0 0.2 1/size/box/geometry/visual/link/model!-- 死胡同 (测试避障) --modelnamedead_endpose-2.5 -3.5 0.5 0 0 0/poselinknamelinkcollisiongeometryboxsize2.0 0.2 1/size/box/geometry/collisionvisualgeometryboxsize2.0 0.2 1/size/box/geometry/visual/link/model!-- 起点标记 --modelnamestart_zonepose0 -4.5 0 0 0 0/posestatictrue/staticlinknamelinkvisualnamevisualgeometrycylinderradius0.2/radiuslength0.01/length/cylinder/geometrymaterialambient0 1 0 1/ambient/material!-- 绿色圆盘 --/visual/link/model/world/sdf代码亮点解析物理属性增强在collision中加入了surfacefriction防止机器人高速撞墙时发生穿模或异常反弹。视觉区分外墙设为红色 (0.8 0.2 0.2)内墙设为灰色起点设为绿色圆盘便于调试时快速定位。坐标逻辑所有墙体高度设为1Z轴位置设为0.5确保墙底紧贴地面 (z0)。 第三步启动仿真现在你可以尝试加载这个世界了。由于我们还没有编写专门的 Launch 文件可以先用 Gazebo 直接打开 world 文件进行测试# 启动 Gazebo 并加载你的迷宫gz sim ~/turtlebot3_ws/worlds/sugar_maze.world或者如果你想结合 TurtleBot3 一起启动假设你已经有了对应的 launch 文件配置请确保在 Launch 文件中将world参数指向该路径。 常见问题排查报错Error Code 11或模型缺失说明 Gazebo 没找到ground_plane等基础模型。请检查~/.gazebo/models目录下是否有这些文件夹或者运行gz sim -v 4查看详细日志。机器人掉出地图检查pose中的 Z 轴高度。机器人的 Z 轴通常应略高于地面如 0.05 左右而墙体 Z 轴应为 0.5。希望这篇教程能帮你顺利跑通仿真如果有具体的 Launch 文件配置问题欢迎在评论区留言。