Beiträge von atw12az5

    Da P1, P2 und der gewünschte Zielpunkt (sei: P3) auf einer Geraden liegen könnte man P3 einfach berechnen.


    Pseudocode:

    Code
    P1P2vektor = P2-P1
    P1P2vektorBetrag = Wurzel(P1P2vektor.x^2 + P1P2vektor.y^2 + P1P2vektor.z^2)
    P1P2normVektor = P1P2vektor/P1P2vektorBetrag
    
    
    FRAME P1P3 = [distance*P1P2normVektor.x,distance*P1P2normVektor.y,distance*P1P2normVektor.z,0,0,0]
    FRAME P3 = P1 : P1P3 
    
    
    LIN P3



    Edit: Zu langsam... Und: Wieso so kompliziert? Liegen die Punkte doch nicht auf einer Geraden? :denk:

    Bezüglich $MOVE_ENABLE
    Wir haben das immer auf 1 ($IN[1025]) gebügelt (ebenso $DRIVES_OFF)
    Dazu muss man $CHCK_MOVENA = FALSE einstellen. Habs nicht im Kopf, ist aber glaub ich der STEU/MADA/option.dat


    Bezüglich "überprüfung der achsstellung und der heimfahrt"
    Kannst das vielleicht etwas ausführlicher darlegen? Würd mich interessieren, was Du da genau machst.

    Hinweis zum automatischen Anstarten:


    Man sollte in der übergeordneten Steuerung auf ($ON_PATH oder $IN_HOME) überprüfen bevor man $EXT_START schickt.
    Sonst kann der Anwender folgenden "lustigen" Crash fabrizieren:
    - Mitten im Ext Ablauf auf T1 schalten
    - Den Roboter verfahren auf eine Position wo es auf dirketem Weg zur Position im Programm zum crash kommt.
    - Wieder auf EXT schalten
    - Programm das noch angewählt ist wird gestartet und der Roboter fährt mit vollem Tempo auf die letzte Position (keine SAK im EXT)



    Bin mir nicht sicher, aber ich glaub das könnte auch passieren wenn man das Programm zwar abgewählt hat (automatisch zb), aber nicht das cell.src verwendet und ein Programm anwählt, welches kein "Check Home" drin hat.



    Zu Deiner Frage:
    Bin mir sicher ob ich Dich richtig verstehe, aber Du kannst ja mit der übergeordnenten Steuerung den Startvorgang automatisch durchfüren sobald der Ausgang $EXT des Roboters ansteht.
    Also: Umschalten auf EXT:
    - Programm wird automatisch angewählt (wie hier im Thread besprochen im sps.sub)
    - Der Ausgang $EXT steht an und übergeordnete Steuerung startet automatisch an (CONF_MESS DRIVES_ON EXT_START, ...)

    1. Praktisch der Roboter nimmt 4 Messbauteilen und liegt diese aufs Kameramessfeld.
    ..."
    Hört sich nicht so an, als ob die Kamera am Roboter montiert wäre. ---> keine Hand-Eye-Calibration.


    Hand-Eye-Calibration kann man auch in dieser Konfiguration machen:
    ZB.: http://www.halcon.de/download/…hand_eye_calibration.html



    @privjet:
    Du drehst Dich im Kreis...
    Willst Du jetzt wissen wie man aus Punkten eine Basis rechnet? Dazu hast Du ja am Beginn des Threads antworten bekommen...
    Oder willst Du wissen wie Du Die Position der Kamera zum Roboter bestimmst? Dazu hab ich Dir 2 Methoden geschildert. (Antasten mit Dorn bzw Hand-Eye-Calibration)
    Aus den Messpunkten der Kamera allein eine Basis zu rechnen ist schön und gut, nur der Roboter weiß dann nicht wo die Basis liegt. (Einfache Überlegung: Stell den Roboter 2 Meter weit weg. Die Basis würde sich nicht ändern.)

    Mehr Senf:
    Den Pfadnamen immer auf "Disk" lassen auch wenn man den Pfad von a:\ auf ein anderes Speichermedium (Platte, Stick) ändert.


    Hab neulich "Disk" rausgelöscht und angelegt:
    "Harddisk"
    "C:\archive\archive.zip"
    -> ging nicht...


    geändert auf:
    "Disk"
    "C:\archive\archive.zip"
    -> klappte

    Naja wie ich sagte:
    Roboter in Stellung 1 fahren, TCP Werte und Kameramesswerte speichern.
    Roboter in Stellung 2 fahren, TCP Werte und Kameramesswerte speichern.
    ...
    Roboter in Stellung n fahren, TCP Werte und Kameramesswerte speichern.


    Die Stellungen legst Du einmal fest sodaß die Kamera in ihren Anbringunstoleranzen das Messobjekt immer sieht und die Kameramessungen den Anforderungen des Hand-Eye-Calibrations-Algorithmus entsprechen.
    Aus den n Datensätzen kannst Dir dann die Stellung der Kamera zum TCP errechnen.
    (Weiters brauchst Du natürlich noch eine automatisierte Routine zur intrinsischen Kalibrierung der Kamera, obiges ist nur die extrinsische.)


    Wenn Du die Kamera dann neu anbringst (und intrinsisch kalibriert hast) lässt Du obigen Ablauf wieder durchlaufen und Du hast die aktuelle Stellung der Kamera zu TCP



    Falls Deine Frage ist WIE man das rechnet, google mal danach und les Dich ins Thema ein :mrgreen:




    Und jetzt noch der zielführendere Tipp:
    Überleg mal ob Du das Zeug wirklich benötigst!
    Kamera kannst auch vermessen indem Du zb ein Messobjekt mit einem Dorn am Roboter antastest + eine Kameramessung.
    Das Antasten ist natürlich nicht automatisierbar, aber die Position der Kamera am Roboter sollte sich ja nicht soooo oft ändern oder?
    Wenn Du es wirklich brauchst kauf Dir eine Software die das kann, das Thema ist komplex und das kann man nicht so einfach selber rechnen.

    Ist es wie eine Vektoraddition?


    Jein.


    A:B rechnet:
    bezüglich x y z:
    Vektor von A
    + Koordinatensystem verdrehen um die Orientierung von A
    +Vektor von B


    bezüglich a b c:
    Orientierung von A
    + Orientierung von B


    Die Orientierung von B ist also für x,y,z des Ergebnisses egal
    und x,y,z von A und B sind für a,b,c des Ergebnisses egal


    (stark vereinfachte darstellung :D )

    Hmm...


    Abbruch einer Fahrbewegung mit Interrupt:
    (1) Brake/Resume im Interruptprogramm
    (2) Fahrbewegeung mindestens eine Ebene tiefer als Interruptdeklaration
    (3) Voraufzeiger noch nicht in der Ebene der Interruptdeklaration



    (2) ist hier nicht gegeben und (3) nicht sichergestellt


    oder überseh ich hier was? :denk:


    Eine Verknüfung von mehreren Variablen mit XOR verhält sich so, dass sie genau dann wahr ist, wenn eine ungerade Anzahl der Eingänge wahr ist (in dem Fall wie schon erwähnt einer oder drei)





    Hallo,


    wie erreiche ich dann, dass in dieses IF gesprungen wird,wenn nur ein einziger Eingang dieser 4 da ist!


    $CYCFLAG


    Hmm...
    Mir fällt ad-hoc nichts eleganteres ein als:
    (A and not B and not C and not D) or (not A and B and not C and not D) or (not A and not B and C and not D) or (not A and not B and not C and D)

    Mein Minimalbeispiel war zu kurz... :)



    Falls fehler und bedingung beide true sind werden beide if bedingungen erfüllt. Damit wechselt machwas (=digitaler ausang) so schnell seinen Zustand, dass der Gegenpart die Änderung gar nicht bemerkt.

    Also die Zykluszeit des submit ist sicherlich nicht dauerhaft so hoch. Ich arbeite da vieles ab und der Großteil geht normal.


    Schleifen gibt es auch keine. Ein wait sec 0.1 hab ich drin, aber damit ists wohl auch nicht erklärt.



    Ich komm dem Fehler nicht auf die Spur... :kopfkratz:



    Bei einer if Abfrage im submit werden 4 digitale Aus- bzw. Eingänge abgefragt. Kann das eventuelle eine Verzögerung bewirken?
    (Macht nicht viel Sinn, denn diese Verzögerung wäre auch immer da)

    int/int lieftert einen gerundeten int.
    In der Real Variable steht natürlich ein Real (was sonst? :) ), aber nicht der gewünschte:


    Code
    int a
    real b,c
    
    
    a = 123
    b = a/10    // b = 12.0
    c = a/10.0  // b = 12.3

    real StichVonSPS_neu


    StichVonSPS_neu = StichVonSPS/10.0



    (das "komma null" ist sorgt dafür, dass der operator "/" eine realzahl liefert (int/real->real) int/int also /10 würde einen gerundeten int liefern )



    //edit: zu langsam :zwink: