4 · URDF几何体与材质
写URDF模型,说白了就是在搭积木。而积木最基础的形状,就是长方体、圆柱体、球体。这一章我们就把这三个几何体吃透,再给它们穿上“衣服”——材质和颜色。
我个人习惯先把几何体定义清楚,再调颜色。你想想看,如果连形状都歪了,颜色再好看也没用。我在项目里见过不少新手一上来就调色,结果模型在Rviz里比例全乱,排查半天才发现是尺寸单位写错了。
4.1 三个基本几何体
URDF 的 <geometry> 标签里,可以放三种形状。我直接上代码,你看一眼就明白。
<!-- 长方体:长0.4m,宽0.3m,高0.2m -->
<geometry>
<box size="0.4 0.3 0.2" />
</geometry>
<!-- 圆柱体:半径0.15m,长度0.5m -->
<geometry>
<cylinder radius="0.15" length="0.5" />
</geometry>
<!-- 球体:半径0.2m -->
<geometry>
<sphere radius="0.2" />
</geometry>
注意单位是米。ROS里长度默认米,角度默认弧度。我曾经遇到一个坑:把圆柱半径写成15,以为是厘米,结果模型在Gazebo里直接穿模。嗯,这里要提醒你,所有数值都按米来。
| 几何体 | 属性 | 典型值(米) | 说明 |
|---|---|---|---|
| box | size="x y z" | 0.4 0.3 0.2 | 底盘常用 |
| cylinder | radius, length | r=0.1, l=0.05 | 轮子、关节 |
| sphere | radius | r=0.15 | 万向轮、装饰 |
4.2 材质与颜色设置
几何体是骨架,材质就是皮肤。URDF 里用 <material> 标签定义颜色或纹理。我个人习惯把材质单独拎出来,用 name 属性复用,这样写10个轮子也不用重复颜色代码。
<!-- 定义一种材质 -->
<material name="dark_blue">
<color rgba="0.1 0.2 0.8 1.0" />
</material>
<!-- 在 link 中引用 -->
<link name="base_link">
<visual>
<geometry>
<box size="0.5 0.4 0.1" />
</geometry>
<material name="dark_blue" />
</visual>
</link>
rgba 四个值范围都是 0~1。最后一个 alpha 一般写1.0,除非你想做半透明效果。我在调试激光雷达模型时,经常把外壳设成半透明,方便看内部结构。
4.3 内联颜色 vs 命名材质
URDF 支持两种写法:一种是在 <visual> 里直接写 <material color="…" />,另一种是先用 <material name="…"> 定义,再引用。我建议用命名材质,尤其是当你有多个 link 共享同一颜色时。你想想看,如果后期要改颜色,改一处就行,不用满文件找。
<!-- 直接内联(不推荐重复使用) -->
<visual>
<geometry><sphere radius="0.1" /></geometry>
<material color="1 0 0 1" /> <!-- 红色 -->
</visual>
<material> 标签如果放在 <robot> 顶层,必须定义 name,且不能重复。我曾经在同一个文件里定义了两个同名的材质,结果 Gazebo 只加载最后一个,颜色全乱了。排查了半天……后来养成了命名加前缀的习惯,比如 mat_wheel_black。
4.4 实战小例子:一个带颜色的轮子
下面是一个完整的 link 定义,包含圆柱几何体和灰色材质。你可以直接复制到你的 URDF 里试试。
<material name="gray_wheel">
<color rgba="0.3 0.3 0.3 1.0" />
</material>
<link name="left_wheel">
<visual>
<geometry>
<cylinder radius="0.1" length="0.04" />
</geometry>
<origin xyz="0 0.2 0" rpy="1.5708 0 0" />
<material name="gray_wheel" />
</visual>
</link>
这里 origin 的 rpy 把圆柱绕 X 轴转了90度,让轮子立起来。不然圆柱默认是竖着的,你想想看,轮子躺在地上怎么滚动?
• 三种几何体:box(size)、cylinder(radius+length)、sphere(radius)
• 材质用 <material> + <color rgba>,推荐命名复用
• 所有长度单位是米,颜色分量0~1
• 别忘了 origin 调整姿态,尤其是圆柱和长方体
好了,这一章的内容就这些。几何体和材质是 URDF 的砖瓦,下一章我们会把这些砖瓦拼成完整的机器人模型,并且在 Rviz 里亲眼看到它。嗯,不过那是下一章的事,先把这几个形状练熟。