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
   56   57   58   59   60   61   62   63   64   65   66