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) .

Tetta, . initialPose_left.
. , .
, .
. :
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,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 .

, 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]) 
. . , - . , . . «Programming by demonstration», . Matlab , – .