E-Puck knihovna

epuck — Ovládání robota

«  Připojení a instalace   ::   Contents   ::   epuck.comm — Sériová komunikace s robotem  »

epuck — Ovládání robota

Ovládání robota je velmi jednoduché a přímočaré. V první řadě je potřeba mít robota již připojeného. Návod je k nalezení v sekci Vytvoření spojení s robotem. Celá komunikace probíhá přes třídu Controller.

Příklad:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""Go forward, stop in front of an obstacle."""

import time

from epuck import Controller

# Input larger than the threshold means there is an obstacle.
threshold = 300

# Create the controller. Robot is connected to /dev/rfcomm2 and the
# communication will be asynchronous.
controller = Controller('/dev/rfcomm2', asynchronous=True)

# Set the speed of left and right wheel to 100.
controller.set_speed(100, 100)

# Ask for the values of proximity sensors
sensor_request = controller.get_proximity_sensors()
# Wait until the robot returns them.
sensor_values = sensor_request.get_response()

# Continue while there is nothing in front of the front left and front right sensor.
while (sensor_values['L10'] < threshold) and (sensor_values['R10'] < threshold):
    # Wait for a while
    time.sleep(0.1)
    # Read new values
    sensor_request = controller.get_proximity_sensors()
    sensor_values = sensor_request.get_response()

# Stop the robot
controller.set_speed(0, 0)

Třída Controller

class epuck.Controller(port[, asynchronous=False[, timeout=0.5[, max_tries=10]]])

Ovládání e-puck robota přes bluetooth z počítače.

Při vytváření objektu je možné rozhodnout, zda-li má komunikace probíhat synchronně, anebo asynchronně. Tato volba ovlivňuje zda-li se pro komunikaci použije třída SyncComm anebo AsyncComm. Také na této volbě závisí, co budou jednotlivé příkazy vracet. V případě synchronní komunikace půjde rovnou o odpověď. V případě asynchronní komunikace vrátí RequestHandler. Z něj se stejné informace dostanou metodou get_response() (další podrobnosti v dokumentaci třídy RequestHandler).

Note

V této dokumentaci jsou popsány návratové hodnoty tak, jak je vrátí přímo příkaz při synchronní komunikaci, anebo metoda get_response() třídy RequestHandler při komunikaci asynchronní.

Parameters:
  • port (string) – cesta k portu, kde je e-puck připojen (např. /dev/rfcomm2)
  • asynchronous (bool) – zda-li má být použita asynchronní komunikace.
  • timeout (float) – čas v sekundách před dalším pokusem o zaslání příkazu (asynchronní komunikace)
  • max_tries (int) – maximální počet pokusů o zaslání příkazu (asynchronní komunikace)
Raise :

ControllerError

set_speed(left, right)

Nastavit rychlost levého a pravého krokového motoru. Rychlost je měřena v krocích za sekundu a musí být v rozmezí [-1000, 1000].

Pokud je rychlost mimo rozsah, tak vyvolá výjimku WrongCommand. Při asynchronní komunikaci může dojít k vypršení limitu pokusů a pak dojde k vyvolání výjimky CommError.

Parameters:
  • left (int) – požadovaná rychlost levého kola
  • right (int) – požadovaná rychlost pravého kola
Raise :

WrongCommand, CommError

get_speed()

Získat rychlost levého a pravého krokového motoru. Rychlost je měřena v krocích za sekundu a je v rozmezí [-1000, 1000].

Returns:dvojice obsahující rychlost levého a pravého motoru
Return type:(int, int)
Raise :CommError
set_body_led(on)

Zapnout nebo vypnout zelenou diodu v robotovi.

Parameters:on (bool) – zapnout nebo vypnout diodu
Raise :CommError
set_front_led(on)

Zapnout nebo vypnout jasnou červenou diodu v přední části robota (vedle kamery).

Parameters:on (bool) – zapnout nebo vypnout diodu
Raise :CommError
set_leds(on)

Zapnout nebo vypnout všechny diody, které jsou na obvodu robota, naráz.

Parameters:on (bool) – zapnout nebo vypnout diody
Raise :CommError
set_led(led_no, on)

Zapnout nebo vypnout jednu z osmi diod, které jsou na obvodu robota.

Diody jsou očíslovány 0 až 7, po směru hodinových ručiček, dioda číslo 0 je v přední části robot (neplést s jasnější diodou, která je vedle kamery).

Parameters:
  • led_no (int) – číslo diody, která má být ovládána (číslo z rozsahu [0, 7])
  • on (bool) – zapnout nebo vypnout diodu
Raise :

WrongCommand, CommError

get_turning_selector()

Získat pozici selektoru.

Selektor je na horní straně robota, jde o malou černou tyčinku, kterou je možné otočit do jedné z 16 pozic. Pozice jsou očíslovány 0 až 15. Selektor je v pozici 0 pokud šipka ukazuje směrem k černé tečce, která je nakreslená na plošném spoji. Pozice jsou číslovány ve směru hodinových ručiček.

Returns:pozice selektoru
Return type:int
Raise :CommError
get_proximity_sensors()

Získat data o vzdálenosti překážek z 8 IR senzorů.

Senzory vrací hodnotu z rozsahu [0, 4095]. Jsou rozmístěny po obvodu robota zrcadlově na pravé i levé straně. Pokud bereme směr pohybu jako úhel 0 stupňů, tak se senzory nachází na 10, 45 a 90 stupních a také jsou dva vlevo i vpravo na zadní části robota.

Metoda vrací vždy hodnoty všech senzorů. Pro přehlednější zpracování jsou uloženy ve slovníku, klíč je vždy znak označující levou (L) nebo pravou (P) stranu a pak úhel v jakém se senzor nachází (senzory vzadu jsou označeny B). Seznam klíčů tedy je ['R10', 'R45', 'R90', 'RB', 'LB', 'L90', 'L45', 'L10'].

Returns:hodnoty IR senzorů překážek
Return type:dict
Raise :CommError
get_ambient_sensors()

Získat data o okolním světlu z 8 IR senzorů.

Senzory vrací hodnotu z rozsahu [0, 4095]. Jsou rozmístěny po obvodu robota zrcadlově na pravé i levé straně. Pokud bereme směr pohybu jako úhel 0 stupňů, tak se senzory nachází na 10, 45 a 90 stupních a také jsou dva vlevo i vpravo na zadní části robota.

Metoda vrací vždy hodnoty všech senzorů. Pro přehlednější zpracování jsou uloženy ve slovníku, klíč je vždy znak označující levou (L) nebo pravou (P) stranu a pak úhel v jakém se senzor nachází (senzory vzadu jsou označeny B). Seznam klíčů tedy je ['R10', 'R45', 'R90', 'RB', 'LB', 'L90', 'L45', 'L10'].

Returns:naměřené hodnoty okolního světla
Return type:dict
Raise :CommError
set_camera(mode, width, height, zoom)

Nastavit parametry kamery.

E-puck obsahuje kameru o rozlišení 640x480, avšak není možné využít její plnou kapacitu z paměťových důvodů. Proto je třeba nastavit jak velký obrázek uživatel očekává a také jaké prokládání má být použito. Kamera je v robotovi umístěna otočená, ale uživatel dostane už obraz správně orotovaný. Je však dobré na tento fakt myslet při zadávání šířky a výšky. Pokud je zoom 2 nebo 4, tak se o prokládání stará přímo kamera a zrychlí se tak patřičně framerate.

Například pro rozměry 40x40 a zoom 8 robot vezme ze senzorů kamery obdélník velikosti 320x320 a z něj každý osmý pixel.

Na parametry jsou kladeny následující požadavky:
  • velikost * zoom nesmí překročit kapacitu kamery.
  • velikost dat je omezena velikostí bufferu, který je zhruba 4kB.
  • zoom by měl být z rychlostních důvodů mocninou dvojky.

Na formát fotografie nejsou kladena žádná další omezení, co se poměru stran týče. Je tedy možné získat i lineární obraz 480x1.

Kamera může fotit v režimu rgb565 anebo v režimu stupňů šedi. Pro každý pixel pak používá buď 16, anebo 8 bitů. V režimu šedi je pak framerate dvojnásobný.

Parameters:
  • mode – mód kamery, buď Controller.RGB565_MODE, anebo Controller.GREYSCALE_MODE.
  • width (int) – šířka požadované fotografie
  • height (int) – výška požadované fotografie
  • zoom (int) – velikost prokládání fotografie
Raise :

CommError, WrongCommand

get_camera()

Získat nastavení kamery.

Metoda vrací slovník s parametry odpovídajícími parametrům metody set_camera().

Returns:Slovník s nastavením kamery. Klíče jsou:
  • mode – mód kamery, buď Controller.RGB565_MODE, anebo Controller.GREYSCALE_MODE.
  • width – šířka získané fotografie
  • height – výška získané fotografie
  • zoom – prokládání fotky
Return type:dict
Raise :CommError
get_photo()

Získat fotku z kamery.

Fotka je ve formátu, jaký byl zadán metodou set_camera(). Pokud nebylo nastavení měněno, tak je získána barevná fotka 40x40 pixelů se zoomem 8.

Pro ulehčení práce s fotkou je vrácena jako instance třídy Image z PIL (Python Imaging Library).

Returns:Fotka z kamery
Return type:Image
Raise :CommError
reset()

Resetovat robota.

Proběhne restart robota. Všechno nastavení se anuluje, robot se zastaví.

Raise :CommError
set_motor_pos(left, right)

Nastavení čítačů pro krokové motory.

U obou krokových motorů je možné aktuální pozici kola přiřadit číslo. To pak bude s každým krokem motoru inkrementováno nebo dekrementováno. Pozice se počítají jako 16bitové číslo se znaménkem.

Počet vykonaných kroků je možné zjistit odečtením nastavených hodnot od hodnot získaných metodou get_motor_pos().

Parameters:
  • left (int) – nová hodnota čítače pro levý motor
  • right (int) – nová hodnota čítače pro levý motor
Raise :

CommError

get_motor_pos()

Získat aktuální hodnotu čítačů krokových motorů.

U obou krokových motorů je možné aktuálnímu pozici kola přiřadit číslo pomocí metody set_motor_pos(). To pak bude s každým krokem motoru inkrementováno nebo dekrementováno. Pozice se počítají jako 16bitové číslo se znaménkem.

Returns:dvojice hodnot čítačů (levý motor, pravý motor)
Return type:(int, int)
Raise :CommError
get_raw_accelerometer()

Získat vektor akcelerace.

Vektor se skládá ze složek x, y a z. Vrácená data jsou uložena ve slovníku, klíčem je vždy směr (“x”, “y” nebo “z”). Pro získání praktičtějších dat viz get_accelerometer().

Returns:slovník se třemi složkami vektoru akcelerace (klíče jsou “x”, “y” a “z”)
Return type:dict of ints
Raise :CommError
get_accelerometer()

Získat data z akcelerometru ve sférických souřadnicích.

Robot z vektoru akcelerometru vypočítá tři veličiny, s kterými se lépe pracuje. Jsou jimi zrychlení, náklon a orientace. Všechny tři jsou vyjádřeny ve stupních. Jejich význam je následující:

Akcelerace
Velikost vektoru = intenzita zrychlení
Náklon
  • 0° – e-puck je horizontálně
  • 90° – e-puck je vertikálně
  • 180° – e-puck je horizontálně, ale vzhůru nohama
Orientace – odklon vektoru od horizontální roviny, 0° míří dopředu
  • 0° – přední část níže než zadní
  • 90° – levá část níže než pravá
  • 180° – zadní část níže než přední
  • 270° – pravá část níže než levá

Note

Uvedené hodnoty veličin byly získány z dokumentace knihovny pro firmware e-puck robota. Při testech ne vždy odpovídaly realitě, proto je důležité si důkladně vyzkoušet jaké hodnoty robot vykazuje při různých činnostech a vytvořit si vlastní závěry.

Returns:slovník se třemi veličinami získanými z vektoru akcelerace. Klíče jsou:
  • acceleration – akcelerace
  • inclination – náklon
  • orientation – orientace
Return type:dict of floats
Raise :CommError
calibrate_sensors()

Kalibrace IR senzorů.

Pro kalibraci IR senzorů je nutné přesvědčit se, že v dosahu senzorů není žádná překážka. Kalibrace probíhá vždy po zapnutí robota, tedy není nutné ji pouštět manuálně, pouze pokud by senzory vykazovaly nějaké závažnější odchylky v naměřených hodnotách.

Raise :CommError
stop()

Zastavit robota.

Dojde k zastavení motorů robota a k vypnutí všech LED.

Raise :CommError
play_sound(sound_no)

Přehrát zvuk.

V robotovi je uloženo 5 zvuků ve formátu wav. Parametr sound_no označuje číslo zvuku, který se má přehrát:

  1. “haa”
  2. “spaah”
  3. “ouah”
  4. “yaouh”
  5. “wouaaaaaaaah”

Jedná se o nahrané výkřiky. Pokud bude zadáno jiné číslo, tak dojde k vypnutí speakeru. Tím pádem také přestane šum, který zůstane hrát po přehraném zvuku.

Parameters:sound_no (int) – číslo označující zvuk, který se má přehrát
Raise :CommError
get_volume()

Získat úrovně hlasitosti z mikrofonů.

Robot disponuje třemi mikrofony rozmístěnými na horní straně. Jsou rozmístěny vlevo, vpravo a vzadu. Protože samotná nahraná data jsou příliš velká, tak robot dokáže pouze poslat úroveň hlasitosti zvuků snímaných jednotlivými mikrofony.

Data jsou vrácena jako slovník, jednotlivé mikrofony jsou označeny zkratkou jejich umístění (“R”, “L”, “B”).

Returns:úroveň hlasitosti na jednotlivých mikrofonech, klíče jsou “R”, “L”, “B”.
Return type:dict of ints
Raise :CommError
get_microphone(on)

Získání hodnot z mikrofonu.

Začne načítání dat z mikrofonu. Tato data pak budou převedena v robotovi pomocí FFT a zaslána do počítače. Jakmile je jednou zapnuto nahrávání, tak každý následující příkaz si už jen vyzvedne připravená data.

Data jsou vrácena jako seznam komplexních čísel.

Parameters:on (int) – zapnout / vypnout nahrávání dat z mikrofonu
Returns:seznam dat získaných z FFT
Return type:[complex]
Raise :CommError

Výjimky

exception epuck.EPuckError

Základní výjimka v epuck. Všechny ostatní od ní dědí.

exception epuck.ControllerError

Chyba při práci s robotem. Například se nepovedlo k robotovi vůbec připojit.

exception epuck.WrongCommand

Specializace výjimky ControllerError. Uživatel nejspíše zadal špatný příkaz, např. parametry, které jsou mimo povolené rozsahy.

«  Připojení a instalace   ::   Contents   ::   epuck.comm — Sériová komunikace s robotem  »