16 Gazebo Fortress 分拣产线仿真建模与 ROS2 Humble 适配基础

Gazebo Fortress 分拣产线仿真建模与 ROS2 Humble 适配基础

关联:索引

  1. 价值点(课程思政切入):仿真能减少试错次数、降低能耗与材料浪费,是“节能减耗”的工程方法;分拣产业升级离不开智能装备与软件生态,国产工业软件的进步需要工程师坚持规范、持续迭代。

1. Gazebo Fortress 的运行闭环(必须会说清)

把 Gazebo 理解为一台“仿真机器”,它主要做四件事:

关键结论(学生必须记住)

2. 物理引擎(ODE/PhysX)工作机制:你要关心的不是名字,是差异点

3. 仿真时间与 ROS2 时间:/clock 是关键连接点

在仿真中,Gazebo 会维护一套“仿真时间”(Sim Time)。ROS2 节点如果要以仿真时间为准,需要两步:

为什么重要

0. 重要说明:命令前置条件

sudo apt update
sudo apt install -y curl gnupg lsb-release

逐行解释:

添加 Gazebo(OSRF)软件源并安装 Fortress:

# 可选命令,具体先执行后续安装指令,提示安装有问题时再来运行这个命令
sudo curl -sSL https://packages.osrfoundation.org/gazebo.gpg -o /usr/share/keyrings/pkgs-osrf-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/pkgs-osrf-archive-keyring.gpg] https://packages.osrfoundation.org/gazebo/ubuntu-stable $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/gazebo-stable.list > /dev/null
# 更新软件源
sudo apt update
# 安装gazebo fortress
sudo apt install -y gz-fortress

逐行解释:

安装验证:

ign
ign gazebo --versions

逐行解释:

常见问题自检(出现“找不到 ign/ign gazebo”时):

which ign
ign --version
echo $PATH

逐行解释:

2. 方式 B:源码安装(扩展选做,用于研究型同学/教师备课)

sudo apt update
sudo apt install -y git cmake build-essential pkg-config python3-pip

逐行解释:

建议做法:

3. 环境变量:让 Gazebo 找得到你的模型与世界

Gazebo 加载模型会查找资源路径。你需要掌握两个变量(不同发行版命名可能不同):

示例:把你的模型目录加入资源路径(假设模型放在 ~/gazebo_models):

export GZ_SIM_RESOURCE_PATH=$GZ_SIM_RESOURCE_PATH:$HOME/gazebo_models
export IGN_GAZEBO_RESOURCE_PATH=$IGN_GAZEBO_RESOURCE_PATH:$HOME/gazebo_models

逐行解释:

验证变量是否生效:

echo $GZ_SIM_RESOURCE_PATH

4. 创建最小 world(SDF/.world)并运行

在任意工作目录下新建文件:minimal.world(注意:文件内容本质是 SDF)。

<?xml version="1.0" ?>
<sdf version="1.8">
  <world name="minimal_world">
    <physics name="default_physics" type="ode">
      <max_step_size>0.001</max_step_size>
      <real_time_factor>1.0</real_time_factor>
      <real_time_update_rate>1000</real_time_update_rate>
    </physics>

    <gravity>0 0 -9.8</gravity>

    <include>
      <uri>https://fuel.gazebosim.org/1.0/OpenRobotics/models/Ground Plane</uri>
    </include>

    <include>
      <uri>https://fuel.gazebosim.org/1.0/OpenRobotics/models/Sun</uri>
    </include>
  </world>
</sdf>

逐段解释:

运行最小 world:

ign gazebo -v 4 minimal.world

常见问题:虚拟机中 Gazebo 窗口闪烁/黑屏/画面撕裂(GUI 不稳定)

这类问题通常不是 world 文件语法导致,而是虚拟机图形栈(OpenGL/显卡驱动/桌面会话类型)导致 GUI 渲染不稳定。按“代价从小到大”的顺序排查:

  1. 确认 OpenGL 渲染器是否正常(建议先装工具):
sudo apt install -y mesa-utils
glxinfo -B | grep -E "OpenGL vendor|OpenGL renderer|OpenGL version"

逐行解释:

  1. 优先检查虚拟机的 3D 加速与增强工具:
  1. 尽量使用 Xorg 会话(部分 Wayland + 虚拟显卡组合容易闪烁):
echo $XDG_SESSION_TYPE

逐行解释:

  1. 作为兜底方案:强制软件渲染运行(稳定优先,性能次之):
LIBGL_ALWAYS_SOFTWARE=1 ign gazebo -v 4 minimal.world

逐行解释:

逐行解释:

5. 参数对比实验:重力与摩擦(只做最小可观察现象)

把上面的 world 复制成 compare_physics.world,新增一个小方块并给它初速度,让它在地面上滑行。

<model name="box1">
  <static>false</static>
  <pose>0 0 0.5 0 0 0</pose>
  <plugin
    filename="ignition-gazebo-velocity-control-system"
    name="gz::sim::systems::VelocityControl">
    <initial_linear>1 0 0</initial_linear>
    <initial_angular>0 0 0</initial_angular>
  </plugin>
  <link name="link">
    <inertial>
      <mass>1.0</mass>
    </inertial>
    <collision name="collision">
      <geometry>
        <box><size>0.2 0.2 0.2</size></box>
      </geometry>
      <surface>
        <friction>
          <ode>
            <mu>0.2</mu>
            <mu2>0.2</mu2>
          </ode>
        </friction>
      </surface>
    </collision>
    <visual name="visual">
      <geometry>
        <box><size>0.2 0.2 0.2</size></box>
      </geometry>
    </visual>
  </link>
</model>

逐段解释:

对比方法(学生必须做并记录):

  1. mu/mu20.2 改成 1.0,观察盒子滑行距离的变化。
  2. <gravity>0 0 -9.8</gravity> 改成 <gravity>0 0 -3.0</gravity><gravity>0 0 -15.0</gravity>,观察落地速度与接触稳定性的变化。

记录要求:

  1. 快速回顾(举手回答):max_step_size 变小通常会带来什么变化?摩擦系数变大,盒子会更滑还是更粘?为什么我们强调要设置资源路径?

1. 分拣产线建模逻辑:先定坐标与布局,再定模型与参数

分拣产线仿真建模的顺序建议是:

  1. 定义世界坐标系:统一约定原点与轴向(建议:世界坐标系 W,x 向前、y 向左、z 向上)。
  2. 规划设备布局:传送带中心线、UR5e 安装基座、分拣箱位置、相机/传感器视野范围。
  3. 建立可复用模型库:传送带、工位框架、箱体、料块、机器人底座等用独立 model 文件管理。
  4. 再调物理参数:重力、摩擦、接触迭代、阻尼等从“能稳定运行”开始逐步提高精度。

2. .world/.sdf 语法规范:你必须会读的 6 个结构

一份可维护的 world 文件建议包含:

3. URDF 与 SDF 的关系:如何复用机器人模型

工程中常见做法:

1. 建一个“基础分拣产线”world(建议命名:sorting_line.world)

sorting_line_demo/
  sorting_line.world

创建并编辑 sorting_line.world(复制即可运行):

mkdir -p sorting_line_demo
cd sorting_line_demo
nano sorting_line.world

逐行解释:

下面示例展示一个可维护的骨架结构:把设备尽量拆成可复用 model,再在 world 中 include 并摆放。

<?xml version="1.0" ?>
<sdf version="1.8">
  <world name="sorting_line_world">
    <physics name="fast_stable" type="ode">
      <max_step_size>0.001</max_step_size>
      <real_time_factor>1.0</real_time_factor>
      <real_time_update_rate>1000</real_time_update_rate>
    </physics>

    <gravity>0 0 -9.8</gravity>

    <include>
      <uri>https://fuel.gazebosim.org/1.0/OpenRobotics/models/Ground%20Plane</uri>
    </include>
    <include>
      <uri>https://fuel.gazebosim.org/1.0/OpenRobotics/models/Sun</uri>
    </include>

    <model name="conveyor_01">
      <static>true</static>
      <pose>0 0 0 0 0 0</pose>
      <link name="belt_link">
        <collision name="belt_collision">
          <geometry>
            <box><size>2.0 0.5 0.1</size></box>
          </geometry>
          <surface>
            <friction>
              <ode>
                <mu>0.9</mu>
                <mu2>0.9</mu2>
              </ode>
            </friction>
          </surface>
        </collision>
        <visual name="belt_visual">
          <geometry>
            <box><size>2.0 0.5 0.1</size></box>
          </geometry>
        </visual>
      </link>
    </model>

    <model name="bin_grade_a">
      <static>true</static>
      <pose>1.2 0.8 0.2 0 0 0</pose>
      <link name="bin_link">
        <collision name="bin_collision">
          <geometry>
            <box><size>0.4 0.4 0.4</size></box>
          </geometry>
        </collision>
        <visual name="bin_visual">
          <geometry>
            <box><size>0.4 0.4 0.4</size></box>
          </geometry>
        </visual>
      </link>
    </model>

    <model name="apple_01">
      <static>false</static>
      <pose>-0.8 0 0.25 0 0 0</pose>
      <plugin
        filename="ignition-gazebo-velocity-control-system"
        name="gz::sim::systems::VelocityControl">
        <initial_linear>0.8 0 0</initial_linear>
        <initial_angular>0 0 0</initial_angular>
      </plugin>
      <link name="link">
        <inertial><mass>0.2</mass></inertial>
        <collision name="collision">
          <geometry>
            <sphere><radius>0.05</radius></sphere>
          </geometry>
          <surface>
            <friction>
              <ode>
                <mu>0.6</mu>
                <mu2>0.6</mu2>
              </ode>
            </friction>
          </surface>
        </collision>
        <visual name="visual">
          <geometry>
            <sphere><radius>0.05</radius></sphere>
          </geometry>
        </visual>
      </link>
    </model>
  </world>
</sdf>

逐段解释(对照“结构规范 6 件套”):

运行:

ign gazebo -v 4 sorting_line.world

逐行解释:

常见问题提示:

2. GUI 基础操作:模型编辑与状态监控(必须会)

3. 物理参数实时调测:从“现象”反推“参数”

  1. 稳定性(防穿透/防抖动):
  1. 接触与摩擦(防打滑/更贴合):
  1. 真实性(速度/实时性权衡):

记录模板(直接抄写):

4. 与 ROS2 Humble 适配基础:仿真时间接入与验证思路

本节只讲“最小适配闭环”:让 ROS2 节点能使用仿真时间,并给出验证证据链。

ROS2 侧设置使用仿真时间(以任意节点为例):

先确认目标节点名(任选其一):

ros2 node list

逐行解释:

ros2 param set /你的节点名 use_sim_time true

逐行解释:

验证证据链(至少做 1 条):

ros2 topic list | grep clock
ros2 topic echo /clock --once

逐行解释:

说明:

5. AI 协同排错:把“报错信息”变成“可行动的修改”

给 AI 的提示词模板 1:安装报错定位(可直接复制)

你是 Gazebo Fortress + ROS2 Humble 助教。我的系统是 Ubuntu 22.04。执行命令:(粘贴你的命令) 报错如下:(粘贴完整报错)。请给出:1)最可能的 3 个原因(按概率排序);2)每个原因对应的验证命令;3)最小修复步骤(避免大范围重装);4)修复后如何验证成功(给出可截图证据);5)回滚方式(若修复失败如何恢复)。

给 AI 的提示词模板 2:生成 world / SDF 模板并自检(可直接复制)

给 AI 的提示词模板 3:语法错误快速修复(可直接复制)

我有一段 SDF/URDF 片段(如下),Gazebo 报错:(粘贴报错)。请你指出具体哪一行/哪一个标签可能导致解析失败,并给出“最小改动”的修复版本。修复后请解释每一处改动的原因。

  1. 安装验证与最小 world 运行:完成 ign --versionign gazebo --versionsign gazebo -v 4 minimal.world 的验证证据(截图)。
  2. 参数对比实验:至少完成 1 组“参数→现象”对比(如摩擦或重力),保留修改前/修改后参数与现象描述(1–2 句话),并截图留证。
  3. 基础分拣产线 world 运行:运行 sorting_line.world,完成“无解析错误 + 关键现象 + GUI 选中查看属性”的证据链(截图或 5 秒录屏)。
  4. AI 协同排错或生成:完成 1 次 AI 交互(排错/生成模板二选一),保留提示词 + 关键输出 + 你最终采用的修改点 + 验证证据(截图)。