Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

WEARHOUSE-VERTEILUNG

1. EINFÜHRUNG

Mit dem Aufkommen des E-Commerce ist die Nachfrage nach Produkten gestiegen und die Unternehmen benötigen große Lagerbestände und müssen täglich große Mengen verarbeiten. Dazu gehören viele arbeitsintensive Aufgaben wie Lagern, Bewegen, Scannen, Prüfen, Liefern und vieles mehr. Um die Effizienz zu steigern, bewegen sich immer mehr Lager- und Distributionszentren in unterschiedlichem Maße in Richtung Automatisierung, von halbautonomen bis zu vollständig autonomen Systemen, je nach Bedarf.

Roboterhandlingsysteme werden zunehmend in Lagerhäusern und Distributionszentren eingesetzt, da sie Flexibilität bei der Bewältigung unterschiedlicher Nachfrageanforderungen bieten und rund um die Uhr arbeiten können.

In diesem Projekt wird ein Roboterarm verwendet, um Pakete von einem Förderband zu übergeben und sie zur Lagerung auf einen internen Transportbot zu laden.

II. ARBEITEN

Dies ist ein automatisiertes Aufnahme- und Transportsystem, bei dem der 2-DOF-Roboterarm (in Abbildung . gezeigt)

2 ) kann sich um die z-Achse &die x-Achse drehen und hat einen Greifer. Der Transport-Bot (dargestellt in

Abbildung 1 ) ist mit einem Ultraschallsensor ausgestattet, der die Entfernung von der Dockingstation erkennt. Sobald es sich in der Nähe des Bahnhofs befindet, dreht sich das Fahrzeug um 180 Grad und sendet eine Benachrichtigung an den Arm, die die Ankunft informiert. Bei der Annahme dreht sich der Arm zunächst mit der Z-Achse ausgerichtet, um 90 Grad in Richtung des Förderers, um die Fracht mit Hilfe eines Greifers von diesem aufzunehmen. Sobald er die Ladung aufgenommen hat, dreht sich der Arm um -90 Grad und richtet sich selbst nach hinten mit der Z-Achse aus (Greifer zeigt nach oben). Der Arm beginnt dann, sich um die z-Achse zu drehen, während er mit OpenCV und PiCamera nach dem Transportfahrzeug sucht. Sobald er den Transport-Bot entdeckt, der gegenüber dem Förderer stationiert ist, dreht der Arm den Arm weiter um -90 Grad in Richtung des Bots um das x und platziert den Greifer oben auf dem Pickup-Bot. Später öffnet sich der Greifer, um die Ladung auf den Bot zu legen, und gibt dann ein (Bluetooth-)Signal an denselben, der die Beladung anzeigt, während er in die Ausgangsposition zurückfährt. Sobald das Transportfahrzeug diese Benachrichtigung erhält, bewegt es sich von der Andockstation weg zum gewünschten Lagerort.

III. TIEFPASSFILTER

Wir haben einen Butterworth-Tiefpassfilter verwendet, um die hochfrequenten Änderungen in den von der Kamera gelesenen x-y-z-Daten herauszufiltern. Wir erstellen einen Vektor aus x-y-z-Werten und wenden diesen Filter darauf an. Nach dem Anwenden des Filters nehmen wir die Durchschnittswerte der letzten 20 Elemente des Vektors, um das Rauschen zu reduzieren und den Graphen zu glätten, um so eine genauere Position des Balls von der PiCam zu erhalten.

In der Abbildung 3 , die orange Linie sind Rohdaten (die sehr verrauscht sind und stark schwanken) und die blaue Linie sind gefilterte Bata, die glatt sind.

IV. ELEKTRONIK

Servo: im Projekt kommen insgesamt 5 Servomotoren zum Einsatz. 2 zum Antreiben des Transportfahrzeugs (Differentialantrieb). 3 werden verwendet, um die Gelenke des Roboterarms zu steuern.

Ultraschallsensor: Ein Ultraschallsensor misst mit Ultraschallwellen die Entfernung zu einem Objekt. Der Sender im Sensor sendet in regelmäßigen Abständen kurze, hochfrequente Schallimpulse aus, die sich in der Luft ausbreiten und beim Auftreffen auf ein Objekt als Echosignale zum Empfänger zurückreflektiert werden. Die Entfernung wird berechnet, indem die Zeitspanne zwischen dem Aussenden des Signals und dem Empfangen des Echos gemessen wird (sogenannte Flugzeit). Es wird auf dem mobilen Roboter montiert und zur Bahnplanung und -erkennung verwendet. Bluetooth:HC06, montiert auf Arduino, wird verwendet, um seriell mit dem eingebauten Bluetooth-Modul des Raspberry Pi zu kommunizieren.

Pi-Kamera:Eine Kamera, die an einem der Gelenke des Roboterarms montiert ist, wird verwendet, um das Transportfahrzeug zu verfolgen, das irgendwo in der Dockingstation stationiert ist.

V. SCHALTKREIS

Wie wir in der Abbildung sehen können 4 Wir haben drei Servos im Raspberry Pi verwendet.

Raspberry Pi hat nur zwei PWM-Pins, daher haben wir unseren eigenen PWM-Servocode geschrieben, um drei Servos laufen zu lassen.

Die Pi-Cam wird wie oben gezeigt am Himbeer-Pi befestigt. Die Kamera findet den Ball mit OpenCV und verriegelt die Position des Arms.

An Arduino sind insgesamt vier Komponenten angeschlossen, wie in der obigen Abbildung gezeigt. Zwei Servos, ein Ultraschallsensor und ein HC-06 Bluetooth-Modul. Welches wird verwendet, um den Frachtbot zu betreiben?

V. CODE

VI.I. Arduino-Code:

#include

Servo links;

Servo rechts;

const int GNND =4; const int GNDD =35; const int echo =37; const int trig =39; const int VCCC =41;

float invcmCosnt =(2*1000000)/(100*344,8); //cmDist=rawTime/invcmCosnt void setup() {

Serial.begin (9600); Serial3.begin(9600);

left.attach(3); // befestigt das Servo an Pin 9 an das Servoobjekt right.attach (5);

pinMode (Trigger, AUSGANG); pinMode (Echo, EINGANG); pinMode (GNND, AUSGANG); pinMode (GNDD, AUSGANG); pinMode(VCCC, AUSGANG);

digitalWrite (VCCC, HOCH); digitalWrite (GNND, LOW); digitalWrite (GNDD, LOW); pinMode(LED_BUILTIN, OUTPUT);

left.write(114); right.write(74);

}

Leere Schleife() {

float rawTime, cmDist; digitalWrite (Trigger, NIEDRIG); VerzögerungMikrosekunden(2); digitalWrite (Trigger, HOCH); VerzögerungMikrosekunden(5); digitalWrite (Trigger, NIEDRIG); rawTime =pulseIn(Echo, HIGH); cmDist =100;

Während (cmDist> 4) {digitalWrite (trig, LOW); VerzögerungMikrosekunden(2); digitalWrite (Trigger, HOCH); VerzögerungMikrosekunden(5); digitalWrite (Trigger, NIEDRIG); rawTime =pulseIn(Echo, HIGH); cmDist =rawTime/invcmCosnt; Serial.println (cmDist);

}

Serial.println ("Out"); Serial3.println ("s"); left.write(94); right.write(94); Verzögerung (1000); left.write(114); right.write(114); Verzögerung (1700); Serial.println ("Gedreht"); left.write(94); right.write(94); Serial.println ("Gestoppt"); während(1){

if(Serial3.read()==’f’){break;

}

}

left.write(114); right.write(74); Verzögerung (2500); left.write(94); right.write(94); während(1){

}

}

VI.II. Himbeere

Am Raspberry-Ende muss man den Raspberry Pi mit den folgenden Befehlen an das HC-06 Bluetooth-Modul anschließen, um zuerst zu finden:

$         hcitool scan        # Kann übersprungen werden, wenn die MAC-ID des Bluetooth bekannt und verfügbar ist

Verbinden Sie sich dann mit der richtigen MAC-ID mit dem erforderlichen Bluetooth:

$         sudo rfcomm connect hci0 xx:xx:xx:xx:xx:xx

Wenn dies erfolgreich ausgeführt wird, ist das Bluetooth verbunden.

Importieren Sie die erforderlichen Pakete aus Sammlungen Importieren Sie deque

from imutils.video import VideoStream import numpy als np
import argparse import cv2 import imutils import time import timeit
from scipy import signal import matplotlib.pyplot als plt

RPi.GPIO als GPIO importieren

Seriennummer importieren

GPIO.setmode(GPIO.BCM) GPIO.setup(12, GPIO.OUT) # Greifer GPIO.setup(13, GPIO.OUT) # Rot_x GPIO.setup(16, GPIO.OUT) # Rot_z

rotz =16
rotx =GPIO.PWM(13, 50) gr =GPIO.PWM(12, 50)

blue =serial.Serial(“/dev/rfcomm0”, baudrate=9600) print(“Bluetooth verbunden”)

def Duty(Winkel):
Rückkehrwinkel * 5 / 90 + 2,5

def search(angle=90, add=1):servo_pwm(rotz, duty(angle), 50) ap =argparse.ArgumentParser() ap.add_argument(“-v”, „–video”,
help=„Pfad zur (optionalen) Videodatei“) ap.add_argument(“-b“, „–buffer“, type=int, default=64,
help=“max buffer size“) args =vars(ap .parse_args())
xn =np.zeros([500]) xm =np.zeros([1])
greenLower =(20, 20, 53)
greenUpper =(64 , 255, 255)
pts =deque(maxlen=args["Puffer"])

Wenn kein Videopfad angegeben wurde, greifen Sie auf die Referenz # auf die Webcam zu

wenn nicht args.get(“video”, False):
vs =VideoStream(src=0).start()

andernfalls nimm einen Verweis auf die Videodatei else:

vs =cv2.VideoCapture(args["video"])

Lassen Sie die Kamera oder Videodatei aufwärmen time.sleep(2.0)

while True:
if angle ==125:
add =-5
elif angle ==35:
add =5 angle +=add
servo_pwm(rotz, Duty(Winkel), 10) time.sleep(0.01)

nimm den aktuellen Frame Frame =vs.read()

Handle den Frame von VideoCapture oder VideoStream frame =frame[1] if args.get(“video”, False) else frame

wenn wir uns ein Video ansehen und kein Frame erfasst haben, # dann haben wir das Ende des Videos erreicht

wenn Frame None ist:
break

Ändern Sie die Größe des Rahmens, verwischen Sie ihn und konvertieren Sie ihn in den HSV-Farbraum #

frame =imutils.resize(frame, width=600) blurred =cv2.GaussianBlur(frame, (11, 11), 0)
hsv =cv2.cvtColor(blurred, cv2.COLOR_BGR2HSV)

Konstruiere eine Maske für die Farbe „Grün“ und führe dann # eine Reihe von Erweiterungen und Erosionen durch, um alle kleinen # Kleckse zu entfernen, die in der Maske verbleiben

mask =cv2.inRange(hsv, greenLower, greenUpper) mask =cv2.erode(mask, None, iterations=2)
mask =cv2.dilate(mask, None, iterations=2)

Finde Konturen in der Maske und initialisiere das aktuelle # (x, y) Zentrum des Balls

cnts =cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts =imutils.grab_contours(cnts) center =Keine

nur fortfahren, wenn mindestens eine Kontur gefunden wurde wenn len(cnts)> 0:

Finden Sie die größte Kontur in der Maske und verwenden Sie dann

es, um den minimalen umschließenden Kreis und # Schwerpunkt zu berechnen

c =max(cnts, key=cv2.contourArea)
((x, y), Radius) =cv2.minEnclosingCircle(c) M =cv2.moments(c)
center =(int(M ["m10"] / M["m00"]), int(M["m01"] / M["m00"])) # nur fortfahren, wenn der Radius eine Mindestgröße erreicht
wenn Radius> 10:

Zeichnen Sie den Kreis und den Schwerpunkt auf den Rahmen, # aktualisieren Sie dann die Liste der verfolgten Punkte cv2.circle(frame, (int(x), int(y)), int(radius),

(0, 255, 255), 2)
cv2.circle(frame, center, 5, (0, 0, 255), -1)

xn =np.delete(xn, 0) xn =np.append(xn, x) fs =300
fc =1 x_old =x
w =fc / (fs / 2)
b, a =signal.butter(5, w, 'low') output =signal.filtfilt(b, a, xn) x =np.average(xn[480:500]) print(x, x_old)
xm =np.append(xm, x) if abs(x – 300) <20:
break

aktualisiere die Punktewarteschlange pts.appendleft(center)

für i im Bereich (1, len(pts)):

wenn einer der verfolgten Punkte Keine ist, ignoriere sie #

if pts[i – 1] is None or pts[i] is None:
weiter

andernfalls berechne die Dicke der Linie und # zeichne die Verbindungslinien

Dicke =int(np.sqrt(args[“buffer“] / float(i + 1)) * 2.5) cv2.line(frame, pts[i – 1], pts[i], (0, 0, 255) , Dicke)

zeige den Rahmen auf unserem Bildschirm cv2.imshow("Rahmen", Rahmen) key =cv2.waitKey(1) &0xFF

Wenn die Taste „q“ gedrückt wird, stoppen Sie die Schleife if key ==ord(“q“):

print(xn) print(xn.shape) plt.plot(xm, label=’x’) plt.show()
break

wenn nicht args.get(“video”, False):vs.stop()

andernfalls lass die Kamera los sonst:

vs.release()

schließe alle Fenster cv2.destroyAllWindows() return x, füge hinzu

def servo_pwm(pin, duty, pulse):on =20 * duty / 100000
off =-on + 20 / 1000 für i in range(pulse):
GPIO.output(pin, GPIO.HIGH ) time.sleep(on) GPIO.output(pin, GPIO.LOW) time.sleep(off)

def grip(angle=90):
servo_pwm(rotz, duty(angle), 100) rotx.start(duty(90)) gr.start(duty(100))
time.sleep(1 ) rotx.ChangeDutyCycle(duty(0)) time.sleep(1) gr.ChangeDutyCycle(duty(180)) time.sleep(0.5) rotx.ChangeDutyCycle(duty(90)) time.sleep(0.5)

def drop():rotx.ChangeDutyCycle(duty(180))

time.sleep(1) gr.ChangeDutyCycle(duty(100)) time.sleep(1) rotx.ChangeDutyCycle(duty(90)) time.sleep(0.5)

def done():
done =„f“
done =done.encode() blue.write(done)

try:
während True:
data =blue.readline() # data =data.decode()

print(type(data), data) # if data !=„s“:

print(“Hat nicht”) # weiter

sonst:print(“found s”) grip(80)

x, add =search(80, 5) drop()
done()

außer KeyboardInterrupt:GPIO.cleanup() print(“Quit”)

VII. SCHLUSSFOLGERUNG

In diesem Projekt haben wir ein Umschlagsystem zur Lagerautomatisierung implementiert. Ein Roboterarm nimmt Artikel von einem Förderband auf, sucht mit einer darauf montierten Kamera das Transportfahrzeug, lädt den Auftrag auf das Fahrzeug, woraufhin das Transportfahrzeug die Ware zur Weiterverarbeitung an den gewünschten Ort bringt. Aufgrund der wachsenden Anforderungen der Kunden und des Wachstums im E-Commerce wird die Lagerautomatisierung sowohl in großen als auch in kleinen Unternehmen immer häufiger. Goods to People (GTP) ist ein neuer aufkommender Trend, bei dem Waren zu den Arbeitern und nicht zu den Arbeitern zu Gegenständen transportiert werden. Nathan Busch, Associate Consulting Engineer bei Bastian Solutions Inc., sagt:„Die Durchsatzraten von GTP-Systemen sind in der Regel um einiges höher als bei herkömmlichen manuellen Operationen. Dies ermöglicht es Unternehmen, ihre gesamten Betriebs- und Auftragserfüllungskosten zu senken und gleichzeitig Durchsätze und Serviceniveaus zu verbessern.“ Mobile Robotik ist dabei mittlerweile ein wesentlicher Bestandteil geworden, da die Artikel gesucht, abgeholt und dann zu ihren jeweiligen Verarbeitungsstandorten gebracht werden. Der zukünftige Umfang dieses Projekts wurde im Großen und Ganzen für ein vollständig autonomes Lagersystem in Betracht gezogen, bei dem die zu lagernden Artikel durch ein anderes System getrennt werden können und das oben vorgestellte System die Waren vom Förderer auf den Lagerbot übertragen kann, der weiter eine optimalen Weg zum gewünschten Lagerort und bevorratet die Ware. Diese Demonstration zeigt, dass das erwähnte System in Teilen zum Nutzen kleinerer Unternehmen implementiert werden kann; Kombinieren Sie daher den manuellen und den Roboterbetrieb für einen erhöhten Durchsatz und eine verbesserte Leistung.

Quelle:WEARHOUSE DISTRIBUTION


Herstellungsprozess

  1. Spork
  2. Titan
  3. Biokeramik
  4. Kastagnetten
  5. Kran
  6. Kleber
  7. Sanduhr
  8. Thread
  9. Acetylen
  10. Zinn