3、Gazebo仿真环境搭建:安装Gazebo、创建简单世界、加载机器人模型

好,咱们进入仿真环节了。说实话,做机器人开发,没有仿真环境就像闭着眼睛开车——心里没底。Gazebo 是我个人最常用的仿真器,它和 ROS 2 的配合非常默契。这一章,咱们就把仿真地基打牢。

3.1 为什么选择 Gazebo?

市面上仿真器不少,但 Gazebo 在机器人圈子里地位特殊。它开源、物理引擎成熟、传感器模拟逼真,而且和 ROS 2 的接口是原生支持的。你想想看,一个仿真器能直接发布 /scan、/odom 这些话题,省了多少适配的功夫。

我在项目中遇到过用其他仿真器结果雷达数据格式不兼容的情况,折腾了两天才搞定。换成 Gazebo 后,半小时就接上了。嗯,这就是生态的力量。

3.2 安装 Gazebo

ROS 2 Humble 官方推荐的是 Gazebo Fortress(也叫 Ignition Fortress)。安装其实很简单,但有几个坑要注意。

3.2.1 确认 ROS 2 环境

先确保你的 ROS 2 已经装好并且能正常使用。我个人习惯每次开新终端都先 source 一下:

source /opt/ros/humble/setup.bash

3.2.2 安装 Gazebo Fortress

直接用 apt 安装就行:

sudo apt update
sudo apt install ros-humble-ros-gz-sim

这个包会把 Gazebo Fortress 和 ROS 2 的桥接一起装好。装完之后,验证一下:

gz sim --version

如果看到版本号,说明装成功了。

注意: 我曾经遇到过装完以后启动报错,原因是系统里同时装了 Gazebo Classic 和 Gazebo Fortress,两个版本冲突了。建议先卸载旧版:sudo apt remove gazebo*,再装新版。

3.3 创建简单世界

Gazebo 里的「世界」就是一个仿真场景,包含地面、光照、物体等。咱们先建一个最简单的测试用世界。

3.3.1 编写世界文件

世界文件是 SDF 格式的。新建一个文件 my_world.sdf:

<?xml version="1.0" ?>
<sdf version="1.6">
  <world name="simple_world">
    <include>
      <uri>model://ground_plane</uri>
    </include>
    <include>
      <uri>model://sun</uri>
    </include>
    <include>
      <uri>model://unit_box</uri>
      <name>my_box</name>
      <pose>1 0 0.5 0 0 0</pose>
    </include>
  </world>
</sdf>

这个文件定义了一个带地面、阳光和一个方块的世界。说白了,就是最基础的测试环境。

3.3.2 启动世界

gz sim my_world.sdf

你会看到一个 3D 窗口,地面是灰色的,中间有个小方块。嗯,这就是咱们的第一个仿真世界。

小技巧: 如果你想让世界更丰富一点,可以加几个障碍物。比如再加一个圆柱体:model://unit_cylinder,摆在不同位置。我在做导航测试时,通常会在世界里放 5-8 个障碍物,模拟真实走廊环境。

3.4 加载机器人模型

世界有了,接下来把机器人放进去。咱们用 TurtleBot3 作为示例,因为它模型简单、文档齐全,非常适合入门。

3.4.1 获取机器人模型

先安装 TurtleBot3 的模型文件:

sudo apt install ros-humble-turtlebot3-gazebo

装好后,模型文件在 /opt/ros/humble/share/turtlebot3_gazebo/models/ 目录下。

3.4.2 编写启动文件

创建一个 Python 启动文件 start_simulation.py:

import os
from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch.actions import ExecuteProcess

def generate_launch_description():
    # 设置模型路径
    model_path = os.path.join(
        get_package_share_directory('turtlebot3_gazebo'),
        'models',
        'turtlebot3_waffle',
        'model.sdf'
    )
    
    return LaunchDescription([
        ExecuteProcess(
            cmd=['gz', 'sim', '-r', model_path],
            output='screen'
        )
    ])

运行这个文件:

ros2 launch start_simulation.py

你会看到 TurtleBot3 出现在仿真世界里。它带有激光雷达、轮式里程计等传感器,这些数据都会通过 ROS 2 话题发布出来。

核心要点: 加载机器人模型的关键是告诉 Gazebo 模型文件的 SDF 路径。模型文件里定义了机器人的外观、碰撞体、传感器、关节等所有信息。说白了,模型文件就是机器人的「数字孪生」。

3.5 本章知识体系

下面这张图帮你理清本章的核心逻辑:

Gazebo 仿真环境搭建流程 安装 Gazebo ros-humble-ros-gz-sim 创建世界文件 my_world.sdf 加载机器人模型 TurtleBot3 SDF 仿真输出 • /scan —— 激光雷达数据 • /odom —— 里程计数据 • /tf —— 坐标变换 • /cmd_vel —— 速度控制指令 这些话题是 Nav2 的输入 后续章节会逐一对接

3.6 常见问题与避坑

问题 原因 解决方法
Gazebo 启动后黑屏 显卡驱动或 OpenGL 版本问题 安装 mesa-utils,检查 glxinfo
模型加载后没有传感器数据 模型 SDF 中传感器插件未启用 检查模型文件中的 <plugin> 标签
仿真速度极慢 物理引擎更新频率过高 降低 <max_step_size> 到 0.001
ROS 2 话题收不到数据 桥接节点未启动 运行 ros2 run ros_gz_bridge parameter_bridge
避坑指南: 我曾经在加载自定义模型时,Gazebo 一直报错说找不到 mesh 文件。后来发现是模型文件里的 URI 路径写的是相对路径,而 Gazebo 的工作目录和启动目录不一致。建议所有模型路径都用路径,或者通过环境变量 GZ_SIM_RESOURCE_PATH 指定。

好了,到这一步,你的 Gazebo 仿真环境已经搭好了。世界有了,机器人也放进去了。下一章咱们会让这个机器人真正动起来——用键盘控制它走一走,看看传感器数据是不是对的。嗯,先到这里,动手试试吧。