2、Gazebo仿真环境搭建:安装Gazebo、创建简单世界、添加障碍物、添加机器人模型

2.1 为什么我要先聊环境搭建?

说实话,很多初学者一上来就急着跑算法、调参数。结果呢?环境没配好,仿真跑两步就崩了。我在项目里见过太多次这种事了。

Gazebo的环境搭建,说白了就是给你的机器人搭个「舞台」。舞台搭不好,演员再厉害也白搭。我个人习惯是,先把基础环境搞扎实了,后面调参才能有的放矢。

核心思路:Gazebo仿真 ≠ 真实物理。但环境搭建越规范,仿真结果越接近真实。这是后面所有避障参数优化的基础。

2.2 安装Gazebo:别踩这些坑

安装Gazebo其实不难,但版本问题容易让人头疼。我建议直接用ROS自带的一键安装脚本,省心。

# 安装ROS(以Noetic为例)
sudo apt update
sudo apt install ros-noetic-desktop-full

# 安装Gazebo(ROS自带)
sudo apt install ros-noetic-gazebo-ros-pkgs ros-noetic-gazebo-ros-control

⚠️ 我曾经踩过的坑:千万别手动装Gazebo独立版本!ROS和Gazebo的版本必须匹配。比如ROS Noetic对应Gazebo 9.x。我见过有人装了Gazebo 11,结果ROS接口全对不上,折腾了两天。

装完后,跑一下这个命令验证:

gazebo --version
# 输出类似:Gazebo multi-robot simulator, version 9.19.0

嗯,看到版本号就说明装好了。

2.3 创建你的第一个世界

世界文件说白了就是一个描述场景的XML文件。我习惯用.world后缀。你想想看,这个世界里有什么?地面、光照、重力、物理参数……全在这里定义。

下面是我常用的一个简单世界模板:

<?xml version="1.0" ?>
<sdf version="1.6">
  <world name="simple_world">
    <include>
      <uri>model://sun</uri>
    </include>
    <include>
      <uri>model://ground_plane</uri>
    </include>
    
    <physics type="ode">
      <real_time_update_rate>1000</real_time_update_rate>
      <max_step_size>0.001</max_step_size>
    </physics>
  </world>
</sdf>

保存为my_world.world,然后用Gazebo打开:

gazebo my_world.world

你会看到一个带阳光和地面的空世界。为什么物理参数要这么设?max_step_size设0.001秒,仿真精度高,但计算量大。我在做避障仿真时,一般保持这个值,因为障碍物检测对精度要求高。

2.4 添加障碍物:从简单到复杂

空世界没意思。我们要加障碍物。Gazebo里加障碍物有两种方式:

  1. 用模型库里的现成模型(适合快速验证)
  2. 自己写SDF模型(适合定制化场景)

我个人习惯先用现成的,调通了再换自定义的。下面是一个带障碍物的世界文件:

<?xml version="1.0" ?>
<sdf version="1.6">
  <world name="obstacle_world">
    <include>
      <uri>model://sun</uri>
    </include>
    <include>
      <uri>model://ground_plane</uri>
    </include>
    
    <!-- 添加一个箱子作为障碍物 -->
    <model name="box_obstacle">
      <pose>2 0 0.5 0 0 0</pose>
      <link name="body">
        <collision name="collision">
          <geometry>
            <box>
              <size>0.5 0.5 1.0</size>
            </box>
          </geometry>
        </collision>
        <visual name="visual">
          <geometry>
            <box>
              <size>0.5 0.5 1.0</size>
            </box>
          </geometry>
          <material>
            <ambient>1 0 0 1</ambient>
          </material>
        </visual>
      </link>
    </model>
    
    <!-- 添加一个圆柱体 -->
    <model name="cylinder_obstacle">
      <pose>-2 1.5 0.5 0 0 0</pose>
      <link name="body">
        <collision name="collision">
          <geometry>
            <cylinder>
              <radius>0.3</radius>
              <length>1.0</length>
            </cylinder>
          </geometry>
        </collision>
        <visual name="visual">
          <geometry>
            <cylinder>
              <radius>0.3</radius>
              <length>1.0</length>
            </cylinder>
          </geometry>
          <material>
            <ambient>0 0 1 1</ambient>
          </material>
        </visual>
      </link>
    </model>
  </world>
</sdf>

💡 小技巧:障碍物的pose参数是 x y z roll pitch yaw。我一般把障碍物放在机器人路径的「必经之路」上,这样测试避障算法才有效果。

2.5 添加机器人模型

机器人模型是仿真的主角。Gazebo里最常用的就是TurtleBot3。为什么选它?因为模型简单、文档全、社区活跃。我在好几个项目里都用它做原型验证。

安装TurtleBot3模型:

sudo apt install ros-noetic-turtlebot3 ros-noetic-turtlebot3-simulations

然后在世界文件中引入:

<!-- 在世界文件中添加机器人 -->
<include>
  <uri>model://turtlebot3_burger</uri>
  <pose>0 0 0 0 0 0</pose>
</include>

或者用launch文件启动:

<launch>
  <!-- 启动Gazebo世界 -->
  <include file="$(find gazebo_ros)/launch/empty_world.launch">
    <arg name="world_name" value="$(find my_package)/worlds/obstacle_world.world"/>
  </include>
  
  <!-- 生成机器人 -->
  <node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" 
        args="-file $(find turtlebot3_description)/urdf/turtlebot3_burger.urdf 
              -urdf -x 0 -y 0 -z 0 -model turtlebot3_burger"/>
</launch>

2.6 本章知识体系

下面这张图,是我梳理的环境搭建核心逻辑。你看一遍就能明白各个模块的关系:

Gazebo仿真环境搭建知识体系 Gazebo仿真引擎 世界文件 (.world) 障碍物模型 机器人模型 世界文件包含 • 物理引擎参数 • 光照/地面 • 模型引用 障碍物类型 • 箱体/圆柱体 • 自定义SDF模型 • 模型库引用 机器人模型 • URDF/SDF描述 • TurtleBot3示例 • spawn_model生成

2.7 验证你的环境

环境搭好了,怎么知道对不对?我一般做三步验证:

验证步骤 命令/操作 预期结果
1. Gazebo启动 gazebo --verbose 窗口打开,无报错
2. 加载世界 gazebo my_world.world 看到地面和障碍物
3. 生成机器人 运行launch文件 机器人出现在指定位置

⚠️ 注意:如果机器人出现后「陷」到地面里,检查一下pose的z值。我记得有一次把z设成了0,结果机器人半个身子在地底下。后来改成0.1(抬高10厘米)就好了。

好了,环境搭建就到这里。记住一句话:环境搭得好,调参没烦恼。后面我们聊避障参数优化的时候,你会感谢现在认真搭环境的自己。

💡 我的个人习惯:每次新建项目,我都会把世界文件、机器人模型、障碍物配置放在一个包里,用git管理。这样换电脑或者给同事用,一条命令就能复现环境。

可可精品资料库