苏州昊瓦智能装备有限公司
当前位置: > 产品展示

便携式塑料分拣机器人,颜色分类机器人的制作

点击:540

销售分拣机器人多少钱如何发明垃圾分拣机器人

步调1:硬件

那是我之前用来构建的这个。我利用来自的部件和我躺正在屋子周围的器材100%构建它。

PhidgetsBoards,Motors,Hardware

HUB0000-VINTHubPhidget

1108-磁传感器

2xSTC1001-2.5AStepperPhidget

2x3324-42STH38NEMA-17双极无齿轮步进器

3x3002-Phidget电缆60厘米

3403-4端口集线器

3031-母尾5.5

3029-2线100‘绞线

3604-10mm红色LED

其他部件

24VDC2.0A电源

车库废木跟金属

拉链

底部堵截的塑料容器

第2步:计划机器人

咱们须要计划一些可以从输入料斗中掏出一个珠子,将其放在收集摄像头下,然后将其挪动到得当的箱子中的器材。

珠子皮卡

我决意用2片圆形胶合板做第1部门,每一个胶合板正在同一个处所钻一个洞。底部件流动,顶部件毗邻到步进机电,步进机电可以正在装有珠子的料斗下方扭转。当孔正在料斗下挪动时,它会拾取一个珠子。然后我可以正在收集摄像头下扭转它,然后进一步扭转,直到它与底部的孔婚配,此时它便会落下。

正在这张图片中,我正在测试体系能行得通。一切都是流动的,除顶部的圆形胶合板,它与上面的步进机电相连。收集摄像头还没有装置。我此刻只是利用Phidget控制面板转向机电。

珠子存储

下一部分是计划用于连结每种颜色的bin体系。我决意利用上面的第二个步进机电去支持跟扭转存在平均距离隔间的圆形容器。那可以用来扭转珠子将从此中失落出的孔下方的精确隔间。

我利用纸板跟胶带去构建它。这里最紧张的是一致性-每一个隔间该当是不异的尺寸,全部器材该当平均减轻,以便扭转而不会跳过。

经由过程慎密贴合的盖子实现珠子的移除一次只有一个隔间,以是可以倒出珠子。

收集摄像头装置正在料斗跟下板孔地位之间的顶板上。那容许体系正在掉落之前窥察珠子。LED用于照亮相机下方的珠子,而且环境光被阻拦,以供给同等的照明情况。那关于精确的颜色检测十分紧张,由于环境光可以真正天消弭感知颜色。

地位检测

体系可能检测到珠子的扭转十分紧张分开器。那用于正在启动时设置初始地位,但也用于检测步进机电是不是曾经没有同步。正在我的体系中,一个珠子有时会正在拾取时卡住,体系须要可能检测并处置惩罚这类环境-经由过程备份跟测验考试agian。

有良多方式可以处置惩罚这个(工作。我决意利用1108磁传感器,正在顶板的边缘嵌入磁铁。那容许我验证每次扭转的地位。一个更好的解决方案能够是步进机电上的编码器,但我有一个1108摆布,以是我利用它。

实现机器人

此时,所有皆曾经实现出来,并测试。此刻是时间装置好一切器材并转向编写软件。

2个步进机电由STC1001步进控制器驱动。HUB000-USBVINT集线器用于运转步进控制器,和读取磁传感器跟驱动LED。收集摄像头跟HUB0000皆毗邻到一个小型USB集线器。利用3031引线跟一些电线和24V电源为机电供电。

步调3:编写代码

C#跟VisualStudio2015用于此名目。下载本页顶部的源代码并依照步调停止操纵-次要部门概述以下

初始化

起首,咱们必需创立,翻开跟初始化Phidget工具。那是正在表单加载事宜跟Phidget附加处理程序中实现的。

privatevoidForm1_Load(objectsender,EventArgse){

/*InitializeandopenPhidgets*/

=0;

+=Top_Attach;

+=Top_Detach;

+=Top_PositionChange;

;

=1;

+=Bottom_Attach;

+=Bottom_Detach;

+=Bottom_PositionChange;

;

=2;

=true;

+=MagSensor_Attach;

+=MagSensor_Detach;

北京分拣机器人价格多少

+=MagSensor_SensorChange;

;

=5;

=true;

=0;

小黄人分拣机器人是什么

+=Led_Attach;

+=Led_Detach;

;

}

privatevoidLed_Attach(objectsender,e){

=true;

=true;

=true;

}

privatevoidMagSensor_Attach(objectsender,e){

=true;

=_1108;

=16;

}

privatevoidBottom_Attach(objectsender,e){

=true;

=bottomCurrentLimit;

=true;

=bottomVelocityLimit;

=bottomAccel;

=100;

}

privatevoidTop_Attach(objectsender,e){

=true;

=topCurrentLimit;

=true;

=-1;

=-topVelocityLimit;

=-topAccel;

=100;

}

咱们借正在初始化时代读取任何已保留的颜色信息,是以可以继承之前的运转。

机电定位

机电处置惩罚代码包罗用于挪动机电的便当功用。我利用的机电每转3,2001/16步,以是我为此创立了一个常量。

关于顶部机电,咱们愿望可能将3个地位发送到机电:收集摄像头,孔跟定位磁铁。有一个功用可以达到每一个地位:

privatevoidnextMagnet(Booleanwait=false){

doubleposn=%stepsPerRev;

+=(stepsPerRev-posn);

if

while;

}

privatevoidnextCamera(Booleanwait=false){

doubleposn=%stepsPerRev;

if

+=;

else

+=+stepsPerRev);

if

while;

}

privatevoidnextHole(Booleanwait=false){

doubleposn=%stepsPerRev;

if

+=;

else

+=+stepsPerRev);

if

while;

}

正在开始运行之前,利用磁传感器对齐顶板。可以随时挪用alignMotor函数去对齐顶板。该功用起首快捷将板迁移转变至1转,直至其磁铁数据高于阈值。然后它略微前进一点并逐步向前挪动,捕获传感器数据。最初,它将地位设置为最大磁铁数据地位,并将地位偏移重置为0.是以,最大磁铁地位应一直为

ThreadalignMotorThread;

BooleansawMagnet;

doublemagSensorMax=0;

privatevoidalignMotor{

//Findthemagnet

=;

sawMagnet=false;

+=magSensorStopMotor;

=-1000;

inttryCount=0;

tryagain:

+=stepsPerRev;

while

;

if{

if{

;

=false;

=false;

runtest=false;

return;

}

tryCount++;

(“Arewestuck?Tryingabackup.。.”);

-=600;

while;

gototryagain;

}

=-100;

magData=newList》;

+=magSensorCollectPositionData;

+=300;

while;

-=magSensorCollectPositionData;

=-topVelocityLimit;

KeyValuePairmax=magData[0];

foreach(KeyValuePairpairinmagData)

if

max=pair;

;

magSensorMax=;

=0;

while;

(“Alignsucceeded”);

}

List》magData;

privatevoidmagSensorCollectPositionData(objectsender,e){

(newKeyValuePair;

}

privatevoidmagSensorStopMotor(objectsender,e){

if{

=-300;

-=magSensorStopMotor;

sawMagnet=true;

}

}

最初,经由过程将底部马达发送到此中一个胎圈容器地位去节制底部马达。关于这个名目,咱们有19个职位。算法取舍最短门路,顺时针或逆时针迁移转变。

privateintBottomPosition{

get{

intposn=%stepsPerRev;

if

posn+=stepsPerRev;

return(((posn*beadCompartments)/stepsPerRev));

}

}

privatevoidSetBottomPosition(intposn,boolwait=false){

posn=posn%beadCompartments;

doubletargetPosn=(posn*stepsPerRev)/beadCompartments;

doublecurrentPosn=%stepsPerRev;

doubleposnDiff=targetPosn-currentPosn;

//Keepitasfullsteps

posnDiff=*16;

if(posnDiff《=1600)

+=posnDiff;

else

-=(stepsPerRev-posnDiff);

if

while;

OpenCV用于从收集摄像头读取图象。正在启动主排序线程之前启动相机线程。该线程不休读入图象,利用Mean计较特定区域的均匀颜色并更新全局颜色变量。该线程借利用HoughCircles去检测珠子或顶板上的孔,以细化它正在探求颜色检测的区域。阈值跟HoughCircles数字是经由过程重复实验肯定的,而且正在很大水平上在于收集摄像头,光照跟间距。

boolrunVideo=true;

boolvideoRunning=false;

VideoCapturecapture;

ThreadcvThread;

ColordetectedColor;

Booleandetecting=false;

intdetectCnt=0;

privatevoidcvThreadFunction{

videoRunning=false;

capture=newVideoCapture;

using(Windowwindow=newWindow{

Matimage=newMat;

Matimage2=newMat;

while{

;

if

break;

if

detectCnt++;

else

detectCnt=0;

if(detecting||circleDetectChecked||showDetectionImgChecked){

;

Matthres=;

thres=;

if(showDetectionImgChecked)

image=thres;

if(detecting||circleDetectChecked){

CircleSegment[]bead=(,2,/*/4*/20,200,100,20,65);

if{

(bead[0].Center,3,newScalar;

(bead[0].Center,bead[0].Radius,newScalar;

if(bead[0].Radius》=55){

=bead[0].+(bead[0].Radius/2);

=bead[0].-(bead[0].Radius/2);

}else{

=bead[0].+;

=bead[0].-;

}

=15;

=15;

}else{

CircleSegment[]circles=(,2,/*/4*/5,200,100,60,180);

if{

Listxs=;

;

Listys=;

;

intmedianX=xs[/2];

intmedianY=ys[/2];

if

medianX=-15;

if

medianY=-15;

(medianX,medianY,100,newScalar;

if{

=medianX-7;

=medianY-7;

=15;

=15;

}

}

}

}

}

Rectr=newRect,

,

,

;

MatbeadSample=newMat;

ScalaravgColor=;

detectedColor=avgColor[2],avgColor[1],;

(r,newScalar;

;

快递分拣机器人能干什么

;

videoRunning=true;

}

videoRunning=false;

}

}

privatevoidcameraStartBtn_Click(objectsender,EventArgse){

if{

cvThread=newThread(newThreadStart(cvThreadFunction));

runVideo=true;

;

=“stop”;

while

;

}else{

runVideo=false;

;

=“start”;

}

}

颜色

此刻,咱们可以肯定珠子的颜色,并依据该颜色决意将其放入哪个容器。

这个步调依赖于颜色比力。咱们愿望可能划分颜色以限定误报,但也容许充足的阈值去限定假阳性。比力颜色实际上是非常复杂的,由于计算机将颜色存储为RGB的方法,和人类感知颜色的方法并不是线性相关的。更蹩脚的是,借必需思量正在上面窥察颜色的光的颜色。

有庞大的计较色差的算法。咱们利用CIE2000,若是2种颜色与人类没法划分,则输出濒临1的数字。咱们利用ColorMineC#库来实现这些庞大的计较。已发明DeltaE值为5可正在假阳性跟假阳性之间供给优越的调和。

因为容器平常有更多颜色,是以最初一个地位保存为捕捉箱。我平常将这些设置为第二次经由过程机械。

List

colors=newList

;

List

无人分拣机器人缺点

colorPanels=newList

;

ListcolorsTxts=newList;

ListcolorCnts=newList;

constintnumColorSpots=18;

constintunknownColorIndex=18;

intfindColorPosition{

(“Findingcolor.。.”);

varcRGB=newRgb;

=;

=;

=;

intbestMatch=-1;

doublematchDelta=100;

for(inti=0;i《;i++){

varRGB=newRgb;

=colors[i].R;

=colors[i].G;

=colors[i].B;

doubledelta=(RGB,newCieDe2000Comparison;

//doubledelta=deltaE;

+“):”+;

if(delta《matchDelta){

matchDelta=delta;

bestMatch=i;

}

}

if{

(“Found!(Posn:”+bestMatch+“Delta:”+matchDelta+“)”);

returnbestMatch;

}

if(《numColorSpots){

;

;

(newAction,newobject[]{-1});

writeOutColors;

return;

}else{

(“UnknownColor!”);

returnunknownColorIndex;

}

}

排序逻辑

排序功能将一切部门搜集正在一路以实际排序珠子。该函数正在专用线程中运转;挪动顶板,检测珠子颜色,将其放入垃圾箱,确保顶板连结对齐,计数珠子等。当垃圾箱变满时,它也会终止运转-不然咱们终极会溢出珠子。

ThreadcolourTestThread;

Booleanruntest=false;

voidcolourTest

=true;

if

=true;

while{

nextMagnet;

;

try{

if(《(magSensorMax-4))

alignMotor;

}catch{alignMotor;}

nextCamera;

detecting=true;

while

;

(“DetectCount:”+detectCnt);

detecting=false;

Colorc=detectedColor;

(newAction

,newobject[]{c});

inti=findColorPosition;

SetBottomPosition;

nextHole;

colorCnts[i]++;

(newAction,newobject[]{i});

;

if(colorCnts[unknownColorIndex]》500){

=false;

=false;

runtest=false;

(newAction,null);

return;

}

}

}

privatevoidcolourTestBtn_Click(objectsender,EventArgse){

if(colourTestThread==null||!){

colourTestThread=newThread(newThreadStart;

runtest=true;

;

=“STOP”;

=;

}else{

分拣机器人agv报价

runtest=false;

=“GO”;

=;

}

}

此时,咱们有一个事情顺序。一些代码被漏掉正在文章以外,以是看一下实际运转它的源代码。

蜘蛛手分拣机器人产能并联分拣机器人生产线快递分拣机器人工作视频