This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
projects:farmrobot:realcode_g-code [2021/03/08 21:59] roman-heinrich |
projects:farmrobot:realcode_g-code [2021/03/11 21:20] (current) roman-heinrich [Pumpe] |
||
---|---|---|---|
Line 2: | Line 2: | ||
===== Code ===== | ===== Code ===== | ||
+ | <WRAP download> | ||
+ | G-Code Sender mit Beispielen: https:// | ||
+ | </ | ||
+ | Die Datei '' | ||
+ | Zuerst muss man sie importieren und ein Objekt instanziieren (Achtung: Es wird mit dem Roboterarm verbunden und eine Nullpunktfahrt ausgeführt!).\\ | ||
+ | Um '' | ||
+ | <file python> | ||
+ | from gcodesender import * | ||
+ | gcsender = GCodeSender(' | ||
+ | </ | ||
+ | Es gibt folgende Funktionen: | ||
+ | ^ Funktion ^ Erklärung ^ Parameter ^ Rückgabewert ^ | ||
+ | | gcsender.send(x, | ||
+ | | gcsender.enablePump() | ||
+ | | gcsender.disablePump() | sendet '' | ||
+ | | gcsender.cleanup() | ||
+ | Die Zeit in Sekunden bis der Arm von Punkt A nach Punkt B fährt ergibt sich wie folgt:\\ | ||
+ | <file python> | ||
+ | rel_x = x - self.last_x | ||
+ | rel_y = y - self.last_y | ||
+ | rel_z = z - self.last_z | ||
+ | t = math.sqrt(rel_x * rel_x + rel_y * rel_y + rel_z * rel_z) * (60 / f) * 0.9 # 3D Pythagoras of x,y,z * feedrate in sec/mm * calibration | ||
+ | self.last_x = x # update last position to current position | ||
+ | self.last_y = y | ||
+ | self.last_z = z | ||
+ | </ | ||
+ | Der Code behält immer die letzte Position des Armes im Speicher, um die Zeit auszurechnen.\\ | ||
+ | Indem gewartet wird bis der Arm den aktuellen Move abgeschlossen hat, und erst dann ein neuer Move gesendet wird, wird verhindert, dass sich der serielle Buffer im Arduino füllt. | ||
+ | So wird immer erst ein Move gesendet, wenn der Arm diesen direkt ausführen kann. Der aktuelle Move basiert so immer auf den aller neusten Daten aus der Object-Recognition mit YOLOv5. | ||
+ | |||
+ | ==== Pumpe ==== | ||
+ | Zum Sprühen des Herbizids wird eine Pumpe verwendet. | ||
+ | |||
+ | Das Kommando '' | ||
+ | |||
+ | <file python> | ||
+ | def enablePump(self): | ||
+ | # turn the pump on (D9 on Ramps PCB) | ||
+ | # set the pump to 100% power. 255 is full speed (12V) | ||
+ | self.ser.write(b' | ||
+ | self.ser.flush() | ||
+ | |||
+ | def disablePump(self): | ||
+ | # turn off pump completely. 0 is no speed | ||
+ | self.ser.write(b' | ||
+ | self.ser.flush() | ||
+ | </ | ||
===== Tests ===== | ===== Tests ===== | ||
Line 19: | Line 66: | ||
Der Kommando G1 wird verwendet, um die Koordinaten für die lineare Bewegung zu senden. | Der Kommando G1 wird verwendet, um die Koordinaten für die lineare Bewegung zu senden. | ||
- | ^ Parameter | + | ^ Parameter ^ Bereich ^ Erklärung |
- | | X | bra | | + | | X | -100, +100 | Links und Rechts |
- | | Y | bra | | + | | Y | -100, +100 | Vorne und Hinten |
- | | Z | bra | | + | | Z | 0, +245 | Höhe (+ is up) | |
- | | F | bra | | + | | F | < |
=== Bilder === | === Bilder === | ||
- | + | 1. Ein grünes Objekt\\ | |
- | {{: | + | {{: |
- | {{: | + | 2. Erkennung eines Objekts. Die Konsole zeigt die für den Vorgang benötigte Zeit an.\\ |
+ | {{: | ||
+ | 3. Oben ist das Bild des erkannten Objekts mit dem Begrenzungsrahmen und dem Mittelpunkt des Objekts nach der Erfassung der Koordinaten dargestellt. Das Bild unten zeigt das erkannte Objekt nach der Entrauschung. Um das erkannte Objekt zu analysieren, | ||
{{: | {{: | ||
=== Code block === | === Code block === | ||
- | <color # | + | opencv wird verwendet, um ein bestimmtes Objekt (in diesem Fall ein grünes Objekt) aus dem Video zu erkennen und die Koordinaten des Objekts zu erhalten. Um ein bewegtes Objekt zu erkennen, verwenden wir das Video anstelle des Bildes. Um den Delta-Arm in die Mitte des Objekts zu bewegen, verwenden wir eine Bounding-Box, |
- | </ | + | |
+ | <file python> | ||
import cv2 | import cv2 | ||
import serial | import serial | ||
Line 51: | Line 101: | ||
camera = cv2.VideoCapture(0) | camera = cv2.VideoCapture(0) | ||
- | gcsender = GCodeSender(' | + | gcsender = GCodeSender(' |
while True: | while True: |