1 Allgemein
- Wenn nur die Position erforderlich ist, kann die Angabe folgenderma�en aussehen (in Metern):
{"xyz": [x, y, z]}
- Die Orientierung kann durch Euler-Winkel (Rx, Ry, Rz, in Grad) beschrieben werden oder durch Quaternionen (q0, q1, q2, q3):
{"euler": [Rx, Ry, Rz]}
{"quat": [q0, q1, q2, q3]} - Eine Pose besteht immer aus der Angabe der kartesischen Position (x, y, z) und der Orientierung. Somit gibt es zwei Arten, eine Pose anzugeben:
{"xyz+euler": [x, y, z, Rx, Ry, Rz]}
{"xyz+quat": [x, y, z, q0, q1, q2, q3]} - Auf die gleiche Art k�nnen die Achswinkel angegeben werden (j1, ..., j6, in Grad):
{"joints": [j1, j2, j3, j4, j5, j6]}
2 Interpolation
2.1 Orientierungen interpolieren
Beschreibung
Mit der Methode getInterpolatedRotation(r1q0, r1q1, r1q2, r1q3, r2q0, r2q1, r2q2, r2q3, percent) kann eine Orientierung interpoliert werden, die zwischen den beiden angegebenen Orientierungen liegt. r1q0, ..., r1q3 beschreibt die erste Orientierung, r1q0, ..., r1q3 beschreibt die zweite Orientierung,r2q0, ..., r2q3 beschreibt die zweite Orientierung, percent gibt an, wie weit zwischen den beiden Orientierungen die ausgegebene Orientierung liegt.
Es wird eine map mit q0, ..., q3 zur�ckgegeben, die die neue Orientierung beschreibt.
Beispiel
var rotation = getInterpolatedRotation(0, 0.7, 0, 0.7, 1, 0, 1, 0, 0.5);
showHint(rotation.q1);
2.2 Fehlende Z-Koordinate anhand von 4 definierten Punkten ermitteln
Es gibt Kamerasysteme, die die Position von Gegenst�nden in x- und y-Koordinaten ausgeben. Da sich der Roboter aber im dreidimensionalem Raum befindet, ben�tigt man dazu noch die Z-Koordinate. Ist sowohl die Kamera als auch der Roboter und die Ebene, die die Kamera erfasst, perfekt parallel zur Z-Koordinate des Weltkoordinatensystems, so ist dieser Wert nat�rlich immer fest. Sobald dies nicht der Fall ist, muss Z ermittelt werden.
Vorgehen
Um die Z-Koordinate ermitteln zu k�nnen, muss erstmal eine Referenzebene eingelernt werden. Daher werden hier zwei Funktionen beschrieben. Eine zum Einlernen der Ebene und eine zum Ermitteln der Z-Koordinate anhand einer XY-Koordinate.
Einlernen der Ebene
Die Ebene wird mit der Funktion teachPlane() eingelernt. Diese Funktion hat 12 Parameter. Diese Parameter sind jeweils die x,y und z-Koordinate von 4 Punkten. Diese kann man ermitteln, indem man mit dem TCP an die Eckpunkte der zu definierenden Ebene f�hrt.
teachPlane(x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4)
Wichtig:
Die 4 Punkte m�ssen entweder im oder gegen den Uhrzeigersinn angegeben werden. Verbindet man die 4 Punkte zu einem Viereck, so darf Punkt 1 nicht mit Punkt 3 verbunden sein!
Hier ein Beispiel:
Es wird an vier verschiedene Punkte gefahren (z.b. �ber die Aktion Wegpunkt definieren) und sich dort jeweils die aktuelle Position ausgeben gelassen.
Von der Position beachten wir nur die Position, nicht die Rotation. Die Positionen dieser vier Punkte �bergeben wir nun der Methode teachPlane().
joints(0.000000, 0.000000, 0.000000, 0.000000, 85.220371, 0.000000, 1.000000, "Wegpunkt 1", false);
var one = getCurrentPose();
joints(-22.290554, 5.129221, 3.172679, 1.856705, 77.280641, -22.629531, 1.000000, "Wegpunkt 2", false);
var two = getCurrentPose();
joints(-17.163997, 26.062826, -27.035683, 1.411788, 86.406272, -17.196313, 1.000000, "Wegpunkt 3", false);
var three = getCurrentPose();
joints(16.878389, 25.613710, -22.733409, -1.398059, 82.547275, 17.004389, 1.000000, "Wegpunkt 4", false);
var four = getCurrentPose();
teachPlane(one.x, one.y, one.z, two.x, two.y, two.z, three.x, three.y, three.z, four.x, four.y, four.z)
Nun ist eine Ebene eingelernt und anhand von xy-Koordinaten kann die z-Koordinate berechnet werden.
Ermitteln der Z-Koordinate
Nachdem die Ebene mit der Funktion teachPlane() eingelernt wurde, kann nun anhand von x- und y-Koordinaten die auf der Ebene befindliche z-Koordinate berechnet werden. Dazu dient die Funktion getZByTeachedPlane().
Diese Funktion ben�tigt als Parameter die x und die y-Position eines Punktes. Als R�ckgabewert erh�lt man die z-Koordinate, die sich auf der zuvor definierten Ebene befindet und die �bergebenen x- und y-Koordinaten besitzt.
var z = getZByTeachedPlane(x,y)
3 Quaternionen in Eulerwinkel umrechnen
Quaternionen k�nnen eindeutig in Eulerwinkel umgerechnet werden, andersrum ist dies nicht immer m�glich. Die Methode convertQuaternionToEuler() bekommt als Parameter einen Quaternion q0, ..., q3 und gibt eine map zur�ck, in der die drei Eulerwinkel enthalten sind.
Beispiel
var pose = convertQuaternionToEuler(0, 0, 1, 0);
showInfo("rx: " + pose.rx + ", ry: " + pose.ry + ", rz: " + pose.rz);
4 Achswerte
4.1 Externe Achswerte
Dieser Artikel beschreibt wie extern vorgegebene Achswerte ausgelesen werden k�nnen.
Seit der Version 2023.04 k�nnen diese Achswerte auch innerhalb eines Programmes gesetzt werden anstatt nur �ber die externe Schnittstelle. Weitere Informationen dazu gibt es hier.
Die Funktion getNextJoints() wird ben�tigt um die aktuellen Achswerte auszulesen. Damit sinnvolle Werte zur�ckgeliefert werden, m�ssen diese vorher �ber die externe Schnittstelle mit dem Befehl nextJoints gesetzt werden. Zur�ckgeliefert wird ein Objekt mit 6 Attributen (j1, j2, j3, j4, j5, j6), wobei jeder Wert den Winkel einer Achse darstellt. Das folgende Beispiel zeigt wie auf die einzelnen Attribute zugegriffen werden kann.
var nextJoints = getNextJoints();
var j1 = nextJoints.j1;
var j6 = nextJoints.j6;
4.2 Auf n�chste Achswerte zugreifen
An die Methode getClosestJoints() werden zwei Parameter �bergeben:
- eine Achsstellung (nicht zwingend die momentane Achsstellung)
- eine gew�nscht Zielpose
Als Ergebnis liefert die Methode die "n�chsten" Zielachswerte zur�ck.
Beispiel
var old_joints = new Joints(0,0,0,0,0,0);
var new_pose = new Pose(0.460,0, 0.2, 0, 0, 1,0);
var pose = getClosestJoints(old_joints, new_pose);
showHint(pose);
4.3 Externe Achswerte setzen/�ndern
�ber die externe Schnittstelle kann der Wert von nextJoints gesetzt werden. Mit der Methode setNextJoints() kann dieser Wert auch aus einem Programm heraus gesetzt werden. Als Parameter wird ein Objekt des Typs Joints erwartet.
Beispiel
var new_joints = new Joints(20, 14, 42, 10, 22, -10);
setNextJoints(new_joints);
4.4 Aktuelle Achswerte
Dieser Artikel beschreibt wie im textuellen Programmieren die aktuellen Achswerte ausgelesen werden k�nnen.
Die Funktion getCurrentJoints() wird ben�tigt um die aktuellen Achswerte auszulesen. Zur�ckgeliefert wird ein Objekt mit 6 Attributen (j1, j2, j3, j4, j5, j6), wobei jeder Wert den Winkel einer Achse darstellt. Das folgende Beispiel zeigt wie auf die einzelnen Attribute zugegriffen werden kann.
var currentJoints = getCurrentJoints();
var j1 = currentJoints.j1;
var j6 = currentJoints.j6;
5 Pose
5.1 Aktuelle Pose
Dieser Artikel beschreibt wie im textuellen Programmieren die aktuelle Pose ausgelesen werden kann.
Die Funktion getCurrentPose() wird ben�tigt um die aktuellen Gelenkwinkel auszulesen. Zur�ckgeliefert wird ein Objekt mit 10 Attributen. Dies sind die Positionen im kartesischem Raum (x, y, z), sowie die Orientierung als Quaternionen (q0, q1, q2, q3) und die Orientierung als Eulerwinkel (rx, ry, rz). Das folgende Beispiel zeigt wie auf die einzelnen Attribute zugegriffen werden kann.
var pose = getCurrentPose();
var x = pose.x;
var q3 = pose.q3;
var rx = pose.rx;
5.2 Extern vorgegebene Pose
Auslesen
Dieser Artikel beschreibt wie im textuellen Programmieren eine extern vorgegebene Pose ausgelesen werden kann.
Seit der Version 2023.04 kann diese Pose auch innerhalb eines Programmes gesetzt werden anstatt nur �ber die externe Schnittstelle. Weitere Informationen dazu gibt es hier.
Die Funktion getNextPose() wird ben�tigt um eine extern vorgegebene Pose auszulesen. Damit sinnvolle Werte zur�ckgeliefert werden, m�ssen diese vorher �ber die externe Schnittstelle mit dem Befehl nextPose gesetzt werden. Zur�ckgeliefert wird ein Objekt mit 10 Attributen. Dies sind die Positionen im kartesischem Raum (x, y, z), sowie die Orientierung als Quaternionen (q0, q1, q2, q3) und die Orientierung als Eulerwinkel (rx, ry, rz). Das folgende Beispiel zeigt wie auf die einzelnen Attribute zugegriffen werden kann.
var pose = getNextPose();
var x = pose.x;
var q3 = pose.q3;
var rx = pose.rx;
5.3 Externe Pose setzen/�ndern
�ber die externe Schnittstelle kann der Wert von nextPose gesetzt werden. Mit der Methode setNextPose() kann dieser Wert auch aus einem Programm heraus gesetzt werden. Als Parameter wird ein Objekt des Typs Pose erwartet.
Beispiel
var new_pose = new Pose(0.460,0.2, 0.3, 0, 0, 1, 0); //x,y,z,q0,q1,q2,q3
setNextPose(new_pose);
6 Normalenvektor
6.1 Normalenvektor anhand Eulerwinkel
Dieser Artikel beschreibt, wie man anhand von Eulerwinkeln an den Normalenvektor kommt. Dies kann f�r mathematische Operationen sinnvoll sein. Ein Beispiel hierf�r ist, das eine Kamera neben der Translation auch eine Rotation in Eulerwinkeln liefert. Soll das TCP nicht direkt dorthin fahren, sondern zuerst mit einem bestimmten Abstand entlang der Ausrichtung des Zielobjekts.
Die Funktion getSurfaceNormalByEuler liefert eine Map zur�ck, die drei Eintr�ge enth�lt: x, y und z. Diese geben den Normalenvektor der Z-Achse des TCP an, wenn dieser nach den �bergebenen Eulerwinkeln ausgerichtet ist. Auf die entsprechenden Eintr�ge kann mit getX(), getY() und getZ() zugegriffen werden.
var normal = getSurfaceNormalByEuler(rx, ry, rz);
var x = normal.getX();
var y = normal.getY();
vaz z = normal.getZ();
Beispiel
Mit den von der Funktion erhaltenen Werten kann man z.B. das TCP in einem bestimmten Abstand zu einem Zielobjekt in Ausrichtung des Zielobjekts platzieren. Dazu hier ein kleines Beispiel.
In diesem Beispiel wird zuerst mit der hier beschriebenen Funktion getSurfaceNormalByEuler() der Normalenvektor ermittelt. Als Parameter gibt man die z.b. von einer Kamera erhaltene Ausrichtung des Zielobjekts.
Um das TCP mit einem bestimmten Abstand zu dem Zielobjekt in Ausrichtung des Zielobjekts zu platzieren, wird nun ein move-Befehl verwendet. Die Zielausrichtung ist die Ausrichtung des Zielobjekts. Die Zielposition ist die Position des Zielobjekts plus ein bestimmter Abstand. Damit man die L�nge des Abstands bestimmen kann, wird hier der Faktor moveFactor genutzt.
var target = {x: 0.3, y: 0.4, z: 0.5, rx: 20, ry: 30, rz: 60};
var normal = getSurfaceNormalByEuler(target.rx, target.ry, target.rz);
var moveFactor = 0.1;
move({
'Coord': 'CARTESIAN_BASIS',
'MoveType': 'LINEAR',
'PoseRelation': 'ABSOLUTE',
'speed.ratio': 1.0,
'targetpose.rx': target.rx,
'targetpose.ry': target.ry,
'targetpose.rz': target.rz,
'targetpose.x': target.x + moveFactor * normal.getX(),
'targetpose.y': target.y + moveFactor * normal.getY(),
'targetpose.z': target.z + moveFactor * normal.getZ()
}, "Wegpunkt 1");
6.1 Normalenvektor anhand der Z-Achse des TCP
Dieser Artikel beschreibt, wie man an den Normalenvektor kommt, der vom TCP aus in Richtung der Z-Achse des TCPs zeigt. Dies kann f�r mathematische Operationen sinnvoll sein oder einfach nur, um an dieser Achse entlang zu verfahren.
Die Funktion getSurfaceNormal() liefert eine Map zur�ck, die drei Eintr�ge enth�lt: x, y und z. Diese geben den Normalenvektor der Z-Achse des TCP an. Auf die entsprechenden Eintr�ge kann mit getX(), getY() und getZ() zugegriffen werden.
var normal = getSurfaceNormal();
var x = normal.getX();
var y = normal.getY();
var z = normal.getZ();
Beispiel
Mit den von der Funktion erhaltenen Werten kann man z.b. im textuellen Programmieren entlang der Z-Achse des TCPs verfahren. Dazu hier ein kleines Beispiel.
In diesem Beispiel wird zuerst mit der hier beschriebenen Funktion getSurfaceNormal() der Normalenvektor ermittelt.
Zudem wird mit der Funktion getCurrentPose() die aktuelle Position des TCPs ermittelt.
Um entlang der Z-Achse zu verfahren wird nun ein move-Befehl verwendet. Dabei soll die Ausrichtung des TCPs nicht ver�ndert werden. Daher �bernehmen wir die 4 Quaternionen aus der aktuellen Position. Die Position des TCPs soll sich aber entlang seiner Z-Achse ver�ndern. Daher addieren wir zu der aktuellen Position die entsprechende Komponente des Normalenvektors. Damit man die L�nge der Bewegung bestimmen kann, wird hier noch der Faktor moveFactor genutzt.
var normal = getSurfaceNormal();
var moveFactor = 0.1;
var pose = getCurrentPose();
move({
'Coord': 'CARTESIAN_BASIS',
'MoveType': 'JOINT',
'PoseRelation': 'ABSOLUTE',
'speed.ratio': 1.0,
'targetpose.q0': pose.q0,
'targetpose.q1': pose.q1,
'targetpose.q2': pose.q2,
'targetpose.q3': pose.q3,
'targetpose.x': pose.x + moveFactor * normal.getX(),
'targetpose.y': pose.y + moveFactor * normal.getY(),
'targetpose.z': pose.z + moveFactor * normal.getZ()
}, "Wegpunkt 1");