Beiträge von JDab

    Eigentlich nicht. Gehe sicher, dass die Koordinaten, die du enträgst, auch die Richtigen sind (Koordinatensystem etc. beachten!).


    Es könnte helfen, wenn du Radius, Beschleunigung, Geschwindigkeit mit aufnimmst, wenn du den Befehl schreibst.

    movej(Position_A, a=1.0, v=1.0 r=0)


    Ich bin das ganze Problem mit get_invers_kin umgangen, in dem ich die Positionen, die per movej angefahren werden, alle im Basis-Koordinatensystem abgespeichert habe. Damit hatte ich keinerlei Probleme beim Verfahren.

    Hi,


    du kannst einzelne Positionen direkt aufrufen und mit diesen weiterrechnen. Ich nutze deine angegebene Position p als Beispiel:


    p[0.65397,0.01392,0.1745,2.319,-2.108,0.003]

    bedeutet im Endeffekt nichts anderes als:

    p[ X = 0.65397, Y = 0.01392, Z = 0.1745, RX = 2.319, RY = -2.108, RZ = 0.003]

    oder

    p[0, 1, 2, 3, 4, 5]


    Du kannst nun mit folgender Funktion eine einzelne Position (wir werden Z nehmen) aufrufen und zum berechnen verwenden, dafür sollten wir die Pose an sich aber in einer Variable speichern:


    Testposition = p[0.65397,0.01392,0.1745,2.319,-2.108,0.003]

    Testposition[2] = 0.500


    Hiermit überschreiben wir den Wert an Position [2] der Variable Testposition, was dem Z-Wert entspricht (X = 0, Y = 1, Z = 2, RX = 3, ..), was in folgendem Ergebnis resultiert:


    Testposition = p[0.65397,0.01392,0.500,2.319,-2.108,0.003]


    Somit kannst du für dein Beispiel folgendes Nutzen:


    Testposition = p[0.65397,0.01392,0.1745,2.319,-2.108,0.003]


    Var_X = Testposition[0]

    Var_Y = Testposition[1]

    Var_Z = Testposition[2]

    Var_RX = Testposition[3]

    Var_RY = Testposition[4]

    Var_RZ = Testposition[5]


    Hiermit schreiben wir den Wert der Variable/Pose "Testposition" an der Stelle [n] auf die entsprechende Variable.


    Ergebnis:


    Var_X = 0.65397

    Var_Y = 0.01392

    Var_Z = 0.1745

    Var_RX = 2.319

    Var_RY = -2.108

    Var_RZ = 0.003

    Zitat

    Wenn ich einmal dabei bin hätte ich da noch allgemeine fragen.

    Bei ABB gibt es ja Robotstudio um bequemer vom PC alles zu programmieren, gibt es sowas von UR auch ? Kann man die gespeicherten Dateien mit einen Editor öffnen zwecks Offline Programmierung ? ( Ultraedit)

    Fangen wir mit dem einfachen Teil an :D Die Dateien von UR sind aufgeteilt in *.urp, (vollständige Programmdatei, die sämtliche Scripte, etc inkl. grafischer Oberfläche enthält. Wenn du das Programm auf dem Cobot abspeicherst, erhälst du dieses Format. Dann hast du noch *.script, dies ist die Text-basierte Versioni zum bearbeiteten. UR arbeitet mit einer vereinfachten Form von Python, in diesesm Format werden die Scripte abgespeichert, die du aufrufen möchtest.

    Generell kannst du sämtliche Dateien mit Notepad++ bearbeiten, ich benutze zur Offlineprogrammierung die Softwareumgebung von UR mittels VMWare. Ist sehr basic, aber zum testen auf Fehler reicht es auf jeden Fall.


    Finden kannst du die Softwareumgebung auf der Downloadseite von UR: CB-Series oder e-Series > Software > Offline Simulator > Linux > Wähle Simulator


    Ich persönlich arbeite nur mit UR-Script, d.h. ich programmiere alles über Notepad++ und teste die Scripte einmal im VMWare-Simulator auf Fehlermeldungen, bevor ist es aufs System spiele.


    Zitat

    Jetzt hat mein Bekannter auf der Messe sich eine Kamera andrehen lassen, womit er QR Codes Auslesen möchte. Soweit so gut es klappt auch. Jedoch wir der Inhalt des QR Codes in eine String Variable gespeichert. In den Codes sind nur Numerische Zahlen hinterlegt. Anhand dieser Zahlen soll der Roboter dann, das passende Produkt aufrufen. Kann man den String wieder auflösen auf eine Numerische Variable? Oder wie sollte ich sie sonst an besten abfragen

    Sind die QR-codes variabel oder hat bspw. Produkt A immer den QR-code A, Produkt B immer QR-code B, etc.?

    In dem Fall könnte man pro QR-code eine extra Variable anlegen (fest abgespeichert), die aufgerufen oder verwendet wird, wenn der entsprechende QR-code-string gescannt wird. Oder man verweist direkt mit String auf das Produkt. Was NICHT geht, ist den String mit einem Integer zu überschreiben, allerdings könnte man den Inhalt des Strings überschreiben

    Ablauf wäre hier:

    1. Scanne QR-Code

    2. QR-Code wird abgespeichert in String XYZ

    3. Switch-Case, wenn QR-Code:

    • String1 "XYZ" (String1 = "123")
    • String2 "ABC" (String2 = "456")
    • String3 "DEF" (String3 = "789"

    Das ganze ist ber recht umständlich. Ich glaube, dass es einfacher wäre, wenn man direkt mit den von der Kamera erstellten Strings weiterarbeitet, alles andere ist eigentlich nur bit-schubsen.

    Es würde definitiv helfen, wenn wir wüssten um welche Kamera es sich handelt, dann schau ich da mal direkt nach.

    Update:


    Nach langer Korrespondenz mit UR ist das Problem endlich gelöst.

    Mir ist bei einer Passage an Move-Befehlen ein copy-und paste Fehler unterlaufen:


    Bei mir sah es wie folgt aus (beispielhaft):

    Movel(pose, Radius r, Geschwindigkeit a, Beschleunigung v)

    Richtig ist es aber so:

    Movel(pose, Geschwindigkeit a, Beschleunigung v, Radius r)


    Dadurch, dass der Radius an der falschen Stelle stand, sind die Daten für den Move-Befehl falsch im Prozessor gespeichert und nicht wieder gelöscht worden, was nach einer festen Anzahl Zyklen zu einer Überlast bei Prozessor geführt hat.


    Nachdem ich die Reihenfolge im Befehl korrigiert habe und selbst bei einem nicht vorhandenen Radius auf Raten von UR am besten r=0 genutzt werden sollte, ist der Fehler bereinigt gewesen.


    Kann also geschlossen werden!

    Hi,


    ich habe jetzt zweimal die Fehlermeldung "unbekannter Fehler: ValueStack is Full" erhalten (s. Anhang). Die Kapazität ist ein 20bit-Integer, ich kann diesen Fehler nciht reproduzieren. Er kommt zufällig alle paar Tage im Dauerbetrieb auf, meist an der selben Position.


    Habe bereits danach gegoogelt, aber keine vernünftigen Lösungen gefunden. Liegt das an meiner Programmgröße?


    Zu meinem Programm:


    In der VorStart-Sequenz rufe ich meine Initialisierungsscripte auf, d.h. alle Variablen und Funktionen, die ich im Laufe des Programmablaufs benötige, werden einmalig initialisiert.

    Im Hauptprogramm laufe ich einen Switch-Case durch. In den verschiedenen Cases werden unterschiedliche Scripte aufgerufen, die wiederum auf die bereits initialisierten Funktionen zugreifen und nutzen.


    Parallel laufen im Hauptprogramm auch einige Threads, die ich regelmäßig abfrage, um Prozesszustände zu schalten (Abladekisten beladen, etc.). Diese laufen auch stabil ohne Timeouts (an sync imemr gedacht).


    Ich habe bereits geschaut, ob ich das Programm schlanker machen kann, aber leider lässt sich hier nichts weiter machen. Wenn ich die *.urp-Datei des kompletten Programms öffne, liege bei ca. 2000 Zeilen Script lt. NotePad++. Ist also auch nicht mega groß.


    Hat da jemand einen Tipp für mich?

    Puh, so eine Anwendung habe ich bisher nicht verwendet.


    Aber generell: Die Kamera scannt den QR-Code und wandelt ihn in einen String um. Du brauchst dann im Endeffekt nur die Variable, in die der String gespeichert wird, auslesen und abgleichen (z.B. mit einem Switch-Case).


    Habe mir das kurze Tutorial auf der Homepage von Robotiq angesehen, dort scheint es ähnlich zu funktionieren. Im Notfall würde ich mich an den Support von Robotiq wenden, wenn du mehr Informationen zum Thema brauchst, es kann sein, dass du die Variable nicht direkt einsehen kannst und evtl. auf UR-Script zurückgreifen musst.


    Grüße,

    Jan

    Prüfe am besten einmal wo A6 steht. Der Drehradius des Gelenks geht ja ungefähr von -360° bis + 360°.

    Wenn du jetzt bereits ziemlich nah an einer der beiden Grenzen bist und mit der kleinen Verfahrbewegung drüberkommst, versucht der Roboter die Position über die andere Richtung zu erreichen. Schau am besten mal auf welcher Position A6 in der Vorposition steht und wo A6 in der darauf folgenden Position steht.

    Hatte mal ein ähnliches Problem und bei mir war das der Grund.

    Für sowas würde ich die konfigurierbaren Ausgänge nutzen, diese sind gleich als Sicherheitssignale nutzbar. In den Sicherheitseinstellungen kannst du auch gleich die Sicherheitsart dazu einstellen.

    Welche Funktion soll der zusätzliche digitale Ausgang denn haben?

    Wie Hendrik schon gesagt hat solltest du dir eine Variable anlegen, in der du die aktuelle Höhenposition abspeicherst. Diese Variable sollte ganzzahlig sein. Dann brauchst du noch eine weitere Variable mit der Höhe einer Ebene, z.B. 10mm (Bedenke, dass bei diesen Berechnungen die Werte in [m] angegeben werden müssen, also Ebenenhoehe = 0.01


    Nun musst du, bevor du eine Position anfährst, die aktuelle Position kontrollieren und vor dem Anfahren erhöhen. Dies kannst du mit einem Scriptbefehl vor dem Anfahrpunkt und dem Musterpunkt machen:

    Code
    AnfahrPunkt_1[2] = AnfahrPunkt_1[2] + (AktuelleEbene * Ebenenhoehe)
    *Auf Anfahrpunkt fahren*
    MusterPunkt_1[2] = MusterPunkt_1[2] + (AktuelleEbene * Ebenenhoehe)
    *Auf Musterpunkt fahren*

    So berechnest du die aktuelle Höhe immer bevor du den Punkt anfährst. Da die Variable der Höhe nicht zurückgesetzt wird wenn das Programm gestoppt wird, berechnest du den Punkt immer korrekt. Bedenke bitte, dass du parallel dazu noch ein paar Variablen brauchst, um das ganze zu kontrollieren. Ich lasse einen Thread parallel laufen. Wenn eine Lage voll ist, dann erhöhe ich die AktuelleEbene um +1. Wenn eine Palette voll beladen ist, setze ich sie wieder auf 0 zurück. Das läuft bei mir auch über Threads.


    Da ich meine Palettierfunktion in UR-Script selbst geschrieben habe, da die fertige Funktion nicht genug Funktionen/Möglichkeiten bietet, kann ich nicht versprechen, dass das so 100% funktioniert.


    Ich benutze diese Berechnung jedoch in meinem Programm und es funktioniert beim Kunden einwandfrei.


    Grüße,


    Jan

    Hi, ich habe eine kurze Frage.


    Bin gerade dabei, eine erweiterte Servicefunktion für meine Cobots (UR5/CB3) zu integrieren.


    Ich lese im Endeffekt einfach die aktuelle TCP-Position aus und lasse sie von einem Pop-up ausgeben. Das sieht dann wie folgt aus:

    Code
    popup(get_actual_tcp_pose(), "Aktuelle Position:", False, False, True)

    Das Problem hierbei ist, dass nicht die komplette Länge der Position ausgegeben wird, da die Achspositionen jeweils mit 6 Nachkommastellen ausgegeben werden. Kann man dies irgendwie begrenzen bzw. in eine zweite Zeile verschieben (z.B. nach Ausgabe von XYZ einen Zeilenumbruch für RXRYRZ)?


    Danke schonmal im Voraus :)

    Hi,


    kurze Frage. Weiß jemand, ob es in URScript einen Befehl gibt, mit dem man ein Gelenk auf eine bestimmte Position stellen kann? Ich brauche dies für folgendes:


    Ich möchte eine Safetyposition einprogrammieren, auf die der Roboter aus jeder beliebigen Position selbstständig hinfahren kann. Hierfür lese ich die Werte der Gelenkpositionen aus. Ich habe es mit dem Befehl get_actual_tcp_pose ausprobiert (so wie hier in der safe home routine von UR beschrieben), allerdings funktioniert das in meinem Falle nicht, da der Greifer relativ groß ist und sich aus manchen Positionen selber erwürgt).


    Ich habe den Befehl get_actual_joint_positions gefunden, mit dem ich die Gelenkwerte auslesen kann. Ich habe mir eine Verfahrreihenfolge der einzelnen Gelenke überlegt, mit denen der Roboter aus jeder Position in die Safeposition kommt, bei der Umsetzung hapert es hier aber leider noch.


    Ich weiß, dass ich mit dem Befehl get_inverse_kin(position, qnear=[0,0,0,0,0,0]) eine Pose unter Beachtung der Gelenkpositionen anfahren kann. Gibt es einen Befehl, mit dem ich die Gelenke direkt ansteuern und bewegen kann?


    Gruß,


    JD

    Guten Morgen,


    hat jemand hier schon eine Möglichkeit gefunden, Programme schreibgeschützt abzusichern? Es gibt ja zwei Passwörter, einmal für das Programmieren und einmal für die Systemsicherheit. Kann man bestimmte Programme mit dem Safety-Passwort verschlüsseln?


    Beste Grüße

    Hi,


    bzgl der Variablen: Geh mal in deine Variablen-Tabelle und schau nach, ob die dort definiert sind. Wenn ja, kannst du die, die du nicht mehr brauchst, rauslöschen.


    Ich nutze eine ähnliche Funktion und bei mir funktioniert die Verschiebung des TCP's gut. Ich habe drei verschiedene TCP's in einem Abstand von 70mm in X von einander mit jeweils einem Greifer dran. Die X-Werte sind bei mit :


    TCP_1: X = 0.000

    TCP_2: X = -70.000

    TCP_3: X = -140.000


    Ich speicher den aktuellen TCP in einer Variable unter und weise beim Auswählen dann immer einen der drei PCB's zu:

    Code
    [...]
    Einstellen act_TCP = TCP_2
    [...]
    Einstellen act_TCP = TCP_3
    [...]
    Einstellen act_TCP = TCP_1
    [...]

    Das funktioniert bei mir zumindest. Du kannts die Zuweisung des TCP's auch über einen Thread lösen.

    In URScript definierst du globale Variablen wie folgt:

    Code
    global variablen_name = 0
    global variable_hoehe = int_hoehe
    global punkt_teach_in = p[0,0,0,0,0,0]

    Dafür fügst du einfach eine Script-Zeile ein und tippst dort deine Definition ein. Beachte allerdings, dass du einer Variable in script immer gleich einen Wert zuweist. Entweder aus einer anderen Variable, einen Punkt oder einen Zustand, Wert etc.

    Programmierst du mit URScript oder mit GUI?


    In URScript könntest du das ganze mit einer While-Schleife lösen, die du beendest, sobald Position_fürs_Abschalten erreicht wird. Dies kannst du mit einer einfachen If-Abfrage lösen.


    Wenn du die GUI zum Programmieren nutzt, dann könntest du z.B. eine Schleife mit Endbedingung nutzen.


    Hierfür eignen sich bei UR Threads ziemlich gut, dass sind parallel-laufende Programme, die du so mit einbinden kannst. Diese werden dann häufig nur zur IO-Steuerung verwendet. Wenn du also ein Signal im Hauptprogramm setzt, kannst du dies parallel im Thread weiterverwenden und nutzen, um die Dosierung wieder zu stoppen.