第1步:籌備
步調(diào)2:代碼布局
我將代碼分別為這些文件,我將逐個注釋:
正在接下來的步調(diào)中,我將一步一步天注釋這些文件
第3步:
這是應(yīng)用程序的次要出口面,包括機(jī)械人類
importasGPIO
fromimportreactor,task
importl298NDrive
importremoteControl
importlogging
importutils
log=
enableMotors=True#Motorscanbedisabledfortestingwiththis
runFrequency=1#ThefrequencyonwichthemainTaskwillberan
classAum2:
def__init__:
(“InitializingAum2robot.。.”)
#Configuration
=5555#Porttoopensotheremotecanconnect
#Configureminandmaxservopulselengths
#Keepinmindthesearenotpinsbutservoouts
=(10,11,12,13,14,15,enableMotors)
=
defprocessRemoteCommand:
=(,,-9.8,9.8,-4095,4095)
,int
defrun:
defstart
l=
#runwillbecalledwiththisfrequency
#Gatherourcodeinamainfunction
defmain:
robot=Aum2
#Standardboilerplatetocallthemainfunctiontobegin
#theprogram.
if__name__==‘__main__’:
main
有些我要對此文件頒發(fā)評論的要點(diǎn):
我正在利用歪曲庫來調(diào)和來自UDP的近程節(jié)制定單服務(wù)器跟機(jī)器人的次要Run方式。如你所見,該方式此刻甚么也沒有做,可是其設(shè)法主意是正在此中增添代碼以使機(jī)器人更具自治性。
processRemoteCommand方式將是
起頭方式是正在我設(shè)置須要調(diào)和的兩件事時:監(jiān)聽
第4步:
此文件包括兩個類,即RemoteControl類,RCCommand類
importlogging
importtraceback
fromimportDatagramProtocol
fromimportreactor
分揀機(jī)器人分揀系統(tǒng)設(shè)計importutils
log=
classRemoteControl(DatagramProtocol):
def__init__:
=port
defstart(self,onCommandReceived):
(“InitializingRemoteControl.。.”)
=onCommandReceived
defdatagramReceived(self,data,addr):
try:
(“Received%rfrom%s”%
command=RCCommand
except(KeyboardInterrupt,SystemExit):
raise
except:
_exc
classRCCommand:
#Timestamp[sec],sensorid,x,y,z,sensorid,x,y,z,sensorid,x,y,z
#890.71558,3,0.076,9.809,0.565,。..
def__init__:
=0
=0
=0
=
iflen》=5and[1].strip==“3”:
=-float
=-float
=float
(“x={}y={}z={}”.format
else:
(“Invalidmessage:{}”.format
一樣是RemoteControl類,它利用歪曲的框架去偵聽運(yùn)轉(zhuǎn)WirelessIMU使用的Android手機(jī)發(fā)送的UDP程序包。此應(yīng)用程序發(fā)送存在以下布局的動靜:
890.71558,3、0.076、9.809、0.565,4,-0.559、0.032,-0.134、5-21.660,-36.960,-28.140
我只對下面突出顯現(xiàn)的動靜部門感興趣,那就是傳感器ID3,和加速度計供給的三個丈量值(0.076、9.809、0.565)。
你可以正在代碼中看到,類RCCommand將此動靜的有用參數(shù)轉(zhuǎn)換為機(jī)器人所需的x跟y值,此中
快遞分揀機(jī)器人哪個牌子好x是疇前到后的軸,而
y則是從一側(cè)到另一側(cè)。
我也有z軸的代碼,可是我臨時沒有利用它。
步調(diào)5:
這是擔(dān)任節(jié)制電動機(jī)的文件。為此,它將下令發(fā)送到16伺服驅(qū)動器,該驅(qū)動器毗鄰到L298N電動機(jī)驅(qū)動器。我念我能夠會正在我構(gòu)建的每一個RaspberryPi機(jī)器人上重用該類。它的確很簡略,而且沒有須要龐大的處置懲罰便可實(shí)現(xiàn)它的事情。
importAdafruit_PCA9685
importlogging
importmath
importutils
log=
classL298NDrive:
def__init__(self,enA,in1,in2,in3,in4,enB,enabled):
(“InitializingL298Drive.。.”)
=0
=4095
=enA
=in1
=in2
=in3
=in4
=enB
=enabled
ifenabled:
defenable:
=True
#InitialisethePCA9685usingthedefaultaddress。
=Adafruit_
defdisable:
=False
#InitialisethePCA9685usingthedefaultaddress。
=None
defsetSpeeds(self,rSpeed,lSpeed):
defsetSpeed(self,motor,speed):
pwm=int
(“Motor:{}speed:{}pwm:{}”.format(motor,speed,pwm))
ifmotor==1:
ifspeed》=0:
if:
_pwm
_pwm
else:
if:
_pwm
_pwm
if:
廣州分揀機(jī)器人特點(diǎn)_pwm
else:#motor==2
ifspeed》=0:
if:
_pwm
_pwm
else:
if:
_pwm
_pwm
if:
_pwm
可以看出,代碼的次要部門正在setSpeed(self,motor,speed)方式中,該方式吸收要設(shè)置的電動機(jī)編號,并通知伺服驅(qū)動器若何處置懲罰與該電動機(jī)關(guān)系的引腳。
大概該當(dāng)給出一些注釋以相識我為何要履行我的事情
L298N機(jī)電驅(qū)動器
利用6個引腳驅(qū)動兩個機(jī)電:
enA用來通知速率,咱們要使電動機(jī)啟動1。通電后,通知駕駛員電動機(jī)1該當(dāng)沿一個標(biāo)的目的挪動
in2通電時,通知駕駛員電動機(jī)1應(yīng)該沿相反標(biāo)的目的挪動
in3通電時,見告駕駛員機(jī)電2該當(dāng)沿一個標(biāo)的目的挪動
in4通知駕駛員,電動機(jī)2該當(dāng)沿相反標(biāo)的目的挪動
enB用于通知速率,咱們愿望電動機(jī)遷移轉(zhuǎn)變
以是正在咱們的例子中,由于我對一切引腳皆利用了伺服驅(qū)動器:
當(dāng)我做到那一點(diǎn):
_pwm
我真的是正在通知伺服驅(qū)動器,正在一切PWM時代,該引腳該當(dāng)為OFF,
當(dāng)我如許做時:
_pwm
我實(shí)際上是正在通知伺服驅(qū)動器,正在一切PWM周期中,該引腳該當(dāng)處于ON地位(以是我將其翻開
然后,當(dāng)我如許做時:
_pwm
我利用真正的PWM引腳,并利用速率參數(shù)設(shè)置我所要求的脈沖。
步調(diào)6:
最初,這是最初的安然。它沒有包括類,可是我認(rèn)為我會正在其他處所重用的一切有用功用。
importmath
importlogging
log=
defmap(v,in_min,in_max,out_min,out_max):
#Checkthatthevalueisatleastin_min
ifv《in_min:
v=in_min
#Checkthatthevalueisatmostin_max
ifv》in_max:
v=in_max
return*(out_max-out_min)//+out_min
defjoystickToDiff(x,y,minJoystick,maxJoystick,minSpeed,maxSpeed):
#Ifxandyare0,thenthereisnotmuchtocalculate.。.
ifx==0andy==0:
return
#FirstComputetheangleindeg
#Firsthypotenuse
z=
#angleinradians
rad=
#andindegrees
angle=rad*180/
#Nowangleindicatesthemeasureofturn
#Alongastraightline,withanangleo,theturnco-efficientissame
#thisappliesforanglesbetween0-90,withangle0thecoeffis-1
#withangle45,theco-efficientis0andwithangle90,itis1
tcoeff=-1+*2
turn=tcoeff*
turn=round/100
#Andmaxofyorxisthemovement
mov=max
#Firstandthirdquadrant
if(x》=0andy》=0)or:
rawLeft=mov
rawRight=turn
else:
rawRight=mov
rawLeft=turn
#Reversepolarity
自動分揀機(jī)器人設(shè)備ify《0:
rawLeft=0-rawLeft
rawRight=0-rawRight
#minJoystick,maxJoystick,minSpeed,maxSpeed
#Mapthevaluesontothedefinedrang
rightOut=map(rawRight,minJoystick,maxJoystick,minSpeed,maxSpeed)
leftOut=map(rawLeft,minJoystick,maxJoystick,minSpeed,maxSpeed)
(“x={}y={},rOut={},lOut={}”.format(x,y,rightOut,leftOut))
return(rightOut,leftOut)
這里只有兩種方式,第一種是從地圖功能的Arduino。它將指定輸入限定內(nèi)的值轉(zhuǎn)換為輸出規(guī)模內(nèi)的響應(yīng)值。
我為輸入值增添了限定,以是我只接管av,位于in_min跟in_max以內(nèi)。
我擁有的另一個函數(shù)(joystickToDiff)略微龐大一點(diǎn),可是其目標(biāo)是從輸入的操縱桿對轉(zhuǎn)換值,以到達(dá)差動驅(qū)動機(jī)器人擺布機(jī)電所需的速率。此輸出已托付,已轉(zhuǎn)換為指定為參數(shù)的速率規(guī)模。
你可以正在我的博客中找到有關(guān)此部門的更多詳細(xì)信息
分揀機(jī)器人企業(yè)分揀機(jī)器人展示交易物流中心快遞分揀機(jī)器人