Page 61 - MATINF Nr. 9-10
P. 61
a
Deprinderea elementelor fundamentale robotic˘ s , i de programare ˆın Python folosind robotul Finch 2.0 61
distant , aM˘asurat˘a = [] # Creare list˘a goal˘ a luminaM˘asurat˘a = [] # Creare list˘a goal˘a
for i in range(15): for i in range(20): # M˘asurare senzor stˆang˘a
distant , aM˘asurat˘a.append(pasare.getDistance()) de 20 ori for i in range(len(luminaMasurata)):
# Adaug˘a element la sfˆars , itul listei luminaM˘asurat˘a.append(pasare.getLight(’L’)) pasare.playNote(luminaMasurata [i] +
sleep(1) # Ad˘augare element la sfˆars , itul listei 32, 0.5)
print(distant , aM˘asurat˘a) sleep(1) sleep(0.5)
a
Finch cont , ine doi senzori numit , i codificatoare, care m˘asoar˘ informat , ii despre Finch ˆınsus , i.
Codificatoarele fac parte din rot , ile Finch s , i fiecare codificator m˘asoar˘ cˆat de departe s-a rotit
a
una dintre rot , i. Metodele setMove() s , i setTurn() utilizeaz˘a codificatoarele pentru a determina
cˆand Finch a finalizat mis , carea dorit˘a.
ˆ
Inainte ca Finch s˘a fac˘a o mis , care ce se dores , te m˘asurat˘a, trebuie resetate codificatoarele
a
apelˆand metoda resetEncoders(). Resetarea codificatoarelor seteaz˘ valoarea ambelor codifica-
toare la 0 (pasare.resetEncoders()). Dup˘a resetare, se poate citi valoarea fiec˘arui codificator
utilizˆand metoda getEncoder(), carereturneaz˘ num˘arul de rotat , ii pe care roata le-a mis , cat de
a
la ultima resetare. Mis , c˘arile ˆınainte sunt pozitive, iar mis , c˘arile ˆınapoi sunt negative.
a
pasare.resetEncoders() #Setare encodere la 0 #Funct , ia returneaz˘ distant , a ˆın cm pe care roata a parcurs-o de cˆand
pasare.setMotors(50,50) # Mis , care ˆınainte encoderul a fost resetat
pentru 1 s def getDistant , aRoata(roata):
sleep(1) diametru=5 #diametrul rot , ii Finch
pasare.stop() circumferint , a=3.14159*diametru # circumferint , a rot , ii Finch
#Afis , are cˆat de departe fiecare roat˘a s-a mis , cat if roata == ’R’ or roata == ’L’:
print(’Rotat , ii roata stˆang˘a: ’, pa- return pasare.getEncoder(wheel)*circumferint , a
sare.getEncoder(’L’)) else:
print(’Rotat , ii roata dreapt˘a: ’, pa- print(”Roata nevalid˘a”)
sare.getEncoder(’R’)) return -1
pasare.resetEncoders() #Setare encoder la 0
pasare.setMotors(50,50) #Mis , care ˆınainte pentru 1 s
sleep(1)
pasare.stop()
#Afis , arecˆat de departe fiecare roat˘a s-a mis , cat
print(’Distant , a roata stˆang˘a: ’, getDistant , aRoata (’L’))
print(’Distant , a roata dreapt˘a: ’, getDistant , aRoata (’R’))
prag = 70
pasare.resetEncoders()
pasare.setMotors(20,20)
while not (pasare.getLine(’L’)<prag or pasare.getLine(’R’)<prag):
pass
pasare.stop()
print(”S-a mis , cat ”, 0.5*(getWheelDistance(’L’)+getWheelDistance(’R’)), ’ cm.’)
Se pot utiliza codificatoarele pentru a afla cˆat de departe s-a ˆıntors robotul. Acest lucru
necesit˘a o anumit˘a geometrie! Imaginat , i-v˘a c˘a roata finch din stˆanga este stat , ionar˘a ˆın timp
ce roata din dreapta se mis , c˘a. Finch se va deplasa ˆntr-un cerc de raz˘a d, care este l˘at , imea
ı
robotului. Distant , a a pe care se mis , c˘a roata din dreapta este o lungime a arcului de-a lungul
acelui cerc. Acea lungime a arcului este l˘t , imea ori unghiul θ pe care robotul s-a ˆıntors. Acest
a
◦
ı
unghi este ˆın radiani s , i poate fi convertit ˆın grade ˆnmult , indu-l cu factorul de conversie π/180 .
a = d · θ radiani = π·d·θ , θ = 180·a . Aceast˘a ecuat , ie permite aflarea a faptului cˆat de departe
180 π·d
s-a deplasat Finch ˆın funct , ie de distant , a pe care a mis , cat-o roata din dreapta s , i de l˘at , imea
robotului, care este de 10 cm.
Se poate utiliza aceast˘a funct , ie pentru o situat , ie mai general˘a. Dac˘a vitezele rot , ilor din
dreapta s , i din stˆanga sunt ambele pozitive, dar nu egale, se poate calcula diferent , a dintre