Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- %%%-------------------------------------------------------------------------------------------------
- %%% Ansteuerung eines UR3 Roboters mit Matlab Robotics Toolbox
- %%% Erstellt von Studenten der HSHL
- %%%-------------------------------------------------------------------------------------------------
- %% Initialisierung von Matlab
- startup_rvc
- %close all
- clear all %#ok<*CLALL>
- clc
- %#ok<*NUSED> %Matlabfehler unterdrücken bei ungenutzter globaler Variable
- %#ok<*SEPEX> %Matlabfehler unterdrücken bei Code in einer Zeile, zB. kurze "If"
- %#ok<*UNRCH> %Matlabfehler unterdrücken bei nicht erreichbarem Code, Ur3_connected=false
- %#ok<*NOPRT> %Matlabfehler unterdrücken bei Ausgabe in Console
- %#ok<*DEFNU> %Matlabfehler unterdrücken bei unbenutzten Funktionen
- %#ok<*NASGU> %Matlabfehler unterdrücken bei globalen Variablen
- %% Globale Variablen
- %Einstellparameter
- global UR3_connected; UR3_connected=true; %true nur mit angeschlossenem UR3, UR3 führt Bewegungen aus!
- global UR3_plot; UR3_plot=true; %true für Erstellen einer Simulation der Bewegung
- global pausetimeOnMovement; pausetimeOnMovement=false;
- global StopOnCalibrationPosition; StopOnCalibrationPosition=false; %Roboter fährt nur zur Ausgangspostition und hält an.
- global SicherheitsabstandUeberEndposition; SicherheitsabstandUeberEndposition=0.1; %Wert in m!
- global brickUpperLeft; brickUpperLeft = [313.32; -43.17; -145.69; -80.14; 59.98; 356.99]; %Linke obere Ecke der Platte. Die Ecke, die am nächsten am Roboterfuß ist.
- global brickLowerRight; brickLowerRight = [285.95; -128.22; -73.51; -52.57; 63.79; 326.26]; %Rechte untere Ecke
- global magazinePosition; magazinePosition = [273.42; -89.74; -124.73; -33.60; 68.79; 311.05];
- global normaleGeschwindigkeitVar; normaleGeschwindigkeitVar = 0.3; %Faktor 0-1
- global langsameGeschwindigkeitVar; langsameGeschwindigkeitVar = 0.01; %Faktor 0-1
- global ParameterGeschwindigkeitMax_mm; ParameterGeschwindigkeitMax_mm = 1;
- global ParameterGeschwindigkeitMax_mm_accel; ParameterGeschwindigkeitMax_mm_accel = 1;
- %Programmparameter
- global accel_radss; %Beschleunigung in Radiant/s²
- global accel_m; %Beschleunigung in mm/s²
- global vel_m; %Geschwindigkeit in mm/s
- global vel_rads; %Geschwindigkeit in Radiant/s
- global q_alt; %Gelenkwinkel der aktuellen Position
- global q_neu; %Gelenkwinkel neu der anzufahrenden Position
- global T_alt; %Transformationsmatrix der aktuellen Position
- global T_neu; %Transformationsmatrix der anzufahrenden Position
- %-------------------------------------------------------------------------------------------------------------------
- %-------------------------------------------------------------------------------------------------------------------
- %-------------------------------------------------------------------------------------------------------------------
- %% Ausführen der Bewegungen/Aufruf der Funktionen
- connectRobot();
- normaleGeschwindigkeit();
- ResetUR3_startPositionUp();
- %startPositionWithTurn(); % Alternativ startPositionNoTurn() für andere Ausrichtung des LEGO-Stein Magazins
- Startposition_MoveJ();
- if(StopOnCalibrationPosition) return; end
- langsameGeschwindigkeit();
- moveTo_XYZ(0,-0.3,0.3);
- moveTo_XYZ(-0.3,-0.3,0.3);
- testPlateCoordinate();
- % testPlace();
- %
- % testNewPosition();
- % %testArbeitsposition();
- %
- % langsameGeschwindigkeit();
- % %testBrickMagazine();
- % testTranslatory3();
- %-------------------------------------------------------------------------------------------------------------------
- %-------------------------------------------------------------------------------------------------------------------
- %-------------------------------------------------------------------------------------------------------------------
- %% Neue Bewegung nach q_neu/T_neu ausführen
- function runQ(time,movement)
- %time ist die Zeit der auszuführenden Bewegung in Sekunden
- %movement ist "L"inear oder "J"unction
- getMissingTQ(movement); % Fehlende Werte T oder q bestimmen
- plotSimulation(time,movement); % Bewegung Simulieren
- moveRobotToQ(time,movement); % Roboter Bewegen
- saveToAlt(); % Aktuelle Position als "alt" speichern
- end
- function getMissingTQ(movement) % Bestimmung fehlender Werte T_neu oder q_neu
- global q_neu; global q_alt; global T_neu; global T_alt;
- mdl_ur3;
- %if(movement=="J") % T_neu wird bei "J" nicht berechnet, aber für anschließende Bewegungen benötigt
- if(q_neu ~= q_alt) % Änderung, da auch mit T "J" gefahren werden darf
- T_neu = ur3.fkine(q_neu);
- %elseif(movement=="L") % q_neu wird nicht erzeugt, nur T mit Koordinaten vorgegeben
- elseif(T_neu ~= T_alt)
- q_neu = ur3.ikine(T_neu,'q0',q_alt);
- end
- end
- function plotSimulation(time,movement) % Bewegung Simulieren
- global q_alt; global q_neu; global T_alt; global T_neu; global UR3_plot;
- if (UR3_plot==false) return; end
- mdl_ur3;
- t = time*20;
- %t = [0:.05:time];
- if(movement=="L")
- T_bewegungMitZwischenpunkten = ctraj(T_alt, T_neu, t); % Bewegungsschritte linear berechnen als T
- q_bewegung = ur3.ikine(T_bewegungMitZwischenpunkten,'q0',q_alt); % Bewegung in Gelenkwinkel umrechnen
- elseif(movement=="J")
- q_bewegung = jtraj(q_alt, q_neu, t); % Bewegung der Achsen ermitteln
- end
- figure(1); % Plot öffnen
- ur3.plot(q_bewegung); % Anzeigen der Bewegung
- end
- function moveRobotToQ(time,movement) % Roboter Bewegen
- global pausetimeOnMovement; global q_neu; global accel_m; global vel_m; global accel_radss; global vel_rads; global Socket_conn; global UR3_connected;
- if(UR3_connected == false) return; end %Roboter nur verfahren, wenn angeschlossen
- if(movement=="L")
- Befehl = command2stringMoveL(q_neu,accel_m,vel_m,0,0);
- elseif(movement=="J")
- Befehl = command2string(q_neu,accel_radss,vel_rads,0,0);
- end
- fprintf(1, 'Verfahre den UR3.\n');
- fprintf(Socket_conn, Befehl);
- %-----
- % RobotSteady=false;
- % Befehl='is_steady()';
- % while RobotSteady==false
- % RobotSteady=fprintf(Socket_conn, Befehl);
- % if(RobotSteady==false) pause(0.2); end
- % end
- %-----
- if(pausetimeOnMovement)
- pausetime = time / (rad2deg(vel_rads)/130) ; %Wartezeit für Matlab, damit Roboter Bewegung beenden kann.
- pause(pausetime);
- end
- end
- function saveToAlt() % Aktuelle Position als "alt" speichern
- % Nach abgeschlossenem Befehl ist die Position "alt" und die neue Bewegung kann die Variablen überschreiben
- global q_alt; global q_neu; global T_alt; global T_neu;
- q_alt = q_neu;
- T_alt = T_neu;
- end
- %% Roboter konfigurieren
- function normaleGeschwindigkeit() % Geschwindigkeit für Roboter einstellen
- global ParameterGeschwindigkeitMax_mm_accel; global ParameterGeschwindigkeitMax_mm; global normaleGeschwindigkeitVar; global vel_rads; global accel_m; global vel_m; global accel_radss;
- if (normaleGeschwindigkeitVar <= 1 && normaleGeschwindigkeitVar > 0)
- vel_deg = normaleGeschwindigkeitVar*130;
- accel_radss = 3;
- vel_rads = deg2rad(vel_deg);
- accel_m = ParameterGeschwindigkeitMax_mm_accel*normaleGeschwindigkeitVar; %10*normaleGeschwindigkeitVar;
- vel_m = ParameterGeschwindigkeitMax_mm*normaleGeschwindigkeitVar;
- fprintf('Geschwindigkeit auf %d Prozent eingestellt.\n', (normaleGeschwindigkeitVar*100))
- else
- error('Normale Geschwindigkeit falsch eingestellt. Faktor zwischen 0 und 1 erwartet.');
- pause(2);
- return;
- end
- end
- function langsameGeschwindigkeit() % Geschwindigkeit für Roboter einstellen
- global ParameterGeschwindigkeitMax_mm_accel; global ParameterGeschwindigkeitMax_mm; global langsameGeschwindigkeitVar; global vel_rads; global accel_m; global vel_m; global accel_radss;
- if (langsameGeschwindigkeitVar <= 1 && langsameGeschwindigkeitVar > 0)
- vel_deg = langsameGeschwindigkeitVar*130;
- accel_radss = 3;
- vel_rads = deg2rad(vel_deg);
- accel_m = ParameterGeschwindigkeitMax_mm_accel*langsameGeschwindigkeitVar; %10*langsameGeschwindigkeitVar;
- vel_m = ParameterGeschwindigkeitMax_mm*langsameGeschwindigkeitVar;
- fprintf('Geschwindigkeit auf %d Prozent reduziert.\n', (langsameGeschwindigkeitVar*100))
- else
- error('Langsame Geschwindigkeit falsch eingestellt. Faktor zwischen 0 und 1 erwartet.');
- pause(2);
- return;
- end
- end
- function connectRobot() % Verbindung herstellen
- global Socket_conn; global UR3_connected;
- if(UR3_connected == false) return; end
- mdl_ur3;
- Robot_IP = '192.168.56.101';
- Port_NR = 30003;
- Socket_conn = tcpip(Robot_IP,Port_NR);
- fclose(Socket_conn); % ggf. bestehende Verbindung schließen
- pause(2);
- fprintf(1, 'Verbindungsaufbau mit UR3...\n');
- try
- fopen(Socket_conn);
- catch
- error('Connection to UR3 not possible');
- pause(2);
- return;
- end
- fprintf(1, 'Verbindung mit UR3 hergestellt.\n');
- pause(2);
- end
- function ResetUR3_startPositionUp() % Roboter in gerade Startposition fahren
- global UR3_connected; global accel_radss; global vel_rads; global Socket_conn; global T_alt; global T_neu; global q_alt; global q_neu;
- mdl_ur3;
- fprintf('Fahre in verikale Ausgangsposition.\n');
- %Startposition des Roboters
- q_start = [0,-pi/2,0,-pi/2,-pi/2,0];
- q_neu = q_start;
- q_alt = q_start;
- T_alt = ur3.fkine(q_start);
- T_neu = ur3.fkine(q_start);
- runQ(4,"J");
- %Startposition anfahren
- % if(UR3_connected)
- % Befehl = command2string(q_neu,accel_radss,vel_rads,0,0);
- % fprintf(Socket_conn, Befehl);
- % %Warten auf das Erreichen der Startposition
- % pausetime = 4 / (rad2deg(vel_rads)/130) ;
- % pause(pausetime);
- % end
- end
- function startPositionNoTurn() % Startposition ohne gedrehtem Greifer (LEGO-Stein horizontal)
- global q_neu; global q_alt;
- fprintf('Fahre in Startposition.\n');
- q1 = deg2rad(45);
- q2 = deg2rad(-90);
- q3 = deg2rad(90);
- q4 = deg2rad(-90);
- q5 = deg2rad(-120);
- q6 = deg2rad(0);
- q_alt = q_neu;
- q_neu = [q1, q2, q3, q4, q5, q6];
- runQ(2,"J")
- end
- function startPositionWithTurn() % Startpsoition mit gedrehtem Greifer (LEGO-Stein vertikal)
- global q_alt; global q_neu;
- fprintf('Fahre in Startposition.\n');
- q1 = deg2rad(135);
- q2 = deg2rad(-90);
- q3 = deg2rad(90);
- q4 = deg2rad(-90);
- q5 = deg2rad(-120);
- q6 = deg2rad(0);
- q_alt = q_neu;
- q_neu = [q1, q2, q3, q4, q5, q6];
- runQ(2,"J");
- % plotMovementPoint();
- % moveJToQ(2);
- end
- function Startposition_MoveJ() % Startpsoition mit gedrehtem Greifer (LEGO-Stein vertikal)
- global q_alt; global q_neu;
- fprintf('Fahre in Startposition.\n');
- q1 = deg2rad(276.19);
- q2 = deg2rad(-71.00);
- q3 = deg2rad(-90.53);
- q4 = deg2rad(-87.66);
- q5 = deg2rad(67.69);
- q6 = deg2rad(313.83);
- q_alt = q_neu;
- q_neu = [q1, q2, q3, q4, q5, q6];
- runQ(2,"J");
- % plotMovementPoint();
- % moveJToQ(2);
- end
- %% Neue Position Roboter - Test
- function testNewPosition() %Über Winkel
- global q_alt; global q_neu;
- q1 = deg2rad(268.65);
- q2 = deg2rad(-82.00);
- q3 = deg2rad(-121.34);
- q4 = deg2rad(-43.18);
- q5 = deg2rad(70.50);
- q6 = deg2rad(306.34);
- q_alt = q_neu;
- q_neu = [q1, q2, q3, q4, q5, q6];
- runQ(4,"J");
- % plotMovementPoint();
- % moveJToQ(4);
- end
- function testArbeitsposition() %Über T
- global q_alt; global q_neu; global T_alt; global T_neu;
- mdl_ur3;
- %Neue Position vorgeben
- T_neu = SE3([ -0.5740 -0.7438 -0.3426 -0.146;
- -0.6467 0.6684 -0.3676 -0.2676;
- 0.5024 0.0105 -0.8646 0.2719;
- 0 0 0 1]);
- %Bewegung erzeugen
- q_neu = ur3.ikine(T_neu,'q0',q_alt);
- runQ(2,"J");
- end
- function testBrickMagazine() %Über Winkel
- global magazinePosition;
- mdl_ur3;
- T_magazine = ur3_fkine(deg2rad(magazinePosition));
- plotMovement();
- moveJToQ(2);
- end
- function testTranslatory1() %Funktion fehlerhaft
- % pause(5);
- % Befehl = command2string(q,accel_radss,vel_rads,time_robot,blend_radius);
- % fprintf(1, 'Verfahre den UR3.\n');
- % fprintf(Socket_conn, Befehl);
- % test=loadrobot("UniversalUR3");
- % show(test);
- global q;
- mdl_ur3;
- T1 = transl(-0.146, -0.26787, 0.23509);
- T2 = transl(-0.14598, -0.26787, 0.49710);
- T = ctraj(T1, T2, 50);
- %X = cart2sph(x,y,z)
- %q = ur3.ikine6s(T); %Fehler: Wrist is not sperical
- %q = ur3.ikunc(T);
- %q = ur3.ikine3(T) %Fehler: Solution only applicable for standard DH conventions
- %q = ur3.ikine(T) %Fehler: Warning: failed to converge: try a different initial value of joint coordinates, 100 Versuche ohne Lösung
- q = ur3.ikcon(T)
- %figure(1); % Plot öffnen
- % q_alt = q_neu; % Alte Position speichern
- % q_neu = q; % Neue Position speichern
- % t = [0:.05:3]'; % Bewegung in kleinere Bewegungssprünge teilen
- % q_plot = jtraj(q_alt, q_neu, t); % generate joint coordinate trajectory
- % ur3.plot(q_plot);
- %ur3.plot(q);
- plotMovement();
- moveJToQ(2);
- % ur3.plot(q);
- end
- function testTranslatory2() %Funktioniert mit fest vorgegebener Bewegung Linear und invers
- global q;
- mdl_ur3;
- T1 = transl(-0.16057, -0.28109, 0.08207);
- T2 = transl(-0.16056, -0.28111, 0.27125);
- T = ctraj(T1, T2, 50);
- %h=hgtransform
- %q = ur3.ikcon(T);
- global q_alt;
- q_alt=q;
- %Aktuelle Position bestimmen
- Ta = ur3.fkine(q)
- %Tn = Ta + [0 0 0 0; 0 0 0 0; 0 0 0 0.2; 0 0 0 0]
- % Tn=[1 0 0 0.1;
- % 0 1 0 0.1;
- % 0 0 1 0.1;
- % 0 0 0 1]
- Tn=[-0.5740 -0.7438 -0.3426 -0.146;
- -0.6467 0.6684 -0.3676 -0.2676;
- 0.5024 0.0105 -0.8646 0.4719;
- 0 0 0 1]
- Ta = [-0.5740 -0.7438 -0.3426 -0.146;
- -0.6467 0.6684 -0.3676 -0.2676;
- 0.5024 0.0105 -0.8646 0.2719;
- 0 0 0 1]
- q_plot = ctraj(Ta, Tn, 20)
- q_pq = ur3.ikine(q_plot,'q0',q_alt)
- ur3.plot(q_pq);
- % Tadd=[0 0 0 0; 0 0 0 0; 0 0 0 0.2; 0 0 0 0]
- % Ttest= Ta + Tadd
- q = ur3.ikine(Tn,'q0',q_alt);
- % q = ur3.ikcon(Tn);
- % plotMovementPoint();
- moveLToQ(2);
- %_________
- q_alt=q;
- Ta = ur3.fkine(q)
- Tn=[-0.5740 -0.7438 -0.3426 -0.146;
- -0.6467 0.6684 -0.3676 -0.0676;
- 0.5024 0.0105 -0.8646 0.4719;
- 0 0 0 1]
- q = ur3.ikine(Tn,'q0',q_alt);
- plotMovementPoint();
- %____________
- q_plot = ctraj(Ta, Tn, 50);
- ur3.plot(q_plot);
- %plotMovement();
- % global q; global accel_radss; global vel_rads; global Socket_conn; global UR3_connected;
- % if(UR3_connected == false) return; end
- % Befehl = command2stringMoveL(q,accel_radss,vel_rads,0,0);
- % fprintf(1, 'Verfahre den UR3.\n');
- % fprintf(Socket_conn, Befehl);
- %
- % pausetime = time / (rad2deg(vel_rads)/130) ;
- % pause(pausetime);
- %
- moveJToQ(2);
- end
- function testTranslatory3() %Funktioniert, mehrere Positionen anfahren über T
- global q_alt; global q_neu; global T_alt; global T_neu;
- mdl_ur3;
- %Neue Position vorgeben - 20cm y
- T_neu = SE3([ -0.5740 -0.7438 -0.3426 -0.1460;
- -0.6467 0.6684 -0.3676 -0.2676;
- 0.5024 0.0105 -0.8646 0.4719;
- 0 0 0 1]);
- runQ(1,"L");
- %Neue Position vorgeben - zurück
- T_neu = SE3([ -0.5740 -0.7438 -0.3426 -0.1460;
- -0.6467 0.6684 -0.3676 -0.2676;
- 0.5024 0.0105 -0.8646 0.2719;
- 0 0 0 1]);
- runQ(1,"L");
- %Neue Position vorgeben - 30cm x
- T_neu = SE3([ -0.5740 -0.7438 -0.3426 0.2460;
- -0.6467 0.6684 -0.3676 -0.2676;
- 0.5024 0.0105 -0.8646 0.2719;
- 0 0 0 1]);
- runQ(1,"L");
- end
- function testPlateCoordinate()
- global brickUpperLeft; global brickLowerRight; global SicherheitsabstandUeberEndposition;
- mdl_ur3;
- % brickUpperLeft = [313.32; -43.17; -145.69; -80.14; 59.98; 356.99];
- % brickLowerRight = [285.95; -128.22; -73.51; -52.57; 63.79; 326.26];
- T_UpperLeft = ur3.fkine(deg2rad(brickUpperLeft))
- T_LowerRight = ur3.fkine(deg2rad(brickLowerRight))
- %Welche Ecke der Platte?
- % T_test = T_LowerRight + SE3([ 0 0 0 0;
- % 0 0 0 0;
- % 0 0 0 SicherheitsabstandUeberEndposition;
- % 0 0 0 0]);
- T_test = T_UpperLeft + SE3([ 0 0 0 0;
- 0 0 0 0;
- 0 0 0 SicherheitsabstandUeberEndposition;
- 0 0 0 0]);
- global T_neu;
- T_neu = SE3(T_test);
- runQ(2,"L");
- langsameGeschwindigkeit();
- %T_neu = SE3(T_LowerRight);
- T_neu = SE3(T_UpperLeft);
- runQ(0.5,"L");
- %%geht!
- end
- function testPlace()
- global T_neu; global q_alt; global q_neu;
- mdl_ur3;
- %aktuellepos -1cm x
- T_neu = SE3([ -0.5743 -0.7438 -0.3420 -0.1078;
- -0.6466 0.6683 -0.3677 -0.2438;
- 0.5020 0.0100 -0.8648 0.4093;
- 0 0 0 1]);
- runQ(2,"L");
- % %neuepos nur x
- % T_neu = SE3([ -0.5743 -0.7438 -0.3420 -0.08988;
- % -0.6466 0.6683 -0.3677 -0.2438;
- % 0.5020 0.0100 -0.8648 0.4093;
- % 0 0 0 1]);
- % runQ(2,"L");
- %
- % %neuepos nur xy
- % T_neu = SE3([ -0.5743 -0.7438 -0.3420 -0.08988;
- % -0.6466 0.6683 -0.3677 0.04943;
- % 0.5020 0.0100 -0.8648 0.4093;
- % 0 0 0 1]);
- % runQ(2,"L");
- %
- % %neuepos nur xyz
- % T_neu = SE3([ -0.5743 -0.7438 -0.3420 -0.08988;
- % -0.6466 0.6683 -0.3677 0.04943;
- % 0.5020 0.0100 -0.8648 0.5366;
- % 0 0 0 1]);
- % runQ(2,"L");
- %
- %
- %drehen
- T_neu = SE3([ -0.9698 -0.0829 0.2294 -0.1078 ;
- -0.2319 0.0216 -0.9725 -0.2438 ;
- 0.0756 -0.9963 -0.0402 0.4093 ;
- 0 0 0 1]);
- runQ(2,"J");
- %neuepos nur x
- T_neu = SE3([ -0.5743 -0.7438 -0.3420 -0.08988 ;
- -0.6466 0.6683 -0.3677 -0.2438 ;
- 0.5020 0.0100 -0.8648 0.4093 ;
- 0 0 0 1]);
- runQ(2,"L");
- %neuepos nur xy
- T_neu = SE3([ -0.5743 -0.7438 -0.3420 -0.08988;
- -0.6466 0.6683 -0.3677 0.04943;
- 0.5020 0.0100 -0.8648 0.4093;
- 0 0 0 1]);
- runQ(2,"L");
- %neuepos nur xyz
- T_neu = SE3([ -0.5743 -0.7438 -0.3420 -0.08988;
- -0.6466 0.6683 -0.3677 0.04943;
- 0.5020 0.0100 -0.8648 0.5366;
- 0 0 0 1]);
- runQ(2,"L");
- % T_neu = SE3([0.5333 0.0801 -0.8422 -0.09757;
- % 0.7673 0.3733 0.5214 0.1534;
- % 0.3562 -0.9242 0.1376 0.614;
- % 0 0 0 1]);
- %
- T_neu = SE3([-0.4125 -0.2152 0.8852 -0.08988;
- 0.6336 0.6304 0.4485 0.04943;
- -0.6546 0.7458 -0.1237 0.5366;
- 0 0 0 1]);
- runQ(5,"L");
- % T_neu = SE3([0.5333 0.0801 -0.8422 -0.09757;
- % 0.7673 0.3733 0.5214 0.1534;
- % 0.3562 -0.9242 0.1376 0.514;
- % 0 0 0 1]);
- %
- T_neu = SE3([-0.4125 -0.2152 0.8852 -0.08988;
- 0.6336 0.6304 0.4485 0.04943;
- -0.6546 0.7458 -0.1237 0.4366;
- 0 0 0 1]);
- langsameGeschwindigkeit();
- runQ(1,"L");
- end
- function moveTo_XYZ(x,y,z)
- global T_neu;
- mdl_ur3;
- %Startposition ist ca: x=0.11, y=-0.24, z=0.40
- T_standartorientierung = [ -0.5743 -0.7438 -0.3420 x ; %Ungedrehte Ausgangslage
- -0.6466 0.6683 -0.3677 y ;
- 0.5020 0.0100 -0.8648 z ;
- 0 0 0 1 ];
- T_neu = SE3(T_standartorientierung);
- runQ(1,"L");
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement