Ansteuerung des UR3 Roboters mit Matlab und URSim mittels Realtime Schnittstelle: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 102: Zeile 102:
== CAD-Konstruktion des Magazins ==
== CAD-Konstruktion des Magazins ==
Das Magazin wurde mit CAD konstruiert. Die Abmessungen beziehen sich auf die Rutsche, an der das Magazin montiert wurde.  
Das Magazin wurde mit CAD konstruiert. Die Abmessungen beziehen sich auf die Rutsche, an der das Magazin montiert wurde.  
[[Datei:Magazin.jpg|800px|thumb|left|CAD-Zeichnung des Magazins]]
<br clear=all>


== Einleitung ==
== Einleitung ==

Version vom 6. Januar 2021, 23:05 Uhr

→ zurück zur Seite Praktikum Produktionstechnik

Autor: Jan Pinter und Rina Mucaj
Betreuer: Prof. Dr. Mirek Göbel & Marc Ebmeyer

Einleitung

In diesem Artikel wird die Ansteuerung des UR3 Roboters mit Matlab und URSim mittels Realtime Schnittstelle beschrieben. Das Projekt fand im Rahmen des Praktikum Produktionstechnik im Wintersemester 20/21 statt. Die Aufgabe bestand darin, den UR3 Roboter so zu programmieren, dass er Legoteile aus einem Ablageort greift und diese auf eine Legoplatte platziert. Außerdem musste er durch wiederholsichere Bewegungen die Legoteile in verschiedenen Stellen platzieren. Zusätzlich wurde noch ein Magazin als Entnahmeort entwickelt, an dem der Roboter die Legosteine abnehmen kann.

Funktionaler und technischer Systementwurf

Mithilfe vom funktionalen (schwarz) und technischen Systementwurf (orange) konnten wir genau das Verhalten des Roboters darstellen. Der UR3 Roboter muss nach einer erfolgreichen Ethernet-Verbindung mit der Matlabsteuerung erstmal zu einer Startposition fahren. Durch Anfahren der Sicherheitspositionen und Einstellung der Geschwindigkeit nimmt er die Legoteile aus dem Magazin ab und platziert diese auf die Legoplatte.

Funktionaler und technischer Systementwurf


Ansteuerung des Roboters

Das Ansteuern des UR3 mit Matlab ist möglich, jedoch nicht einfach. Bereits nach 2 Stunden war es möglich, ohne Matlab mit der Programmierung des Polyscopes einen LEGO Stein wiederholt aufzunehmen und auf der Platte zu platzieren. Die Programmierung in Matlab erwies sich als schwierig, da viele Funktionen, die es im Polyscope gibt, nicht direkt in Matlab gibt. Die Verwendung der Robotic Toolbox von Peter Corke schafft zwar eine Lösungsmöglichkeit, jedoch muss man hier bereits genau wissen, wie die einzelnen Befehle anzuwenden sind, da es sonst zu Fehlern oder Abbrüchen des Programms kommt. Ebenso werden einige nützliche Polyscopebefehle nicht unterstützt. Abhilfe muss hier über andere Wege geschafft werden, wie über die Variablentabelle der Realtime TCP Verbindung. Sind alle Befehle bekannt und lassen sich alle Funktionen umsetzen, bietet die Programmierung über Matlab jedoch den Vorteil, weitere Funktionalitäten aus Matlab einzubeziehen, wie das Auslesen einer Excel Tabelle für die Steinkoordinaten. Eine Simulation der Bewegungen kann in Matlab auch erfolgen. Diese wäre jedoch auch ohne Matlab mit URSim möglich. Durch die Verwendung von Matlab erlernt man den Umgang mit Skripthandbüchern, die für die Anwendung von nicht selbst programmierten Befehlen nötig sind.

Herstellung der Verbindung und einfache Bewegungen mit Matlab

Um mit dem Roboter über eine Ethernet-Verbindung kommunizieren zu können, muss ein TCP Port geöffnet werden. Der Port für die Realtime Kommunikation zum Roboter ist 30003. Die IP des Roboters muss gegebenenfalls auf statisch festgelegt werden anstatt DHCP. Für das Erzeugen einer Bewegung gibt es im Skripthandbuch von UR bestimmte Befehle. So ist eine Bewegung aller Achsen des Roboters auf bestimmte Zielwinkel „q“ mit der Funktion „movej(q, a, v, t=0, r=0)“ möglich. Die zu übergebenden Variablen sind hier ebenfalls beschrieben, wobei in diesem Beispiel „a“ die Beschleunigung und „v“ die maximale Geschwindigkeit der Achsen sind. Dieser Befehl muss als String, also nicht als Variablen, an die Steuerung des Roboters übergeben werden. Dies kann in Matlab mit „num2str“ so umgesetzt werden:

function [commandString] = command2string(q,a,v,t,r)
    
    commandString = ['movej([' num2str(q(1)) ', ' num2str(q(2)) ', ' num2str(q(3)) ', ' num2str(q(4))...
                    ', ' num2str(q(5)) ', ' num2str(q(6)) '], ' num2str(a) ', ' num2str(v) ', ' num2str(t)...
                    ', ' num2str(r) ')'];

end

Anschließend muss dieser String über die Verbindung mit „fprintf“ gesendet werden.

Bewegungsarten

Unterschied Lineare und Joint Bewegung

Der Roboter kann die Zielposition entweder durch direkte Drehung der Achsen anfahren oder seine resultierende Bewegung vorher Berechnen und für den Greifer eine lineare, gradlinige Bewegung erzeugen. Mit der linearen Bewegung lässt sich besser die Bewegung des Roboters abschätzen, da er sich im Joint Modus auch bei kleinen Bewegungen um seine eigene Achse drehen kann. Damit es hierbei zu keinen unerwarteten Problemen, wie das Verfahren durch Hindernisse, bei einem Programmstart kommt, fahren wir den Roboter zunächst in eine Ausgangsposition, in welcher er senkrecht nach oben zeigt. Analog zu „movej“ gibt es hierzu den Befehl „movel“.

Zielangaben

Die Zielkoordinaten einer Bewegung können entweder als direkte Winkel der Achsen (q1, q2, q3, q4, q5, q6) oder als Transformationsmatrix T angegeben werden. Die Umrechnung erfolgt über ikine und fkine und erfordert ein aktives Robotermodell, das mit dem Befehl „mdl_ur3;“ aktiviert wird.

Ikine

Mit ikine lassen sich aus einer Transformationsmatrix T neue Zielwinkel q bestimmen. Hierzu werden jedoch noch Startwinkel für die Berechnung benötigt. Es empfiehlt sich, für den Startwinkel die aktuellen Winkel der Gelenke zu nutzen. Sollte die Berechnung mittels Matlab nicht funktionieren, müssen andere Startwinkel gewählt werden oder geprüft werden, ob das Ziel im erreichbaren Roboterbereich liegt.
Der Code für ikine sieht so aus:

q = ur3.ikine(T,'q0',q_Startwinkel);

Fkine

Mit fkine lässt sich aus einem q eine Transformationsmatrix T errechnen. Dies kann folgend umgesetzt werden:

T = ur3.fkine(q_neu);

Quellcode

Aufbau mit Funktionen für Übersicht

Der von unserer Gruppe generierte Matlab Code ist in Funktionen gegliedert, um eine übersichtliche Programmierung zu gewährleisten und einzelne Programmteile erneut verwenden zu können. Somit lässt sich übersichtlich eine Verbindung zum Roboter aufbauen, einige Sicherheitspositionen anfahren und gezielt bestimmte Koordinaten in wenigen Zeilen anfahren:

%% Ausführen der Bewegungen/Aufruf der Funktionen
connectRobot();
normaleGeschwindigkeit();
ResetUR3_startPositionUp();
%startPositionWithTurn();                
Startposition_MoveJ();
if(StopOnCalibrationPosition) return; end
langsameGeschwindigkeit();
moveTo_XYZ(0,-0.3,0.3);
moveTo_XYZ(-0.3,-0.3,0.3);
testPlateCoordinate();

Globale Variablen und Bedeutung

Für das Programm wurden mehrere Globale Variablen angelegt. Diese dienen dazu, das Programm zu konfigurieren und das Programmverhalten schnell ändern zu können. So kann man beispielsweise schnell die maximalen Geschwindigkeiten für eine schnelle oder langsame Fahrt anpassen, ohne tief in den Code einsteigen zu müssen.

runQ(time,movement)

Mit dem Befehl runQ wird der Bewegungsprozess nach der Berechnung des neuen Ziels eingeleitet. Hierzu muss das Ziel vorher als Transformationsmatrix „T_neu“ (ggf. muss die 4x4 Matrix mit SE3 umgewandelt werden) oder als Zielwinkel „q“ definiert werden. Bei Aufruf von „runQ“ muss nun noch eine zu erwartende Zeit als „time“ eingetragen werden, um dem Roboter Zeit zu lassen, die Bewegung vor einem neuen Befehl auszuführen. Die Zeit wird hierbei auf 100% Robotergeschwindigkeit angegeben und wird automatisch auf kleinere Geschwindigkeiten umgerechnet. Zudem muss definiert werden, ob es sich um eine joint oder eine lineare Bewegung handeln soll. Dies geschieht mit einem „L“ oder „J“ in der Variable „movement“.

moveToXYZ(x,y,z)

Ist eine Zielkoordinate kartesisch zum Roboterfuß bekannt, kann die Funktion „moveToXYZ“ genutzt werden. Diese Funktion fährt linear zur Zielkoordinate. Der Greifer wird hierbei jedoch nicht gedreht. Er bleibt hierbei immer „gerade“, wie er in der Transformationsmatrix in der Funktion definiert ist. Diese Matrix nutzt die vierte Spalte, um die Zielkoordinaten zu erreichen. Soll sich der Roboter anders gedreht bewegen, kann die Transformationsmatrix angepasst werden. Hierzu muss der Roboter manuell in die gewünschte Richtung gedreht werden und über „fkine“ die Transformationsmatrix in Matlab ausgelesen werden.

testPlateCoordinate()

Das Anfahren über einen Sicherheitsabstand kann in der Funktion „testPlateCoordinate()“ erreicht werden. Hierzu wird zunächst ein Sicherheitsabstand auf die Z Koordinate addiert und schnell angefahren. Anschließend lässt sich das Ziel mit „movel“ langsam anfahren, sodass der Roboter nur noch langsam vertikal nach unten fährt. Analog lässt sich so das Entfernen von einer Sicherheitsposition in umgekehrter Reihenfolge erzeugen.

TCP Realtime Variablen

Der UR Roboter schreibt viele Variablen über den Port 30003. Diese können mit „fread(TCP_Verbindung)“ als Array ausgelesen werden. Da es sehr viele Bytes sind, muss die maximale Ausleselänge in Matlab mit dem Befehl „TCP_Verbindung.InputBufferSize = 1080“ erhöht werden. Es empfiehlt sich, vorher alle Werte der Schnittstelle zu reinigen mit „flushinput(TCP_Verbindung)“, damit nicht mitten in der Übertragung mit „fread“ abgegriffen wird. Je nach Version des Polyscope Programm auf dem Roboter, werden unterschiedlich viele Werte übertragen. Die Zuordnung kann über eine von UR bereitgestellte Liste erfolgen. So können beispielsweise die aktuelle Position, die Zielposition oder die Bewegungsgeschwindigkeit ausgelesen werden. Eine übersichtlichere Liste zur aktuellen Version des Roboters wurde im SVN abgelegt und beschreibt die Byte-Nummer sowie die Deutung der Werte. Diese Bytes müssen anschließend in einen double-Wert umgewandelt werden. Dies kann mit dem Code „typecast(uint8([Byte1, Byte2, Byte3, Byte4, Byte5, Byte6, Byte7, Byte8]),'double')“ erfolgen. Die TPC Liste von UR für alle Versionen kann unter folgendem Link gefunden werden: TPC Liste

URSim Simulationssoftware

Eine Anleitung zur Installation der Simulationssoftware URSim befindet sich unter folgendem Link zu finden: Anleitung URSim
Ist die Verbindung mit der richtigen IP gewählt, lässt sich auch ein Befehl aus Matlab an die Virtuelle Maschine des URSim senden. Der Befehl wird hier ausgeführt und die Bewegung des Roboters wird simuliert. Auch hierbei ist es möglich, die TCP Realtime Variablen mit Matlab auszulesen.

Ansteuerung des Roboters mit URSim


CAD-Konstruktion des Magazins

Das Magazin wurde mit CAD konstruiert. Die Abmessungen beziehen sich auf die Rutsche, an der das Magazin montiert wurde.

CAD-Zeichnung des Magazins


Einleitung

Dieser Artikel ist eine Vorlage für einen Wiki-Artikel. Tipp: Kopieren Sie den gesamten Quelltext und ändern Sie ihn so, dass er Ihr Projekt beschreibt.

Dieser Artikel ist aus der Kategorie "How-To".

Inhalt

Die Gliederung des Inhalts hängt stark von Ihrem individuellen Projekt ab. Benutzen Sie einen leicht nachvollziehbaren roten Faden und gliedern Sie nach gesundem Menschenverstand!


Unterabschnitt

  1. Nutzen Sie Aufzählungen
    • mit verschiedenen Schachtelungen
    • und so weiter
  2. zweite Ebene
    • mit erneuter Unterebene

Bilder

Bauen Sie Bilder ein, am besten mit darin gekennzeichneten Stellen, die Sie dann im Text erklären.

Beispielbild mit Quelle [1]

Bilder in den Text einbetten

Wenn Sie Bilder anzeigen möchten, ohne das der Artikel links oder rechts weiter läuft, können Sie den Textfluss mit dem Befehl <br clear=all> stoppen.

Beispiel <br clear=all>


Alternativ können Sie das Bild in einer "wikitable" anzeigen lassen. Dadurch wird das Bild auch auf Bildschirmen mit einer anderen Auflösung in der richtigen Darstellungsart angezeigt.

Beispiel wikitable

Hier geht es weiter mit dem Text.

Tabellen

Eine tolle Tabelle ist hier dargestellt.

Spalte 1 Spalte 2 Spalte 3
blabla sowieso sowieso
test sowieso test1

Formeln

Für Formeln nutzen Sie die <math>-Umgebung.

Dieser Quelltext

<math> y = \int\limits_0^2 {\sin \frac{x}{2}dx}</math>

wird dann so dargestellt .

Eine Übersicht über die Befehle findet sich z. B. hier: Gleichungen in math.

Formatierung

Nutzen Sie zur Formatierung Beispiele, z. B. aus dem weltbekannten Wikipedia selbst (das ist die gleiche Syntax!) oder anderer Hilfeseiten wie z. B. [2].

Quelltext

Details siehe: Quelltext_einbinden.


Bei lang= muss die richtige Sprache eingetragen werden (matlab, c,...).

 
for i=1:10 
%     try
%         image = CAMERA_DumpFrame(s);       
%     catch err
%         error('MATLAB:RWTHMindstormsNXT:Sensor:unknown', 'An unknown Error occured while fetching the image. Please check that the Camera is connected and try again');
%     end
    image = CAMERA_GetImage(com);
    handle = imshow(image);
    %pause(0.1)
    currTime(i) = toc(startTime);
    disp(['Aktuelle Zeit: ',num2str(currTime(i))])
    %imwrite(image,sprintf('NXTCamImage%03d.png',i));
    %imwrite(img,fullfile(workingDir,sprintf('HexBug%03d.png',n)));
    % ca. alle 4.8 Sekunden ein Bild
end;

Zusammenfassung

Was ist das Ergbnis? Das Ergebnis dieses Artikels ist eine Vorlage, mit der Nutzer des Wikis schnell und leicht eigene Artikel verwirklichen können. Diese Vorlage ist Bestandteil der Anleitungen aus den How-To's.


Ausblick

Was kann/muss noch verbessert werden?


Literaturverzeichnis