Pass bitte auf bei diesen 180° - Fahrten.
Die Maßgabe für den Robbi lautet: "fahre von Anfangsorientierung zu Endorientierung". Bei exakt 180.0000 Grad ist sich der Roboter nicht unbedingt sicher, wie herum er diese Orientierungsänderung fahren soll. Der Zwischenpunkt hat dabei keinen Einfluß, deswegen kann da u. U. ne böse Überraschung passieren. Ich präferiere deshalb die Verwendung von mindestens 3 Kreissegmenten.
Ich würde auch eher ungern mit offs() arbeiten, da sich das auf das Wobj bezieht und nicht auf die Orientierung des Punktes. Weiß ja nicht, was Du als Ausgangsposition benutzt, ich würde halt beim Teachen versuchen, den Punkt senkrecht zur Oberfläche auszurichten. Wenn die Oberfläche allerdings selbst topfeben ist und parallel zum Wobj, dann ist diese Lösung hier eher unbequem, und man sollte Raumbezogen arbeiten (mit offs).
Wenn ich es machen würde, würde ich zuerst auf Schönheit verzichten und mir die Punkte im Voraus ausrechnen. Dadurch kann man in der Datenansicht beim schrittweisen durchsteppen schon mal schauen, was eigentlich passiert.
Zwei Arrays mit reichlich Positionsdaten und einer mit Targets, sodann noch ein paar Container:
var pose erster_schritt{7};
var pose zweiter_schritt{7};
var pose rechenpose_winkel;
var pose rechenpose_radius;
var pose mittelpunkt;
var robtarget kreispunkte{7};
var byte z;
Dann für den ersten Schritt:
mittelpunkt.trans:=pCentrPoint.trans;
mittelpunkt.rot:=pCentrPoint.rot;
rechenpose_winkel.trans:=[0,0,0];
rechenpose_radius.trans:=[0,0,0];
rechenpose_radius.rot:=[1,0,0,0];
rechenpose_radius.trans.y:=nRadius;
for z from 0 to 6 do
rechenpose_winkel.rot:=OrientZYX (z*60, 0, 0);
erster_schritt{z+1}:=posemult(mittelpunkt,rechenpose_winkel);
Alles anzeigen
An dieser Stelle hast Du einen Array mit dem Mittelpunkt, 6-Fach verdreht um jeweils 60 °. Der letzte um 360° verdreht, der sollte also hinterher genauso aussehen wie der 1., der mit 0° verdreht wurde. Die Poses mit Index 1 und 7 sind somit eigentl. überflüssig, aber es geht ums Prinzip.
Achso: die Verdrehung geht hier um z des Mittelpunktes, also um den e3-Vektor. Ich gehe hier also davon aus, dass Dein Messer in der Längsachse z ist und x die Schnittrichtung.
im zweiten Step dann den Radius draufrechnen. Ich mache hier in Y:
zweiter_schritt{z+1}:=posemult(erster_schritt{z+1},rechenpose_radius)
Jetzt hat man die Positionen berechnet, leider kann man eine Pose nicht komplett in ein Robtarget holen. Also einzeln:
kreispunkte{z+1}:=pCentrPoint;
kreispunkte{z+1}.trans:=zweiter_schritt{z+1}.trans;
kreispunkte{z+1}.rot:=zweiter_schritt{z+1}.rot;
endfor
Hier endet die FOR-Schleife, und in allen 7 Punkten steht jetzt ein Ziel drin, Natürlich mit falschen Konfigurationsangaben.
Also ConfL \off und fahren
movel kreispunkte{1} ... Messer eintauchen
movec kreispunkte{2}, kreispunkte{3}... erstes Segment
Dann 4 und 5 zweites Segment
dann 6 und 7 drittes Segment.
Auftauchen dann beliebig relTool(0,0,-30) oder so....
Nur mal so aus der Hüfte geschossen, wenn auch ohne Gew(a)ehr.
Grüße,
Michael