• 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

MATLAB下机器人可视化与控制—simulink篇(3)

人工智能 二民院小学生 1234次浏览 0个评论

1、前记:

续写MATLAB下机器人可视化与控制—simulink篇(2),继续完善基于MATLAB/simulink的机器人控制—位置控制。这里主要是PID和GUI部分。PID作为单关节伺服控制部分,GUI作为上位机完成简单的基本运动指令。

 

2、位置控制:

在预先指定的坐标系上,对机器人末端执行器(end effector)的位置和姿态(方向)的控制。如图所示,末端执行器的位置和姿态是在三维空间描述的,包括三个平移分量三个旋转分量,它们分别表示末端执行器坐标在参考坐标中的空间位置方向(姿态)。因此,必须给它指定一个参考坐标,原则上这个参考坐标可以任意设置,但为了规范化和简化计算,通常以机器人的基坐标作为参考坐标。

 

MATLAB下机器人可视化与控制---simulink篇(3)

 

机器人的位置控制主要有直角坐标关节坐标两种控制方式。个人理解是直角坐标是逆运动学的位置控制,关节坐标的位置控制是正运动学的控制。

 

即:直角坐标位置控制:是对机器人末端执行器坐标在参考坐标中的位置和姿态的控制。通常其空间位置主要由腰关节、肩关节和肘关节确定,而姿态(方向)由腕关节的两个或三个自由度确定。通过解逆运动方程,求出对应直角坐标位姿的各关节位移量,然后驱动伺服结构使末端执行器到达指定的目标位置和姿态。

 

关节坐标位置控制:直接输入关节位移给定值,控制伺服机构

 

MATLAB下机器人可视化与控制---simulink篇(3)

 

3、根据上图很容易在simulink中建立机器人的位置控制系统—独立关节位置控制。

MATLAB下机器人可视化与控制---simulink篇(3)

 

GUI运动学部分:1)界面包括简单的关节坐标控制(正)和直角坐标控制(逆)。正逆运动部分参考PUMA762中的形式编写。

MATLAB下机器人可视化与控制---simulink篇(3)

 

以下是部分代码:关节1轴运动回调函数–正运动。

 


function slider1_Callback(hObject, eventdata, handles)

ModelName = 'complete_arm';

a1 = 0;

a2 = 0;

a3 = 104;

a4 = 94;

a5=119;

%get the angle

theta1=get(handles.slider1,'value');

set(handles.edit2,'string',num2str(theta1));

theta2=get(handles.slider2,'value');

set(handles.edit3,'string',num2str(theta2));

theta3=get(handles.slider3,'value');

set(handles.edit4,'string',num2str(theta3));

theta4=get(handles.slider4,'value');

set(handles.edit5,'string',num2str(theta4));

%Data transmission to simulink

set_param([ModelName '/Slider Gain1'],'Gain',num2str(theta1));

set_param([ModelName '/Slider Gain2'],'Gain',num2str(theta2+180));

set_param([ModelName '/Slider Gain3'],'Gain',num2str(theta3+170));

set_param([ModelName '/Slider Gain4'],'Gain',num2str(theta4));

 

T1 = [ cosd(theta1) 0   -sind(theta1)    0;

       sind(theta1) 0   -cosd(theta1)    0;

       0            -1       0           486;

       0            0       0            1];

 

T2 = [ cosd(theta2) -sind(theta2)   0   a2*cosd(theta2);

       sind(theta2) cosd(theta2)    0   a2*sind(theta2);

       0            0               1       0;

       0            0               0        1];

   

T3 = [ cosd(theta3) -sind(theta3)   0   a3*cosd(theta3);

       sind(theta3) cosd(theta3)    0   a3*sind(theta3);

       0            0               1     0;

       0            0               0       1];

   

T4 = [ cosd(theta4) -sind(theta4)   0   a4*cosd(theta4);

       sind(theta4) cosd(theta4)    0   a4*sind(theta4);

       0            0               1   0;

       0            0               0     1];

T = T1*T2*T3*T4;

px=T(1,4);

py=T(2,4);

pz=T(3,4);

set(handles.edit6,'string',num2str(px));

set(handles.edit7,'string',num2str(py));

set(handles.edit8,'string',num2str(pz));

 

逆运动部分:

 


function INVERSE_Callback(hObject, eventdata, handles)

ModelName = 'complete_arm';

global var;

px=get(handles.slider5,'value');

set(handles.edit9,'string',num2str(px));

py=get(handles.slider6,'value');

set(handles.edit10,'string',num2str(py));

pz=get(handles.slider7,'value');

set(handles.edit11,'string',num2str(pz));

set(handles.edit6,'string',num2str(px));

set(handles.edit7,'string',num2str(py));

set(handles.edit8,'string',num2str(pz));

a1 = 486;

a2 = 0;

a3 = 104;

a4 = 94;

a5=119;

%%rignal

theta1=atan2d(py,px);

theta234= 0; 

d=sqrt(px^2+py^2);%DB = OA

xd=d*cosd(theta1);

yd=d*sind(theta1);

r4=d-a4*cosd(theta234);

z4=pz-a4*sind(theta234);%

s=sqrt((z4-a1)^2+r4^2);

theta3=acosd((s^2-a2^2-a3^2)/(2*a2*a3));

beta=atan2d(a3*sind(theta3),a2+a3*cosd(theta3));

alpha=atan2d(z4-a1,r4);

theta2=alpha+beta;

theta4=theta234-theta2-theta3; 

guidata(hObject,handles);

set_param([ModelName '/Slider Gain1'],'Gain',num2str(theta1));

set_param([ModelName '/Slider Gain2'],'Gain',num2str(theta2));

set_param([ModelName '/Slider Gain3'],'Gain',num2str(theta3));

set_param([ModelName '/Slider Gain4'],'Gain',num2str(theta4));

set(handles.edit2,'string',num2str(theta1));

set(handles.edit3,'string',num2str(theta2));

set(handles.edit4,'string',num2str(theta3));

set(handles.edit5,'string',num2str(theta4));

 

4、演示效果:

MATLAB下机器人可视化与控制---simulink篇(3)

 

后记:

由于机器人模型是从OnShape上下载的,没有得到机器人的DH参数,所以机器人的正逆运动计算结果是不正确的。建议用DH可知的机器人模型来做这个部分。

 

GUI与Simulink之间的链接通过Slider Gain实现。参看代码中的部分。

 

另外关于GUI与Simulink之间的通讯可以参看:

http://www.ilovematlab.cn/thread-434153-1-1.html

http://blog.sina.com.cn/s/blog_14ecd62080102wu6a.html

http://blog.sina.com.cn/s/blog_14ecd62080102wu5a.html

 

关键文件下载地址:https://download.csdn.net/download/weixin_39090239/10782447


开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明MATLAB下机器人可视化与控制—simulink篇(3)
喜欢 (0)

您必须 登录 才能发表评论!

加载中……