1. 程式人生 > >MATLAB控制IRB120機器人的方式--Socket(自我學習記)

MATLAB控制IRB120機器人的方式--Socket(自我學習記)

1、前記:這篇來自一西班牙某大學的一篇論文,因為涉及有Sokect所以花時間整理了下,但是水平有限,原本打算復現論文做的東西,也沒有完成!!!論文名字“Desarrollo de una interfaz para el control del robot IRB120 desde Matlab”。

該專案的目標是與機器人手臂IRB120進行通訊,通過Matlab的數學軟體工具。為此,我們將開發一個通訊套接字,負責傳送和處理資料。 驗證通訊是否正常以及傳送是否正常資料正確完成後,它們將在Matlab中實現一系列介面與機器人的通訊和最終的應用程式,如下結構。

          

第一個是通過GUIDE工具製作的圖形介面。

第二個介面的設計將通過在Matlab中建立類來實現稍後我們將用它來開發最終的應用程式。

第三個介面在溝通方面,我們將使用Simulink工具。

2、使用工具MATLAB+Robotstudio。

     Robotstudio端:必要工具---PC-interface

MODULE TCPIPConnectionHandler
VAR socketdev socketServer;
VAR socketdev socketClient;
VAR bool connectionStatus := FALSE;
LOCAL VAR string ipAddress := "127.0.0.1";
LOCAL VAR num portNumber := 1024;
LOCAL VAR string receivedString;
PROC EstablishConnection()
SocketCreate socketServer;
SocketBind socketServer, ipAddress, portNumber;
SocketListen socketServer;
SocketAccept socketServer,socketClient,\ClientAddress:=ipAddress,\Time:=WAIT_MAX;
connectionStatus := TRUE;
ENDPROC
PROC DataProcessing()
SocketSend client_socket \Str := "Connection successfully established!";
WHILE connectionStatus DO
SocketReceive client_socket \Str := receivedString;
processData receivedString;
ENDWHILE
ERROR
IF ERRNO=ERR_SOCK_CLOSED THEN
RETURN;
ENDIF
ENDPROC

傳送關節資料包的結構圖:

ID:識別符號--預設為1;S:狀態------0或1;J:關節標號---絕對值,0-255,單位‘度’。

TCP資訊資料包結構:TCP參考的系統方向,由尤拉角獲得。

ID:預設為2; S:同上;  RX/Y/Z:尤拉旋轉絕對值0-255.

TCP定位資料包結構:該資料包含TCP定位過程的資料。它允許執行線性型別或關節型別的運動。

ID:預設為3;S:同上; X/Y/Z---XR/YR/ZR:位置的絕對值,0-255---0-99;M:運動型別--0為關節,1為線性。

TCP的姿態和位置資料包結構:2和3的結合。

ID:預設為4,其他同上。X real = 100 · X frame  + XR, XR - the rest of value ( >100)

TCP速度資料包的結構,工具和限制。

ID:5;   T:工具,0或1,1標記為有工具; Vt Vtr:TCP速度---0-1999mm/s,V TCP = 100·V T + V TR;

    X l  / Zl    XlR   ZlR:limit。。。

MATLAB端:必要工具---Instrument Control Toolbox

關鍵程式碼:建立--- obj = tcpip('rhost'); obj = tcpip('rhost',rport) ;obj = tcpip('localhost', 30000, 'NetworkRole', 'client');

                  開啟與資料收發---- fopen(obj); fclose(obj);fwrite (obj,A,'precision','mode'); A = fread (obj,size,'precision');

3、圖形介面(GUI)的開發:控制元件佈局略,以圖站位!

         

控制關鍵程式碼:

IP + Port:

function pushbutton1_Callback(hObject, eventdata, handles)
%Definición de variables globales utilizadas para este control.
72
global t
global IP
global Port
% Establecemos la conexión mediante el protocolo TCP/IP utilizando las funciones de
la toolbox de Matlab correspondiente.
t=tcpip(IP, Port); fopen(t);
msgbox('La Conexión se ha establecido'); % Abrimos un cuadro de diálogo al haberse
establecido de forma correcta la conexión
guidata(hObject, handles); %Salvar datos de la aplicación

滑塊----關節Ji  /1--6:以下為關節1,其他同。

function slider1_Callback(hObject, eventdata, handles)
%Definición de variables globales utilizadas para este control.
global J1
global sj1
% cogemos el valor del slider y nos quedamos con su valor absoluto y su signo para
asignárselo a las variables J y sj
ang =get(hObject,'Value');
signo = sign(ang);
J1 = uint8(round(abs(ang)));
if signo == -1
sj1 = 0;
else
sj1=1;
end
angulo =round(ang);
% actualizamos el valor del static text correspondiente a este Joint Value
set(handles.text2,'String',angulo);
guidata(hObject, handles); %Salvar datos de la aplicación

按鈕Enviar Joint Values,傳送關節值。

function pushbutton2_Callback(hObject, eventdata, handles)
%Definición de variables globales utilizadas para este control.
global J1
global J2
global J3
global J4
global J5
global J6
global t
global sj1
global sj2
global sj3
global sj4
global sj5
global sj6
% Construimos el datagrama
D1=uint8([1 sj1 J1 sj2 J2 sj3 J3 sj4 J4 sj5 J5 sj6 J6]);
%Enviamos el datagrama realizando una pausa de dos segundos, para dar tiempo al
robot a realizar la instrucción ordenada.
fwrite(t, D1);
pause(2);
guidata(hObject, handles); %Salvar datos de la aplicación

Reset Joint Values按鈕:位置重置

function pushbutton3_Callback(hObject, eventdata, handles)
%Definición de variables globales utilizadas para este control.
global J1
global J2
global J3
global J4
global J5
global J6
global sj1
global sj2
global sj3
global sj4
global sj5
global sj6
global t
% Enviamos el robot a la posición de Reposo

set(handles.slider1,'Value',0) ; set(handles.text2,'String',0);
set(handles.slider2,'Value',0); set(handles.text3,'String',0);
[…]
%Y así sucesivamente con los demás valores Joint del robot.
sj1=1; J1=0; sj2=1; J2=0; sj3=1; J3=0; sj4=1; J4=0; sj5=1; J5=0; sj6=1;J6=0;
% asignamos los varales de reset y enviamos el datagrama
D1=uint8([1 sj1 J1 sj2 J2 sj3 J3 sj4 J4 sj5 J5 sj6 J6]);
fwrite(t, D1);
pause(2);
guidata(hObject, handles); % Salvar datos de la aplicación

可編輯的文字框Z,Y,X:尤拉角,位姿。。?

function edit3_Callback(hObject, eventdata, handles)
%Definición de variables globales utilizadas para este control.
global sz
global Rz
% Obtenemos de los cuadros de texto las variables de Rotación para construir el
datagrama
vble = str2double(get(hObject,'String'));
signo = sign (vble);
if signo == -1
sz=0;
else
sz=1;
end
Rz= uint8(round(abs(vble))); % Obtenemos la variable de rotación Rz.
guidata(hObject, handles); %Salvar datos de la aplicación

可編輯的文字框X,Y,Z:位置單位,mm。

function edit6_Callback(hObject, eventdata, handles)
%Definición de variables globales utilizadas para este control.
global spx
global X
global xr
%Obtenemos las variables en este caso correspondientes a la coordenada x para construir el %datagrama
x=str2double(get(hObject,'String'));
xr=rem(x,100);
X=floor(x/100);
signo = sign (x);
if signo == -1
spx=0;
else
spx=1;
  y,z同
end
guidata(hObject, handles); %Salvar datos de la aplicación

傳送旋轉,傳送位置和傳送旋轉和位置對於這些控制元件,只需要解釋其中一個,因為其餘的都是類似。

對應於命令“傳送TCP旋轉”的控制程式碼是:

function pushbutton4_Callback(hObject, eventdata, handles)
%Definición de variables globales utilizadas para este control.
global sz
global sx
global sy
global Rz
global Rx
global Ry
global t
D2=uint8([2 sz Rz sy Ry sx Rx]); % Construimos el datagrama

fwrite(t, D2); %Enviamos datagrama realizando una pausa de 2 segundos entre medias
pause(2);
guidata(hObject, handles); %Salvar datos de la aplicación

TCP Velocity:此控制元件是一個“彈出”選單,也就是我們可以使用的下拉列表選擇末端執行器的速度。

function popupmenu2_Callback(hObject, eventdata, handles)
%definimos las variables globales utilizadas en este control.
global t;
global Vt;
global Vtr;
global Vr;
global Vrr;
sxl=1; xl=0; xlr=0; szl=1; zl=0; zlr=0;
vel= get(hObject,'Value'); % Ajustamos valores de velocidad a partir del control del
popup menu
Vtr=rem(vel,100);
Vt=floor(vel/100);
Vrr=rem(vel,100);
Vr=floor(vel/100);
D5=uint8([5 1 Vt Vtr Vr Vrr sxl xl xlr szl zl zlr]);
% construimos y enviamos en datagrama.
fwrite(t,D5);
pause(2);
guidata(hObject, handles); %Salvar datos de la aplicación

測試效果:

4、在Matlab中建立類--Mathworks官網查詢例項。

MATLAB語言允許您使用以下兩種技術建立程式:程式性程式和麵向物件的程式設計因此使用程式中的常用物件和函式建立任何應用程式。類描述了一組具有共同特徵的物件。該物件是類的特定例項。包含在中的值物件的屬性是使物件與其他物件不同的屬性同一類。

建立類的例子:

%建立TensileData類,並在屬性中放置特徵,要評估的材料的必要性
classdef TensileData
properties
Material = '';
SampleNumber = 0;
Stress
Strain
Modulus = 0;
end

%我們建立一個示例並分配資料。
td = TensileData;
td.Material = 'Carbon Steel';
td.SampleNumber = 001;
td.Stress = [2e4 4e4 6e4 8e4];
td.Strain = [.12 .20 .31 .40];
td.Modulus = mean(td.Stress./td.Strain);

%新增方法。定義的功能是確保使用者正確輸入材料。
methods
function obj = set.Material(obj,material)
if ~(strcmpi(material,'aluminum') ||...
strcmpi(material,'stainless steel') ||...
strcmpi(material,'carbon steel'))
error('Material must be aluminum, stainless steel, or carbon steel')
end

%為了簡化類的建立,建立了一個建構函式。
function td = TensileData(material,samplenum,stress,strain)
if nargin > 0 % Support calling with 0 arguments
td.Material = material;
td.SampleNumber = samplenum;
td.Stress = stress;
td.Strain = strain;
end
end % TensileData

%此建構函式將按以下方式使用:
>> td = TensileData('carbon steel',1,[2e4 4e4 6e4 8e4],[.12 .20 .31 .40]);





演示:

5、Simulink方式:

為了實現這個介面,我們將使用Matlab工具,Simulink和初始化檔案.m。因此,該介面由兩個主要檔案組成:.m檔案初始化和建立的Simulink塊所在的.mdl檔案。首先,定義了一系列將在以後和之後使用的全域性變數Simulink的檔案我們找到了我們建立的用於連線的塊機器人併發送我們認為方便的資料。我們還必須提到在初始化檔案中,進行了開啟與伺服器通訊。通Simulink,我們處理併發送資訊。在下圖中,我們觀察了建立的Simulink檔案的內容。它由兩個元素:第一個是常量向量,我們將在其中介紹我們想要傳送給機器人的關節角度的值,在第二個我們找到的值建立了irb120塊。irb120塊可用於任何其他Simulink框圖。此介面設計為僅執行關節配置的交付機器人。

 mask下子系統

取樣時間:引數Ts(Time Step)進行模擬

演示:

6、應用開發

該應用的主要目的是讓我們的機器人手臂根據使用者的要求進行噴漆,在數字面板上建立從0到9的數字,使用兩個開發的通訊介面:通過介面在Matlab中建立類,通過塊“Simulink的irb120”建立介面。在應用開發中,我們將在RobotStudio中進行不同的模擬對真實機器人進行測試,專門為此安裝了Robotics Toolbox。我們已經知道,建模和模擬的機器人是IRB120的模型ABB。通過這個應用程式,我們可以深化建模的概念如;工業機器人的運動學和動力學,軌跡生成和控制。

建模DH引數:

程式碼:

%%
l1=290;l2=270;l3=-70;l4=302;l5=72;
%%
L(1)=Link([0 l1 0 -pi/2]);
L(2)=Link([-pi/2 0 l2 0]);
L(3)=Link([0 0 l3 -pi/2]);
L(4)=Link([0 l4 0 pi/2]);
L(5)=Link([0 0 0 -pi/2]);
L(6)=Link([pi l5 0 0]);
irb1201=SerialLink(L,'name','IRB120');
irb1201.plot([0 0 0 0 0 0]);

具有塊“irb120”的差分控制的Simulink模型: