Matlab Robotics ToolBox 实战 -- 埃夫特ER3A-C60六轴机器人运动学建模及分析


  大三下(本学期)《工业机器人》课程作业,要求利用Matlab Robotics ToolBox完成对埃夫特ER3A-C60六轴机器人的正逆运动学分析。除了DH参数不一样外,其余知识同之前的文章对斯坦福机械手的建模类似。

一、建模对象

  埃夫特ER3A-C60六轴机器人。

二、D-H法建模分析

  6个关节均为旋转副,利用D-H对机器人手臂建立坐标系如下:

  制D-H参数表如下:

三、Matlab Robotics ToolBox建模分析

3.1、关节定义

%关节定义
%             th    d   a    alpha   sigma
L(1) = Link([ pi/2    321.5   50     pi/2     0]);
L(2) = Link([ pi/2    0       270    0        0]);
L(3) = Link([ 0       0       70     pi/2     0]); 
L(4) = Link([ 0       299     0     -pi/2     0]);
L(5) = Link([ 0       78.5    0      pi/2     0]);
L(6) = Link([ 0       0       0      0        0]);

3.2、关节限位

  通过参考手册,可以知道埃夫特ER3A-C60六轴机器人具有如下关节限位:

  因此,修改关节qlim属性如下:

% 关节参数范围限定
L(1).qlim = [-167 167]*pi/180;
L(2).qlim = [-130 90]*pi/180;
L(3).qlim = [-71 101]*pi/180;
L(4).qlim = [-180 180]*pi/180;
L(5).qlim = [-113 113]*pi/180;
L(6).qlim = [-360 360]*pi/180;

3.3、观察模型

  给定初始关节角:

init = [0 pi/2 0 0 0 0];%初始关节参数
%工作区定义
w=[-1000,1000,-1000,1000,-1000,1000]:
figure
efort.plot(init,'workspace',w);%画出图像
title('初始状态');

  结果显示如左图所示,对比右图可以验证建模结果是正确的:

3.4、工作空间

  通过在关节角限位内随机取1000个关节角状态,绘制机械臂末端到达的空间点位置,可以近似得到机械臂的工作空间形状:

3.5、正逆运动学分析

3.5.1、正运动学分析

  给定期望关节角,求位姿:

    

  输出结果:

    

  机械臂状态:

  动画演示:

3.5.2、逆运动学分析

  给定期望位姿,求解关节角(此处为便于验证,将期望位姿设置为正运动分析所得到的位姿结果)。
  期望位姿:

         

  输出结果:

  由输出结果可以看出,第二组运动学逆解求得的关节角 \(theta1\) 中我们设定的第二组期望关节角 \(aid1\) 有所不同:

  进一步观察此时机械臂状态(左图):

  可以发现此时的机械臂末端确实到达了我们期望的位姿(右图),但是各关节角状态并不符合我们的要求。同时,细心观察结果,可以发现此时由逆解计算得到的关节角状态已经超过机械臂的关节限位。

三、总结

  Matlab Robotics Toolbox的ikine函数在求机械臂运动逆解时,由于未考虑机械臂的限位及机械臂状态(比如左手/右手、肘部在上/肘部在下、手腕翻转/手腕不翻转),会导致出现我们不想要的解的状态。怎么解决?试试求解析解吧🚀 (过于复杂,我已经忘了怎么求了嘻嘻🍄)

四、附matlab源码

close all
clc
%关节定义
%             th    d   a    alpha   sigma
L(1) = Link([ pi/2    321.5   50     pi/2     0]);
L(2) = Link([ pi/2    0       270    0        0]);
L(3) = Link([ 0       0       70     pi/2     0]); 
L(4) = Link([ 0       299     0     -pi/2     0]);
L(5) = Link([ 0       78.5    0      pi/2     0]);
L(6) = Link([ 0       0       0      0        0]);

% %关节参数范围限定
L(1).qlim = [-167 167]*pi/180;
L(2).qlim = [-130 90]*pi/180;
L(3).qlim = [-71 101]*pi/180;
L(4).qlim = [-180 180]*pi/180;
L(5).qlim = [-113 113]*pi/180;
L(6).qlim = [-360 360]*pi/180;

efort = SerialLink(L, 'name', 'EFORT');%创建机器人

t = 0:0.5:8;%采样时间
init = [0 pi/2 0 0 0 0];%初始关节参数

%期望关节参数 第一组
aid0 = [0 0 0 0 0 0];
%运动轨迹求解,第一组
[q0,qd0,qdd0]=jtraj(init,aid0,t);%运动轨迹求解,q为位移,qd为速度,qdd为加速度
Theta0 = q0(17,:)/pi*180;
Theta0
%正运动学分析 第一组
T0=efort.fkine(aid0);
T0
%逆运动学分析 第一组
theta0 =efort.ikine(T0);
theta0 = theta0/pi*180;%转换为角度
theta0

% 
%期望关节参数 第二组
aid1 = [3*pi/4 pi/4 0 pi/4 -pi/2 0];
%运动轨迹求解,第二组
[q1,qd1,qdd1]=jtraj(aid0,aid1,t);%q为位移,qd为速度,qdd为加速度
Theta1 = q1(17,:)/pi*180;
Theta1
%正运动学分析 第二组
T1=efort.fkine(aid1);
T1
%逆运动学分析 第二组
theta1 =efort.ikine(T1);
theta1 = theta1/pi*180;%转换为角度
theta1

% %工作区定义
w=[-1000,1000,-1000,1000,-1000,1000];
waitforbuttonpress;%等待按键
figure
efort.plot(init,'workspace',w);%画出图像
title('初始状态');
waitforbuttonpress;%等待按键
efort.plot(q0,'workspace',w);%画出动态动作图像
title('动作一');
waitforbuttonpress;%等待按键
efort.plot(q1,'workspace',w);%画出动态动作图像
title('动作二');


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM