3 · 几何与可视化

geometry、mesh、material —— 让机器人“看得见”

上一章我们把 link 和 joint 搭起来了,但模型还是“隐形”的。说白了,<geometry> 就是给机器人画皮,<material> 就是上色。我刚开始做 URDF 时,觉得几何嘛,无非就是 box、cylinder、sphere,后来才发现 mesh 才是真正的重头戏。这一节,咱们把视觉部分彻底吃透。

几何与可视化 几何 primitive box / cylinder / sphere mesh 标签 STL / Collada 导入 material 颜色 RGBA / 材质名 尺寸参数 scale / filename color / texture

3.1 几何标签 <geometry> 三兄弟

URDF 里最基础的几何形状就三种:box、cylinder、sphere。你想想看,大部分机器人的关节、连杆都能用它们拼出来。我个人习惯先把整体拆成这几个基本体,调试通过再替换成精细 mesh。

  • box —— 长方体,用 size="长 宽 高" 定义。比如 <box size="0.2 0.1 0.05" />
  • cylinder —— 圆柱,参数 radius 和 length。注意长度沿圆柱的局部 z 轴。
  • sphere —— 球,就一个 radius。

💡 快速示例:一个视觉link

<link name="base_link">
  <visual>
    <geometry>
      <box size="0.4 0.3 0.1" />
    </geometry>
    <origin xyz="0 0 0.05" rpy="0 0 0" />
  </visual>
</link>

嗯,这里要注意:<origin> 的 xyz 是相对于 link 坐标系的偏移。我之前有个项目,把 box 的尺寸写对了,但 origin 的 z 忘了抬一半高度,结果模型陷到地底下……排查了半天。

3.2 <mesh> 标签 —— 复杂模型的救星

真实机器人哪有那么多标准几何体?机械臂、轮子、外壳,基本都是用 CAD 导出的 mesh 文件。URDF 支持两种主流格式:STL(二进制或 ASCII)和 Collada(.dae)。

我个人的经验:STL 文件小、加载快,但没颜色信息;Collada 可以带材质和颜色,不过文件容易大。如果你只是要碰撞检测,STL 足够了。要是可视化想好看点,用 Collada 或者单独指定 material。

<geometry>
  <mesh filename="package://my_robot/meshes/arm.stl" scale="1.0 1.0 1.0" />
</geometry>

🔧 避坑指南 —— 我曾经把 mesh 的 scale 写成 0.001 0.001 0.001,因为 STL 单位是毫米,而 URDF 用米。结果模型小到几乎看不见。后来我统一在导出时设为单位米,或者在 scale 里换算。记住:scale 三个值可以不同,用来拉伸模型。

另外,filename 推荐用 package:// 路径,这样模型包移动后路径不会断。我见过太多人用路径,换台电脑就炸了。

3.3 <material> 与颜色定义

光有形状还不够,得让机器人有“皮肤”。<material> 可以定义在 link 内部,也可以提取成全局资源,方便复用。

属性说明示例
name材质名称,全局唯一name="blue_metal"
color rgba红绿蓝+透明度,值 0~1rgba="0.2 0.5 0.9 1.0"
texture(较少用)贴图文件名texture="texture.png"

🎨 全局材质示例

<robot name="my_robot">
  <material name="light_gray">
    <color rgba="0.75 0.75 0.75 1.0" />
  </material>
  <link name="leg">
    <visual>
      <geometry><cylinder radius="0.05" length="0.3" /></geometry>
      <material name="light_gray" />
    </visual>
  </link>
</robot>

你可能会问:颜色值为什么是 0~1 而不是 0~255?因为 URDF 沿袭了 ROS 的惯例,用浮点数。我刚开始也老写 255,结果颜色惨白……后来习惯了。

⚠️ 注意 —— material 的 name 引用必须在 <visual> 之前定义,否则 Rviz 会报 warning 并显示默认白色。我曾经在大型机器人里把材质定义写在文件末尾,结果所有零件都是白的,找了半天才发现是顺序问题。

3.4 可视化小技巧 · 让模型更真实

  • 透明度调试:把 rgba 的 alpha 设成 0.5 左右,可以透视内部结构,特别适合检查关节是否重叠。
  • 使用 <collision> 简化几何:视觉用精细 mesh,碰撞用 box 或 cylinder,能极大提升仿真速度。我做过一个抓取机器人,碰撞用六个 box 代替了复杂的 STL,仿真帧率从 15 飙到 60。
  • 颜色命名规范:我习惯在文件头部定义好所有材质,比如 material name="chassis_red"、material name="wheel_black",后期改颜色只需改一处。

说白了,几何和可视化就是机器人的“皮囊”。但皮囊之下,别忘了还有碰撞和惯性参数——下一章我们会深入碰撞几何。不过今天先把视觉部分练熟,打开 Rviz 看看你的机器人是不是有模有样了?