Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

WEARHOUSE DISTRIBUTIE

1. INLEIDING

Met de komst van e-commerce is de vraag naar producten toegenomen en hebben de bedrijven grote voorraden nodig en moeten ze dagelijks grote volumes verwerken. Dit omvat veel arbeidsintensieve taken zoals opslaan, verplaatsen, scannen, inspecteren, afleveren en nog veel meer. Voor een betere efficiëntie evolueren steeds meer magazijnen en distributiecentra in verschillende mate naar automatisering, van semi-autonome tot volledig autonome systemen, op basis van de vraag.

Gerobotiseerde handlingsystemen worden steeds vaker gebruikt in magazijnen en distributiecentra omdat ze flexibiliteit bieden bij het beheren van verschillende vraagvereisten en 24/7 kunnen werken.

In dit project wordt een robotarm gebruikt om pakketten van een transportband over te brengen en op een interne transportbot te laden voor opslag.

II. WERKEN

Dit is een geautomatiseerd ophaal- en transportsysteem, waarbij de 2 DOF robotarm (getoond in Figuur

2 ) kan draaien om de z-as &de x-as en heeft een grijper. De transportbot (weergegeven in

Figuur 1 ) heeft een ultrasone sensor erop gemonteerd om de afstand tot het dockingstation te detecteren. Zodra het in de buurt van het station is, draait het voertuig 180 graden terwijl het een melding naar de arm stuurt om de aankomst te informeren. Bij ontvangst draait de arm aanvankelijk uitgelijnd met de z-as, 90 graden in de richting van de transportband, om de lading ervan op te pakken met behulp van een grijper. Zodra het de lading pakt, draait de arm -90 graden en lijnt zichzelf uit met de z-as (grijper wijst naar boven). De arm begint dan rond de z-as te draaien terwijl hij naar het transportvoertuig zoekt, met behulp van OpenCV en PiCamera. Zodra het de transportbot ontdekt die tegenover de transportband is gestationeerd, draait de arm de arm verder -90 graden, naar de bot toe, over de x en plaatst de grijper bovenop de oppakbot. Later gaat de grijper open om de lading op de bot te plaatsen en geeft deze vervolgens een (Bluetooth) signaal om de lading aan te geven, terwijl deze teruggaat naar de beginpositie. Zodra het transportvoertuig deze melding ontvangt, begint het weg te rijden van het dockingstation naar de gewenste opslaglocatie.

III. LAGE PAS FILTER

We gebruikten een Low Pass Butterworth-filter om de hoogfrequente veranderingen in de x-y-z-gegevens van de camera uit te filteren. We maken een vector uit x-y-z-waarden en passen dit filter erop toe. Nadat we het filter hebben toegepast, nemen we de gemiddelde waarden van de laatste 20 elementen van de vector om de ruis te verminderen en de grafiek glad te strijken, waardoor we een nauwkeurigere positie van de bal van de PiCam krijgen.

In de Figuur 3 , de oranje lijn zijn onbewerkte gegevens (die erg luidruchtig zijn en veel fluctueren) en de blauwe lijn is gefilterde bata die vloeiend is.

IV. ELEKTRONICA

Servo: in het project worden in totaal 5 servomotoren gebruikt. 2 voor het besturen van het transportvoertuig (differentieelaandrijving). 3 worden gebruikt om de gewrichten van de robotarm te besturen.

Ultrasone sensor: Een ultrasone sensor meet de afstand tot een object met behulp van ultrasone golven. De zender in de sensor zendt met regelmatige tussenpozen korte, hoogfrequente geluidspulsen uit die zich in de lucht voortplanten en als echosignalen worden teruggekaatst naar de ontvanger wanneer ze een object raken. De afstand wordt berekend door de tijdsduur te meten tussen het uitzenden van het signaal en het ontvangen van de echo (de zogenaamde vluchttijd). Het wordt op de mobiele robot gemonteerd en gebruikt voor padplanning en detectie. Bluetooth:HC06 gemonteerd op Arduino wordt gebruikt om serieel te communiceren met de ingebouwde Bluetooth-module van de Raspberry pi.

Pi-camera:een camera die op een van de gewrichten van de robotarm is gemonteerd, wordt gebruikt om het transportvoertuig te volgen dat ergens in het dockingstation is gestationeerd.

V. CIRCUIT

Zoals we kunnen zien in de Figuur 4 we hebben drie servo's gebruikt in de Raspberry Pi.

Raspberry pi heeft slechts twee PWM-pinnen, dus we hebben onze eigen PWM-servocode geschreven om drie servo's te laten werken,

Pi cam is bevestigd aan de Raspberry Pi zoals hierboven weergegeven. De camera vindt de bal met behulp van OpenCV en vergrendelt de positie van de arm.

Arduino heeft in totaal vier componenten die eraan zijn bevestigd, zoals weergegeven in de bovenstaande afbeelding. Twee servo's, een ultrasone sensor en een HC-06 Bluetooth-module. Welke wordt gebruikt om de vrachtbot te laten draaien?

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() {

Serieel.begin(9600); Serial3.begin(9600);

links.bijvoegen (3); // bevestigt de servo op pin 9 aan het servo-object right.attach(5);

pinMode (trigger, UITGANG); pinMode (echo, INPUT); pinMode (GNND, UITGANG); pinMode (GNDD, UITGANG); pinMode(VCCC, UITGANG);

digitalWrite (VCCC, HOOG); digitalWrite (GNND, LAAG); digitalWrite (GNDD, LAAG); pinMode(LED_BUILTIN, OUTPUT);

links.schrijven(114); right.write(74);

}

void loop() {

float rawTime, cmDist; digitalWrite(trig, LOW); vertragingMicroseconden(2); digitalWrite(trig, HOOG); vertraging Microseconden (5); digitalWrite(trig, LOW); rawTime =pulseIn(echo, HOOG); cmDist =100;

while(cmDist> 4){ digitalWrite(trig, LOW); vertragingMicroseconden(2); digitalWrite(trig, HOOG); vertraging Microseconden (5); digitalWrite(trig, LOW); rawTime =pulseIn(echo, HOOG); cmDist =rawTime/invcmCosnt; Serial.println(cmDist);

}

Serieel.println(“Uit”); Serial3.println(“s”); links.schrijven(94); rechts.schrijven(94); vertraging (1000); links.schrijven(114); rechts.schrijven(114); vertraging (1700); Serial.println ("Gedraaid"); links.schrijven(94); rechts.schrijven(94); Serial.println(“Gestopt”); while(1){

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

}

}

links.schrijven(114); rechts.schrijven(74); vertraging (2500); links.schrijven(94); rechts.schrijven(94); while(1){

}

}

VI.II. Framboos

Aan het Raspberry-uiteinde moet men de Raspberry Pi verbinden met de HC-06 Bluetooth-module met behulp van de volgende opdrachten om eerst te vinden,

$         hcitool scan        # Kan worden overgeslagen als de MAC-ID van de Bluetooth bekend en beschikbaar is

En maak vervolgens verbinding met de vereiste Bluetooth met de juiste MAC-ID:

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

Als dit met succes wordt uitgevoerd, is de Bluetooth verbonden.

importeer de benodigde pakketten uit collecties import deque

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

importeer RPi.GPIO als GPIO

serienummer importeren

GPIO.setmode(GPIO.BCM) GPIO.setup(12, GPIO.OUT) # Gripper 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)

blauw =serieel.Serial(“/dev/rfcomm0”, baudrate=9600) print(“Bluetooth verbonden”)

def duty(hoek):
retourhoek * 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=”pad naar het (optionele) videobestand”) ap.add_argument(“-b”, “–buffer”, type=int, default=64,
help=”max buffergrootte”) 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[“buffer”])

als er geen videopad is opgegeven, pak dan de referentie # naar de webcam

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

pak anders een verwijzing naar het videobestand anders:

vs =cv2.VideoCapture(args[“video”])

laat de camera of het videobestand opwarmen time.sleep(2.0)

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

pak het huidige frameframe =vs.read()

behandel het frame van VideoCapture of VideoStream frame =frame[1] if args.get(“video”, False) else frame

als we een video aan het bekijken zijn en we hebben geen frame gepakt, # dan hebben we het einde van de video bereikt

als frame Geen is:
break

verklein het frame, vervaag het en converteer het naar de HSV # kleurruimte

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

maak een masker voor de kleur "groen", voer vervolgens # een reeks verwijdingen en erosies uit om eventuele kleine # klodders in het masker te verwijderen

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

vind contouren in het masker en initialiseer het huidige # (x, y) midden van de bal

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

ga alleen verder als er minstens één contour is gevonden als len(cnts)> 0:

zoek de grootste contour in het masker en gebruik dan

het om de minimale omsluitende cirkel en # zwaartepunt te berekenen

c =max(cnts, key=cv2.contourArea)
((x, y), straal) =cv2.minEnclosingCircle(c) M =cv2.moments(c)
center =(int(M [“m10”] / M[“m00”]), int(M[“m01”] / M[“m00”])) # ga alleen verder als de straal een minimumgrootte heeft
als straal> 10:

teken de cirkel en het zwaartepunt op het frame, # werk vervolgens de lijst met gevolgde punten bij 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_oud =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

update de puntenwachtrij pts.appendleft(midden)

voor i binnen bereik(1, len(pts)):

als een van de gevolgde punten Geen is, negeer dan # ze

als pts[i – 1] Geen is of pts[i] Geen is:
ga verder

bereken anders de dikte van de lijn en # teken de verbindingslijnen

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

toon het frame op ons scherm cv2.imshow(“Frame”, frame) key =cv2.waitKey(1) &0xFF

als de 'q'-toets wordt ingedrukt, stop de lus if key ==ord("q"):

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

zo niet args.get(“video”, False):vs.stop()

laat anders de camera los:

vs.release()

sluit alle vensters cv2.destroyAllWindows() return x, voeg toe

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

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)

probeer:
while True:
data =blue.readline() # data =data.decode()

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

print(“niet”) # ga verder

anders:print(“gevonden s”) grip(80)

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

behalve KeyboardInterrupt:GPIO.cleanup() print(“Quit”)

VII. CONCLUSIE

In dit project hebben we een vrachtafhandelingssysteem geïmplementeerd voor magazijnautomatisering. Een robotarm pakt artikelen op van een transportband, zoekt het transportvoertuig met behulp van een daarop gemonteerde camera, laadt de bestelling op het voertuig waarna het transportvoertuig de goederen vervolgens naar de gewenste locatie brengt voor verdere verwerking. Magazijnautomatisering wordt steeds gebruikelijker in zowel grote als kleine bedrijven vanwege de groeiende vraag van klanten en de groei in e-commerce. De Goods to People (GTP) is een nieuwere opkomende trend waarbij goederen naar de werknemers worden verplaatst in plaats van werknemers naar artikelen. Volgens Nathan Busch, associate consulting engineer bij Bastian Solutions Inc.:“De doorvoersnelheden van GTP-systemen zijn doorgaans een stuk hoger dan bij traditionele handmatige bewerkingen. Hierdoor kunnen bedrijven hun totale bedrijfs- en orderafhandelingskosten verlagen en tegelijkertijd de doorvoer en serviceniveaus verbeteren.” Mobiele robotica is nu een cruciaal onderdeel hiervan geworden, aangezien de items worden gezocht, opgehaald en vervolgens naar hun respectieve verwerkingslocaties worden gebracht. Toekomstige reikwijdte van dit project werd breed overwogen voor een volledig autonoom magazijnsysteem, waar de artikelen die moeten worden opgeslagen door een ander systeem kunnen worden gescheiden en het hierboven gepresenteerde systeem de goederen van de transportband naar de voorraadbot kan overbrengen, die verder een optimaal pad naar de gewenste opslaglocatie en slaat de goederen op. Deze demonstratie laat zien dat het genoemde systeem in delen kan worden geïmplementeerd ten behoeve van kleinere bedrijven; daarom wordt de handmatige en robotbediening gecombineerd voor een verhoogde doorvoer en verbeterde prestaties.

Bron:WEARHOUSE DISTRIBUTIE


Productieproces

  1. Spark
  2. Titanium
  3. Biokeramiek
  4. Castanets
  5. Kraan
  6. Lijm
  7. Zandloper
  8. Thread
  9. Acetyleen
  10. Asbest
  11. Tin