第一章:仿真环境搭建——Gazebo与ROS2的安装与配置,创建第一个仿真世界

说实话,每次带新人入门机器人开发,我最头疼的就是环境搭建这一步。不是技术有多难,而是坑太多。我自己当年折腾Gazebo和ROS2的安装,前前后后重装了三次系统。嗯,今天咱们就把这事一次说清楚。

1.1 为什么非要用Gazebo?

你想想看,真机调试一次的成本有多高?电池要充、场地要清、安全员要盯着,万一撞了还得修。仿真就不一样了——随便撞,随便重启,零成本。

Gazebo是目前最主流的机器人仿真器之一。它和ROS2的配合,说白了就像发动机和变速箱的关系。我个人习惯把Gazebo叫做「机器人的虚拟训练场」。你在里面跑过的算法,拿到真机上至少能省一半的调试时间。

核心逻辑:Gazebo负责物理仿真(重力、碰撞、摩擦力),ROS2负责通信与控制。两者通过gazebo_ros_pkgs这个桥梁连接。

1.2 安装前的准备工作

先看看你的系统。我建议用Ubuntu 22.04,搭配ROS2 Humble。为什么?因为这是目前最稳定的组合。我在项目里踩过Foxy的坑,也试过Rolling的雷,最后老老实实回到了Humble。

组件 推荐版本 备注
操作系统 Ubuntu 22.04 LTS 别用20.04,有些包会冲突
ROS2 Humble Hawksbill LTS版本,支持到2027年
Gazebo Gazebo Fortress 与ROS2 Humble原生兼容

注意:千万不要用apt直接装Gazebo 11。那个版本是给ROS1用的。我曾经在项目里搞混过,结果仿真死活跑不起来,查了两天才发现是版本不匹配。

1.3 安装ROS2 Humble

这一步其实很简单,但很多人会卡在源的选择上。我直接给出一套经过验证的流程:

# 1. 设置语言环境
sudo apt update && sudo apt install locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8

# 2. 添加ROS2源
sudo apt install software-properties-common
sudo add-apt-repository universe

# 3. 添加GPG密钥
sudo apt update && sudo apt install curl -y
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg

# 4. 添加仓库到源列表
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

# 5. 安装ROS2 Humble桌面版
sudo apt update
sudo apt install ros-humble-desktop

# 6. 安装开发工具
sudo apt install ros-dev-tools

装完之后,记得在~/.bashrc里加上这行:

source /opt/ros/humble/setup.bash

然后source ~/.bashrc一下。验证安装:

ros2 run demo_nodes_cpp talker

如果看到「Hello World」不断输出,恭喜你,ROS2装好了。

1.4 安装Gazebo Fortress

Gazebo Fortress的安装比ROS2还简单。但有个坑——它和ROS2的通信包需要单独装。

# 安装Gazebo Fortress
sudo apt install ignition-fortress

# 安装ROS2与Gazebo的桥梁
sudo apt install ros-humble-ros-ign-bridge

# 安装Gazebo的ROS2工具包
sudo apt install ros-humble-gazebo-ros-pkgs

小技巧:装完后运行ign gazebo --version检查版本。如果显示6.x,说明装对了。我曾经见过有人装成了Gazebo Classic,那个版本号是7.x,完全两码事。

1.5 创建你的第一个仿真世界

好了,环境搭好了,咱们来建个世界。别一上来就搞复杂场景,先弄个空地,放个机器人进去跑跑。

创建一个.sdf文件,这是Gazebo的世界描述文件。我习惯把它放在工作空间的worlds目录下:

mkdir -p ~/ros2_ws/src/my_robot/worlds
cd ~/ros2_ws/src/my_robot/worlds
touch empty_world.sdf

用文本编辑器打开empty_world.sdf,写入以下内容:

<?xml version="1.0" ?>
<sdf version="1.6">
  <world name="my_first_world">
    <physics name="default" type="ode">
      <real_time_update_rate>1000</real_time_update_rate>
      <max_step_size>0.001</max_step_size>
    </physics>
    
    <scene>
      <ambient>0.4 0.4 0.4 1.0</ambient>
      <background>0.7 0.7 0.7 1.0</background>
      <shadows>true</shadows>
    </scene>
    
    <light name="sun" type="directional">
      <pose>0 0 10 0 0 0</pose>
      <diffuse>0.8 0.8 0.8 1.0</diffuse>
      <specular>0.2 0.2 0.2 1.0</specular>
      <direction>-0.5 0.1 -0.9</direction>
    </light>
    
    <include>
      <uri>model://ground_plane</uri>
    </include>
    
    <include>
      <uri>model://sun</uri>
    </include>
  </world>
</sdf>

这个文件定义了一个最简单的世界:一块地面、一束阳光、一套物理引擎。够用了。

1.6 启动仿真世界

启动Gazebo,加载这个世界:

ign gazebo ~/ros2_ws/src/my_robot/worlds/empty_world.sdf

如果一切顺利,你会看到一个灰色的地面,上面有光影效果。嗯,这就是你的第一个仿真世界。

验证是否成功:在另一个终端运行ign topic -l,如果看到一堆话题列表,说明Gazebo和ROS2的通信已经打通了。

1.7 往世界里加点东西

光有地面太单调了。咱们加个盒子,再放个圆柱体。修改empty_world.sdf,在</world>之前加入:

<model name="box">
  <pose>1 0 0.5 0 0 0</pose>
  <link name="link">
    <collision name="collision">
      <geometry>
        <box>
          <size>1 1 1</size>
        </box>
      </geometry>
    </collision>
    <visual name="visual">
      <geometry>
        <box>
          <size>1 1 1</size>
        </box>
      </geometry>
      <material>
        <ambient>0.8 0.2 0.2 1.0</ambient>
      </material>
    </visual>
  </link>
</model>

<model name="cylinder">
  <pose>-1 0 0.5 0 0 0</pose>
  <link name="link">
    <collision name="collision">
      <geometry>
        <cylinder>
          <radius>0.5</radius>
          <length>1.0</length>
        </cylinder>
      </geometry>
    </collision>
    <visual name="visual">
      <geometry>
        <cylinder>
          <radius>0.5</radius>
          <length>1.0</length>
        </cylinder>
      </geometry>
      <material>
        <ambient>0.2 0.2 0.8 1.0</ambient>
      </material>
    </visual>
  </link>
</model>

重新加载世界,你会看到一个红色盒子和一个蓝色圆柱体。你可以用鼠标拖拽它们,看看物理引擎怎么处理碰撞。

1.8 本章知识体系

下面这张图,是我自己梳理的本章核心逻辑。你看一眼,心里就有谱了:

仿真环境搭建知识体系 ROS2 Humble Gazebo Fortress ros_ign_bridge 话题通信 / 服务 / 动作 SDF世界描述 / 物理引擎 话题映射 / 类型转换 第一个仿真世界(.sdf文件) ROS2负责大脑(控制与通信),Gazebo负责身体(物理与渲染) ros_ign_bridge就是连接大脑和身体的神经

1.9 避坑指南

最后,分享几个我当年踩过的坑:

  • 版本不匹配:我曾经把ROS2 Foxy和Gazebo Fortress混着装,结果桥接包死活编译不过。后来老老实实全换成Humble+Fortress,一次搞定。
  • 环境变量没生效:很多人装完ROS2,忘了source,然后跑来问我为什么ros2命令找不到。嗯,检查一下~/.bashrc吧。
  • 显卡驱动问题:Gazebo需要OpenGL支持。如果你在虚拟机里跑,记得开启3D加速。我在VMware里折腾过,不开加速的话,Gazebo启动后一片黑。
  • 防火墙拦截:ROS2的通信走DDS,有时候会被防火墙拦住。如果你发现两个节点互相找不到,试试sudo ufw disable(不推荐长期关闭,调试用而已)。

我的习惯:每次装完环境,我都会跑一遍ros2 run demo_nodes_cpp talker和ros2 run demo_nodes_py listener,确认通信正常。然后再启动Gazebo,加载一个简单世界。两步都过了,基本就稳了。

好了,第一章就到这里。你的第一个仿真世界已经跑起来了。接下来,咱们可以往里面放机器人了。

可可精品资料库