写在前面:

Matlab不仅支持DH参数建模,也支持直接使用结构化描述文件urdf建模,urdf是一种类似html的结构文本,能结构化描述各个关节、连杆的关系和属性。

要求提前建好模,并按照关节导出stl文件,这部分在6.1节已经完备讲过了。如果没有现成模型,可以等我把xMate7的模型传到资源上。

如果是自行建模,大家可能遇到的一个问题是如何修改坐标系原点,可以参考https://blog.csdn.net/2301_80226956/article/details/149453062?spm=1001.2014.3001.5502


质量分布描述在《机器人学导论》(约翰J克雷格著)第118页,如果没看过也没关系,下面我们会一起快速复习一遍。

惯性张量复习速通

物理性质描述是构建模型必不可少的一部分,我们常用结构化文件urdf来描述一个机械臂,其中就需要计算惯性张量。

物体平动时,我们用质量直接描述他的惯性特征。

而在刚体转动时,我们也要一种能表征质量分布的方式,于是我们引入惯性张量矩阵
他描述了刚体在三维空间中绕其质心旋转时的惯性特性,它决定了物体“抵抗转动”的能力——就像质量描述物体抵抗平动的能力一样。

他是一个对称矩阵:

{}^A I = \begin{pmatrix} I_{xx} & -I_{xy} & -I_{xz} \\ -I_{xy} & I_{yy} & -I_{yz} \\ -I_{xz} & -I_{yz} & I_{zz} \end{pmatrix}

其中主对角线上Ixx、Iyy、Izz是惯性矩,其余交叉项是惯性积

I_{xx} = \iiint_V (y^2 + z^2) \rho \, dv \\ I_{yy} = \iiint_V (x^2 + z^2) \rho \, dv \\ I_{zz} = \iiint_V (x^2 + y^2) \rho \, dv \\ I_{xy} = \iiint_V xy \rho \, dv \\ I_{xz} = \iiint_V xz \rho \, dv \\ I_{yz} = \iiint_V yz \rho \, dv

要注意,惯性张量矩阵的计算依赖于选取的坐标系,一般我们直接用关节坐标系来计算。
特别地,有时候选取坐标系会使得交叉项惯量积为0,此时坐标系的三根轴被称为主轴,对应的惯性矩被称为主惯性矩

我们常用平行轴定理将惯量积置零,使其变成主对角线矩阵,简化计算。

比如,这是以长方体一个角为原点建系得到的惯性张量矩阵,我们希望通过转换坐标系,将惯量积置零:

{}^A I = \begin{pmatrix} \frac{m}{3}(l^2 + h^2) & -\frac{m}{4}wl & -\frac{m}{4}hw \\ -\frac{m}{4}wl & \frac{m}{3}(w^2 + h^2) & -\frac{m}{4}hl \\ -\frac{m}{4}hw & -\frac{m}{4}hl & \frac{m}{3}(l^2 + w^2) \end{pmatrix}

平行轴定理如下:

{}^A I_{zz} = {}^C I_{zz} + m(x_c^2 + y_c^2) \\ {}^A I_{xy} = {}^C I_{xy} - mx_cy_c

那么我们可以通过更改原点:将在角上的坐标系转移到体心上

\mathbf{p} = \begin{pmatrix} x_c \\ y_c \\ z_c \end{pmatrix} = \frac{1}{2} \begin{pmatrix} w \\ l \\ h \end{pmatrix}

由平行轴定理,我们可以得到:

{}^C I_{zz} = \frac{m}{12} (\omega^2 + l^2) \\ {}^C I_{xy} = 0

此时就完成了置零,成功将其变成主对角矩阵。

{}^C I = \begin{pmatrix} \frac{m}{12}(h^2 + l^2) & 0 & 0 \\ 0 & \frac{m}{12}(\omega^2 + h^2) & 0 \\ 0 & 0 & \frac{m}{12}(l^2 + \omega^2) \end{pmatrix}

一般solidworks在工具栏可以用“评估”获得每个连杆的惯性张量矩阵,但我们还是要会算。

同时,如果使用AI生成urdf文件,一定要检查inertia一栏,是否按照[0][0]、[1][1]、[2][2]、[1][2]、[1][3]、[2][3]的顺序填写惯性张量矩阵。任何不确定的参数,都可以读document。


虽然绝大多数时候都可以由AI或solidworks生成urdf文件,但是由于某些原因,仍然可能导致结构性错误,这个时候就需要我们看懂urdf文件才能修改了。

URDF描述文件的结构

我们看下结构,

urdf和html类型,也是通过节点描述机器人的物理与几何结构,其中:

最外层是机器人节点:

1. <robot name="xMate7">

<robot
  name="xMate7">
    <link>...</link>
    <joint>...</joint>
</robot>
  • 定义了一个名为 xMate7 的机器人模型。
  • 下面有多个link和joint节点。link代表连杆,joint代表关节,意味着所有连杆和关节都属于这个机器人。

接下来来看link关节如何写:

2. <link>:机器人的连杆

<link
    name="base">
    <inertial>...</inertial>
    <visual>...</visual>
    <collision>...</collision>
</link>

每个 <link> 代表机器人的一个刚体部件,例如底座、手臂节段等。

每个 link 包含三类节点:

子标签 作用
<inertial> 质量参数:描述该部件的质量、质心位置和惯性张量(用于动力学仿真)
<visual> 视觉参数:使用什么 3D 模型(STL 文件)、颜色等
<collision> 定义用于碰撞检测的几何形状(通常也用 STL,也可简化为立方体/圆柱)

一般碰撞禁止区域<collision>都会比实体部分大不少,同时会取一个更平整简洁的立方体、圆柱体简化计算,以免碰撞。

其中

<inertial>详述

<inertial>包括origin、mass、inertia三部分

<inertial>
      <origin
        xyz="-0.0190975185922809 3.63607466931301E-05 0.0741764160993386"
        rpy="0 0 0" />
      <mass
        value="5.27639214386426" />
      <inertia
        ixx="0.0277370875503954"
        ixy="2.17941599274713E-05"
        ixz="-0.00396137885321739"
        iyy="0.0357761993501891"
        iyz="4.48688518868532E-06"
        izz="0.0304451579710877" />
</inertial>

origin定义了连杆相对于连杆原点的偏移和旋转,显然是六维的。

mass定义了该连杆的质量。

inertia定义了惯性张量矩阵,分别是矩阵的[0][0]、[1][1]、[2][2]、[1][2]、[1][3]、[2][3],为什么呢?因为他是对称矩阵,因此只要知道矩阵的上三角的元素就能得知整个矩阵的值。{}^A I = \begin{pmatrix} I_{xx} & -I_{xy} & -I_{xz} \\ -I_{xy} & I_{yy} & -I_{yz} \\ -I_{xz} & -I_{yz} & I_{zz} \end{pmatrix}

<visual>详述

<visual>包括了origin、geometry、material三部分

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

origin定义了 <visual> 模型相对于其所属 <link> 坐标系的位置和姿态偏移

geometry定义了视觉模型的几何形状,可以用简单的正方体和圆柱体替代,也可以使用stl模型。

material定义了视觉模型的材质属性,主要是颜色或纹理。

<collision>详述

<collision>包括了origin、geometry两部分

<collision>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://xMate7/meshes/base.STL" />
      </geometry>
</collision>

origin定义了碰撞模型相对于其所属 <link> 坐标系的位置和姿态偏移

geometry定义了碰撞检测所使用的几何形状。

3. <joint>:机器人的关节

<link>...</link>
<joint
    name="Joint1"
    type="revolute">
    <origin
      xyz="0 0 0.404"
      rpy="-1.5708 0 0" />
    <parent
      link="base" />
    <child
      link="Link1" />
    <axis
      xyz="0 -1 0" />
    <limit
      lower="-2.9671"
      upper="2.9671"
      effort="0"
      velocity="0" />
</joint>
<link>...</link>

joint主要定义连接哪两个连杆?两个连杆以什么方式连接?是否有限制?

type定义了两个连杆连接的方式,这里是"revolute"就是旋转关节。

originl定义从 父 link 坐标系 到 关节坐标系 的变换

axis定义了关节的运动轴方向(在关节坐标系下),这里绕y轴旋转

limit定义了关节变量的上下限。

而parent和child节点就指明了当前joint连接哪两个连杆,每个joint和link都有自己的名字,因此是用名字指定父连杆和子连杆。

4. 文件路径说明

每一个Link都需要把stl文件的路径导入

filename="package://xMate7/meshes/base.STL"

也可以是你模型的真实路径

filename="D:\工程\0. xMateSimFinal\版本二\xMate7\meshes\base.STL"

写好URDF文件后,可以在matlab用importrobot进行导入

% 导入 URDF 机器人模型
robot = importrobot('xMate7/urdf/xMate7.urdf');

加载代码

% 清除工作区
clear all; clc; close all;

% 导入 URDF 机器人模型
robot = importrobot('xMate7/urdf/xMate7.urdf');%改成你的文件路径

% 设置数据格式(可选)
robot.DataFormat = 'row';

% 显示机器人(在零位姿态 q = zeros(1,7))
figure('Position', [600, 300, 800, 600]);
show(robot, 'Frames', 'off');  % 'off' 表示不显示坐标系
title('xMate7 机器人模型 - 默认姿态');
axis equal;
view([-250, 30]);  % 设置视角
grid on;
axis([-0.6 0.8 -0.4 0.6 0 1.0]);  % 调整坐标轴范围以便更好查看

这里最后的axis代表展示的区间,你可以调大一些。

如果出现下面的视图证明成功!

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐