Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

DISTRIBUTION WEARHOUSE

1. PRÉSENTATION

Avec l'avènement du commerce électronique, la demande de produits a augmenté et les entreprises ont besoin de stocks importants et doivent gérer quotidiennement de gros volumes. Cela inclut de nombreuses tâches à forte intensité de main-d'œuvre telles que le stockage, le déplacement, la numérisation, l'inspection, la livraison et bien d'autres. Pour une meilleure efficacité, un nombre croissant d'entrepôts et de centres de distribution s'orientent vers l'automatisation à des degrés divers, des systèmes semi-autonomes aux systèmes complètement autonomes, en fonction de la demande.

Les systèmes de manutention robotisés sont de plus en plus utilisés dans les entrepôts et les centres de distribution, car ils offrent une flexibilité dans la gestion des différentes exigences de la demande et peuvent fonctionner 24h/24 et 7j/7.

Dans ce projet, un bras robotique est utilisé pour transférer les colis d'un convoyeur et les charger sur un robot de transport interne pour le stockage.

II. TRAVAIL

Il s'agit d'un système de ramassage et de transport automatisé, où le bras robotique 2 DOF (illustré sur la Figure

2 ) peut tourner autour de l'axe z et de l'axe x et dispose d'une pince. Le robot de transport (illustré dans

Figure 1 ) est équipé d'un capteur à ultrasons pour détecter sa distance par rapport à la station d'accueil. Une fois à proximité de la gare, le véhicule tourne à 180 degrés tout en envoyant une notification au bras informant de l'arrivée. A la réception, le bras initialement aligné sur l'axe z, pivote de 90 degrés vers le convoyeur, pour en prélever la cargaison à l'aide d'une pince. Une fois qu'il prend la cargaison, le bras pivote de -90 degrés en s'alignant en arrière avec l'axe z (pince pointée vers le haut). Le bras commence alors à tourner autour de l'axe z pendant qu'il recherche le véhicule de transport, en utilisant OpenCV et PiCamera. Une fois qu'il a découvert le robot de transport qui est stationné en face du convoyeur, le bras fait encore pivoter le bras de -90 degrés, vers le robot, autour du x plaçant la pince au-dessus du robot de ramassage. Plus tard, la pince s'ouvre pour placer la cargaison sur le robot, puis lui envoie un signal (Bluetooth) indiquant le chargement, alors qu'il revient à la position initiale. Une fois que le véhicule de transport reçoit cette notification, il commence à s'éloigner de la station d'accueil vers l'emplacement de stockage souhaité.

III. FILTRE PASS BAS

Nous avons utilisé un filtre passe-bas Butterworth pour filtrer les changements à haute fréquence dans les données x-y-z de lecture de la caméra. Nous créons un vecteur de valeurs x-y-z et lui appliquons ce filtre. Après avoir appliqué le filtre, nous prenons les valeurs moyennes des 20 derniers éléments du vecteur afin de réduire le bruit et de lisser le graphique, obtenant ainsi une position plus précise de la balle de la PiCam.

Dans la Figure 3 , la ligne orange est des données brutes (qui sont très bruyantes et fluctuant beaucoup) et la ligne bleue est un bata filtré qui est lisse.

IV. ÉLECTRONIQUE

Servo : un total de 5 servomoteurs sont utilisés dans le projet. 2 pour la conduite du véhicule de transport (entraînement différentiel). 3 sont utilisés pour contrôler les articulations du bras robotique.

Capteur à ultrasons : Un capteur à ultrasons mesure la distance à un objet à l'aide d'ondes ultrasonores. L'émetteur du capteur émet à intervalles réguliers de courtes impulsions sonores à haute fréquence qui se propagent dans l'air et sont renvoyées sous forme de signaux d'écho au récepteur lorsqu'elles heurtent un objet. La distance est calculée en mesurant le laps de temps entre l'émission du signal et la réception de l'écho (appelé Temps de vol). Il est monté sur le robot mobile et utilisé pour la planification et la détection de chemin Bluetooth :HC06 monté sur Arduino est utilisé pour communiquer en série avec le module Bluetooth intégré du Raspberry pi.

Pi-Camera :une caméra montée sur l'une des articulations du bras robotique est utilisée pour suivre le véhicule de transport stationné quelque part dans la station d'accueil.

V. CIRCUIT

Comme on peut le voir sur la Figure 4 nous avons utilisé trois servos dans le Raspberry Pi.

Raspberry pi n'a que deux broches PWM, nous avons donc écrit notre propre code servo PWM pour faire fonctionner trois servos,

La caméra Pi est attachée au Raspberry Pi comme indiqué ci-dessus. La caméra trouve la balle à l'aide d'OpenCV et verrouille la position du bras.

Arduino a un total de quatre composants qui lui sont attachés, comme indiqué dans la figure ci-dessus. Deux servos, un capteur à ultrasons et un module Bluetooth HC-06. Lequel est utilisé pour faire fonctionner le robot cargo ?

V. CODE

VI.I. Code Arduino :

#include

Servo gauche ;

Servo à droite ;

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);

attache.gauche(3) ; // attache le servo sur la broche 9 à l'objet servo right.attach(5) ;

pinMode(trig, SORTIE); pinMode(écho, INPUT); pinMode(GNND, SORTIE); pinMode (GNDD, SORTIE); pinMode(VCCC, SORTIE);

écriture numérique (VCCC, ÉLEVÉ); digitalWrite(GNND, LOW); digitalWrite(GNDD, LOW); pinMode(LED_BUILTIN, SORTIE);

gauche.écriture(114); right.write(74);

}

boucle vide() {

float rawTime, cmDist; digitalWrite(trig, LOW); délaiMicrosecondes(2) ; digitalWrite(trig, HAUT); délaiMicrosecondes(5) ; digitalWrite(trig, LOW); rawTime =pulseIn(écho, HAUT); cmDist =100 ;

while(cmDist> 4){ digitalWrite(trig, LOW); délaiMicrosecondes(2) ; digitalWrite(trig, HAUT); délaiMicrosecondes(5) ; digitalWrite(trig, LOW); rawTime =pulseIn(écho, HAUT); cmDist =rawTime/invcmCosnt ; Serial.println(cmDist);

}

Serial.println ("Sortie"); Serial3.println("s"); gauche.écriture(94); right.write(94); retard(1000); gauche.écriture(114); right.write(114); retard (1700); Serial.println ("Tourné"); gauche.écriture(94); right.write(94); Serial.println ("Arrêté"); tandis que(1){

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

}

}

gauche.écriture(114); droite.écrire (74); retard (2500); gauche.écriture(94); right.write(94); tandis que(1){

}

}

VI.II. Framboise

Du côté du Raspberry, il faut d'abord connecter le Raspberry Pi au module Bluetooth HC-06 à l'aide des commandes suivantes,

$         hcitool scan        # Peut être ignoré si l'ID MAC du Bluetooth est connu et disponible

Puis connectez-vous au Bluetooth requis en utilisant le bon MAC ID :

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

Si cela s'exécute avec succès, alors le Bluetooth est connecté.

importer les packages nécessaires depuis les collections import deque

depuis imutils.video import VideoStream import numpy en tant que np
import argparse import cv2 import imutils import time import timeit
de scipy import signal import matplotlib.pyplot as plt

importer RPi.GPIO en tant que GPIO

importer la série

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

bleu =serial.Serial ("/dev/rfcomm0", baudrate=9600) print ("Bluetooth connecté")

def duty(angle):
angle de retour * 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=”chemin vers le fichier vidéo (facultatif)”) 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["buffer"])

si un chemin vidéo n'a pas été fourni, saisissez le # de référence à la webcam

sinon args.get("video", False) :
vs =VideoStream(src=0).start()

sinon, récupérez une référence au fichier vidéo sinon :

vs =cv2.VideoCapture(args["vidéo"])

permettre à la caméra ou au fichier vidéo de se réchauffer time.sleep(2.0)

while True :
if angle ==125 :
add =-5
elif angle ==35 :
add =5 angle +=add
servo_pwm(rotz, devoir(angle), 10) temps.sommeil(0,01)

saisir l'image actuelle frame =vs.read()

gérer l'image de VideoCapture ou VideoStream frame =frame[1] if args.get(“video”, False) else frame

si nous regardons une vidéo et que nous n'avons pas saisi d'image, # alors nous avons atteint la fin de la vidéo

si le cadre est Aucun :
break

redimensionnez le cadre, floutez-le et convertissez-le dans l'espace colorimétrique HSV #

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

construisez un masque pour la couleur « vert », puis effectuez # une série de dilatations et d'érosions pour éliminer les # petites taches restantes dans le masque

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

trouver des contours dans le masque et initialiser le centre actuel # (x, y) de la balle

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

ne procéder que si au moins un contour a été trouvé si len(cnts)> 0 :

trouvez le plus grand contour dans le masque, puis utilisez

pour calculer le cercle englobant minimum et # centroïde

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”])) # ne procéder que si le rayon respecte une taille minimale
si rayon> 10 :

tracer le cercle et le centroïde sur le cadre, # puis mettre à jour la liste des points suivis cv2.circle(frame, (int(x), int(y)), int(radius),

(0, 255, 255), 2)
cv2.circle(cadre, centre, 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) si abs(x – 300) <20 :
break

mettre à jour la file d'attente des points pts.appendleft(center)

for i in range(1, len(pts)):

si l'un des points suivis est Aucun, ignorez-les #

si pts[i – 1] est Aucun ou pts[i] est Aucun :
continuer

sinon, calculez l'épaisseur de la ligne et # tracez les lignes de connexion

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

montrer le cadre à notre écran cv2.imshow("Frame", frame) key =cv2.waitKey(1) &0xFF

si la touche 'q' est enfoncée, arrête la boucle si touche ==ord("q") :

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

sinon args.get("video", False):vs.stop()

sinon, relâchez la caméra sinon :

vs.release()

ferme toutes les fenêtres cv2.destroyAllWindows() renvoie x, ajoute

def servo_pwm(pin, devoir, impulsion) :on =20 * devoir / 100000
off =-on + 20/1000 pour i dans la plage (impulsion) :
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(devoir (100)) time.sleep(1) rotx.ChangeDutyCycle(devoir(90)) time.sleep(0,5)

def done() :
done ="f"
done =done.encode() blue.write(done)

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

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

print("n'a pas") # continue

else :print("trouvable s") grip(80)

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

sauf KeyboardInterrupt :GPIO.cleanup() print(« Quitter »)

VII. CONCLUSION

Dans ce projet, nous avons mis en place un système de manutention de fret pour l'automatisation des entrepôts. Un bras robotique récupère les articles d'une bande transporteuse, recherche le véhicule de transport à l'aide d'une caméra montée dessus, charge la commande sur le véhicule, après quoi le véhicule de transport amène les marchandises à l'emplacement requis pour un traitement ultérieur. L'automatisation des entrepôts devient de plus en plus courante dans les grandes et les petites entreprises en raison des demandes croissantes des clients et de la croissance du commerce électronique. Le Goods to People (GTP) est une nouvelle tendance émergente où les biens sont déplacés vers les travailleurs, plutôt que les travailleurs vers les articles. Selon Nathan Busch, ingénieur-conseil associé chez Bastian Solutions Inc., « les débits des systèmes GTP sont généralement un peu plus élevés que les opérations manuelles traditionnelles. Cela permet aux entreprises de réduire leurs coûts globaux d'exploitation et d'exécution des commandes tout en améliorant les débits et les niveaux de service. La robotique mobile est maintenant devenue une partie cruciale de cela, car les articles sont recherchés, récupérés, puis acheminés vers leurs sites de traitement respectifs. La portée future de ce projet a été largement envisagée pour un système d'entrepôt entièrement autonome, où les articles à stocker peuvent être séparés par un autre système et le système présenté ci-dessus peut transférer les marchandises du convoyeur au robot de stockage, qui trouve en outre un chemin optimal vers le lieu de stockage souhaité et stocke les marchandises. Cette démonstration montre que le système mentionné peut être mis en œuvre en partie au profit des petites entreprises ; par conséquent, combinant le fonctionnement manuel et robotique pour un débit accru et des performances améliorées.

Source :DISTRIBUTION WEARHOUSE


Processus de fabrication

  1. Sport
  2. Titane
  3. Biocéramique
  4. castagnettes
  5. Grue
  6. Colle
  7. Sablier
  8. Filetage
  9. Étain