E-puck knihovna pro Python
David Marek
Univerzita Karlova v Praze
5. 4. 2011
Osnova
1 Pˇredstaven´ı e-puck robota
2 Pˇripojen´ı
3 Komunikace
4 Pˇrehled pˇr´ıkaz ˚u
5 Uk ´azky program ˚u
6 Z ´av ˇer
Pˇredstaven´ı e-puck robota
Pˇredstaven´ı e-puck robota
Pˇredstaven´ı e-puck robota
E-Puck
• Ecole Polytechnique F ´ed ´erale de
Lausanne
• Miniaturn´ı robot (pr ˚um ˇer 75mm)
• Opensource hardware
• Spousta senzor ˚u
• Bluetooth komunikace
• Dostupn´y (v labu)
Pˇredstaven´ı e-puck robota
Senzory a akˇcn´ı ˇcleny
• Kamera (640x480)
• IR senzory (proximity / ambient light)
• Akcelerometr (3D)
• Mikrofony
• LED
• Krokov ´e motory
• Speaker
Pˇredstaven´ı e-puck robota
Kamera
• Rozliˇsen´ı 640x480
• Dva reˇzimy: RGB565 / barvy ˇsedi
• Pˇr´ıliˇs velk ´e fotky pro zpracov ´an´ı v robotovi
• Reˇsen´ı probl ´em ˚u s pam ˇet´ı:ˇ
• Prokl ´ad ´an´ı
• Zm ˇena form ´atu fotografie
• Re ´aln ˇe jde z´ıskat:
• 40x40 barevn ˇe
• 55x55 ˇcernob´ıle
• Line ´arn´ı kamera
Pˇredstaven´ı e-puck robota
IR senzory
• 8 senzor ˚u po obvodu
• Dva reˇzimy:
• Aktivn´ı – rozezn ´av ´an´ı pˇrek ´aˇzek
• Pasivn´ı – intenzita sv ˇetla
• Pˇrek ´aˇzky do∼4cm
Pˇredstaven´ı e-puck robota
Akcelerometr
• 3D akcelerometr
• Z robota se d ´a z´ıskat:
• Vektor akcelerace
• Zpracovan ´e informace (rotace, zrychlen´ı, . . . )
• Detekce n ´arazu, naklon ˇen´ı, sm ˇeru pohybu
Pˇredstaven´ı e-puck robota
Mikrofony
• 3 mikrofony
• Vlevo, vpravo, vzadu
• Lze z´ıskat:
• Hlasitost
• Frekvenci (FFT)
Pˇredstaven´ı e-puck robota
LED
• 8 LED po obvodu robota
• Zelen ´a dioda v t ˇele robota
• Jasn ´a dioda u kamery
Pˇredstaven´ı e-puck robota
Krokov ´e motory
• Dva krokov ´e motory
• Tis´ıc krok ˚u = jedna ot ´aˇcka kola
• Jeden krok≈0.13 mm
• Maxim ´aln´ı rychlost jedna
ot ´aˇcka za sekundu
• Neklouzav ´a ´uprava
Pˇredstaven´ı e-puck robota
Speaker
• Pˇrehr ´av ´a pˇripraven ´e zvuky (WAV)
• 5 zvuk ˚u zakompilovan´ych do firmware
Pˇripojen´ı
Pˇripojen´ı
Pˇripojen´ı
Pˇr´ıprava PC
• Potˇreba funkˇcn´ı bluetooth
• Bal´ıkybluez-firmware,bluez-utils
• Utilita na zasl ´an´ı PIN (bluez-pin, . . . )
Pˇripojen´ı
Nastaven´ı rfcomm
Z´ıskat adresu robota $ hcitool scan Scanning ... 10:00:E8:52:C6:3E e-puck_1055 Nastaven´ı/etc/bluetooth/rfcomm.conf rfcomm2 { bind no; device 10:00:E8:52:C6:3E; channel 1; comment "e-puck_1055"; }Pˇripojen´ı
Vytvoˇren´ı spojen´ı
Pˇripojen´ı pomoc´ırfcomm# rfcomm connect rfcomm2
Connected /dev/rfcomm2 to 10:00:E8:52:C6:3E on channel 1 Press CTRL-C for hangup
Moˇzn ´e chyby
Can’t connect RFCOMM socket: Connection refused
• Nen´ı spuˇst ˇen ´a aplikace, kter ´a by pˇredala PIN Can’t create RFCOMM TTY: Address already in use
• Robot uˇz je pˇripojen
• Jin ´a aplikace s n´ım st ´ale komunikuje
Pˇripojen´ı
Nahr ´an´ı firmware
• Pouˇz´ıv ´a seepuckupload
• Je potˇreba m´ıt aktivn´ı pˇripojen´ı
• Robot dok ´aˇze pˇrij´ımat nov´y firmware pouze p ´ar sekund po
restartu
Postup pˇri nahr ´av ´an´ı
1 Spuˇst ˇen´ı nahr ´av ´an´ı
$ epuckupload -f BTcom.hex rfcomm2
2 Restartov ´an´ı robota
3 Vyˇck ´an´ı na konec nahr ´av ´an´ı
4 Robot pˇripraven k pr ´aci
Komunikace
Komunikace
Komunikace
Komunikace
• Kontroln´ı program b ˇeˇz´ı v PC napsan´y v Pythonu
• Pˇr´ıkazy jsou textov ´e (bin ´arn´ı) ˇret ˇezce pos´ılan ´e pˇres s ´eriov ´e rozhran´ı
• V robotovi je upraven´y firmware BTcom, kter´y pouze zpracov ´av ´a
pˇr´ıkazy
• Je potˇreba aby bylo vytvoˇren ´e pˇripojen´ı
Komunikace
Pˇr´ıklad ovl ´ad ´an´ı
Pˇr´ıklad zasl ´an´ı pˇr´ıkazu>>> from epuck import Controller
>>> controller = Controller("/dev/rfcomm2")
>>> controller.set_speed(100, 100)
>>> controller.get_speed() (100, 100)
1 Je vytvoˇren Controller, parametr je cesta k rozhran´ı kde je robot
pˇripojen
2 Nastavena rychlost obou motor ˚u na 100
3 Zjiˇst ˇena rychlost z robota
Jde o synchronn´ı komunikaci, program byl vˇzdy zablokov ´an dokud nedoˇsla odpov ˇed’ od robota.
Komunikace
Druhy komunikace
Synchronn´ı Asynchronn´ı
• Vˇzdy v´ıme, zda se pˇr´ıkaz
provedl
• Transparentn´ı komunikace
• Hned se dozv´ıme v´ysledek
• Pokud nastala chyba tak m ˚uˇze
z ˚ustat v deadlocku
• Nen´ı tˇreba ˇcekat, neˇz se pˇr´ıkaz vykon ´a
• Spolehliv ´a komunikace
• Zotavov ´an´ı z chyb
• Mus´ıme si zvl ´aˇst’ ˇr´ıct o v´ysledek
Komunikace
Asynchronn´ı komunikace
Pˇr´ıklad programu
Uk ´azka k ´odu
from epuck import Controller
controller = Controller("/dev/rfcomm2", asynchronous=True) photo_request = controller.get_photo()
while not photo_request.response_received(): foo()
photo = photo_request.get_response()
• M´ısto odpov ˇedi z´ısk ´ame jen handler
• Je moˇzn ´e zkontrolovat zda-li uˇz pˇriˇsla odpov ˇed’
• Neˇz pˇrijde odpov ˇed’, tak je moˇzn ´e d ˇelat cokoli jin ´eho
Komunikace
Asynchronn´ı komunikace
Callback
• Pro zpracov ´an´ı odpov ˇedi je moˇzn ´e m´ıt speci ´aln´ı funkci
• Kaˇzd´y pˇr´ıkaz m ´a parametr callback, coˇz je funkce
• Callback je zavol ´an hned po pˇrijet´ı odpov ˇedi
• Callback m ˚uˇze b´yt pouˇzit pro modifikaci odpov ˇedi:
vysledek_get_response = callback(odpoved_od_robota)
Uk ´azka callback metody
from epuck import Controller
controller = Controller("/dev/rfcomm2", asynchronous=True) controller.get_photo(callback=lambda img: img.show())
Pˇrehled pˇr´ıkaz ˚u
Pˇrehled pˇr´ıkaz ˚u
Pˇrehled pˇr´ıkaz ˚u
Pˇr´ıkazy
• Tˇr´ıdaControllerobsahuje pˇr´ıkazy pro ovl ´ad ´an´ı vˇsech sensor ˚u
a akˇcn´ıch ˇclen ˚u robota
• Kaˇzd ´a akce je pouze zavol ´an´ı jedn ´e metody
• Pˇri synchronn´ı komunikaci vrac´ı metody rovnou v´ysledek
• Pˇri asynchronn´ı komunikaci vrac´ı handler.
• Bliˇzˇs´ı informace v dokumentaci
Pˇrehled pˇr´ıkaz ˚u
Pˇr´ıkazy
Pˇrehled • Motory • set_speed(left, right) • get_speed() • set_motor_pos(left, right) • get_motor_pos() • IR senzory • get_proximity_sensors() • get_ambient_sensors() • calibrate_sensors() • LED • set_body_led(on) • set_front_led(on) • set_leds(on) • set_led(led_no, on)Pˇrehled pˇr´ıkaz ˚u
Pˇr´ıkazy
Pˇrehled
• Kamera
• set_camera(mode, width, height, zoom)
• get_camera() • get_photo() • Pˇrep´ınaˇc na robotovi • get_turning_switch() • Akcelerometr • get_accelerometer() • get_raw_accelerometer() • Zvuk • play_sound(sound_no) • get_volume()
• Restart nebo zastaven´ı
• reset()
• stop()
Uk ´azky program ˚u
Uk ´azky program ˚u
Uk ´azky program ˚u
N ´asledov ´an´ı sv ˇetla
• Vyuˇzity IR senzory
• Robot se pohybuje za sv ˇetlem
• Je potˇreba zdroj IR sv ˇetla (sv´ıˇcka, . . . )
Zdrojov´y k ´od 1/3 1 import logging 2 import time 3 import sys 4 import signal 5
6 from epuck.controller import Controller
7
8 logging.basicConfig(level=logging.WARNING)
9
10 c = Controller("/dev/rfcomm2", asynchronous=True)
Uk ´azky program ˚u
N ´asledov ´an´ı sv ˇetla
Zdrojov´y k ´od 2/31 # Signal handler to cleanup after shutdown 2 def handle_signal(signum, frame):
3 r = c.stop()
4 r.join()
5 sys.exit(0)
6
7 # SIGINT is interrupt signal sent by CTRL+C 8 signal.signal(signal.SIGINT, handle_signal)
9
10 while True:
11 # Read ambient light sensors
12 r = c.get_ambient_sensors().get_response()
13
14 front_side = r["L10"] + r["R10"]
15 left_side = r["L45"] + r["L90"]
16 right_side = r["R45"] + r["R90"]
Uk ´azky program ˚u
N ´asledov ´an´ı sv ˇetla
Zdrojov´y k ´od 3/31 # The light source is straight ahead
2 if front_side < left_side and front_side < right_side:
3 c.set_speed(500, 500)
4 elif left_side < right_side:
5 c.set_speed(-500, 500)
6 else:
7 c.set_speed(500, -500)
8
9 time.sleep(0.1)
Uk ´azky program ˚u
LED
• Pouze efekty s LED
• Pˇrep´ınaˇc na robotovi vyuˇzit pro r ˚uzn ´e reˇzimy
Uk ´azky program ˚u
Vyh´yb ´an´ı se pˇrek ´aˇzk ´am
• Jednoduch´y program na principu Braitenberg vehicle
• V´ystup na akˇcn´ıch ˇclenech je ovlivn ˇen pouze hodnotou senzor ˚u
Uk ´azky program ˚u
Detekce obliˇcej ˚u
• Pouˇzita kamera a OpenCV knihovna
• Program kaˇzd´ych p ´ar sekund sejme
obr ´azek a snaˇz´ı se na n ˇem nal ´ezt obliˇcej
Uk ´azky program ˚u
Evoluce
• Experiment s knihovnou PyEvolve
Z ´av ˇer
Z ´av ˇer
Z ´av ˇer