Matlab机器人工具箱6.2 导入stl模型——用urdf文件描述
写在前面:
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来描述一个机械臂,其中就需要计算惯性张量。
物体平动时,我们用质量直接描述他的惯性特征。
而在刚体转动时,我们也要一种能表征质量分布的方式,于是我们引入惯性张量矩阵。
他描述了刚体在三维空间中绕其质心旋转时的惯性特性,它决定了物体“抵抗转动”的能力——就像质量描述物体抵抗平动的能力一样。
他是一个对称矩阵:
其中主对角线上Ixx、Iyy、Izz是惯性矩,其余交叉项是惯性积。
要注意,惯性张量矩阵的计算依赖于选取的坐标系,一般我们直接用关节坐标系来计算。
特别地,有时候选取坐标系会使得交叉项惯量积为0,此时坐标系的三根轴被称为主轴,对应的惯性矩被称为主惯性矩。
我们常用平行轴定理将惯量积置零,使其变成主对角线矩阵,简化计算。
比如,这是以长方体一个角为原点建系得到的惯性张量矩阵,我们希望通过转换坐标系,将惯量积置零:
平行轴定理如下:
那么我们可以通过更改原点:将在角上的坐标系转移到体心上
由平行轴定理,我们可以得到:
此时就完成了置零,成功将其变成主对角矩阵。
一般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">
<robotname="xMate7"><link>...</link><joint>...</joint>
</robot>
- 定义了一个名为
xMate7
的机器人模型。 - 下面有多个link和joint节点。link代表连杆,joint代表关节,意味着所有连杆和关节都属于这个机器人。
接下来来看link关节如何写:
2. <link>
:机器人的连杆
<linkname="base"><inertial>...</inertial><visual>...</visual><collision>...</collision>
</link>
每个 <link>
代表机器人的一个刚体部件,例如底座、手臂节段等。
每个 link
包含三类节点:
子标签 | 作用 |
---|---|
<inertial> | 质量参数:描述该部件的质量、质心位置和惯性张量(用于动力学仿真) |
<visual> | 视觉参数:使用什么 3D 模型(STL 文件)、颜色等 |
<collision> | 定义用于碰撞检测的几何形状(通常也用 STL,也可简化为立方体/圆柱) |
一般碰撞禁止区域<collision>都会比实体部分大不少,同时会取一个更平整简洁的立方体、圆柱体简化计算,以免碰撞。
其中
<inertial>详述
<inertial>包括origin、mass、inertia三部分
<inertial><originxyz="-0.0190975185922809 3.63607466931301E-05 0.0741764160993386"rpy="0 0 0" /><massvalue="5.27639214386426" /><inertiaixx="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],为什么呢?因为他是对称矩阵,因此只要知道矩阵的上三角的元素就能得知整个矩阵的值。
<visual>详述
<visual>包括了origin、geometry、material三部分
<visual><originxyz="0 0 0"rpy="0 0 0" /><geometry><meshfilename="package://xMate7/meshes/base.STL" /></geometry><materialname=""><colorrgba="1 0 0 1" /></material>
</visual>
origin定义了 <visual>
模型相对于其所属 <link>
坐标系的位置和姿态偏移。
geometry定义了视觉模型的几何形状,可以用简单的正方体和圆柱体替代,也可以使用stl模型。
material定义了视觉模型的材质属性,主要是颜色或纹理。
<collision>详述
<collision>包括了origin、geometry两部分
<collision><originxyz="0 0 0"rpy="0 0 0" /><geometry><meshfilename="package://xMate7/meshes/base.STL" /></geometry>
</collision>
origin定义了碰撞模型相对于其所属 <link>
坐标系的位置和姿态偏移。
geometry定义了碰撞检测所使用的几何形状。
3. <joint>:机器人的关节
<link>...</link>
<jointname="Joint1"type="revolute"><originxyz="0 0 0.404"rpy="-1.5708 0 0" /><parentlink="base" /><childlink="Link1" /><axisxyz="0 -1 0" /><limitlower="-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代表展示的区间,你可以调大一些。
如果出现下面的视图证明成功!