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

Matlab机器人工具箱7 搬运动画展示

参考视频:【MATLAB机器人工具箱10.4 机械臂仿真教学(未完结)】 https://www.bilibili.com/video/BV1q44y1x7WC/?p=10&share_source=copy_web&vd_source=2c56c6a2645587b49d62e5b12b253dca

前面我们学习了正逆解的简单运用、机械臂模型的加载,接下来我们结合起来做点小实验吧~

展示目标:从原点开始,将小球搬运到指定位置并回到原点

1 加载模型

首先加载模型,这在第六节讲了两种方法。

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.42746^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','5-dof');
Five_dof.base=transl(0,0,0.28);q0=[0 0 0 0 0];
v=[35 20];
w=[-1 1 -1 1 0 2];Five_dof.plot3d(q0,'tilesize',0.1,'workspace',w,'path','D:\工程\Fdof1','nowrist','view',v)light('Position',[1 1 1],'color','w');

2 绘制小球

用plot_shpere绘制小球,其中position在三维空间需要输入向量,我们用[0.5, 0.5, 0.5]

plot_sphere(position, radius, color)

3 运行机械臂到小球的位置

指定小球的位置Position,然后设定参数生成小球。

接着要让机械臂移动过来,因此先计算终点的位姿,并让z轴向下(rpy2tr(180, 0, 0))。
得到终点的位和姿后,用transl和rpy2tr将其转换为变换矩阵T1.
接着用我们熟悉的ikunc函数逆解T1,得到关节空间的解q1。
最后用我们第五章讲的jtraj函数,在关节空间内插值,插60个点,得到关节轨迹q。

%% pick
Position = [0.5 0.5 0.5];
r = 0.04;
plot_sphere(Position, r, 'r');
T1 = transl(Position) * rpy2tr(180, 0, 0);
q1 = Five_dof.ikunc(T1);
q = jtraj(q0, q1, 60);
Five_dof.plot3d(q, 'view', v, 'fps', 60, 'nowrist');

plot3d不支持生成gif,因此你只能自己试一下。

Five_dof.plot(q, 'movie', 'pick_trail.gif');

4 搬运小球

对于机械臂而言,和3一样,也是给定目标点计算变换矩阵,求逆解,然后在关节空间插值计算即可。

问题在于小球的跟随移动如何实现?

这里我们用:
首先对每一个插值时刻的关节变量进行正解,得到机械臂末端的位姿,然后用transl将位姿转化为位置,也就是小球应该在的位置。此时再调用plot_sphere绘制小球,就能实现类似跟随的效果了。

%% place
position2 = [0.5, -0.5, 1];
T2 = transl(position2) * rpy2tr(90, 90, 0);
q2 = Five_dof.ikunc(T2);
t = 30;
q = jtraj(q1, q2, t);for i = 1:30qi = q(i, :);Ti = Five_dof.fkine(qi);Pi = transl(Ti);plot_sphere(Pi, r, 'r');Five_dof.plot3d(qi, 'view', v, 'fps', 60, 'nowrist');if i < 30  % 只在前29次清除,最后一次保留cla;end
end

首先确定目标点Position2,然后计算目标的位姿并转化为变换矩阵,求逆解,在关节空间内插值,得到q2。

过程中我们插入30个点,通过for对每一个点执行如下计算:
首先获取当前各个关节的变量qi=q(i, :),“:”意味着全选所有关节。
然后用fkine正运动学求解末端位姿Ti,并用transl函数转换为坐标Pi。
最后在这里绘制小球,并执行机械臂的移动。

由于每次计算都是独立的,都会生成一个机械臂和一个小球,因此会产生严重残影影响运算,我们用cla清除前一次计算。(你可以删去cla试试)

到第29次时,保留最后一次的位置。

5 复位

最后让机械臂回到原点。同上。

%% back
plot_sphere(Pi, r, 'r');
q = jtraj(q2, q0, 60);
Five_dof.plot3d(q,'view', v, 'nowrist', 'fps', 60);

6 绘制轨迹

%% traj
q = [jtraj(q0, q1, 60); ...jtraj(q1, q2, 60); ...jtraj(q2, q0, 60)];Five_dof.plot3d(q,'view', v, 'nowrist', 'fps', 60,...'trail', {'r', 'LineWidth', 1});

完整代码:

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.42746^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','5-dof');
Five_dof.base=transl(0,0,0.28);q0=[0 0 0 0 0];
v=[35 20];
w=[-1 1 -1 1 0 2];Five_dof.plot3d(q0,'tilesize',0.1,'workspace',w,'path','D:\工程\Fdof1','nowrist','view',v)light('Position',[1 1 1],'color','w');%% pick
Position = [0.5 0.5 0.5];
r = 0.04;
plot_sphere(Position, r, 'r');
T1 = transl(Position) * rpy2tr(180, 0, 0);
q1 = Five_dof.ikunc(T1);
q = jtraj(q0, q1, 60);
Five_dof.plot3d(q, 'view', v, 'fps', 60, 'nowrist');%% place
position2 = [0.5, -0.5, 1];
T2 = transl(position2) * rpy2tr(90, 90, 0);
q2 = Five_dof.ikunc(T2);
t = 30;
q = jtraj(q1, q2, t);for i = 1:30qi = q(i, :);Ti = Five_dof.fkine(qi);Pi = transl(Ti);plot_sphere(Pi, r, 'r');Five_dof.plot3d(qi, 'view', v, 'fps', 60, 'nowrist');if i < 30  % 只在前29次清除,最后一次保留cla;end
end%% back
plot_sphere(Pi, r, 'r');
q = jtraj(q2, q0, 60);
Five_dof.plot3d(q,'view', v, 'nowrist', 'fps', 60);%% traj
q = [jtraj(q0, q1, 60); ...jtraj(q1, q2, 60); ...jtraj(q2, q0, 60)];Five_dof.plot3d(q,'view', v, 'nowrist', 'fps', 60,...'trail', {'r', 'LineWidth', 1});


文章转载自:

http://4YXempqp.kmwsz.cn
http://GoNxAU5r.kmwsz.cn
http://O1FS9p8J.kmwsz.cn
http://nXnTtLCk.kmwsz.cn
http://ZjNzYz2a.kmwsz.cn
http://7lHILEyD.kmwsz.cn
http://b0sjgUCx.kmwsz.cn
http://FagCwCwU.kmwsz.cn
http://hp6pFAnm.kmwsz.cn
http://aLOp7eTZ.kmwsz.cn
http://1bItsZjF.kmwsz.cn
http://g0dyTqND.kmwsz.cn
http://grH9B4cA.kmwsz.cn
http://dNzdp8mK.kmwsz.cn
http://lB6rq4jl.kmwsz.cn
http://gSO8cyvh.kmwsz.cn
http://OYc94Tlj.kmwsz.cn
http://D2ogl5Cw.kmwsz.cn
http://Rb6ZrBkN.kmwsz.cn
http://jq2omoJS.kmwsz.cn
http://I84Tf7XB.kmwsz.cn
http://m9Jcuaem.kmwsz.cn
http://OVFupcGm.kmwsz.cn
http://mD2rs7Or.kmwsz.cn
http://59rPsSAK.kmwsz.cn
http://5eYONyHQ.kmwsz.cn
http://HKQ1gb0U.kmwsz.cn
http://f76Z7f9H.kmwsz.cn
http://zNw4C5ie.kmwsz.cn
http://uD2dRR8m.kmwsz.cn
http://www.dtcms.com/a/375429.html

相关文章:

  • 概率论第五讲—大数定律与中心极限定理
  • 计算机视觉--opencv---如何识别不同方向图片的识别
  • SME-OLS
  • 【OpenAI】性价比极高的轻量级多模态模型GPT-4.1-mini介绍 + API KEY的使用教程!
  • 机器学习-聚类
  • MyBatis基础到高级实践:全方位指南(中)
  • CLR的GC机制
  • 《投资-48》- 股市有哪些相互矛盾的说法?
  • 传统商业积分的普遍困境与 RWA 的破局可能
  • 稳定币法律困局:游走在创新与监管的钢丝绳上
  • 第三方区块链应用测评:【多签钱包合约安全评估_阈值签名机制与私钥存储安全性测试】
  • 【服务器】将本地项目部署到服务器
  • 串的模式匹配(朴素算法和KMP算法以及KMP的改进算法)
  • 基于LLM的月全食时空建模与智能预测:当古老天文遇见深度学习
  • php redis 中文API文档手册
  • 哪些危化品企业的岗位需要持有安全员证?
  • Linux指令基础
  • Modbus 速查与实战笔记(功能码、帧结构、坑点)
  • Label Smoothing Cross Entropy(标签平滑交叉熵) 是什么
  • 亮相cippe 成都石油展,陀螺定向短节带来高精度无磁导向方案
  • Debian 操作系统全面介绍
  • Java全栈开发工程师面试实战:从基础到微服务的深度解析
  • C++工程实战入门笔记15-移动语义
  • Vue3源码reactivity响应式篇之批量更新
  • Vue3源码reactivity响应式篇之computed计算属性
  • 微服务02
  • RPA的天花板真的到了吗?智能体正打开下一个市场
  • 计算机视觉(opencv)——基于模板匹配的信用卡号识别系统
  • STM32中EXTI原理及其运用
  • 如何在项目中融合Scrum和Kanban