Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

РАСПРОСТРАНЕНИЕ ИЗДЕЛИЙ

1. ВВЕДЕНИЕ

С появлением электронной коммерции спрос на продукты увеличился, и компаниям требуются большие запасы и требуется обрабатывать большие объемы на ежедневной основе. Это включает в себя множество трудоемких задач, таких как хранение, перемещение, сканирование, проверка, доставка и многое другое. Для повышения эффективности все большее количество складских и распределительных центров в разной степени движется к автоматизации, от полуавтономных до полностью автономных систем, в зависимости от спроса.

Роботизированные погрузочно-разгрузочные системы все чаще используются на складах и в распределительных центрах, поскольку они обеспечивают гибкость в управлении изменяющимися требованиями спроса и могут работать круглосуточно и без выходных.

В этом проекте роботизированная рука используется для передачи пакетов с конвейера и загрузки их на внутреннего транспортного бота для хранения.

II. РАБОТАЕТ

Это автоматизированная система захвата и транспортировки, в которой роботизированная рука с 2 степенями свободы (показана на рисунке

2 ) может вращаться вокруг оси z и оси x и имеет захват. Транспортный бот (показан на

Рисунок 1 ) имеет установленный на нем ультразвуковой датчик для определения расстояния до док-станции. Оказавшись рядом со станцией, автомобиль разворачивается на 180 градусов, одновременно отправляя на руку уведомление о прибытии. При приеме рычаг, первоначально выровненный по оси z, поворачивается на 90 градусов в сторону конвейера, чтобы поднять с него груз с помощью захвата. Захватив груз, рука поворачивается на -90 градусов, выравниваясь обратно по оси Z (захват направлен вверх). Затем рука начинает вращаться вокруг оси z при поиске транспортного средства с использованием OpenCV и PiCamera. Как только он обнаруживает транспортировочного бота, который находится напротив конвейера, рычаг дополнительно поворачивает рычаг на -90 градусов по направлению к боту примерно на x, помещая захват наверху захватывающего бота. Позже захват открывается, чтобы поместить груз на бота, а затем подает сигнал (Bluetooth) тому же, указывающий на загрузку, когда он возвращается в исходное положение. Как только транспортное средство получит это уведомление, оно начнет движение от стыковочной станции к желаемому месту хранения.

III. ФИЛЬТР НИЗКОГО ПРОХОДА

Мы использовали фильтр Баттерворта нижних частот, чтобы отфильтровать высокочастотные изменения в данных x-y-z, считываемых камерой. Мы создаем вектор из значений x-y-z и применяем к нему этот фильтр. После применения фильтра мы берем средние значения последних 20 элементов вектора, чтобы уменьшить шум и сгладить график, тем самым получая более точное положение мяча от PiCam.

На рисунке 3 , оранжевая линия - это необработанные данные (которые очень шумны и сильно колеблются), а синяя линия - это отфильтрованные данные, которые являются плавными.

IV. ЭЛЕКТРОНИКА

Сервопривод: Всего в проекте используется 5 серводвигателей. 2 для управления транспортным средством (дифференциальный привод). 3 используются для управления суставами манипулятора.

Ультразвуковой датчик: Ультразвуковой датчик измеряет расстояние до объекта с помощью ультразвуковых волн. Передатчик в датчике излучает короткие высокочастотные звуковые импульсы с регулярными интервалами, которые распространяются в воздухе и отражаются обратно в приемник в виде эхо-сигналов, когда они ударяются о предмет. Расстояние вычисляется путем измерения промежутка времени между излучением сигнала и получением эхо-сигнала (так называемое время полета). Он устанавливается на мобильном роботе и используется для планирования пути и обнаружения. Bluetooth:HC06, установленный на Arduino, используется для последовательной связи со встроенным модулем Bluetooth Raspberry pi.

Pi-Camera:камера, установленная на одном из шарниров манипулятора робота, используется для отслеживания транспортного средства, находящегося где-то на стыковочной станции.

В. ЦЕПЬ

Как мы видим на рисунке 4 мы использовали три сервопривода в Raspberry Pi.

Raspberry pi имеет только два вывода ШИМ, поэтому мы написали наш собственный сервокод ШИМ, чтобы заставить работать три сервопривода,

Камера Pi прикреплена к Raspberry Pi, как показано выше. Камера находит мяч с помощью OpenCV и фиксирует положение руки.

К Arduino прикреплено всего четыре компонента, как показано на рисунке выше. Два сервопривода, один ультразвуковой датчик и один модуль Bluetooth HC-06. Что используется для запуска грузового бота?

В. КОД

VI.I. Код Arduino:

#include

Сервопривод слева;

Сервопривод правый;

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); // прикрепляет сервопривод на выводе 9 к сервообъекту right.attach (5);

pinMode (триггер, ВЫХОД); pinMode (эхо, ВХОД); pinMode (GNND, ВЫХОД); pinMode (GNDD, ВЫХОД); pinMode (VCCC, ВЫХОД);

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

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

}

void loop () {

float rawTime, cmDist; digitalWrite (триггерный, LOW); delayMicroseconds (2); digitalWrite (триггер, ВЫСОКИЙ); delayMicroseconds (5); digitalWrite (триггерный, LOW); rawTime =pulseIn (эхо, ВЫСОКИЙ); cmDist =100;

в то время как (cmDist> 4) {digitalWrite (trig, LOW); delayMicroseconds (2); digitalWrite (триггер, ВЫСОКИЙ); delayMicroseconds (5); digitalWrite (триггерный, LOW); rawTime =pulseIn (эхо, ВЫСОКИЙ); cmDist =rawTime / invcmCosnt; Serial.println (cmDist);

}

Serial.println («Выход»); Serial3.println («с»); left.write (94); right.write (94); задержка (1000); left.write (114); right.write (114); задержка (1700); Serial.println («повернутый»); left.write (94); right.write (94); Serial.println («Остановлен»); в то время как (1) {

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

}

}

left.write (114); right.write (74); задержка (2500); left.write (94); right.write (94); в то время как (1) {

}

}

VI.II. Малина

На стороне Raspberry необходимо подключить Raspberry Pi к модулю Bluetooth HC-06, используя следующие команды, чтобы сначала найти:

$ Hcitool scan # Можно пропустить, если MAC-идентификатор Bluetooth известен и доступен

А затем подключитесь к необходимому Bluetooth, используя правильный MAC ID:

$ Sudo rfcomm connect hci0 xx:xx:xx:xx:xx:xx

Если это выполняется успешно, значит, Bluetooth подключен.

импортировать необходимые пакеты из коллекций import deque

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

импортировать RPi.GPIO как GPIO

импортный серийный

GPIO.setmode (GPIO.BCM) GPIO.setup (12, GPIO.OUT) # Захват 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)

синий =последовательный. Последовательный («/ dev / rfcomm0», скорость передачи =9600) печать («Bluetooth подключен»)

def duty (angle):
угол возврата * 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 =«Путь к (необязательно) видеофайлу») ap.add_argument («- b», «–buffer», type =int, default =64,
help =«максимальный размер буфера») 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 [«буфер»])

если путь к видео не был указан, возьмите ссылку # на веб-камеру

если не args.get («video», False):
vs =VideoStream (src =0) .start ()

в противном случае возьмите ссылку на видеофайл else:

vs =cv2.VideoCapture (аргументы [«видео»])

дать камере или видеофайлу прогреться time.sleep (2.0)

while True:
if angle ==125:
add =-5
elif angle ==35:
add =5 angle + =add
servo_pwm (rotz, долг (угол), 10) время сна (0,01)

захватить текущий кадр frame =vs.read ()

обрабатывать кадр из VideoCapture или VideoStream frame =frame [1] if args.get («video», False) else frame

если мы просматриваем видео и не захватили кадр, # значит, мы достигли конца видео

если рамка отсутствует:
разрыв

изменить размер кадра, размыть его и преобразовать в цветовое пространство HSV #

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

создайте маску для зеленого цвета, затем выполните серию расширений и эрозий, чтобы удалить # все маленькие капли, оставшиеся в маске

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

найти контуры в маске и инициализировать текущий центр # (x, y) шара

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

продолжать только в том случае, если был найден хотя бы один контур, если len (cnts)> 0:

найдите самый большой контур в маске, затем используйте

это для вычисления минимального охватывающего круга и # центроида

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»])) # продолжить, только если радиус соответствует минимальному размеру
if radius> 10:

нарисуйте круг и центроид на кадре, # затем обновите список отслеживаемых точек cv2.circle (frame, (int (x), int (y)), int (radius),

(0, 255, 255), 2)
cv2.circle (рамка, центр, 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

обновить очередь точек pts.appendleft (в центре)

для i в диапазоне (1, len (pts)):

если любая из отслеживаемых точек - None, # игнорируйте их

если pts [i - 1] равно None или pts [i] is None:
continue

в противном случае вычислите толщину линии и # нарисуйте соединительные линии

толщина =int (np.sqrt (args [«буфер»] / float (i + 1)) * 2.5) cv2.line (frame, pts [i - 1], pts [i], (0, 0, 255) , толщина)

показать рамку нашему экрану cv2.imshow («Frame», frame) key =cv2.waitKey (1) &0xFF

если нажата клавиша «q», остановить цикл, если клавиша ==ord («q»):

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

если не args.get («видео», False):vs.stop ()

в противном случае отпустите камеру, иначе:

по сравнению с выпуском ()

закрыть все окна cv2.destroyAllWindows () вернуть x, добавить

def servo_pwm (pin, duty, pulse):on =20 * duty / 100000
off =-on + 20/1000 для i в диапазоне (импульс):
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 (обязанность (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 (готово)

попробуйте:
while True:
data =blue.readline () # data =data.decode ()

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

print («не сделал») # продолжить

else:print («found s») захват (80)

x, add =search (80, 5) drop ()
готово ()

кроме KeyboardInterrupt:GPIO.cleanup () print («Выход»)

VII. ЗАКЛЮЧЕНИЕ

В этом проекте мы внедрили систему обработки грузов для автоматизации склада. Роботизированная рука забирает предметы с конвейерной ленты, ищет транспортное средство с помощью установленной на нем камеры, загружает заказ на транспортное средство, после чего транспортное средство затем доставляет товары в требуемое место для дальнейшей обработки. Автоматизация складов становится все более и более распространенной как в больших, так и в малых компаниях из-за растущих требований клиентов и роста электронной коммерции. Товары для людей (GTP) - это новая развивающаяся тенденция, при которой товары перемещаются к рабочим, а не рабочие к товарам. По словам Натана Буша, младшего инженера-консультанта Bastian Solutions Inc., «Пропускная способность систем GTP обычно немного выше, чем при традиционных ручных операциях. Это позволяет компаниям снизить общие операционные расходы и затраты на выполнение заказов, одновременно улучшая производительность и уровень обслуживания ». Мобильная робототехника теперь стала важной частью этого процесса, поскольку предметы ищут, забирают и затем доставляют на соответствующие участки обработки. Будущие масштабы этого проекта широко рассматривались для полностью автономной складской системы, в которой товары, которые должны храниться, могут быть разделены другой системой, а представленная выше система может передавать товары с конвейера на складского бота, который в дальнейшем находит оптимальный путь к желаемому складу и наличию товара. Эта демонстрация показывает, что упомянутая система может быть реализована частично в интересах малых предприятий; следовательно, сочетание ручного и роботизированного управления для увеличения пропускной способности и повышения производительности.

Источник:РАСПРОСТРАНЕНИЕ ИЗДЕЛИЙ


Производственный процесс

  1. Spork
  2. Титан
  3. Биокерамика
  4. Кастаньеты
  5. Кран
  6. Приклейте
  7. Песочные часы
  8. Тема
  9. Ацетилен
  10. Олово