2、机器人建模基础:URDF文件结构、link与joint定义、坐标系与物理参数

各位同学,欢迎来到第二章。上一章我们聊了MoveIt的整体框架,算是打了个底。这一章,咱们得亲手搭积木了——用URDF把机器人描述出来。

URDF,全称是Unified Robot Description Format。说白了,就是一套用XML写的机器人说明书。你告诉计算机:这里有个连杆,那里有个关节,它们怎么连,能怎么动。我刚开始学的时候,觉得这东西不就是个配置文件嘛,有啥难的?后来在项目里被坑过几次,才发现细节里全是魔鬼。

URDF 机器人模型 link(连杆) 视觉/碰撞/惯性参数 joint(关节) 类型/父子/坐标系/限位 <visual> <collision> <inertial> <origin> <axis> <limit> 工具:SolidWorks → sw2urdf 导出 验证:check_urdf / 可视化

2.1 URDF文件结构:从根到叶

一个URDF文件,最外层是<robot>标签。里面就两样东西:<link>和<joint>。你想想看,机器人再复杂,拆到底也就是连杆和关节的树状结构。

<?xml version="1.0"?>
<robot name="my_robot">
  <link name="base_link">
    ...
  </link>

  <joint name="joint1" type="revolute">
    <parent link="base_link"/>
    <child link="link_1"/>
    ...
  </joint>

  <link name="link_1">
    ...
  </link>
</robot>

注意,<robot>的name属性是必须的。我个人习惯用项目代号,比如arm_v2,方便后面调试时一眼认出来。

2.2 link与joint:机器人的骨骼和关节

link(连杆)

link就是机器人的一个刚体部件。它有三个子部分:

  • <visual>:长什么样。指定几何体(box、cylinder、sphere、mesh)和材质颜色。
  • <collision>:碰撞检测用。通常和visual一样,但可以简化成凸包或基本几何体来省计算。
  • <inertial>:惯性参数。质量、质心、惯性张量。这个最容易被忽略,但动力学仿真全靠它。
我的经验: 碰撞模型尽量用简单几何体。我曾经把一个复杂机械臂的STL网格直接当碰撞模型,结果MoveIt规划一次要好几秒。换成圆柱和长方体组合后,速度提升了10倍。

joint(关节)

joint连接两个link,定义了它们的相对运动关系。常见类型有:

类型说明自由度
revolute旋转关节,有角度限位1
continuous连续旋转关节,无限位(如轮子)1
prismatic平移关节,有位移限位1
fixed固定连接,两个link刚性地绑在一起0
floating6自由度浮动关节(很少用)6

每个joint必须有<parent>和<child>。这构成了机器人的运动学树。根节点通常是base_link,叶子节点是末端执行器。

2.3 <origin>与<axis>:坐标系是灵魂

这是URDF里最容易出错的地方。我见过太多人在这里栽跟头。

<origin>:定义子link相对于父link的变换。包含xyz(平移)和rpy(旋转,单位弧度)。

<origin xyz="0 0 0.5" rpy="0 0 0"/>

上面这行表示:子link的原点,在父link坐标系下,沿Z轴向上0.5米,没有旋转。

<axis>:定义关节的运动轴。只对revolute、prismatic、continuous有效。

<axis xyz="0 0 1"/>

这表示关节绕Z轴旋转。注意,这个轴是在父link坐标系下定义的。嗯,这里要特别小心——我当年做六轴机械臂时,把axis写成了相对于子link,结果仿真时手臂扭成了麻花。

避坑指南: 我曾经在调试一个协作机器人时,发现关节转动的方向总是反的。查了半天,原来是<origin>的rpy写错了符号。记住:rpy的顺序是绕固定轴X→Y→Z,不是绕自身轴。

2.4 <limit>与<dynamics>:物理参数决定真实感

光有几何和运动学还不够。要让机器人动得真实,必须加上物理参数。

<limit>:关节的硬限位。

<limit effort="100" velocity="3.14" lower="-3.14" upper="3.14"/>
  • lower/upper:关节运动范围(弧度或米)。
  • effort:最大驱动力/力矩。
  • velocity:最大速度。

<dynamics>:关节的阻尼和摩擦。

<dynamics damping="0.1" friction="0.0"/>

这两个参数在纯运动学规划中影响不大,但如果你要做力控或仿真,它们就很重要了。我建议一开始都设成小值,等模型跑通了再慢慢调。

2.5 使用SolidWorks导出URDF

手写URDF?对于简单模型还行。但真实机器人动辄几十个零件,手写会疯掉的。这时候就需要工具了。

SolidWorks有个官方插件叫sw2urdf。流程大致如下:

  1. 在SolidWorks里建好装配体,确保每个零件是一个独立的part。
  2. 安装sw2urdf插件(从ROS官网下载)。
  3. 在SolidWorks里打开装配体,启动插件。
  4. 为每个关节指定类型、轴线、限位。
  5. 插件自动生成URDF文件和对应的mesh文件(STL或DAE)。
关键点: 导出前,一定要在SolidWorks里把base_link的坐标系对齐到世界坐标系。否则导出的URDF里所有坐标都是歪的。我见过有人导出后机械臂悬浮在半空中,就是坐标系没对齐。

导出后,用check_urdf命令验证一下:

check_urdf my_robot.urdf

它会打印出机器人的运动学树,如果有错误会直接报出来。再用urdf_to_graphiz生成可视化树状图,一目了然。

小技巧: 导出后,我习惯手动检查每个joint的<origin>和<axis>。插件有时候会搞错坐标系方向,尤其是当你的装配体里有子装配体时。花10分钟检查,能省下后面几小时的调试时间。

好了,这一章的内容就到这里。URDF是机器人建模的基石,看似简单,但每个字段都有它的意义。下一章我们会用这些知识,搭建一个完整的机械臂模型,然后让它在MoveIt里动起来。