3. 机器人建模与URDF:从零搭建你的机器人“骨架”

做机器人开发,第一步是什么?不是写代码,不是调参数,而是给你的机器人“画个像”。

URDF(Unified Robot Description Format)就是这个画像的标准语言。说白了,它就是一套XML格式的“机器人身份证”,告诉计算机你的机器人长什么样、胳膊往哪伸、轮子怎么转。

我刚开始接触URDF时也觉得挺枯燥,不就是一堆标签嘛。直到有一次在项目里,因为一个关节的坐标系方向搞反了,整个机械臂在仿真里“反关节”运动,差点把虚拟工件打飞……嗯,从那以后我再也不敢小看这个“身份证”了。

本章核心:掌握URDF语法,学会定义连杆与关节,能用SolidWorks导出URDF,并在Rviz中让机器人“活”起来。

URDF 知识体系 URDF 机器人模型 连杆 (link) 定义 关节 (joint) 定义 SolidWorks → URDF 导出 Rviz 可视化验证 从定义到可视化,构建完整的机器人描述

3.1 URDF语法详解:标签就是积木块

URDF的语法其实很简单。它只有两个核心标签:<link> 和 <joint>。你想想看,机器人不就是一堆刚体(link)通过关节(joint)连起来嘛。

先看一个最简的URDF文件长什么样:

<robot name="my_robot">
  <link name="base_link">
    <visual>
      <geometry>
        <box size="0.5 0.3 0.1"/>
      </geometry>
    </visual>
  </link>
  
  <joint name="base_to_arm" type="fixed">
    <parent link="base_link"/>
    <child link="arm_link"/>
    <origin xyz="0 0 0.2" rpy="0 0 0"/>
  </joint>
</robot>

这里有几个关键点:

  • robot:根标签,name属性随便起,但别用中文
  • link:定义连杆的视觉、碰撞和惯性属性
  • joint:定义两个link之间的连接关系

我的小技巧:写URDF时,我习惯先画个树状图。根节点通常是 base_link,然后一层层往下挂。这样写出来的URDF结构清晰,不容易出错。

3.2 连杆与关节的“五脏六腑”

一个完整的link定义,其实包含三部分:

属性 作用 我的经验
visual 视觉显示,决定你看到的样子 用STL文件更真实,用几何体更轻量
collision 碰撞检测,决定物理交互 尽量简化,用长方体代替复杂曲面
inertial 惯性参数,决定动力学 SolidWorks导出时自动计算,别手写

关节类型有六种,但常用的就三种:

  • fixed:固定连接,比如底座和机身
  • revolute:旋转关节,比如机械臂的肘关节
  • prismatic:滑动关节,比如升降台

我曾经踩过的坑:定义revolute关节时,忘了设置 <limit> 标签。结果在MoveIt里规划运动时,关节直接转到了极限位置,把虚拟工件撞飞了。记住:旋转关节一定要设 lower、upper 和 effort。

3.3 从SolidWorks导出URDF:省时省力的“捷径”

手写URDF?对于简单机器人还行。但如果你用的是复杂的工业机械臂,手写会疯掉的。我建议直接用SolidWorks导出。

步骤很简单:

  1. 安装 sw2urdf 插件(网上有教程)
  2. 在SolidWorks里定义好每个零件的坐标系和关节轴
  3. 一键导出,自动生成URDF和STL文件

导出时要注意:

  • 每个零件单独成一个文件,别把所有东西画在一个零件里
  • 关节的旋转轴要对齐SolidWorks里的坐标轴
  • 导出的URDF里,<origin> 的数值是自动计算的,别乱改

我的建议:第一次导出后,先在Rviz里看一眼。如果机器人姿势不对,90%是SolidWorks里的坐标系没对齐。别问我怎么知道的……

3.4 在Rviz中可视化:让机器人“活”起来

URDF写好了,怎么验证?用Rviz。这是ROS里最常用的可视化工具。

启动命令很简单:

# 先启动一个robot_state_publisher
ros2 run robot_state_publisher robot_state_publisher --ros-args -p robot_description:=$(cat my_robot.urdf)

# 再启动Rviz
ros2 run rviz2 rviz2

在Rviz里,添加一个 RobotModel 显示组件,就能看到你的机器人了。

如果机器人显示不出来,检查这几件事:

  • URDF文件路径对不对?用路径最保险
  • STL文件路径对不对?URDF里用的是相对路径,要确保文件在正确位置
  • 有没有启动 robot_state_publisher?它负责发布TF变换

调试小技巧:用 check_urdf 命令检查URDF语法。它会告诉你哪里少了标签,哪里坐标不对。我每次导出后都会跑一遍这个命令,省了不少排查时间。

嗯,到这里,你的机器人已经有了“骨架”。下一章,我们会在这个骨架上添加传感器和控制器,让它真正“活”起来。