Punkte verschieben durch Kamera

  • Guten Tag zusammen,


    kurze Infos zum Setup: ABB IRB_4600_60kg_2.05m mit einem Schrauber am Flansch inklusive Kamera. Ich Erstelle mir meine Wobj & Teache darin auf ein Referenzbauteil meine Punkte. Ein neuer Warenträger fährt ein und das Bauteil kann +/- 5 mm platziert liegen. Also muss ich rausfinden inwiefern sich mein Punkt zum Schraubenloch verschiebt.


    ich fahre mit meinem Tool (Ein Schrauber an diesem eine Kamera hängt) zu einem Schraubenloch und mache davon ein Foto, das Kamera System sagt mir x-y-z wie auch immer +/- so und so. Dann fahre ich mit dem Schrauber in Position und lasse mir wie folgt die Position neu berechnen.

    Schraube_10.trans.x:=(Schraube_10.trans.x+KameraX+KameraY);


    Würde der Befehl so funktionieren?


    KameraX & KameraY wurden angelegt "VAR num KameraX;"


    Hoffe konnte es einigermaßen verständlich erklären.


    Gruß Tobias :thumbup:

  • ANZEIGE
  • So ganz grob passt das schon,

    Allerdings frage ich mich warum Du KameraX und KameraY auf den x-Wert addierst und nicht x auf X und y auf Y?

    Code
    Schraube_10.trans.x:=(Schraube_10.trans.x+KameraX);
    Schraube_10.trans.y:=(Schraube_10.trans.y+KameraY);

    Das setzt dann aber voraus, dass Kamera- und WerkobjektKoordinatensystem gleich ausgerichtet sind, die Kamera mm-Werte rausgibt und sauber kalibriert ist.

  • So ganz grob passt das schon,

    Allerdings frage ich mich warum Du KameraX und KameraY auf den x-Wert addierst und nicht x auf X und y auf Y?

    Code
    Schraube_10.trans.x:=(Schraube_10.trans.x+KameraX);
    Schraube_10.trans.y:=(Schraube_10.trans.y+KameraY);

    Das setzt dann aber voraus, dass Kamera- und WerkobjektKoordinatensystem gleich ausgerichtet sind, die Kamera mm-Werte rausgibt und sauber kalibriert ist.

    Das war natürlich nur auf die schnelle zusammen getippt. Das x sollte natürlich auf X addiert werden und y auf Y. Ups :D


    Ging nur um den Grundgedanken ob das so passen könnte.

    Nächste Frage wäre wenn ich auf die Position "Schraube_10" x & y werte addiere, ändert er dann mein Robtarget um? Also das es ständig drauf und drauf und drauf addiert ?

  • Da du dich nur im zweidimensionalen Raum bewegst, funktioniert das so


    Code
    !geht als einzeiler => hier aber darauf achten dass es nur einmalig ausgeführt wird
    Schraube_10.trans := [Schraube10_trans.x+KameraX,Schraube_trans.y+KameraY,0];

    Woher weiß deine Kamera dass Roboter (TCP) und die Kamera über den selben Ursprung sprechen damit die Offsets passen?


    Damit wird dein Robtarget 'Schraube_10" natürlich verändert. Ich würde da eine Zwischenvariable bevorzugen.


    Code
    PERS robtarget pTemp := Schraube_10;
    PERS num kTemp{2} := [KameraX,KameraY];
    
    pTemp.trans.x := pTemp.trans.x+kTemp{1};
    pTemp.trans.y := pTemp.trans.y+kTemp{2};
    
    MoveL pTemp ......

    Nicht wundern - ich mache das gern so, weil man dann bequem die Ausgangsdaten verändern kann (Kameradaten oder das Robtarget) ohne an 1000 Stellen anfassen zu müssen und gefahr läuft die Daten zu versauen.

  • Vielen Dank schon mal für deine Antwort. Aktuell bereite ich das Projekt gerade vor. Also kann es noch nicht am realen Roboter testen. Ich habe Offline in RobotStudio die Punkte geteached und eben ein Programm vorbereitet. Geplant waren erst Omron Kameras, jetzt sind es aber Cognex geworden. Am Anfang wollte ich eigentlich das Wobj verschieben indem ich mein Wobj zwischenspeicher, dann das Wobj verschiebe.


    ! ## Wobj beschreiben ## !

    Wobj_verschoben:=wobj_OP140;


    Wobj_verschoben.uframe.trans.x:=(Wobj_verschoben.uframe.trans.x+KameraX);

    Wobj_verschoben.uframe.trans.y:=(Wobj_verschoben.uframe.trans.y+KameraY);


    dann habe ich heute aber erfahren das Cognex gerne bei jedem Schraubenloch ein Bild machen würde, deshalb dachte ich mir ich Teache Quasi ein Bauteil ( Refereznbauteil ) dann schicke ich ein neues Bauteil rein, mache bei den Schraubenlöchern ein Bild und verschiebe dann mit der Differenz meine Robtargets damit ich wieder genau das Loch treffe. Hab leider keinerlei Erfahrungen mit Schraubern & Kameras. Ist mein erster Projekt in so einer Konstellation. Könnte mir aber gerne Tipps geben :)!

  • Wenn du das werkobjekt verschieben willst, kann ich nur empfehlen nicht den uframe, sondern den oframe zu verschieben


    punkte beziehen sich auf den oframe => TCP bezieht sich auf den punkt


    wie oben geschrieben benutze ich dafür gern temporäre dateien - dann kann dein werkobjekt, tcp und punkt gern eine konstante sein, ohne dass du gefahr läufst die originaldaten zu zerschießen.


    bei cognex kann ich evtl noch etwas unterstützen - bei omron bin ich raus


    deine kamera ist am roboter montiert - du solltest ihr also beibringen wo der tcp des roboters liegt (alternativ gern der oframe oder aber das robtarget) damit beide die selbe referenz benutzen.

    so kann dir die kamera direkt koordinaten senden.

    wenn du mit offsets arbeiten möchtest, braucht die kamera ein nullbild


    bei offsets wird der code für den roboter simpel da du mit der Offs Funktion arbeiten kannst.

  • Habe von Cognex keinerlei Ahnung. Das macht ein SPS Kollege. Aber schon mal gut zu wissen das du sagst das geht.

    Hätte halt gedacht die Kamera sendet mir Offsets, um die ich dann eben meine Robtargets verschiebe, wie wir oben das Beispiel mit der Schraube_10 hatten. Das denke ich sollte am einfachsten sein. Ein Referenzbild machen und von dem aus mit Offsets arbeiten. Das Wobj kann ich mit diesem Befehl beschreiben. So würde mein wobj_OP140 immer unberührt bleiben und ich würde nur das "Wobj_verschoben" verschieben.


    ! ## Wobj beschreiben ## !

    Wobj_verschoben:=wobj_OP140;


    Wieso geht der gleiche Befehl für Robtargets nicht? Habe es versucht quasi einen Schraube_10_verschoben punkt zu erstellen. Funktion nur für Wobj kommt als Syntax.

  • Zitat von Langebua

    ! ## Wobj beschreiben ## !

    Wobj_verschoben:=wobj_OP140;


    Wieso geht der gleiche Befehl für Robtargets nicht? Habe es versucht quasi einen Schraube_10_verschoben punkt zu erstellen. Funktion nur für Wobj kommt als Syntax.

    Was meinst du damit?


    wobj_verschoben := wobj_OP140 => hier scheint die struktur zu passen

    robt_verschoben:= wobj_OP140 => wenn du das so meinst, dann versuchst du vielleicht ein werkobjekt in ein robtarget zu schreiben?

    wenn ja ginge das nur über


    robt_verschoben.trans := wobj_OP140.oframe.trans


    du musst halt darauf achten, dass die datentypen (strukturen) zueinander passen


    wenn du von der kamera offsets bekommst, die passen ist das einfach.


    für die kamera-referenzierung kannst du zum beispiel zwei marken nehmen:

    marke1: auf ide fährst du mit deinem TCP

    marke2: diese erkennt die kamera als koordinate


    die beiden marken haben einen definierten abstand zueinander


    entweder teilst du der kamera nun mit, dass ihr koordinatenursprung an marke1 ist (den abstand zu marke2 kennst du ja)

    oder aber du verrechnest diesen abstand der beiden marken dann im roboter



    angenommen die kamera macht das mit dem ursprung, hast du saubere offsets (auf die ausrichtung des koordinatensystems achten!)


    und kannst simpel mit


    Code
    PERS robtarget pTemp;
    PERS wojbdata wTemp;
    var num nOffsets{2};
    
    nOffsets := [KameraOffs_x,KameraOffs_y];
    pTemp := Schraube_10;
    wTemp := wDeinWerkobj;
    
    MoveL Offs(pTemp,nOffsets{1},nOffsets{2},0),v1000,fine,toolx\wobj:=wobj0;


    und sofern die Ausrichtung aller Koordinatensysteme passt, solltest du den Punkt direkt anfahren können.


    Tipp:

    um nicht auf koordinatensystemausrichtungen achten zu müssen, benutze ich kerne den oframe des werkobjektes (verschiebe ich mit posemult) da die des Punktes und/oder des TCP meist um x 180 oder y 180 gedreht sein müssen. da wird es manchmal ätzend mit den vorzeichen.


    Da würdest du dann entsprechend statt dem offs zusatz, den PoseMult Befehl nutzen.

  • Also entweder denke ich falsch oder ich weis auch nicht. Angenommen ich habe vor mir einen Warenträger der Fixiert ist mit einem Bauteil drauf. Ich nenne es mein Referenzteil.

    Ich Teache 6 Punkte bei deinen die Kamera perfekt das Loch mittig im Bild hat. Lasse der Kamera ein Bild machen und speichere dies als Referenz ( denke so würde das mein Kollege in der Cognex einstellen ) Ich Teache dann auch noch alle 6 Schraubenlöcher so das ich das Loch perfekt Treffe. Dann schicke ich den Warenträger raus und ein neuer fährt rein. Der Roboter startet und fährt auf die erste Kamera Position, die Kamera macht ein Bild und vergleicht und merkt aha, ich bin jetzt mit dem Loch um x um 2mm verschoben. Die Kamera sendet mir den Wert "x+2mm" ich fahre Schraube_10 an und rechne so diese x+2mm drauf. Und Zack treffe ich das Loch wieder perfekt.

    VAR num KameraX;

    Schraube_10_verschoben:=Schraube_10 <- Speichere die Koordinaten von Schraube_10 Temporär ab.

    Schraube_10_verschoben.trans.x:=(Schraube_10_verschoben.trans.x+KameraX); <- Verschiebe die x+2mm durch KameraX am Robtarget.


    und fertig? Oder? Sorry falls es eine Dumme Frage ist, bin da noch nicht ganz so fit darin :(

    • Hilfreich

    Warum so kompliziert?


    MoveL Offs(schraube_10, KameraX,KamerY,0),tSchrauber,wWerkobjekt.


    Fertig.


    Da brauchst du nix verrechnen etc. ist alles nicht notwendig macht dir die Offs-Funktion. ;)


    Bedingung ist halt wie gesagt das Koordinatensysteme Kamera und deiner Box die gleiche Ausrichtung haben. ;)


    Gruß

    Wer nichts macht, macht keine Fehler!

    Wer keine Fehler macht, kann nichts daraus lernen!

    Wer nichts lernen kann, kann sich nicht weiterentwickeln!

    Wer sich nicht entwickelt, geht unter!

  • Ach sehr geil! Wusste nicht das man das Syntax Technisch so schreiben kann. Vielen Dank! :thumbup:

    Er Rechnet dadurch Quasi die Werte von KameraX & KameraY per Offsett auf die Schraube_10 Position drauf?

    Gruß

    Einmal editiert, zuletzt von Langebua ()

  • Jupp,

    du kannst das ganze natürlich auch im Bezug auf das Tool machen was dann, bei dir natürlich keinen Sinn macht.


    MoveL RelTool(schraube_10,Wertx,WertY,WertZ\Rx:=0\Ry:=0\Rz:=0).......



    Hat den charmanten Vorteil das du auch rotieren könntest um die einzelnen Achsen.

    Die rotatorischen Werte wären auch optionale Parameter und müssen nicht zwingend im Aufruf vorhanden sein.


    Man kann das auch noch weiter treiben:


    MoveL Offs(RelTool(Schraube_10,0,0,0\Rx:=nRotX),Kamerax,Kameray,0).....


    Hier könntest du um deinen Schrauberpunkt um die X-Achse rotieren und zusätzlich die Positionen im Koordinatensystem verschoben werden. ;)


    Praktisch eine Funktion in einer Funktion, nutzen wir recht häufig bei Palettierungsaufgaben bei welcher nur einzelne Positionen eine andere Orientierung benötigen, Erreichbarkeit etc.


    Gruß


    Sven

    Wer nichts macht, macht keine Fehler!

    Wer keine Fehler macht, kann nichts daraus lernen!

    Wer nichts lernen kann, kann sich nicht weiterentwickeln!

    Wer sich nicht entwickelt, geht unter!

  • Perfekt, dankeschön! :thumbup:

    Die Kamera sollte ja nicht das Problem zum einrichten sein oder?

    Die SPS Steuert den Schrauber, das ist ja kein Problem da schick ich einfach ein Signal das ich da bin und er starten kann.

    Die Kamera hängt direkt an mir ohne SPS. Von Cognex ist bei der Inbetriebnahme eh jemand dabei.

  • Da hat doch ABB sowie so eine interne Schnittstelle zu, oder täusche ich mich da?


    Das justieren Bedarf da sicherlich schon etwas Kenntnisse.


    Aber mit Cognex hab ich nur rudimentär etwas zu tun, zwecks Daten und Datenhaltung ist so etwas immer in der SPS gelagert bei uns. ;)


    Viel Erfolg.


    Gruß


    Sven

    Wer nichts macht, macht keine Fehler!

    Wer keine Fehler macht, kann nichts daraus lernen!

    Wer nichts lernen kann, kann sich nicht weiterentwickeln!

    Wer sich nicht entwickelt, geht unter!

  • Ja bei uns ist das eben auch so das sowas die SPS Kollegen machen bzw. einrichten. Bin nur auch immer gern etwas informiert bevor es losgeht. Will ordentlich vorbereitet sein.


    Dankeschön & schönen Gruß :thumbup:

  • Ja bei uns ist das eben auch so das sowas die SPS Kollegen machen bzw. einrichten. Bin nur auch immer gern etwas informiert bevor es losgeht. Will ordentlich vorbereitet sein.


    Dankeschön & schönen Gruß :thumbup:

    wenn es sich um smartkameras von cognex handelt, hat abb eine interne schnittstelle dazu und du kannst die kamera direkt ansprechen.


    sogar variablen abfragen und ändern => somit direkt in die daten des kamerajobs greifen


    das läuft dann soweit über symboltags

  • wenn es sich um smartkameras von cognex handelt, hat abb eine interne schnittstelle dazu und du kannst die kamera direkt ansprechen.


    sogar variablen abfragen und ändern => somit direkt in die daten des kamerajobs greifen


    das läuft dann soweit über symboltags

    Gibt es da etwas in der Beschreibung bzw. Anleitung? Hab davon noch nie was gehört. Wäre ja super da wie gesagt gestern Festgelegt wurde das die Kamera direkt mit dem Roboter Kommuniziert und der Schrauber über die SPS. Wenn ich da die Kamera direkt ansprechen könnte mit ner ABB schnittstelle wäre das ja ein Traum. Wenn nicht kannst mir nen kurzen Ablauf zur inbetriebnahme geben?

    Gruß Tobias

  • Ja das ganze findest du in dem Application Manual 'Integrated Vision'

    Die Kamera muss einmal im Robotstudio konfiguriert werden (wird als MAC erkannt)

    Danach kann diese über ihren Namen angesprochen werden.


    Im Grunde läuft es so:

    Die Kamera liefert ein Ergebnis (in deinem Fall also die Offsets)


    Nun kannst du mit 'CamGetResult' (zu finden n der Doku) das Ergebnis auslesen und entsprechend wegspeichern (oder halt direkt in dem Offs-Befehl nutzen => das hängt von der Struktur des Ergebnisses ab). Hierzu muss der Kamerajob allerdings auch explizit das Ergebnis als Ergebnis ausgeben, da RAPID sonst nicht in der Lage ist, dies als solches zu erkennen.


    Oder aber (und das bevorzuge ich persönlich) man arbeitet mit Symboltags die in dem Kamerajob vergeben werden.

    Diese kannst du dann mit 'CamGetParameter' oder 'CamSetParameter' manipulieren. Das bedarf etwas Absprache mti dem Kameraprogrammierer, ist aber kein Hexenwerk (im In-Sight-Explorer in der Tabellarischen Ansicht einfach via Kontextmenü den Symboltag für diese Zelle festlegen).


    So kannst du sehr Flexibel die Daten aus der Kamera gezielt zusammentragen und für deine Zwecke nutzen.


    Die Befehle findest du in der Hilfe (Instructions, Functionsand Data types) wenn du einfach mal 'camera' in die Suche tippst.


    Wenn du weitergehende Fragen dazu hast, helfe ich dir gern.


    Im Anhang das Application Manual für Integrated Vision

  • Vielen Dank !! Wünsche schon mal ein schönes Wochenende :thumbup:

  • Kurze Ergänzung zu Yuminists Beitrag:

    Meines Wissens nach besteht das "Integrated Vision"-Paket aus einer Kamera & dem entsprechenden Lizenzschlüssel für den Roboter... Den Lizenzschlüssel sowie die Software kann man sicherlich auch nachträglich installieren und eine eigens beigestellte Cognex-Kamera verwenden. Dazu muss man aber freundlich beim ABB-Vertrieb vorsprechen, noch ein paar Scheinchen einwerfen und bekommt dann sicherlich den Schlüssel auch ohne Kamera.

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