3 · 几何与可视化
geometry、mesh、material —— 让机器人“看得见”
上一章我们把 link 和 joint 搭起来了,但模型还是“隐形”的。说白了,<geometry> 就是给机器人画皮,<material> 就是上色。我刚开始做 URDF 时,觉得几何嘛,无非就是 box、cylinder、sphere,后来才发现 mesh 才是真正的重头戏。这一节,咱们把视觉部分彻底吃透。
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~1 | rgba="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 看看你的机器人是不是有模有样了?