Falsche Position nach Berechnung eines wobj mit DefFrame?!

  • Moin,


    entweder mache ich grad was falsch, oder ich hab ein Verständnisproblem. :/


    Ich hab einen Greifer mit Messspitze. Die Messspitze ist definiert (TCP, 4 Punkte). Die Daten sind ok und die Bewegung und Umorientierung passt. Danach wollte ich mit drei geteachten Punkten ein wobj berechnen lassen. Dazu gibt es eine Teachplatte mit Spitzen drauf. Die lege ich auf die Palette, für die das wobj sein soll. Nach dem Definieren des wobj mit DefFrame möchte ich die Abstände der Spitzen gerne rausrechnen, damit der Ursprung des wobj im Ursprung der Palette liegt. Das passt aber irgendwie nicht.





    Grün gekennzeichnet ist das Koordinatensystem, wie ich es gerne an der Palette hätte.

    Rot gekennzeichnet sind die Abstände der Messspitze vom Ursprung des Koordinatensystems an der Palette.

    Das Koordinatensystem der Palette ist etwa 30° gegenüber dem des Roboters verdreht.



    Wie man sieht passt die Position pDummy1, die direkt nach dem DefFrame geteached wurde. Nach der ersten Korrektur haut es aber schon nicht mehr hin. Der Roboter wurde zwischenzeitlich nicht bewegt. Wenn ich dann pDummy2 teache, würde ich erwarten, daß da die Werte nDeltaX, ...Y und ...Z drin stehen. Ich hab da aber schon etwa 1,7mm bzw. 1,3mm Differenz. Danach habe ich die Messspitze so nah wir möglich an den Ursprung des Koordinatensystems gefahren. Nach dem Teachen von pDummy3 würde ich da jetzt Werte nahe bei 0 erwarten. Die sind aber weit davon entfernt.


    Hab ich da jetzt einen Fehler in der Denke oder im Code?


    Vielen Dank schonmal. :)


    Gruß

    Jörn

  • ANZEIGE
  • probiers mal so und teach nochmal dummy

    Code
     ! (Bekannte) Verschiebung durch die Spitze auf der Messplatte rausrechnen
        wobj_PM761.uframe := PoseMult(wobj_PM761.uframe,[[nDeltaX,nDeltaY,nDeltaZ],[1,0,0,0]];

    Dein Wobj hat diese Winkel RZ -29.2776, RY 0.0329, RX 0.4403


    was du gemacht hast ist das wobj in richtung deiner welt geschoben.


    mit PoseMult schiebst du im richtungsVektor des Wobjs.

  • =>falls jemand mal am O-Frame rumgespielt hat.


    Ich hatte die gleiche Befürchtung und habs so gelöst:


    Code
    ! Nullpose (Zum Zurücksetzen der oframes)
    CONST pose pPose0 := [[0,0,0], [1,0,0,0]];
    
    ! Koordinatensystem berechnen und oFrame zurücksetzen
    wobj_PM761.uframe := DefFrame(pU_wobj_PM761, pX_wobj_PM761, pXY_wobj_PM761);
    wobj_PM761.oframe := pPose0;

    In der Theorie sind Theorie und Praxis identisch. In der Praxis nicht.

  • Einen hab ich noch. :D


    Der Roboter steht an einer bestimmten Position innerhalb eines wobj:


    Code
    wobjdata wobj_PM761 := [FALSE, TRUE, "", [[-44.422, 1430.8, 136.847],[0.967623, 0.0042076, -0.000477384, -0.252365]], [[0, 0, 0],[1, 0, 0, 0]]];
    
    robtarget rtVKHolen_GP := [[607.5,302.5,1332],[0,1,0,0],[1,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];


    Jetzt hab ich durch eine Suche eine Lagekorrektur ermittelt. Ich muss in X 2.37555mm, in Y 0.824158mm und um Z 1.49961° drehen. Das ganze hab ich in eine pose gepackt:


    Code
    pRaeumlicheLageKorrektur := [[2.37555,0.824158,0],[0.999914,0,0,0.0130862]];


    Und die verrechne ich dann:


    Code
    wobj_PM761.oframe := pRaeumlicheLageKorrektur;


    Der Winkel passt auch, aber die Verschiebung in Y beträgt etwa 23mm statt 0.8mm. "Tottel, Du musst doch PoseMult nehmen!", fiel mir da ein (Siehe oben ;) ). Et voila:


    Code
    wobj_PM761.oframe := PoseMult(wobj_PM761.oframe, pRaeumlicheLageKorrektur);


    Allerdings fährt er dann auf genau die gleiche Position.


    Ich bin mir recht siecher, daß es irgendwie gehen muss. Aber wie? :/


    Vielen Dank schonmal.


    Gruß

    Jörn

    In der Theorie sind Theorie und Praxis identisch. In der Praxis nicht.

  • Fahr

    Code
    LIN RelTool(rtVKHolen_GP,pRaeumlicheLageKorrektur.Trans.x,pRaeumlicheLageKorrektur.Trans.y,pRaeumlicheLageKorrektur.Trans.z\RZ:= EulerZYX(\Z, pRaeumlicheLageKorrektur.rot),.....

    oder


    Code
    wobj_PM761.oframe :=PoseMult([[rtVKHolen_GP.trans],[rtVKHolen_GP.rot]],pRaeumlicheLageKorrektur);
    Evtl. musst du die Korrektur drehen dann
    
    wobj_PM761.oframe :=PoseMult([[rtVKHolen_GP.trans],[rtVKHolen_GP.rot]],INV_POSE(pRaeumlicheLageKorrektur));

    dann fährst du im programm auf X Y Z RX RY RZ 0


    du drehst wenn du eine Rotation im Oframe angibts um den translatorischen punkt der das ergebniss von uframe und oframe ist. wenn im oframe trans 0 drinn steht dreht es sich um die uframe.trans


    da du auch noch trans und rot in der pos hast wird es noch kniffliger.

    und es kommt noch drauf an in welchen bezug hast die lagekorrektur ermittelt

    in Werkobject oder im bezug des tools and der position


    wir bräuchten mehr details um 100% dir eine lösung vorzuschlagen


    Gruß Loipe

    Einmal editiert, zuletzt von Loipe () aus folgendem Grund: Mehr gedanken eingebracht

  • Fahr ..

    Code
    wobj_PM761.oframe :=PoseMult([[rtVKHolen_GP.trans],[rtVKHolen_GP.rot]],pRaeumlicheLageKorrektur);
    Evtl. musst du die Korrektur drehen dann
    
    wobj_PM761.oframe :=PoseMult([[rtVKHolen_GP.trans],[rtVKHolen_GP.rot]],INV_POSE(pRaeumlicheLageKorrektur));

    ...


    wir bräuchten mehr details um 100% dir eine lösung vorzuschlagen

    Ersteres hab ich schon probiert. Meine Idee war gewesen die Verschiebung relativ zum TCP berechnen zu lassen. Da fährt er dann aber weiß-ich-wo hin.


    Das zweite hab ich gerade probiert, das passt leider auch nicht.


    Mit Details kann ich aber dienen:

    Ich hab eine Palette. Auf der hab ich ein wobj im Ursprung der Palette definiert, d.h. auf Höhe der Palette und in der Ecke der Palette, die im Anschlagwinkel steht (Siehe Bild ganz oben im ersten Beitrag). Die Achsen sind parallel zu Palette. Die Palette steht aber nicht parallel zur base.


    Auf der Palette stehen 4 Türme mit Körben, die ich abholen soll. Zwischen den Körben ist relativ viel Platz, weshalb ich eine Messung für eine Lagekorrektur zu ermitteln. Der erste Korb, den ich abholen muss, ist berechnet bei [607.5, 302.5, 1332] im wobj_PM761. Als Lagekorrektur hab ich die besagte pRaeumlicheLageKorrektur ermittelt (X 2.375mm, Y 0.824mm, Z 1,5°). Um den Wert muss ich den TCP korrigieren, damit der Greifer beim Greifen gerade im Korb steht und ihn nicht verschiebt.


    Stecke ich die pRaeumlicheLageKorrektur in den uframe, dann sieht es so aus, als drehe der Roboter um den Ursprung des wobj_PM761, was dann zu einer Verschiebung um etwa 23mm führt -> asin 23mm / SQRT(607mm^2 + 302mm^2) ~ 1,9°

    In der Theorie sind Theorie und Praxis identisch. In der Praxis nicht.

  • Ich hab zwei Sensoren an der Seite des Greifers. Mit denen bestimmt ich zuerst den Versatz und den Winkel in X und dann den Versatz in Y.


    Wenn ich mit dem Greifer ohne Korrektur knapp über den Korb fahren, sehen die ermittelten Werte auch richtig aus. Es ist nicht so, daß ich 23mm Versatz in Y habe. Ich hab den Turm zum Testen an die "richtige" Position gerückt und nur ein bissl verdreht.

    In der Theorie sind Theorie und Praxis identisch. In der Praxis nicht.

  • dann hätte


    Code
    MoveL RelTool(rtVKHolen_GP,pRaeumlicheLageKorrektur.Trans.x,pRaeumlicheLageKorrektur.Trans.y,pRaeumlicheLageKorrektur.Trans.z\RZ:= EulerZYX(\Z, pRaeumlicheLageKorrektur.rot),.....

    eigentlich funktionieren sollen.


    evtl pRaeumlicheLageKorrektur:=PoseInv (pRaeumlicheLageKorrektur) vorweg


    wenn nur die Verdrehung falsch ist dann


    RZ:= EulerZYX(\Z, pRaeumlicheLageKorrektur.rot)*(-1)

  • RelTool würde sicherlich funktionieren. Das nähme ich aber nur ungerne, weil ich es dann bei jedem Fahrbefehl extra dazuschreiben muss. Das macht es unübersichtlicher und aufwändiger bei Änderungen.


    Der oframe ist ja extra dafür da. Deshalb würde ich den bevorzugen. ;)


    Nachtrag:

    Die Verdrehung ist nicht in die falsche Richtung. Der Winkel passt perfekt. Aber er dreht nicht um den TCP, sondern (scheinbar) um den Ursprung des wobj. Der Versatz ist auch korrekt. Wenn ich den Winkel aus dem pRaeumlicheLageKorrektur lösche, dann passt es. Dann fährt er 2,3mm in X und 0,8mm in Y. Ich weiß nur nicht, wie ich dem Roboter mitteile, daß ich um den TCP und nicht um den Ursprung des wobj drehen möchte bzw. wie ich die passenden Werte dafür in den oframe bekomme.

    In der Theorie sind Theorie und Praxis identisch. In der Praxis nicht.

    2 Mal editiert, zuletzt von halbesYoyo ()

  • Stecke ich die pRaeumlicheLageKorrektur in den uframe, dann sieht es so aus, als drehe der Roboter um den Ursprung des wobj_PM761,...

    So ist es.

    Du hast aber eine Verschiebung ermittelt, und danach die Drehung. Einfachste Lösung dürfte sein den translatorischen Anteil in den Oframe zu packen und den rotatorischen per Reltool zu verarbeiten.

  • ja so macht er das auch richtig. du müsstest dann in das oframe so manipulieren das da alles bis zum tcp drinn steht.


    die Position die du dann anfährst wäre halt komplett null


    dann dreht sich der winkel im oframe auch richtig


    das hätte das hier machen sollen


    Code
    wobj_PM761.oframe :=PoseMult([[rtVKHolen_GP.trans],[rtVKHolen_GP.rot]],pRaeumlicheLageKorrektur);

    in das oframe die informationen deines punktes reinschreiben und um deine korrecktur verschieben


    dann fährst du im programm selber natürlich nicht mehr rtVKHolen_GP an


    sondern X 0 y 0 z 0 RZ0 RY0 RX 0


    fahr mal von han hin mit richtigen tool und dem neuen wobj

  • Wenn es unbedingt nur der Oframe sein soll, dann multipliziere den translatorischen und den rotatorischen per Posemult und trage das Ergebnis in den Oframe ein. Reihenfolge im Posemult einfach ausprobieren, da bin ich immer unsicher.

  • hab ich ja geschrieben. Nur hat er einen punkt den er auch ins oframe reinehmen muss damit die rotation passt. Posemult bezug offset

    Der offset wird in richtung des bezugs geschoben.


    Also in seinem fall in der richtung der position in tool richtung da die in der position drin ist

  • Code
    wobj_PM761.oframe :=PoseMult([[rtVKHolen_GP.trans],[rtVKHolen_GP.rot]],pRaeumlicheLageKorrektur);

    in das oframe die informationen deines punktes reinschreiben und um deine korrecktur verschieben


    dann fährst du im programm selber natürlich nicht mehr rtVKHolen_GP an


    sondern X 0 y 0 z 0 RZ0 RY0 RX 0


    Jetzt, wo Du es sagst. :/


    Ich denke dann mach ich es doch lieber mit RelTool. Das ist zwar ein klein wenig aufwändiger, aber wesentlich einsichtiger. ;)

    In der Theorie sind Theorie und Praxis identisch. In der Praxis nicht.

  • Wenn es unbedingt nur der Oframe sein soll ...

    Es soll nicht unbedingt der oframe sein. Ich dachte nur es wäre handlicher, weil er ja genau dafür da ist. Im Nachhinein stellt es sich aber als schwer(er) lesbarer Code heraus, deshalb wird es jetzt doch RelTool.

    In der Theorie sind Theorie und Praxis identisch. In der Praxis nicht.

Hilfe und Support für ABB Roboter Programmierung, Konfiguration, Inbetriebnahme finden Sie hier im ABB Roboter Forum. ABB Rapid Programmierung ist einfach, die Roboterforum Community hilft sehr gerne.

Erstelle ein Benutzerkonto oder melde dich an um zu kommentieren

Du musst ein Benutzerkonto haben um einen Kommentar hinterlassen zu können

Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Geht einfach!
Neues Benutzerkonto erstellen
Anmelden
Du hast bereits ein Benutzerkonto? Melde dich hier an.
Jetzt anmelden