模型文件基础:从零认识你的第一个机器人模型

做机器人仿真这么多年,我见过太多新手一上来就急着写代码,结果连模型文件长什么样都没搞清楚。说实话,模型文件就是机器人的「身份证」,Gazebo 能不能认出你的机器人,全看它。

今天咱们就来聊聊模型文件的结构。我会带着你,把一个机器人模型拆开来看。

模型文件长什么样?

一个标准的 Gazebo 模型,通常包含两个核心文件:

  • model.config —— 模型的「名片」
  • model.sdf —— 模型的「身体」

这两个文件缺一不可。我刚开始做项目时,有次只放了 model.sdf,结果 Gazebo 死活加载不出来。折腾了半天才发现,原来是忘了写 model.config。

model.config:模型的身份证

这个文件说白了就是告诉 Gazebo:「我叫什么名字,是谁做的,版本是多少」。内容很简单,但格式必须对。

<?xml version="1.0"?>
<model>
  <name>my_robot</name>
  <version>1.0.0</version>
  <sdf version="1.6">model.sdf</sdf>

  <author>
    <name>张三</name>
    <email>zhangsan@example.com</email>
  </author>

  <description>
    一个简单的两轮差速机器人模型
  </description>
</model>

嗯,这里要注意:<sdf version="1.6"> 这个版本号不能乱写。我见过有人写了 1.7,结果 Gazebo 直接报错。建议统一用 1.6,兼容性最好。

model.sdf:机器人的身体构造

这个文件才是重头戏。它定义了机器人的所有物理部件:形状、大小、重量、颜色,甚至关节怎么动。

一个最简单的 SDF 模型长这样:

<?xml version="1.0"?>
<sdf version="1.6">
  <model name="my_robot">
    <link name="base_link">
      <pose>0 0 0.1 0 0 0</pose>
      <inertial>
        <mass>1.0</mass>
        <inertia>
          <ixx>0.1</ixx>
          <iyy>0.1</iyy>
          <izz>0.1</izz>
          <ixy>0.0</ixy>
          <ixz>0.0</ixz>
          <iyz>0.0</iyz>
        </inertia>
      </inertial>
      <collision name="collision">
        <geometry>
          <box>
            <size>0.5 0.3 0.2</size>
          </box>
        </geometry>
      </collision>
      <visual name="visual">
        <geometry>
          <box>
            <size>0.5 0.3 0.2</size>
          </box>
        </geometry>
        <material>
          <ambient>0.8 0.2 0.2 1.0</ampient>
        </material>
      </visual>
    </link>
  </model>
</sdf>

看到没?一个 link 就包含了三部分:

  • inertial —— 惯性参数,说白了就是重量和转动惯量
  • collision —— 碰撞检测用的形状
  • visual —— 你看到的视觉效果

我个人习惯把 collision 和 visual 设成一样的大小。为什么?因为如果碰撞体比视觉体小,机器人可能会「穿模」——看着碰到了,实际没碰到。我曾经因为这个 bug 排查了一整天。

SDF 格式入门:别被 XML 吓到

SDF 其实就是 XML 的一种变体。你只要记住几个核心标签:

标签 作用 必填?
<link> 定义刚体部件 是
<joint> 定义连接关系 有多个 link 时必填
<pose> 位置和姿态 推荐填写
<geometry> 形状定义 是
<material> 颜色材质 否

你想想看,一个机器人无非就是一堆 link 通过 joint 连起来。每个 link 有自己的形状和重量,joint 决定了它们怎么动。就这么简单。

模型坐标系:别搞反了方向

坐标系这个问题,我吃过不少亏。Gazebo 用的是右手坐标系:

  • X 轴 —— 向前
  • Y 轴 —— 向左
  • Z 轴 —— 向上

为什么强调这个?因为很多 CAD 软件用的是不同的坐标系。比如 SolidWorks 默认 Z 轴向上,但有些软件 Y 轴向上。导入模型时如果不做转换,你的机器人可能会「躺」在地上。

避坑指南: 我曾经把一个从 SolidWorks 导出的模型直接扔进 Gazebo,结果机器人是侧躺着的。后来才发现,需要在导出时指定坐标系为「Z-up」。

每个 link 都有自己的局部坐标系。<pose> 标签里的六个数字,前三个是位置 (x, y, z),后三个是旋转 (roll, pitch, yaw)。单位分别是米和弧度。

<pose>0 0 0.1 0 0 0</pose>

这表示:在父坐标系的原点,向上偏移 0.1 米,没有旋转。

知识体系总览

下面这张图,帮你理清模型文件的核心结构:

Gazebo 模型文件结构 模型文件夹 model.config(名片) model.sdf(身体) 名称 / 版本 / 作者 SDF 文件路径 link(刚体) joint(关节) inertial(惯性) collision(碰撞) visual(视觉)
我的小技巧: 刚开始学的时候,别急着写复杂的模型。先从一个立方体开始,确认能加载成功,再慢慢加轮子、加关节。这样出了问题,你才知道是哪里错了。

好了,模型文件的基础就这些。说白了就是两个文件:一个告诉系统「我是谁」,一个告诉系统「我长什么样」。坐标系记住右手法则,别搞反了就行。

下一节我们会动手写一个真正的机器人模型,到时候你会看到这些知识点是怎么串起来的。