跳转至

URDF

本节用于说明从机械模型导出 URDF 模型的步骤

SolidWorks导出URDF

第一步:准备工作与插件安装

下载插件:从 ROS Wiki 获取 sw_urdf_exporter 插件。安装插件:下载后运行安装程序。安装完成后,重启 SolidWorks。

第二步:模型预处理

打开一个装配体模型为每个活动关节(旋转或平移)定义好参考几何体。从参考几何中按照点,坐标系,基准轴的顺序,针对每一个关节模组(活动部位)都需要配置。

urdf1

选择点:选择面中心后选择关节旋转/平移中心的一个面作为坐标系的原点

urdf2

然后创建坐标系:

先选原点:选择上一步创建的“点”。然后定义 Z 轴:必须与关节的旋转轴或平移轴对齐。这是 URDF 标准的要求(旋转关节绕 Z 轴旋转,平移关节沿 Z 轴移动)。

urdf3

基准轴:选择上一步创建的“坐标系”的 Z 轴。这将在导出插件中用于定义关节轴

urdf4

命名规范:为所有创建的参考几何体使用清晰、一致的命名。

urdf5

第三步:配置 URDF 导出插件

启动插件:在 SolidWorks 中,点击 工具 (Tools) -> Export as URDF。

urdf6

定义基座连杆 (Base Link):

  • Link Name: 为机器人的基座命名,如 base_link。
  • Coordinate System: 选择机器人整体的参考坐标系(通常是世界坐标系或基座中心)。
  • Parts: 选中所有与基座相对静止的零件。
  • Children: 填写从基座延伸出的分支数量(例如,一个双臂机器人,基座连接着头、左臂、右臂,则数量为 3)。
urdf7

配置每个连杆和关节 (Configure Links and Joints):

按照树状结构,逐个配置每个分支。

  • Link Name: 为当前连杆命名(如 neck)。
  • Reference Coordinate System: 选择第二步中为该关节创建的“坐标系”。
  • Joint Name: 为关节命名(如 neck_joint)。
  • Joint Type: 选择关节类型(revolute 旋转, continuous 连续旋转, prismatic 平移,fixed 固定)。
  • Axis: 选择第二步中为该关节创建的“基准轴”。

重复此步骤,直到配置完所有连杆和关节。

urdf8

第四步:检查和修正物理属性

重要提示:此步骤可以在打开导出插件前或后进行,但强烈建议在导出前完成。

计算单个连杆的质量属性:

  • 在 SolidWorks 中,取消所有零件的选择。
  • 在左侧设计树或图形区域中,仅选中构成单个连杆(例如 neck)的所有零件。
  • 点击 评估 (Evaluate) 选项卡中的 质量属性 (Mass Properties)。
  • 点击 重算 (Recompute)。
  • 记录并填写数据:
  • 在弹出的窗口中,记录下 质量 (Mass)、质心 (Center of Mass) 和 惯性主轴/惯性张量 (Moments of Inertia) 的数据。
  • 回到 URDF 导出插件的 Configure Link Properties 页面,将记录的数据手动填写到对应连杆的属性框中。
  • 注意单位:确保单位统一(通常为 kg 和 m)。
urdf9
urdf10

第五步:预览与导出

  • 预览 (Preview):点击 Preview and Export 按钮。
  • 检查关节属性 (Configure Joint Properties):
  • 在弹出的窗口中,可以再次检查每个关节的坐标系、轴向和类型。
  • 可以为旋转关节设置 Limits (位置、速度、力矩限制)。
  • 检查连杆属性 (Configure Link Properties):
  • 再次确认每个连杆的质量、质心、惯性矩
  • 导出 (Export):
  • 点击 Export URDF and Meshes。
urdf11
urdf12

修改碰撞体

因为机器人仿真器中机器人刚体模型通过mesh来表达,mesh是由很多小三角形拼出来的机器人三维表面模型。在SolidWorks导出出来的精细模型三角面非常多,这样会导致仿真计算非常慢,所以通常导出出来模型之后会修改碰撞体,用简化的碰撞体比如长方体、圆柱体、球体等仿真容易计算的几何体来替代原来复杂的mesh。实际上对于机器人来说,把碰撞体简化不会对控制器Sim2Real效果影响太多。

关于修改碰撞体或关节限位,可以通过URDF Studio或VsCode插件来操作。

身体、手臂、大小腿等直接修改成差不多大小的圆柱体即可,与地面碰撞的部分需要精细设计一下,尤其是脚底的碰撞。脚底碰撞处理有几种方法:平行圆柱、长方体、四点足,我们这里采用平行圆柱。平行圆柱的碰撞类似之前的平板足部碰撞体,能保持仿真的准确性。

例如如下代码,将足部原来的mesh碰撞体改为三圆柱碰撞体:

<link name="Rfoot">
  <inertial>
    <origin xyz="0 -0.0233 0.02403" rpy="0 0 0" />
    <mass value="0.67876" />
    <inertia
      ixx="0.00137339124"
      ixy="-2.033E-08"
      ixz="-1.7E-10"
      iyy="0.00101905647"
      iyz="-0.0002676393"
      izz="0.00088815706" />
  </inertial>

  <visual>
    <origin xyz="0 0 0" rpy="0 0 0" />
    <geometry>
      <mesh filename="../meshes/Rfoot.STL" />
    </geometry>
    <material name="">
      <color rgba="1 1 1 1" />
    </material>
  </visual>

  <!-- 修改前碰撞体
  <collision>
    <geometry>
      <mesh filename="../meshes/Rfoot.STL" />
    </geometry>
  </collision>
  -->

  <!-- 修改后碰撞体 -->
  <collision>
    <origin xyz="0 0 0" rpy="0 0 0" />
    <geometry>
      <cylinder radius="0.03" length="0.13" />
    </geometry>
  </collision>

  <collision>
    <origin xyz="0.024 -0.052 -0.005" rpy="0 0 0" />
    <geometry>
      <cylinder radius="0.022" length="0.16" />
    </geometry>
  </collision>

  <collision>
    <origin xyz="-0.024 -0.052 -0.005" rpy="0 0 0" />
    <geometry>
      <cylinder radius="0.022" length="0.16" />
    </geometry>
  </collision>
</link>

修改关节限位

在URDF Studio中查看完整碰撞体模型,旋转各个关节,最后读取最大旋转位置写入URDF即可

collision5
读取关节限位

将关节限位写入URDF:

<joint name="right_knee" type="revolute">
    <origin xyz="-0.00900000000000004 0 -0.146"
            rpy="1.5707963267949 0 -1.5707963267949" />
    <parent link="Rleg1" />
    <child link="Rleg2" />
    <axis xyz="0 0 -1" />
    <limit lower="-1.0" upper="2.3" />
</joint>

这里虽然图片中最大位置2.42都可以,但是我们限制的更严格,最大位置给2.3,这个可以根据需求随意修改。