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节点通信。
2.2 Gazebo界面:别被它吓到
第一次打开Gazebo,你可能会觉得界面有点复杂。其实说白了,它就几个核心区域。我刚开始用的时候,也花了点时间才摸清楚每个面板是干嘛的。
下面这张图,是我自己画的界面结构,帮你快速建立认知:
界面其实就三大块:中间的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 |
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_MODEL_PATH 环境变量是否设置正确,或者模型文件是否真的下载到了本地。