Steuerung von Multi-Link-Manipulatoren eines Roboterkomplexes über ein neuronales Netzwerk

Einführung

Bei der Simulation von Bewegungssteuerungssystemen für Roboter müssen die Probleme der Kinematik und Dynamik für ihre Aktuatoren gelöst werden. Es gibt ein inverses und direktes Problem der Kinematik. Das direkte Problem der Kinematik besteht darin, die räumliche Position und Ausrichtung des charakteristischen Punktes des Arbeitswerkzeugs des Robotermanipulators in der Regel anhand der bekannten Werte der verallgemeinerten Koordinaten zu bestimmen. Das inverse Problem der Kinematik ist wie das direkte Problem eines der Hauptprobleme der kinematischen Analyse und Synthese. Um die Position der Glieder und die Ausrichtung des Arbeitswerkzeugs des Manipulators zu steuern, muss das inverse Problem der Kinematik gelöst werden.

Die meisten analytischen Ansätze zur Lösung des Problems der inversen Kinematik sind im Hinblick auf Rechenverfahren ziemlich teuer. Einer der alternativen Ansätze ist die Verwendung neuronaler Netze. Eingabedaten. Stellen Sie sich einen Drei-Link-Manipulator mit den in Tabelle 1 gezeigten Parametern vor.

EIN

Alfa

D.

Tetta

0

pi / 2

0,2

0

0,4

0

0

0

0,4

0

0

0

Tabelle 1 - DH-Parameter für einen Drei-Link-Manipulator

In der MatLab-Umgebung wird mithilfe der kostenlosen Robotics Toolbox ein Computermodell eines Drei-Link-Manipulators erstellt. Unten finden Sie ein Fragment des MatLab-Skripts, in dem wir dem 'L'-Array die Werte der Parameter A, Alfa und D aus Tabelle 1 zuweisen. Bei unserem Modell handelt es sich um konstante Werte, die sich während der Arbeit mit dem Manipulator nicht ändern. Wir weisen den Tetta-Parameter der Variablen 'initialPose_left' zu - der Anfangsposition unseres Manipulators. 

function [L,initialPose_left,baseL] =model3z 
%   
initialPose_left = deg2rad([0 0 0]); 
L(1) = Revolute('d', 0.2, 'alpha', pi/2, 'qlim', initialPose_left(1)+deg2rad([-90 +90]) ); 
L(2) = Revolute('d', 0, 'alpha', 0, 'a', 0.4, 'qlim', initialPose_left(2)+deg2rad([-20 +90]));   
L(3) = Revolute('d', 0, 'alpha', 0, 'a', 0.4, 'qlim', initialPose_left(2)+deg2rad([-90 +90])); 
% -178 +178 
baseL = [1 0 0 0;  
        0 1 0 0;  
        0 0 1 0;  
        0 0 0 1]; 

1 (. 1) . 

Abbildung 1 - Grafische Anzeige der ausgewählten Ausgangsposition des Drei-Link-Manipulators
1-

 Tetta, .  initialPose_left. 

. , . 

, .  

  . :

Y_i = [q_1, q_2, q_3 ... q_n],

q – . 

%       
t1_min = L(1).qlim(1); t1_max = L(1).qlim(2);  
t2_min = L(2).qlim(1); t2_max = L(2).qlim(2); 
t3_min = L(3).qlim(1); t3_max = L(3).qlim(2); 
%     
t1 = t1_min + (t1_max-t1_min)*rand(N,1); 
t2 = t2_min + (t2_max-t2_min)*rand(N,1); 
t3 = t3_min + (t3_max-t3_min)*rand(N,1); 
Y = horzcat(t1, t2, t3);

, .  : 

X_i = [x, y, z, R], R = [φ, θ, γ]

:  x,y,z – . R – , . 

%    4x4 
T = zeros(4, 4, N); 
T(:, :, :) = leftArm.fkine(Y); %  ,       
%R = tr2rpy(T(1:3, 1:3, :), 'arm'); %      
R = tr2eul(T(1:3, 1:3, :)); %      
Tx = reshape(T(1, 4, :), [N 1]); %  - 
Ty = reshape(T(2, 4, :), [N 1]); 
Tz = reshape(T(3, 4, :), [N 1]); 
% scatter3(Tx,Ty,Tz,'.','r'); 
X = horzcat(Tx, Ty, Tz, R); %   

. 3.2.1  , 3000 . 

Abbildung 2 - Die Anfangsposition des Drei-Link-Manipulators. Die Punkte geben die Endposition des Manipulators an
2 - ,

, 3000 . , X Y. 

, .

Keras Python. .

X_train, X_test, y_train, y_test = train_test_split(data_x, data_y, test_size=0.2,
random_state=42) 

« » . .

def base_model():
 model = Sequential()
 model.add(Dense(32,input_dim=6,activation='relu'))
 model.add(Dense(64,activation='relu'))
 model.add(Dense(128,activation='relu'))
 model.add(Dense(32,activation='relu'))
 model.add(Dense(3, init='normal'))
 model.compile(loss='mean_absolute_error', optimizer = 'adam', metrics=['accuracy'])
 model.summary()
 return model

, . . , , . , , .       KerasRegressor,  Keras.

clf = KerasRegressor(build_fn=base_model, epochs=500, batch_size=20,verbose=2)
clf.fit(X_train,y_train) 

.

res = clf.predict(X_test) 

99% , . 

3 , , , . . , . . - . , , , , .

%%    ,    
M=[-178:10:178]; %      -178   +178    10 
M_size=length(M); 
first_q=zeros(M_size, 3); 
T33 = zeros(4, 4, M_size); 
T34 = zeros(4, 4, M_size); 
first_q(:,1)=[deg2rad(M)]; %  q 
T33(:, :, :) = leftArm.fkine(first_q);%      ,   
R = tr2rpy(T33(1:3, 1:3, :), 'arm'); %      
Tx = reshape(T33(1, 4, :), [M_size 1]); %  - 
Ty = reshape(T33(2, 4, :), [M_size 1]); 
Tz = reshape(T33(3, 4, :), [M_size 1]); 
plot3(Tx,Ty,Tz) 
axis([-1 1 -1 1 -1 1]);hold on;grid on; 

XX = horzcat(Tx, Ty, Tz, R); %        
T34(:, :, :) = leftArm.fkine(q_new); %     ,   
Tx2 = reshape(T34(1, 4, :), [M_size 1]); %  - 
Ty2 = reshape(T34(2, 4, :), [M_size 1]); 
Tz2 = reshape(T34(3, 4, :), [M_size 1]); 
plot3(Tx2,Ty2,Tz2,'.') 
axis([-1 1 -1 1 -1 1]) 
Abbildung 3 - Prognoseergebnis
3 –

. . , - . , . . «Programming by demonstration», . Matlab , – .




All Articles