Matlab机械臂建模:机器人工具箱的使用导入自己的机械臂模型

news2024/11/26 6:25:02

        本文主要介绍如何在matlab中建立机械臂模型(前提要下载了Robotics Toolbox机器人工具箱~),并进行基于正逆运动学计算的轨迹运动。对于已有的Solidworks机械臂三维模型,如何导入Matlab,并对其进行运动控制。

        关于机器人工具箱的安装及函数的详细解释可以参考这篇文章(写的很详细,很好!!):(1条消息) Matlab机器人工具箱(Robotics Toolbox)学习笔记_Mist_Orz的博客-CSDN博客

目录

1 机械臂的建立

核心函数——Link函数释义

机械臂仿真代码

 2 基于运动学求解的轨迹规划

正逆运动学求解

3 基于Solidworks和Matlab 的自定义机械臂模型的导入及使用

将Solidworks模型导入Matlab

 进行正运动学轨迹规划


1 机械臂的建立

核心函数——Link函数释义

        Link函数是根据DH参数建立连杆,包含了关节的主要信息,建立连杆时DH参数的输入顺序为:关节转角θ,关节距离d,连杆长度a,连杆转角α,关节类型(0转动,1移动);

        另外,关节变量的参数有:

        qlim指定关节极限,【注意,工具箱中的移动关节变量不允许有负值

        jointtype指定关节类型,默认为转动关节,L(4).jointtype='P’意味着第四根link是由移动关节连接的;
        offset为关节初始值的偏置。【这里要注意的是,定义好关节类型后,相应的变量必须为0,初值必须由offset定义,例如,关节2为转动关节,那么L(2)的theta必须为0,但是我们又希望初始状态下关节2能有一个偏置,那么就在初始化后通过“ L(2).offset=pi/2;”的语句来实现】。
        最后是建模参数类型的选择:标准型D-H参数 / 改进型D-H参数,区别在于固连坐标系不同以及执行变换的的顺序不同,类比如下:

标准型D-H参数改进型D-H参数

固连坐标系

的选用

以连杆的后一个关节坐标系为固连坐标系以连杆的前一个关节坐标系为固连坐标系

X轴方向

的确定

以当前Z轴和“前一个”坐标系的Z轴叉乘确定X轴以“后一个”坐标的Z轴与当前Z轴叉乘确定X轴

坐标系间

的变换规则

相邻关节坐标系之间的参数变化顺序为:
θ、d、a、α
相邻关节坐标系之间的参数变化顺序为:
α、a、θ、d

        Link函数调用的格式为

L(1) = Link([theta1, D1, A1, alpha1, offset1], 'standard')    %标准型D-H参数

L(1) = Link([theta1, D1, A1, alpha1, offset1], 'modified')    %改进型D-H参数

机械臂仿真代码

        举例1:建立关节型六轴机械臂

%% 基于MATLAB的关节型六轴机械臂仿真

%% 参数定义
clear;
close all;
clc;
 
%角度转换
angle=pi/180;  %转化为角度制
 
%D-H参数表
theta1 = 0;   D1 = 0.4;   A1 = 0.025; alpha1 = pi/2; offset1 = 0;
theta2 = pi/2;D2 = 0;     A2 = 0.56;  alpha2 = 0;    offset2 = 0;
theta3 = 0;   D3 = 0;     A3 = 0.035; alpha3 = pi/2; offset3 = 0;
theta4 = 0;   D4 = 0.515; A4 = 0;     alpha4 = pi/2; offset4 = 0;
theta5 = pi;  D5 = 0;     A5 = 0;     alpha5 = pi/2; offset5 = 0;
theta6 = 0;   D6 = 0.08;  A6 = 0;     alpha6 = 0;    offset6 = 0;

%% DH法建立模型,关节转角,关节距离,连杆长度,连杆转角,关节类型(0转动,1移动),'standard':建立标准型D-H参数
L(1) = Link([theta1, D1, A1, alpha1, offset1], 'standard')
L(2) = Link([theta2, D2, A2, alpha2, offset2], 'standard')
L(3) = Link([theta3, D3, A3, alpha3, offset3], 'standard')
L(4) = Link([theta4, D4, A4, alpha4, offset4], 'standard')
L(5) = Link([theta5, D5, A5, alpha5, offset5], 'standard')
L(6) = Link([theta6, D6, A6, alpha6, offset6], 'standard')

% 定义关节范围
L(1).qlim =[-180*angle, 180*angle];
L(2).qlim =[-180*angle, 180*angle];
L(3).qlim =[-180*angle, 180*angle];
L(4).qlim =[-180*angle, 180*angle];
L(5).qlim =[-180*angle, 180*angle];
L(6).qlim =[-180*angle, 180*angle];

%% 显示机械臂(把上述连杆“串起来”)
robot0 = SerialLink(L,'name','six');
theta = [0 pi/2 0 0 pi 0];				%初始关节角度
figure(1)
robot0.plot(theta);
title('六轴机械臂模型');

        可得运行结果(第二张图分别标明六个轴):

        

 可示教:加入teach指令,使得机械臂关节角度可调节:

        接续上一段代码继续执行:

%% 加入teach指令,则可调整各个关节角度
robot1 = SerialLink(L,'name','sixsix');
figure(2)
robot1.plot(theta);
robot1.teach
title('六轴机械臂模型可调节');

        运行结果如上图所示,可以通过拖动各个关节q的进度条,观察不同关节角度下的机械臂位姿。

 2 基于运动学求解的轨迹规划

正逆运动学求解

        对于机械臂 robot0 = SerialLink(L,'name','six');

        正运动学:robot0.fkine():输入期望的关节角度,输出末端齐次变换矩阵。

        逆运动学:robot0.ikine()【仅用在标准型D-H建模方法中】:输入末端执行的齐次变换矩阵,输出得到的关节角度。

        举例2:正运动学求解及轨迹实现

%% 已知机械臂初始和目标的关节角度,利用五次多项式进行轨迹规划

robot0 = SerialLink(L,'name','six');
T1=transl(0.5,0,0);						%根据给定起始点,得到起始点位姿
T2=transl(0,0.5,0);						%根据给定终止点,得到终止点位姿
init_ang=robot0.ikine(T1);				%根据起始点位姿,得到起始点关节角
targ_ang=robot0.ikine(T2);				%根据终止点位姿,得到终止点关节角
step = 20;

%轨迹规划方法
figure(3)

%关节空间轨迹规划
[q ,qd, qdd]=jtraj(init_ang,targ_ang,step); %五次多项式轨迹,得到关节角度,角速度,角加速度,20为采样点个数
grid on
T=robot0.fkine(q);						%根据插值,得到末端执行器位姿
nT=T.T;
plot3(squeeze(nT(1,4,:)),squeeze(nT(2,4,:)),squeeze(nT(3,4,:)));%输出末端轨迹
title('根据运动学求正解得到目标轨迹');
robot0.plot(q);							%动画演示 


%% 求解上述运行过程中的位置、速度、加速度的变化曲线
figure(4)
subplot(3,2,[1,3]); 					%subplot 对画面分区 三行两列 占用1到3的位置
plot3(squeeze(nT(1,4,:)),squeeze(nT(2,4,:)),squeeze(nT(3,4,:)));%输出末端轨迹
robot2.plot(q);							%动画演示

figure(f)
subplot(3, 2, 2);
i = 1:6;
plot(q(:,1));
title('位置');
grid on;

figure(f)
subplot(3, 2, 4);
i = 1:6;
plot(qd(:,1));
title('速度');
grid on;

figure(f)
subplot(3, 2, 6);
i = 1:6;
plot(qdd(:,1));
title('加速度');
grid on;

        得到的运行结果

机械臂正解求解并轨迹运行

3 基于Solidworks和Matlab 的自定义机械臂模型的导入及使用

        参考学习了视频三维模型_哔哩哔哩_bilibili(感谢up!!模型也是下载的up主的,视频讲解的很详细~),以四轴机械臂为例,在Solidworks中将每一个关节依次导出为STL格式的文件,具体步骤如下:

将Solidworks模型导入Matlab

        1)下载三维模型【文件夹Fdof】(2条消息) 四轴机械臂三维模型(各Link零件及4DOFmanipulator装配体)资源-CSDN文库,并在Solidworks中打开装配体4DOFmanipulator.sldasm。

        2)导出基座Base为 link0.STL 文件,另存为的路径选择刚刚下载的文件夹Fdof的路径。

 【注意:下面所有零件在导出至STL时都要勾选“不要转换STL输出到整的坐标空间”和“在单一文件中保存装配体的所有零部件”两个选项,否则会遇到导出到Matlab中时,零部件分离的情况】

        3)导出第一个关节Link1为 link1.STL 文件

        4)导出第二个关节Link2为 link2.STL 文件

         5)同理,导出第三个关节Link3为 link3.STL 文件,输出坐标系为Frame3;

                导出第四个关节Link4为 link4.STL 文件,输出坐标系为Frame4;

                导出工具Tool为 link5.STL 文件,输出坐标系为Frame5;

        最终得到的文件夹Fdof中存在的文件有:

         6)根据Solidworks建模时的物理参数大小,在Matlab中设置Link函数的参数值(关节转角θ,关节距离d,连杆长度a,连杆转角α),在Matlab中导入上述STL模型的代码如下:

        举例3:自定义机械臂三维模型的Matlab运动学求解

clear;
clc;
L(1) = Link('revolute','d',0.216,'a',0,'alpha',pi/2);
L(2) = Link('revolute','d',0,'a',0.5,'alpha',0,'offset',pi/2);
L(3) = Link('revolute','d',0,'a',sqrt(0.145^2+0.42726^2),'alpha',0,'offset',-atan(427.46/145));
L(4) = Link('revolute','d',0,'a',0,'alpha',pi/2,'offset',atan(427.46/145));
L(5) = Link('revolute','d',0.258,'a',0,'alpha',0);

Five_dof = SerialLink(L,'name','4-dof');
Five_dof.base = transl(0,0,0.28);           % 相当于将link1的frame1向上提升0.28(基座的高度),将机械臂放置在基座上

q0 = [0 0 0 0 0];
view = [35 20];        %plot函数的展示视角【方位角,仰角】
w = [-1 1 -1 1 0 2];        %工作空间

% 变量path的值'D:\Matlab2022a\...\Fdof','nowrist'仅为示意,改为自己的文件夹Fdof的路径
Five_dof.plot3d(q0,'tilesize',0.1,'workspace',w,'path','D:\Matlab2022a\...\Fdof','nowrist','view',view)

L1 = light('Position',[1 1 1],'color','w');     %加光源

         得到的运行结果为:

 进行正运动学轨迹规划

        接续上一段代码继续执行:

%% 给定目标位置为(0.5,0.5,0.5)机械臂求解正运动学的解并运动到该位置
Position = [0.5 0.5 0.5];

T1 = transl(Position)*rpy2tr(180,0,0);         % 机械臂到达的末端位置(rpy2tr:Roll-pitch-yaw angles to SE(3) homogeneous transform)

q1 = Five_dof.ikunc(T1);                    % 末端机械臂的关节位姿

q = jtraj(q0,q1,60);                    % 计算从q0到q1的关节空间轨迹,T=60为时间(60帧)

Five_dof.plot3d(q,'view',view,'fps',60,'nowrist');         % 'nowrist'表示绘制末端的坐标系

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/662770.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

带你手摸手从零开始撸一个脚手架

文章目录 为什么要搭建脚手架搭建流程梳理初始化脚手架命令参数处理询问用户信息下载模版代码等待提示交互脚手架命令行美化发布脚手架到npm 为什么要搭建脚手架 脚手架就是在项目启动的时候询问一些简单的问题,并且通过用户回答的结果去渲染对应的模板文件。 搭建…

四、使用Kibana执行elasticsearch的CRUD操作

目录 使用kibana测试 1、创建一个索引 2、创建索引并添加数据 3、获取索引的具体信息 4、通过GET请求_cat查看所有的_cat命令 5、修改数据 5.1、使用PUT修改 5.2、使用POST最后加上_update修改 6、删除文档 7、删除索引 8、查询操作 Rest风格说明 Rest是一种软件架构…

汽车一键启动开关发动机启动按钮点火开关图解

汽车改装件一键启动按钮单复位汽车点火开关一键启动按钮开关 (用于配套启动主机使用) 移动管家一键启动开关 YC360外观:黑色按钮上有3种不同的雷射灯,指示汽车不同的状态,和主机配套时可任意选灯的颜色。指示汽车的不…

AFPM系列消防设备电源监控系统的功能和一样

安科瑞虞佳豪 现代建筑内部, 消防报警、防火、灭火系统种类繁多,并分布在建筑内的各个角落。当灾情发生的时候,消防设备能否处于正常的工作状态, 直接关系到人民生命财产安全是否得到及时保全。 消防设备电源监控系统对于确保建…

Node.js包和模块的关系是怎样的?

在Node.js 中,会将某个独立的功能封装起来,用于发布、更新、依赖管理和进行版本控制。Nodejs 根据CommonJS规范实现了包机制,开发了NPM包管理工具,用来解决包的发布和获取需求。 Node.js的包和模块并没有本质的不同,包…

高频前端面试题汇总之CSS篇

一、CSS基础 1. CSS选择器及其优先级 选择器格式优先级权重id选择器#id100类选择器#classname10属性选择器a[ref“eee”]10伪类选择器li:last-child10标签选择器div1伪元素选择器li:after1相邻兄弟选择器h1p0子选择器ul>li0后代选择器li a0通配符选择器*0 对于选择器的优…

亚马逊云科技Serverless为手游《MARVEL SNAP》降低30%成本

经典的漫威IP,酷炫的卡牌对战,丰富的故事情节,这款移动游戏《MARVEL SNAP》一经上线就深得全球玩家喜爱。在The Game Awards 2022的年度颁奖典礼上,它更是以出色的表现,一举斩获最佳移动游戏奖项。 其研发公司Second …

centos7~等 FTP登录时,解决报错530,500,421等错误

问题描述 1、添加了用户但是莫名登录不能用户真的是见鬼了,这那遭得住呀!我干,出现的问题如下图所示: cat /etc/passwd 查看是否是之前添加的用户,并确定是否存在。 若没有创建成功,则使用useradd -s /sbin/nologin …

矩阵向量乘法MPI程序的性能评估

文章目录 前言一、实验代码二、实验运行效果三、问题以及思考总结 前言 要求:对矩阵向量乘法MPI程序进行不同输入规模、不同进程数的执行和计时,并对得到运行时间进行计算分析,据此评价该程序的强扩展性和弱扩展性。最后总结学习心得&#x…

feign调用get请求的接口时,出现“Request method ‘POST‘ not supported“

上面是错误的写法 下面是正确的写法 其实就是在feign接口的参数中加了个SpringQueryMap注解 SpringQueryMap是微服务之间调用,使用openfeign通过GET请求方式来处理通过实体类来传参情况的注解。 注意:被SpringQueryMap注解的对象只能有一个 如果需要传…

vulhub-struts2-S2-001 远程代码执行漏洞复现

漏洞原理 该漏洞因用户提交表单数据并且验证失败时,后端会将用户之前提交的参数值使用OGNL表达式%{value}进行解析,然后重新填充到对应的表单数据中。如注册或登录页面,提交失败后一般会默认返回之前提交的数据,由于后端使用%{va…

Python 中常用的数据类型及相关操作详解

文章目录 列表(Lists)创建列表访问列表元素添加元素到列表删除列表元素切片(Slicing)其他常用操作 元组(Tuples)创建元组访问元组元素元组长度其他常用操作 字符串(Strings)创建字符…

低成本渲染提速!掌握这6点,不换电脑也能迅速提升渲染速度

之前一期给大家分享过影响渲染速度的三个“大坑”: 渲染干货 | 渲染速度太慢?很有可能你是踩了这些坑https://blog.csdn.net/LhcyyVSO/article/details/131191936 本期再来谈谈如何在不换电脑配置的情况下,以更低的成本提升你的渲染速度,毕…

无人机电池能不能上高铁以及什么型号的电池可以上高铁

无人机电池能不能上高铁以及什么型号的电池可以上高铁 高铁关于电池的限制电池参数介绍可上高铁的无人机锂电池6S电池3S电池 高铁关于电池的限制 2022年7月1日起施行的《铁路旅客禁止、限制携带和托运物品目录》规定,充电宝、锂电池单块额定能量不超过100Wh 电池参数介绍 明…

致创业者,亚马逊云科技中国峰会“创业者之日”邀您相聚

IDC预测,到2025年全球数据规模将达到175 ZB,这为人工智能模型训练提供了海量数据资源,全球AI产业迅速发展为创业者们带来了巨大的机遇,但也提出了全新的挑战。新的市场、高效的工具和智能的资源,开辟了创新的领域和商业…

和鲸社区数据分析每周挑战【第九十四期:中风患病预测分析】

和鲸社区数据分析每周挑战【第九十四期:中风患病预测分析】 文章目录 和鲸社区数据分析每周挑战【第九十四期:中风患病预测分析】一、前言1、背景描述2、数据说明3、数据集预览 二、数据读取和数据预处理三、探索性数据分析1、绘制相关性矩阵2、中风患病…

1 os|linxu常用命令|vim编辑器

文章目录 oslinux 常用命令用户配置切换用户添加用户设置(修改)密码删除用户总结 目录以及文件操作查看文件或者目录改变工作目录显示当前工作目录创建目录删除空目录拷贝文件或者目录移动文件或者目录删除文件或者目录修改目录或者文件的权限文字设定法…

年过30的我,今年也遇到了职场危机 ...

在软件测试行业摸爬滚打这么多年,即将人到中年,也会和大家一样面临转型或者跳槽的问题。这里总结了一下自我的看法。 对于找工作这个事情,有这么个普遍现象。工作供求无法匹配~ 1、对于测试招聘者,特别是一、二线互联网公司的招…

12.动态规划:子集状压DP和位运算

参考: 0x3f:从集合论到位运算,常见位运算技巧分类总结!https://leetcode.cn/circle/discuss/CaOJ45/ 状态压缩DP详细讲解 https://zhuanlan.zhihu.com/p/599427567 【动态规划学习】状压/子集 DP https://leetcode.cn/circle/arti…

zabbix-4-触发器

4.触发器 4.1什么是触发器 当监控的值发现变化后,对应的值不符合预期,则应该通过触发器通知管理人员介入; 比如:监控TCP的80端口,如果存活则符合预期,如果不存活则不符合预期,应该通过触发器通…