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里加障碍物有两种方式:
- 用模型库里的现成模型(适合快速验证)
- 自己写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 本章知识体系
下面这张图,是我梳理的环境搭建核心逻辑。你看一遍就能明白各个模块的关系:
2.7 验证你的环境
环境搭好了,怎么知道对不对?我一般做三步验证:
| 验证步骤 | 命令/操作 | 预期结果 |
|---|---|---|
| 1. Gazebo启动 | gazebo --verbose |
窗口打开,无报错 |
| 2. 加载世界 | gazebo my_world.world |
看到地面和障碍物 |
| 3. 生成机器人 | 运行launch文件 | 机器人出现在指定位置 |
⚠️ 注意:如果机器人出现后「陷」到地面里,检查一下pose的z值。我记得有一次把z设成了0,结果机器人半个身子在地底下。后来改成0.1(抬高10厘米)就好了。
好了,环境搭建就到这里。记住一句话:环境搭得好,调参没烦恼。后面我们聊避障参数优化的时候,你会感谢现在认真搭环境的自己。
💡 我的个人习惯:每次新建项目,我都会把世界文件、机器人模型、障碍物配置放在一个包里,用git管理。这样换电脑或者给同事用,一条命令就能复现环境。