Basisverschiebung mit Winkel

  • Hallo Liebe Robotercommunity,


    erst mal vielen Dank für euer Forum. Ihr habt mir schon oft aus der patsche geholfen und ich konnte mir durch euch sehr oft weiter helfen. Diesmal muss ich aber doch eine Frage stellen, da ich einfach nicht weiter komme. Selbst die Beiträge zu dem Thema helfen mir nicht weiter, oder ich stehe einfach nur auf dem Schlauch:denk:.


    Folgendes ist an der Anlage vorzufinden:

    - Halbrunder Tisch auf dem 10 Bauteilträger montiert sind (Bild siehe Anhang)

    - Bauteilträger zum Ablegen der Bauteile besitzt ca. 30° Steigung (Bild siehe Anhang)

    - Bauteil (Vierkantrohr) mit Flanschplatte (Kann in der Länge auf dem Rohr variieren -> andere Abholpos)


    Folgendes möchte ich gerne einbringen:

    Die Bauteile werden mit dem KUKA von einem Bauteilträger (Bild siehe Anhang) abgeholt und sollen ggf. auf dem Halbrunden Tisch gepuffert werden. Wenn das "Ausförderband" frei ist, können sie auch da abgelegt werden. Das schwierige dabei: Die Bauteilträger sind "schräg" und die Platte auf den Vierkantrohren (=Greifpos) kann in Längsrichtung variieren. Beim Abholen auf dem "Einförderband" und beim Absetzen auf den Tisch muss das also berücksichtigt werden.


    Mein Problem:

    Bei den anderen Robis gab es nur eine Abholpos und eine Ablegepos. Somit konnte ich die BASE mit dem Referenzbauteil auf dem Bauteilträger vermessen und hatte das Koordinatensystem genau wie die Schräge auf dem Träger.
    Dann habe ich das Referenzbauteil mit dem Robi gegriffen, die Ablegepos in dem Bauteilträger geteached und über den Punktseparator und dem "Offsetwert" (SPS: Plattenverschiebung) konnte ich mir alles basteln was ich wollte. Berechnete Vorpos, Nachpos, Ablegepos usw.

    Das ist hier aber nicht mehr möglich, da ich ja die "schräge Basis" nicht mehr habe, bzw ich mir die 10x einmessen müsste!?:wallbash:

    Ich hätte aber gerne eine Basis, wie auf meiner Zeichnung, und von mir aus 10 Teachpunkte mit Referenzbauteil (dann kann man einen Versatz auch einfach mal über teachen anpassen).

    Diese sollten dann entweder eine 2. Base dahin verschieben, oder es läuft iwie über das TOOL Koordinatensystem. Wichtig ist, dass der Punkt BEVOR ich ablege berechnet werden muss, da das Bauteil an einen Anschlag gelegt wird.

    Der Plan ist, beim Wiederaufbau der Anlage, einmal die BASE Tisch neu auszumessen und sofort alle 10 Teachpositionen wieder an Ort und Stelle zu haben.



    Folgendes habe ich schon als Ansatz aus dem Forum:


    Punkt P1 gegeben

    ;1. Verschieben bezügliche Tool-System


    FRAME f

    f=$nullframe

    f.x=100 ; Tool Stossrichtung


    P1=P1:f


    Das Problem, wenn ich mit einem Frame, die X,Y,Z,a,b,c in die ABLEGEPOS schreibe, oder da drauf rechne sind die ja im Bezug zu dem vermessenen Tisch-Kordinatensystem?
    Irgendwie muss ich ja von der/den geteachten Positionen ausgehen um meine Berechnung aufzubauen.

    Habt ihr eine Idee?


    Sorry für den langen Text:roll:

  • Schritt für Schritt zum Roboterprofi!
  • Etwa so...


  • Hallo Maverick,


    so als Idee.

    wenn Du eine "normale Base" aufnimmst auf Deinem Halbrundtisch,

    dann die 10 Teach-Positionen bezogen auf die "normale Base" teacht, kannst Du diese ja nachher addieren über den Geometrischen Operator und das Ergebnis wieder als Base verwenden. Dann haste Deine 10 schrägen Basen mit Ursprung TCP und Ausrichtung Greifer bei all Deinen Ablagepositionen, wo Du dann wiederum den Versatz von der SPS in die Position (wäre dann für die Referenzposition {X 0.0,Y 0.0,Z 0.0,A 0.0,B 0.0,C 0.0}) reinschreiben kannst.


    So als Input:

    BASE_DATA[10]={X 0.0,Y 0.0,Z 0.0,A 0.0,B 0.0,C 0.0} ;BASE HALBRUNDTISCH NORMAL AUFNEHMEN


    DECL FRAME TEACH_POS[10] Deine Teachpositionen als Frame teachen bezogen auf base_data[10]

    TEACH_POS[1]={X 0.0,Y 0.0,Z 0.0,A 0.0,B 0.0,C 0.0}

    TEACH_POS[2]={X 0.0,Y 0.0,Z 0.0,A 0.0,B 0.0,C 0.0}

    TEACH_POS[3]={X 0.0,Y 0.0,Z 0.0,A 0.0,B 0.0,C 0.0}

    TEACH_POS[4]={X 0.0,Y 0.0,Z 0.0,A 0.0,B 0.0,C 0.0}

    TEACH_POS[5]={X 0.0,Y 0.0,Z 0.0,A 0.0,B 0.0,C 0.0}

    TEACH_POS[6]={X 0.0,Y 0.0,Z 0.0,A 0.0,B 0.0,C 0.0}

    TEACH_POS[7]={X 0.0,Y 0.0,Z 0.0,A 0.0,B 0.0,C 0.0}

    TEACH_POS[8]={X 0.0,Y 0.0,Z 0.0,A 0.0,B 0.0,C 0.0}

    TEACH_POS[9]={X 0.0,Y 0.0,Z 0.0,A 0.0,B 0.0,C 0.0}

    TEACH_POS[10]={X 0.0,Y 0.0,Z 0.0,A 0.0,B 0.0,C 0.0}

    ;Diese Punkte teachen. Müssen nicht zwingend Arrays sein.


    ;Danach die 10 Bases berechnen in .src

    BASE_DATA[11]=BASE_DATA[10] : TEACH_POS[1]

    BASE_DATA[12]=BASE_DATA[10] : TEACH_POS[2]

    BASE_DATA[13]=BASE_DATA[10] : TEACH_POS[3]

    BASE_DATA[14]=BASE_DATA[10] : TEACH_POS[4]

    BASE_DATA[15]=BASE_DATA[10] : TEACH_POS[5]

    BASE_DATA[16]=BASE_DATA[10] : TEACH_POS[6]

    BASE_DATA[17]=BASE_DATA[10] : TEACH_POS[7]

    BASE_DATA[18]=BASE_DATA[10] : TEACH_POS[8]

    BASE_DATA[19]=BASE_DATA[10] : TEACH_POS[9]

    BASE_DATA[20]=BASE_DATA[10] : TEACH_POS[10]


    Fahren wäre dann als Bsp. für ersten Platz:

    $BASE= BASE_DATA[11]

    PTP $NULLFRAME : OFFSET ; OFFSET FRAME VON SPS

    Kannst diese natürlich auch über Punktseparator zuweisen.


    Was auch gehen sollte wäre die direkte Variante:

    PTP BASE_DATA[10] : TEACH_POS[1] : OFFSET


    Geometrischer Operator:



    Viel Glück


    SJX

    Manche Maenner bemuehen sich lebenslang, das Wesen einer Frau zu verstehen. Andere befassen sich mit weniger schwierigen Dingen z.B. der Relativitaetstheorie.

  • Erste Frage:
    Wie wandel ich am schönsten und kompaktesten die Teachpositionen in ein FRAME für die spätere Berechnung um?
    Hab im Forum sowas wie das hier gefunden:


    1.) Punkt einfach in Frame schreiben
    XFRAME_=XP1

    "Bei der Verwendung eines Werts vom Typ "E6POS" für einen Parameter vom Typ "Frame" könnten einige Werte nicht richtig initialisiert sein"


    Kann ich den Hinweis der dann kommt ignorieren? Status, Turn und externe Achsen werden hier wahrscheinlich einfach nicht übergeben und deswegen meckert der? Oder könnten im schlimmsten fall irgendwie dadurch auch andere Werte als X,Y,Z,a,b,c übergeben werden?

    2.) Über eine Funktion lösen

    Da schreibe ich ja auch einfach nur mit dem Punktseparator die einzelnen Werte in das Frame rein? Warum als Funktion?

    3. Meine Variante aus den beiden zusammen gebastelt

    Code
    IM .DAT:
    DECL E6POS XTeachpos_1={X 44.6603508,Y 48.8358307,Z -245.740219,A -122.658813,B -89.8507538,C -147.763382,S 2,T 10,E1 0.0,E2 0.0,E3 0.0,E4 0.0,E5 0.0,E6 0.0}
    
    DECL FRAME F_Teachpos
    F_Teachpos ={X 0.0,Y 0.0,Z 0.0,A 0.0,B 0.0,C 0.0}
    
    
    IM .SRC:
    ;Teachpos in FRAME umwandeln
    F_Teachpos = XTeachpos_1.X.y.z.a.b.c

    Habe so z.B. im .dat meine Teachpunkte, die immer verändert werden könnten und Automatisch sich das Frame anpasst, bei Abarbeitung im .src.

    Kann ich die Teachpos, wie in meinem Teil beschrieben, einfach so in das Frame F_Teachpos schreiben (mit Frame=POS.x.y.z.a.b.c)?


    Könnte dann auch eine Teachpositionen.src erstellen wo alle Positionen Global deklariert sind und die .dat auf Public gestellt wurde.


    Habt ihr eine bessere Idee, oder ist das so Okay?

  • IM .SRC:
    ;Teachpos in FRAME umwandeln
    F_Teachpos = XTeachpos_1.X.y.z.a.b.c

    Das geht so nicht. Dann schon eher wie am Anfang zitiert:

    Code
    F_Teachpos = XTeachpos_1
    ; oder
    F_Teachpos.x = XTeachpos_1.x
    F_Teachpos.y = XTeachpos_1.y
    F_Teachpos.z = XTeachpos_1.z
    .....

    Da gibt es keine Probleme mit "nicht richtig initialisierten Werten". Das kann im umgekehrten Fall passieren:

    Code
    XTeachpos_1 = F_Teachpos

    "Am schönsten" liegt im Auge des Betrachters.

  • Hallo kurz mal nachfragen....


    F_Teachpos =FRAME

    XTeachpos_1=E6POS


    F_Teachpos = XTeachpos_1


    Da kommt auch die meldung mit nicht initialisierten werten!


    Hab das auch aktuell gerade bei mir gemacht. Probs gibt es da keine....

    Hiermit verschiebe ich meinen Arbeitsraum bei jedem Produkt.


    RAUM_SGM=BASE_DATA[1]

    Verschiebung[1]=XEntnahme


    Verschiebung[1].A=0

    Verschiebung[1].B=0

    Verschiebung[1].C=0

    RAUM_SGM=BASE_DATA[1]:Verschiebung[1] ;SGM

    $WORKSPACE[1].x=RAUM_SGM.x ;Ursprung Base

    $WORKSPACE[1].Y=RAUM_SGM.Y ;Ursprung Base

    $WORKSPACE[1].Z=RAUM_SGM.Z ;Ursprung Base

    $WORKSPACE[1].A=RAUM_SGM.A ;Ursprung Base

    $WORKSPACE[1].B=RAUM_SGM.B ;Ursprung Base

    $WORKSPACE[1].C=RAUM_SGM.C ;Ursprung Base



    Oder hab ich die frage jetzt nicht verstanden?

  • F_Teachpos = XTeachpos_1


    Da kommt auch die meldung mit nicht initialisierten werten!


    Hab das auch aktuell gerade bei mir gemacht. Probs gibt es da keine....

    Ja, hast du richtig verstanden. Danke nochmal. Mir war nur wichtig Erfahrungen aus der Praxis einzuheimsen:zwink:. Da du das aber auch verwendest und ich es jetzt schon mehrmals gelesen/vorgeschlagen bekommen habe, werde ich das auch so umsetzen.

    Hermann hatte das ja auch schon beschrieben, dass das geht. :supi:

  • Wie wandel ich am schönsten und kompaktesten die Teachpositionen in ein FRAME für die spätere Berechnung um?

    Kannst auch da den geometrischen Operator verwenden.


    Wichtig ist immer der rechte Operand. Dieses gibt Dir den Datentyp. Also bescheiss es zusammen und häng doch einfach noch ein Frame mit alles Nullen wie $nullframe dran.


    im .dat deine geteachte Position zu Base[10] ; Base Deines Tisches.

    DECL E6POS XTeachpos_1={X 44.6603508,Y 48.8358307,Z -245.740219,A -122.658813,B -89.8507538,C -147.763382,S 2,T 10,E1 0.0,E2 0.0,E3 0.0,E4 0.0,E5 0.0,E6 0.0}


    in .src dann sowas:


    BASE_DATA[11]=BASE_DATA[10] : XTeachpos_1 : $NULLFRAME

    Manche Maenner bemuehen sich lebenslang, das Wesen einer Frau zu verstehen. Andere befassen sich mit weniger schwierigen Dingen z.B. der Relativitaetstheorie.

  • Sorry das ich mich jetzt noch mal melde wegen offtopic und so .....


    heißt das im umkehrschluss das was ich geschrieben habe....


    RAUM_SGM=BASE_DATA[1]

    Verschiebung[1]=XEntnahme


    Verschiebung[1].A=0

    Verschiebung[1].B=0

    Verschiebung[1].C=0

    RAUM_SGM=BASE_DATA[1]:Verschiebung[1]


    ist das Gleiche wie wenn ich schreibe....


    RAUM_SGM=BASE_DATA[1]:XEntnahme:$NULLFRAME


    Hat der Raum sgm in beiden Fällen das selbe Ergebnis? Also von den Werten her? Kann’s gerade nicht mehr testen.


    grüsse

  • Bei Variante 1 verschiebst Du nur in XYZ, da Du ja explizit ABC 0 setzt. Also nicht das Gleiche.


    Bei Variante 2 verschiebst Du's über XYZABC, was Maverick ja will. Er will die Schräge des Bauteilträgers. Du aber nicht in $WORKSPACE[1].x=RAUM_SGM.x

    $NULLFRAME anzuhängen macht schlussendlich einfach das Ergebnis rechts vom "=" von einer E6POS zu einem Frame nach Konventionen des Geometrischen Operators.

    Manche Maenner bemuehen sich lebenslang, das Wesen einer Frau zu verstehen. Andere befassen sich mit weniger schwierigen Dingen z.B. der Relativitaetstheorie.

  • Hi,


    Okay das habe ich verstanden. Mir war bis dato nicht klar dass man ein dritter operand mit einbeziehen kann.!

    Das der dritte operand ein Nullframe hat und somit nichts passiert ausser der datentyp leuchtet mir ein .


    was aber wenn zb.


    FRAME1={X 0.0,Y 0.0,Z 0.0,A 0.0,B 0.0,C 0.0}

    FRAME2={X 5.0,Y 5.0,Z 5.0,A 5.0,B 5.0,C 5.0}

    FRAME3={X 10.0,Y 10.0,Z 10.0,A 10.0,B 10.0,C 10.0}

    FRAME4={X 15.0,Y 15.0,Z 15.0,A 15.0,B 15.0,C 15.0}


    FRAME1=FRAME2:FRAME3

    Ergebnis Frame1 ={X 15.0,Y 15.0,Z 15.0,A 15.0,B 15.0,C 15.0}



    FRAME1=FRAME2:FRAME3:$NULLFRAME

    Ergebnis Frame1 ={X 15.0,Y 15.0,Z 15.0,A 15.0,B 15.0,C 15.0}



    FRAME1=FRAME2:FRAME3:FRAME4

    Ergebnis Frame1 ={X ?.0,Y ?.0,Z ?.0,A ?.0,B ?.0,C ?.0}


    Wie verhält sich das dann ? ist der Ursprung dann immernoch FRAME2?

    könnte mir vorstellen das dass ganze von links nach rechts verschoben wird...

    Ergebnis Frame1 ={X 30.0,Y 30.0,Z 30.0,A 30.0,B 30.0,C 30.0}


    grüsse

    • Hilfreich

    Hallo Woodys,

    Mir war bis dato nicht klar dass man ein dritter operand mit einbeziehen kann.!

    Das ist auch nicht auf 3 beschränkt. Auch schon bei Palletierprogramme gesehen mit 10 "Verknüpfungen".

    so einfach ist es dann mit den Werten auch wieder nicht. Problematik fängt an mit Verdrehung.

    Hab gehofft ein Tool zu finden, wo man dies grafisch in 3D gut zeigen kann. Leider nichts gefunden.


    Hab's Dir mal in 2D versucht aufzuzeichnen.

    Kette geht von Links nach rechts. Das nächste in der "Verknüpfung" zeichnest Du nicht mehr bezüglich dem Ursprungskoordinatensystem ein, sondern gegenüber dem davor. In 3D ist es noch verwirrender.


    Manche Maenner bemuehen sich lebenslang, das Wesen einer Frau zu verstehen. Andere befassen sich mit weniger schwierigen Dingen z.B. der Relativitaetstheorie.

  • Der Robi rennt, vielen Dank für die Hilfe und Erklärungen. Ihr habt mir echt weiter geholfen.


    Anbei noch grob, wie ich das jetzt gelöst habe:


  • Leider muss ich das Thema doch gerade nochmal aufrollen...


    Ich habe das Problem, dass der Roboter ab Ablegeplatz 7 die Vor- und Nachposition "verdreht" anfahren möchte.

    Er will Achse 4 und Achse 6 verdrehen um auf den Punkt zu kommen. Die alleinige Ablegepos anfahren geht...


    Meine Positionen haben keinen Status und Turn da sie ja durch $NULLFRAME zu einem Frame geworden sind.

    Ich dachte aber, da ich die Ausrichtung der Base aufgrund der teachpositionen ja berechne, sich die Vor- und Nachposition dieser anpassen.


    Folgendes Problem gibt es aber bei der Anlage:

    Zwischen der berechneten Vorposition und Ablegebeposition passiert der Robi eine Achse4/6 Singularität. Genauso bei ablegepos -> nachpos.

    Deswegen werden alle Punkte NUR mit SPTP angefahren.


    Habt ihr Ideen wie ich dem Robi sagen kann, dass er sich die Orientierung/den Status-Turn auch auf die vorposition und nachposition berechnet??


    Könnte den so an die Ablegepos weitergeben, aber wie würde es denn bei den vor und Nachpositionen aussehen? Da ist der S/T ja anders...

    Code
    Xpos1.s = Xposteach.s
    Xpos1.t = Xposteach.t
  • Also kürzester Weg hört sich schon mal gut an, wenn das auch die Achsbewegung betrifft.

    Das eindrehen ist nämlich definitiv mehr Achsbewegung, könnte aber sein, dass es TCP bezogen wenig bis keinen unterschied macht...


    Wie würde das denn in der Syntax aussehen?
    Hab damit noch nie gearbeitet, aber mir gerade mal ein paar Dinge im Forum dazu angeguckt.

    Bekomme da aber nicht so recht den Durchblick. Bin Montag erst wieder an der Anlage und kann was testen.



    Bis dahin würde ich gerne ein paar Möglichkeiten zum "ausprobieren" haben.

    Könntest du mir beispielhaft (grob) sagen, wie so etwas aussehen könnte?


    Mein Beispielprogramm:

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