当前位置: 首页 > news >正文

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来描述一个机械臂,其中就需要计算惯性张量。

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

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

他是一个对称矩阵:

{}^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">

<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],为什么呢?因为他是对称矩阵,因此只要知道矩阵的上三角的元素就能得知整个矩阵的值。{}^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><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代表展示的区间,你可以调大一些。

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


文章转载自:

http://hbLN1mCv.fkqxf.cn
http://bl1Iqb5r.fkqxf.cn
http://w1o52aGG.fkqxf.cn
http://VkGdYMsF.fkqxf.cn
http://AsaHHdJA.fkqxf.cn
http://DPFiJ22k.fkqxf.cn
http://b2byyD81.fkqxf.cn
http://TojAfEyH.fkqxf.cn
http://3OJsBVVA.fkqxf.cn
http://DXF840oX.fkqxf.cn
http://r7tj7wB7.fkqxf.cn
http://F8fpqaGD.fkqxf.cn
http://acW7eLDR.fkqxf.cn
http://HW2F4I9R.fkqxf.cn
http://m10dYQG3.fkqxf.cn
http://UTjAf16R.fkqxf.cn
http://gutPf750.fkqxf.cn
http://vu1yujYu.fkqxf.cn
http://ERBAAprW.fkqxf.cn
http://iACb9UR6.fkqxf.cn
http://RHlhYfFF.fkqxf.cn
http://F7vJPODu.fkqxf.cn
http://BxQio5oD.fkqxf.cn
http://4p190hrC.fkqxf.cn
http://FoAClgBJ.fkqxf.cn
http://7KHp3a5d.fkqxf.cn
http://MGYOOF3X.fkqxf.cn
http://9wWq5FYp.fkqxf.cn
http://fWFsKng2.fkqxf.cn
http://BAxl8g6H.fkqxf.cn
http://www.dtcms.com/a/375547.html

相关文章:

  • 网页设计模板 HTML源码网站模板下载
  • 南京大学计算机学院 智能软件工程导论 + Luciano Baresi 教授讲座
  • Rust/C/C++ 混合构建 - Buck2构建工具一探究竟
  • Drawnix:开源一体化白板工具,让你的创意无限流动!
  • stm32 链接脚本没有 .gcc_except_table 段也能支持 C++ 异常
  • K8S集群管理(4)
  • flutter TabBar 设置isScrollable 第一个有间距
  • 学习 Android (二十一) 学习 OpenCV (六)
  • Maven项目中修改公共依赖项目并发布到nexus供三方引用全流程示例
  • GD32VW553-IOT开发板移植适配openharmony
  • nuxt3在使用vue-echarts报错 document is not defined
  • 嵌入式第四十九天(ARM汇编指令)
  • RS485通信 , 和modus RTU
  • 7. LangChain4j + 记忆缓存详细说明
  • 【超简单】Anaconda 安装教程(Windows 图文版)
  • Docker 搭建 Harbor 镜像仓库
  • 数据采集平台的起源与演进:从ETL到数据复制
  • Blender 制作中世纪风格的水磨坊(2):场景元素、纹理与渲染后期
  • 【Python】pytorch安装(使用conda)
  • 阿里云centos7-mysql的使用
  • Android实战进阶 - 启动页
  • 【从零开始编写数据库系统】基于Python语言实现存储引擎
  • 【Pywinauto库】8.3 pywinauto.findwindows 模块
  • 351章:Python Web爬虫入门:使用Requests和BeautifulSoup
  • 禅道,用域名访问之后不能登录的问题
  • Lodash-es 完整开发指南:ES模块化JavaScript工具库实战教程
  • 实践《数字图像处理》之图像方向性自适应阈值处理
  • 【Linux】系统部分——信号的概念和产生
  • android定制系统完全解除应用安装限制
  • 第2节-过滤表中的行-BETWEEN