4 · URDF几何体与材质

写URDF模型,说白了就是在搭积木。而积木最基础的形状,就是长方体、圆柱体、球体。这一章我们就把这三个几何体吃透,再给它们穿上“衣服”——材质和颜色。

我个人习惯先把几何体定义清楚,再调颜色。你想想看,如果连形状都歪了,颜色再好看也没用。我在项目里见过不少新手一上来就调色,结果模型在Rviz里比例全乱,排查半天才发现是尺寸单位写错了。

URDF 几何体 & 材质 核心逻辑 box 长方体 cylinder 圆柱 sphere 球体 材质 & 颜色 (material / color) 每个几何体通过 <geometry> 定义,材质通过 <material> 设置

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里直接穿模。嗯,这里要提醒你,所有数值都按米来。

尺寸速查表(常用机器人部件参考)
几何体属性典型值(米)说明
boxsize="x y z"0.4 0.3 0.2底盘常用
cylinderradius, lengthr=0.1, l=0.05轮子、关节
sphereradiusr=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,除非你想做半透明效果。我在调试激光雷达模型时,经常把外壳设成半透明,方便看内部结构。

如果你想让轮子看起来更真实,可以给不同的 link 分配不同材质。比如驱动轮用深灰色,万向轮用浅灰。这样在 Rviz 里一眼就能区分。

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 里亲眼看到它。嗯,不过那是下一章的事,先把这几个形状练熟。