Base Korrektur mit Hilfe eines Laser Sensors

  • Hallo,


    Mein Problem:
    Ein KUKA Roboter greift über eine im Boden integrierte Dehnfuge die sich bis zu 15 mm verändert. Das heißt er kann das Werkstück oft nicht mehr exakt greifen.


    Meine Lösung:
    Der Roboter bekommt an den Greifer einen Laser Abstands-Sensor, der jeden Tag einen Klotz auf der anderen Seite der Dehnfuge abmisst. Dabei nimmt er jeweils zwei Punkte auf drei verschiedenen Seiten des Klotzes auf (siehe rote Punkte im Anhang) und errechnet sich anhand dieser eine neue Base, bzw. versieht die vorhandene Base mit einem Korrekturwert. Bisher bin ich soweit, das der Sensor einen schnellen Eingang am Roboter, beim Erreichen der eingestellten Entfernungen, gibt und der Roboter sich die 6 Positionen speichert.


    Meine Frage:
    Hat sich einer mit so etwas schon mal beschäftigt? Bzw. gibts bereits Lösungen?
    Wie kann ich die sechs gemessenen Punkte zu einer Base verrechnen?


    Im Voraus schon mal ein Danke!
    Grüße
    eli

  • Schritt für Schritt zum Roboterprofi!
  • Hi Elifendt,


    bekommst du über deinen Eingang einen Frame (x,y,z) angezeigt? :huh:.
    Wenn ja, würde ich einen Vergleich zwischen Sollwert und Istwert machen.
    Dann die Differenz mit Hilfe des Punkt--Separators, auf die einzelnen Koordinaten, eine Base Verschiebung machen.
    Mfg Aquin

  • Ist vielleicht ein bisschen oversized, der Lösungsansatz... oder wandert der Bereich hinter der Fuge in alle drei Raumrichtungen? Und selbst wenn, wird er kaum die Orientierung ändern...
    Ich mache für sowas immer gerne eine Lern-Routine, Robbi fährt Meßpunkte ab, vorher sagt man ihm: speichere DAS als Referenz.
    Zukünftige Messungen werden dann als Differenz davon abgebildet. Bei einer Dehnfuge würde ich ein Base in derselben Orientierung wie der Meßklotz nehmen (oder besser gesagt andersrum: den Meßklotz selbst als Grundlage des Base verwenden) und dann aus den drei Raumrichtungen (ausgehend davon, dass sich die Orientierung nicht groß ändert) jeweils einen Abstand messen. Die Differenz kann man dann direkt einzeln auf das XYZ-System des Base aufschlagen bzw. ein temporäres Base mit dem Rechenergebnis füllen, welches man hinfort verwendet. Dafür reichen an sich drei Punkte.
    Wenn man Orientierungsänderungen berücksichtigen will plus die Verschiebung, bräuchte man 5 Punkte, das wird dann ein bisschen aufwendiger, noch schlimmer wird's, wenn für größere Genauigkeit auch die Meßpunkte mitwandern sollen und man den Würfel erst suchen muss.


    Was ich nicht ganz verstehe bei Deiner Applikation: normalerweise gibt ein Lasersensor doch einen analogen Messwert zurück. Bisher habe ich es mit solcher Hardware dann so gehalten, dass ich mit dem Robbi feste Punkte angefahren hab und den Sensor dann habe messen lassen. Sollte eigentlich genauer sein.
    Aber wenn der Sensor das hergibt sollte auch das digitale Verfahren gehen, warum nicht.


    Grüße,
    Michael

  • Hi,


    dein Problem kommt mir sehr bekannt vor. Stand vor dem selben Problem.


    Mein Ansatz war mit einem Mess-Programm meine Referenzwerte zuerfassen, diese Werte habe ich dann fest eingetragen. Mit jedem neuen Aufruf von dem Messprogramms wurde dann die Position abgespeichert und in einem anderen Programm verrechnet. Daraus habe ich dann meinen Korrekturwert erzeugt und im eigentlichen Bearbeitungsprogramm mit : mit der Base verrechnet.


    Ich habe mal das Messprogramm und das rechenprogramm angehangen. Ich hoffe es hilft dir weiter, für fragen bin ich immer offen, aber auch für Verbesserungsvorschläge.


    MfG
    Chris

  • Zur Verständlichung:
    Ich fahre mit der LIN-Funktion auf einer Achse (X,Y,Z) im Tool-Koordinaten-System auf den Messklotz zu. Bei 20 cm Abstand zum Messklotz kommt ein digitales Signal vom Sensor. Dieser geht direkt auf den schnellen Eingang am Roboter. Durch die logische 1 wird ein Interrupt aufgerufen, der dann die aktuelle Position des Roboters speichert.
    Stimmt, es ist oversized, aber wenn ich das Problem schon angehe, würde ich auch gern alle 6 Achsen abgleichen um alle möglichen Verschiebungen auszugleichen.
    Das Suchen des Würfels würde ich ausschließen, indem ich die Messpunkte beim ersten Vermessen im Abstand von 15 mm zum Rand aufnehme.
    Mein Problem liegt eigentlich darin, anhand den 6 vermessenen Koordinaten ein Koordinatensytem aufzuspannen, mit dem ich dann die "alten" Base-Koordinaten korrigieren kann.
    Aber danke schon mal für eure Anregungen!
    Gruß
    ELi

  • Bin mittlerweile soweit:
    _______________________________


    DEF main1( )

    ;wenn schneller Messeingang kommt, Unterprogramm posspeicher abarbeiten
    INTERRUPT DECL 1 WHEN $MEAS_PULSE[1] DO posspeicher()
    INTERRUPT ON

    ;Hilfspunkt
    P2[1]=BASE_DATA[2]


    ;Messpunkte = 0 setzen
    ;X-Achse
    P1[1]={X 0.0,Y 0.0,Z 0.0,A 0.0,B 0.0,C 0.0}
    ;B-Winkel
    P1[2]={X 0.0,Y 0.0,Z 0.0,A 0.0,B 0.0,C 0.0}
    ;Y-Achse
    P1[3]={X 0.0,Y 0.0,Z 0.0,A 0.0,B 0.0,C 0.0}
    ;A-Winkel
    P1[4]={X 0.0,Y 0.0,Z 0.0,A 0.0,B 0.0,C 0.0}
    ;Z-Achse
    P1[5]={X 0.0,Y 0.0,Z 0.0,A 0.0,B 0.0,C 0.0}
    ;C-Winkel
    P1[6]={X 0.0,Y 0.0,Z 0.0,A 0.0,B 0.0,C 0.0}

    ZAEHL = 0


    …Positionen werden abgefahren...
    __________________________________________________________
    DEF posspeicher( )

    ;in nächste Speichervariable springen
    ZAEHL = ZAEHL + 1

    ;Sensor schaltet -> aktuelle Pos. speichern
    P1[ZAEHL]= $POS_INT


    IF ZAEHL == 6 THEN
    berechnen()
    ENDIF


    END
    __________________________________________________________
    DEF berechnen()

    BASE_CORR.X = P1[1].X - P2[1].X
    BASE_CORR.Y = P1[3].Y - P2[1].Y
    BASE_CORR.Z = P1[5].Z - P2[1].Z


    END
    __________________________________


    Ich gleich aber jetzt erstmal die X-,Y- und Z-Achse ab.
    Mein Frage allerdings:
    Kann ich den BASE_CORR.X einfach so mit einem Wert belegen, den der Roboter dann automatisch berechnet?


    Grüße
    Eli

  • Ich würde - gerade bei Berechnung von Korrekturframes - diese immer erst mit $NULLFRAME initialisieren ODER halt den Ausgangsframe = Eingangsframe machen.
    so ungefähr:

    Code
    BASE_CORR=BASE_DATA[2] ;Vorbelegung und ABC-Daten rein
    BASE_CORR.X = BASE_DATA[2].X+(P1[1].X - P2[1].X)
    BASE_CORR.Y = BASE_DATA[2].Y+(P1[3].Y - P2[1].Y)
    BASE_CORR.Z = BASE_DATA[2].Z+(P1[5].Z - P2[1].Z)
    $BASE=BASE_CORR

    In dem Falle enthält dann BASE_CORR das korrigierte BASE.
    (Allerdings wohl mit Vorzeichenfehler, falls in P2 Deine Referenzwerte stehen, also andersrum subtrahieren)


    Oder eben so:

    Code
    DECL FRAME TEMPFRAME
    TEMPFRAME=$NULLFARME
    TEMPFRAME.X=P1[1].X - P2[1].X
    TEMPFRAME.Y=P1[1].Y - P2[1].Y
    TEMPFRAME.Z=P1[1].Z - P2[1].Z
    $BASE=BASE_DATA[2]:TEMPFRAME


    Geschickterweise kann man das auch in eine Funktion packen à la $BASE=berechne(eingangsframe, punktesatz) oder sowas.
    Den Aufruf der Berechnung würde ich auch auf keinen Fall ins Interruptprogramm nehmen, sondern in die übergeordnete Routine bzw. das Hauptprogramm.


    Wenn Du XYZ auf die Art berechnest, muß die Orientierung des Werkframes auch identisch sein mit der, in der Du die Meßpunkte angefahren hast. Also das hier

    Zitat

    ;Hilfspunkt
    P2[1]=BASE_DATA[2]


    so nicht machen.
    Besser in Base 2 fahren, einmal messen lassen (wenn alles top ist) und diesen Wert dann speichern, beispielweise mit einer Interrupt-Routine, die genauso aussieht wie Deine "Posspeicher", die aber nicht nach P1[ZAEHL] speichert, sondern nach P2[ZAEHL].
    Oder meinetwegen in die Interrupt-Routine sowas reinpacken wie


    Code
    ;Sensor schaltet -> aktuelle Pos. speichern
    P1[ZAEHL]= $POS_INT
    if $IN[666] then
      ;Eingang fuer Referenzfahrt ist gesetzt
      P2[ZAEHL]=P1[ZAEHL]
    endif




    INTERRUPT OFF 1 als erste Anweisung innerhalb der Interrupt-Routine ist auch sinnvoll.


    Grüße,
    Michael

  • zur Info:
    Der Abgleich der X, Y und Z Achse funktioniert bereits. Bin gerade dabei die Rotatorischen Achsen noch irgendwie mit ins Programm zu nehmen.


    Mein Programm zum Abgleich der X,Y und Z Achsen:



  • Hallo,


    es hat sich mittlerweile wieder ein Problem aufgetan. Ich bin gerade dabei den Winkel A zu korriegieren. Dabei habe ich in A_Korr[1].A den Offset der auf die Hilfs_BASE addiert werden muss. Schaut folgendermaßen aus:


    BASE_DATA[1].A = Hilfs_BASE[1].A + A_Korr[1].A


    Allerdings kann scheinbar der Roboter keinen Winkel mit einem + Operator verändern. Lieg ich da richtig? Und wie kann ich das Problem lösen?
    Ich habs auch schon mit:


    BASE_DATA[1] = Hilfs_BASE[1] : A_Korr[1]


    versucht. Allerdings hab ich die X, Y und Z Daten in der Base_DATA schon mit einem Offset versehen und will diese nicht wieder mit den X, Y und Z Daten von der Hilfs_BASE überschreiben.


    Danke schon mal im voraus


    Gruß
    Eli

  • Allerdings hab ich die X, Y und Z Daten in der Base_DATA schon mit einem Offset versehen und will diese nicht wieder mit den X, Y und Z Daten von der Hilfs_BASE


    Man kann ja im Zwischenschritt mit REAL-Werten rechnen und die dann anschließend in den Frame überschreiben, und muss nicht ausgerechnet mit den Strukturelementen des Frames hantieren.


    :vorsicht: Möchte nur schon mal drauf hinweisen, dass es ab jetzt frustrierend wird. A ist die Drehung um Z, d. h. X und Y sollten von der Drehung beeinflusst sein. Da Deine Meßpunkte für X und Y ja vor der Berücksichtigung der Drehung gemessen wurden, können sie ja nicht mehr genau sein, oder? Und das Ganze dann auch für die anderen Drehungen... im Prinzip macht die Sache also nur dann Sinn, wenn Du den Schnittpunkt der Messflächen des Klotzes im Raum herausfändest. Dafür fehlt Dir dann aber noch mindestens eine Messung....


    Michael

  • Stimmt allerdings!


    Um das Problem zu beseitigen fällt mir diese Lösung ein: Ich vermesse jeweils zwei Punkte auf jeder Seite des Würfels, berechne daraus die Drehungen und korrigiere die A,B und C Werte der BASE_DATA.
    Danach fahr ich dann erneut auf der jeweiligen bereits korrigierte Achse in Stoßrichtung auf den zu messenden Würfel zu und korrigiere dann erst die X, Y und Z Werte der Base.


    Wäre das möglich?


    Gruß
    Eli

  • Hallo,


    komplett neuer Plan, da der alte mit ziemlicher Sicherheit nicht funktioniert.


    Ich nehme auf 3 unterschiedlichen Seiten des Messklotzes jeweils 3 Messpunkte auf (insgesamt 9 Messpunkte). Aus den jeweils 3 Messpunkten auf den 3 Seiten spann ich 3 Ebenen auf. Wenn ich jeweils 2 Ebenen miteinander schneide, bekomme ich eine Gerade im Raum als Ergebniss. Somit bekomme ich 3 Geraden im Raum. Zugleich kann ich einen Nullpunkt bestimmen, indem ich die 3 Ebenen schneide.
    Damit ich die Veränderung zur eigentlich Basis feststellen kann, wird zuerst eine Referenzfahrt (nach der 3-Punkte-Basisvermessung) angefahren. Bei einer Veränderung wird dann ein Abgleichprogramm aufgerufen, bei dem ebenfalls ein Nullpunkt und durch die Verschiebung der Geraden zu den Referenzgeraden ein Winkel berechnet wird.


    Was meint ihr? Ist das umsetzbar?


    Grüße
    Eli

  • Hallo,
    Ich hab jetzt die Lösung:


    -> 9 Punkte vermessen -> 3 Ebenen aufspannen
    -> jeweils 2 Ebenen schneiden -> Schnittgeraden berechnen -> Winkel aus den Schnittgeraden berechnen
    -> alle 3 Ebenen schneiden -> Nullpunkt berechnen


    Dieser Vorgang wird zum 1. mal nach der 3-Punkte-Base-Vermessung als Referenzfahrt durchgeführt.
    Danach wird dann eine Ablgeichsfahrt angewählt, die dann die verschobenen Punkte mit den Referenzpunkten vergleicht und in der Base korrigiert!


    Im Anhang die Berechnung im Programm (ist vielleicht noch etwas umständlich geschrieben, aber es funktioniert!)

  • funktioniert fast - verdammt!


    Irgendwo in meinen Berechnungen steckt noch ein Denkfehler.
    Ich glaube auch zu wissen wo: Ein Nullpunkt vom Referenz-Würfel wird berechnet. Dieser ist aber nicht gleich dem Ursprung der Base. Das heißt, wenn sich der Wüfel um seinen Nullpunkt dreht (A,B,C-Winkel) verändert sich zwar der Nullpunkt und die X,Y und Z Position des Würfels NICHT, aber die Koordinaten des Ursprung der Base.


    Hat jemand einen Lösungsvorschlag?


    Gruß
    Eli

    Einmal editiert, zuletzt von elifendt ()

  • Das war auch meine Idee, den Würfel einfach als Base verwenden. Allerdings ist das in der Praxis wahrscheinlich nicht umsetzbar, weil die zu vermessende Base vorgegeben wird und der Würfel irgendwo anderst in der Base befestigt wird.
    Allerdings gibt es eine Lösung auf das Problem (wurde von einem Kollegen gelöst)!
    Der letzte Teil des Programms wurde von:


    auf diese weise geändert:


    Und jetzt funktioniert auch die ganze Sache!!!!


    Danke für eure Hilfe!


    Grüße
    Eli

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