User Tools

Site Tools


projects:farmrobot:realcode_g-code

This is an old revision of the document!


Realcode G-code

Tests

Allgemeine Informationen

Um den Delta Arm mit Objekterkennung zu testen, wird OpenCv verwendet. Das Skript erkennt grüne Objekte und weist den Drucker an, die Position des Objects anzufahren. Es funktioniert in folgenden Schritten:

  • Durch eine Kamera ist ein grünes Objekt erkannt werden
  • Das oben erfasste Bild laden, Farbräume und Glättung ändern
  • die Kontur des Objekts finden und die Kontur zeichnen. Hier werden die XY-Positionen bestimmt. Außerdem wird der Mittelpunkt der Positionen berechnet
  • G-Code mit der Position des Objekts senden

OpenCV

Für die Entwicklung der Objekterkennung wird OpenCV verwendet, eine Bibliothek für Bildverarbeitung / Bildanalyse.

Command

Bilder

Code block

import cv2
import serial
import time
import imutils
import math
from gcodesender import *
 
# detect only green obj
greenLower = (29, 86, 6)
greenUpper = (64, 255, 255)
 
feedrate = 4200 # mm/min   #  4300 mm/min is too fast, and the robot arm cant keep up
z_pos = 170  
nextCommandTime = 0
 
camera = cv2.VideoCapture(0)
 
gcsender = GCodeSender('COM7')
 
while True:
    ret, frame = camera.read()
 
    # frame = imutils.resize(frame, width=600, height=300)
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
 
    mask = cv2.inRange(hsv, greenLower, greenUpper)
    mask = cv2.erode(mask, None, iterations=2)
    mask = cv2.dilate(mask, None, iterations=2)
 
    cnt, hierarchy = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2:]
    if nextCommandTime < time.time():
        for c in range(len(cnt)):
            # determine positions + bounding box
            x, y, w, h = cv2.boundingRect(cnt[c])
            cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
 
            # center positions
            x2 = int(x + w / 2)
            y2 = int(y + h / 2)
 
            # send G-Code and capture time needed for operation
            timeToWait = gcsender.send(x2, y2, z_pos, feedrate)
            # calculate next time a command can be issued
            nextCommandTime = time.time() + timeToWait
            print('timetowait: ' + str(timeToWait) + '\n')
 
 
            # draw center in bounding box
            cv2.circle(frame, (x2, y2), 4, (0, 255, 0), -1)
 
    cv2.imshow("Frame", frame)
    cv2.imshow("Mask", mask)
 
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
 
gcsender.cleanup()
camera.release()
cv2.destroyAllWindows()
projects/farmrobot/realcode_g-code.1615124988.txt.gz · Last modified: 2021/03/07 13:49 by miki