第3章:机器人建模与URDF

各位同学,今天我们来聊聊机器人建模。说白了,就是给你的机器人画个「骨架」,让计算机知道它长什么样、关节怎么动。

URDF(Unified Robot Description Format)是ROS里最基础的机器人描述格式。我刚开始接触ROS时,觉得这东西不就是个XML吗?后来才发现,这里面的门道还真不少。

3.1 URDF语法基础

URDF本质上是一个XML文件。它的核心就两个东西:连杆(link)关节(joint)

你可以这么理解:连杆是机器人的「骨头」,关节是连接骨头的「筋」。骨头本身不会动,筋才会让机器人动起来。

核心原则:每个URDF文件必须包含至少一个link和一个joint。link是刚体,joint定义link之间的运动关系。

来看一个最简单的例子:

<robot name="my_robot">
  <link name="base_link">
    <visual>
      <geometry>
        <box size="0.2 0.2 0.1"/>
      </geometry>
    </visual>
  </link>
</robot>

嗯,这里要注意:robot标签是根节点,name属性随便起,但最好有意义。我习惯用项目名或机器人型号。

3.2 连杆定义详解

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

子标签 作用 是否必须
<visual> 可视化外观,用于Rviz显示 推荐
<collision> 碰撞检测模型 推荐
<inertial> 惯性参数,用于物理仿真 仿真时必选

我在项目中遇到过一个问题:visual和collision用同一个模型,结果碰撞检测特别慢。后来我把collision简化成几个基本几何体,速度提升了好几倍。

我的经验:collision模型尽量用box、cylinder、sphere这些基本形状。复杂的mesh模型会拖慢碰撞检测,尤其是做导航时,影响很明显。

3.3 关节定义详解

关节定义了连杆之间的运动关系。URDF支持6种关节类型:

  • fixed:固定连接,不能动
  • revolute:旋转关节,有角度限制
  • continuous:连续旋转关节,没限制
  • prismatic:平移关节
  • floating:6自由度浮动
  • planar:平面运动

最常用的是revolute和continuous。差速轮式机器人一般用continuous,机械臂用revolute。

<joint name="joint1" type="revolute">
  <parent link="base_link"/>
  <child link="arm_link"/>
  <origin xyz="0 0 0.1" rpy="0 0 0"/>
  <axis xyz="0 0 1"/>
  <limit lower="-1.57" upper="1.57" effort="10" velocity="1.0"/>
</joint>

这里有个坑:origin的xyz是相对于父连杆的坐标,rpy是旋转角度。我曾经把rpy写反了,结果机械臂在Rviz里扭成了麻花。

避坑指南:rpy的顺序是绕X轴、Y轴、Z轴旋转。单位是弧度,不是度。我刚开始总写成角度,结果模型飞到了天上去。

3.4 使用SolidWorks导出URDF

手动写URDF太累了,尤其是复杂机器人。我推荐用SolidWorks的URDF导出插件。

步骤很简单:

  1. 在SolidWorks里建好装配体
  2. 给每个零件设置好坐标系
  3. 定义关节类型和运动轴
  4. 运行导出插件,生成URDF和mesh文件

导出时要注意几点:

  • 每个零件单独成一个link
  • 关节的坐标系要对齐
  • mesh文件格式用STL或DAE

我个人习惯用DAE格式,因为它支持颜色信息。STL只有几何形状,在Rviz里灰蒙蒙的,不好看。

小技巧:导出前把SolidWorks的单位设为米。不然导出的URDF里坐标全是毫米,你得手动除以1000,很麻烦。

3.5 在Rviz中可视化模型

模型建好了,总得看看长啥样吧?Rviz就是干这个的。

启动命令很简单:

ros2 launch urdf_tutorial display.launch.py model:=my_robot.urdf

或者手动操作:

  1. 启动Rviz:rviz2
  2. 添加RobotModel显示组件
  3. 在Description Topic里选择/robot_description
  4. 或者直接加载URDF文件

我第一次在Rviz里看到自己建的机器人时,说实话挺激动的。虽然只是个简单的两轮底盘,但看到它动起来的那一刻,感觉之前熬的夜都值了。

如果模型显示不出来,多半是这几个原因:

  • URDF文件路径不对
  • mesh文件路径是相对路径,但Rviz找不到
  • 关节的parent和child写反了

注意:URDF里的mesh路径最好用package://格式。比如package://my_robot/meshes/base.stl。这样不管你在哪个目录启动,都能找到文件。

3.6 本章知识体系

下面这张图总结了URDF建模的核心逻辑:

URDF机器人建模知识体系 URDF机器人描述 连杆 (link) 关节 (joint) 导出工具 visual 可视化 collision 碰撞 inertial 惯性 类型 (6种) parent/child origin/axis/limit SolidWorks插件 手动编写 Rviz可视化验证 核心:link定义「是什么」,joint定义「怎么动」,Rviz验证「对不对」

从这张图可以看出,URDF建模其实就三步:定义连杆、定义关节、可视化验证。每一步都有对应的工具和方法。

好了,这一章的内容就到这里。URDF是机器人建模的基础,后面做导航、做SLAM,都离不开它。建议大家多动手,从简单的两轮底盘开始,慢慢加传感器、加机械臂,一步步来。


公众号:蓝海资料掘金营,微信deep3321