2. Gazebo环境搭建:让你的仿真世界跑起来

Gazebo的安装,说实话,比我想象中要简单得多。我记得第一次接触ROS时,最头疼的就是环境配置,各种依赖冲突能把人搞疯。但Gazebo在这方面做得相当成熟,尤其是和ROS搭配使用时,基本上一行命令就能搞定。

2.1 安装与启动:从零到有

我个人习惯用apt安装,干净利落。如果你用的是Ubuntu 20.04 + ROS Noetic,直接敲下面这条命令:

sudo apt install ros-noetic-gazebo-ros-pkgs ros-noetic-gazebo-ros-control

嗯,这里要注意,gazebo-ros-control 这个包很容易被忽略。我在项目中遇到过好几次,装完Gazebo发现机器人动不了,查了半天才发现是少了这个控制接口包。你想想看,模型加载进去了,但关节就是不听使唤,多憋屈。

装完之后,启动Gazebo的方式有两种:

  • 直接启动:终端输入 gazebo,会打开一个空世界。
  • 通过ROS启动:roslaunch gazebo_ros empty_world.launch,这样启动的Gazebo会和ROS节点通信。
我的小技巧: 第一次启动时,Gazebo会下载一些模型文件(比如地面、桌子),速度可能很慢。我建议你提前设置好模型路径,或者直接挂个代理。不然干等着,挺浪费时间的。

2.2 Gazebo界面:别被它吓到

第一次打开Gazebo,你可能会觉得界面有点复杂。其实说白了,它就几个核心区域。我刚开始用的时候,也花了点时间才摸清楚每个面板是干嘛的。

下面这张图,是我自己画的界面结构,帮你快速建立认知:

Gazebo 界面核心布局 3D 场景主窗口 显示机器人、传感器、环境 支持鼠标拖拽旋转/缩放 左侧面板 世界 / 插入 / 模型 管理场景中的对象 右侧面板 属性 / 传感器 / 日志 查看和编辑参数 底部工具栏:播放/暂停/重置 / 视角切换 / 测量工具

界面其实就三大块:中间的3D场景、左侧的对象管理面板、右侧的属性面板。底部还有一排工具栏。你不需要全部记住,用多了自然就熟了。

2.3 世界文件(.world):搭建你的仿真场景

Gazebo的世界文件,说白了就是一个描述仿真环境的配置文件。它用SDF格式(Simulation Description Format)来定义地面、灯光、物体、物理参数等等。

我曾经犯过一个低级错误:直接在Gazebo GUI里拖拽添加物体,然后保存。结果下次打开,物体位置全乱了。后来我才养成习惯,所有场景都用 .world 文件来定义,版本可控,还能分享给团队。

一个最简单的世界文件长这样:

<?xml version="1.0" ?>
<sdf version="1.6">
  <world name="my_world">
    <include>
      <uri>model://sun</uri>
    </include>
    <include>
      <uri>model://ground_plane</uri>
    </include>
    <model name="my_box">
      <pose>1 0 0.5 0 0 0</pose>
      <link name="body">
        <collision name="collision">
          <geometry>
            <box>
              <size>0.5 0.5 0.5</size>
            </box>
          </geometry>
        </collision>
        <visual name="visual">
          <geometry>
            <box>
              <size>0.5 0.5 0.5</size>
            </box>
          </geometry>
        </visual>
      </link>
    </model>
  </world>
</sdf>

这个文件定义了一个有阳光、有地面、还有一个方盒子的世界。你可能会问,为什么要有 <collision> 和 <visual> 两套几何?

嗯,这里要解释一下:<visual> 是你看得见的样子,<collision> 是物理引擎用来算碰撞的。两者可以不一样。比如你可以用一个复杂的模型做视觉,用一个简单的盒子做碰撞,这样仿真跑起来更快。

2.4 世界文件的核心元素

我整理了一个表格,把世界文件里常用的元素列出来,方便你对照:

元素 作用 常用属性
<world> 世界根节点,包含所有定义 name
<include> 引用外部模型或资源 uri(模型路径)
<model> 定义场景中的物体 name, pose
<link> 物体的刚体部分 name, pose
<visual> 视觉外观 geometry, material
<collision> 碰撞检测 geometry
<physics> 物理引擎参数 type(ode/bullet), gravity
<light> 光源设置 name, pose, diffuse
核心要点: 世界文件是你仿真环境的“蓝图”。我建议你从一开始就养成用 .world 文件启动 Gazebo 的习惯,而不是手动拖拽。这样你的仿真环境是可复现的,团队协作也方便。

2.5 启动自定义世界

写好世界文件后,启动方式很简单:

gazebo my_world.world

或者通过ROS launch文件:

<launch>
  <include file="$(find gazebo_ros)/launch/empty_world.launch">
    <arg name="world_name" value="$(find your_package)/worlds/my_world.world"/>
  </include>
</launch>
避坑提醒: 我曾经遇到过世界文件里引用了不存在的模型路径,结果Gazebo启动后一片漆黑,连地面都没有。检查一下 GAZEBO_MODEL_PATH 环境变量是否设置正确,或者模型文件是否真的下载到了本地。