czech english

PyRoMania

python robot interface

PyRoMania
PyRoMania

PyRoMania je v pythonu psaný interface pro různé druhy robotů. Cilem je snadný port existujících robotů a snadá implementace nejrůznějších aplikací.


http://robotika.cz/


Pokud máte jakékoli zkušenosti s tímto softwarem/projektem a rádi byste se o ně podělili s ostatními prostřednictvím této stránky, můžete nám napsat.

Motivace

MD> mám k dispozici 2-3 různé roboty, ale SW pro ně chci psát právě jednou. Dále se účastním nejrůznějších soutěží a přál bych si, aby se dal potřebný řídící program a strategie rychle napsat a odladit.

První seance ZT/30-10-2009

Robot

Robot zajišťuje integraci všech vstupně/výstupních zařízení do jednotného proudu informací.

Source/Sink

Zdroj a příjemce dat je typicky seriová linka pro řízení robota. Můžou to ale být i NMEA data od GPS nebo obrázky z kamery. Každé ze zařízení generuje zprávy ve formátu specifickém pro dané zařízení.

Device

Zařízení je cosi, co se zapojuje do Robota. Pro svoji činnost vyžaduje aktuální binární zprávy, které interpretuje a převádí do smysluplných hodnot.
Příklady:
  • kompas na CANu zpacovává zprávy s ID=0x187 a délkou dat 2 bajty určující úhel v desetině stupně.
  • ATMegaBoard čte analogové hodnoty z A/D převodníků. Tam může být napojena světelná zavora, Sharp nebo CNY70. Zde Device navíc zná přesnou polohu senzoru.

Extension

Extension je rozšíření základních informací robota. Příkladem může být lokalizace, která z nasbíraných dat z odometrie, kompasu, GPS a pod upřesňuje informaci o pozici robota.

Implementace Robot.update()

Robot.update by měl být řízen zdrojem s nejvyšší frekvencí a tím by zároveň měl být zdroj zajišťující řízení mobilního robota. Jeho čtení by mělo být blokové a definovat „robotův čas” (v sekundách s časem 0 při puštění programu).
Jeden update by měl mít jasný začátek a konec. U Daisy-like komunikace (pošli strukturu, přijmi strukturu) update odpovídá jedinému sync-u. Tato struktura je pak jako jediná zpráva předávána všem Devices. U SLIP modelu MOBů, kde na jeden příkaz může přijít hned několik stavových zpráv, je důležitá „ukončovací zpráva”, že v dané iteraci již více informací nedorazí. Konečně u RobSys CANu se sbírají všechny zprávy, dokud nedorazí SYNC.

Generátory

Kód na řízení může být napsán „naruby”. Může využívat pythonovských generátorů s klíčovým slovem yield:
def gonorth(r):
    p=position.Position(r)
    r.speedcontrol.setSpeed(0.1,0)
    while p.x < 1:
        yield
        r.speedcontrol.setSpeed(0.1,0)
        print p 

def main2():
    r = robot.Eduro()
    for a in gonorth(r):
        r.update()

MD notes (last update 2010-05-11)

Robot/Vehicle

Robot je kolekce zařízení (senzorů a efektorů), které se buď mohou připojovat dynamicky, tj. vytvořím si robota a pak přípojím (attach, addExtension,…) senzor, nebo staticky, tj. vytvořím si speciálního robota a všchny dostupné senzory zapojím už v konstruktoru.
Robot je zároveň sběrna, kolektor, něco jako BlackBoard v literatuře. Jednotlivé senzory do něj mohou zapisovat nasbírané informace, např. zda je stisknuté EmergencyStop tlačítko.
Každý robot musí mít funkci update(), která realizuje vyslání příkazů a naopak sběr nových dat.

Driver

Řidič robota. Robota dostane v konstruktoru a zajišťuje nejrůznější druhy řízení (ujeď danou vzdálenost, otoč se o X stupňů atd.). Pro případné kombinování strategií jsou všechny akce Drivera generatory. K dispozici by ale měl být i jednoduchý wrapper, který akci provede:
def stop( self ):
    for cmd in self.stopG():
      self.robot.setSpeedPxPa( *cmd )
      self.robot.update()
Driver musí brát ohledy na schopnosti robota, konkrétně omezení maximální rychlosti. Tu má jak Robot/Vehicle, jak se s ním dá maximálně rychle jet, tak Driver (tj. např. opatrný řidič v BMW).

Localisation

Lokalizace je vlastně advanced senzor. Na vstupu má předzpracovaná nejrůznější data z realných senzorů a sama generuje informaci pose(x,y,heading) případně nepřesnost pozice.
Vedle dat ze senzorů potřebuje ještě extra konfiguraci, např. kde se nachází referenční majáček, kde je umístěn Sharp na robotu a kam směřuje, jaký offset má kompas, jaká je referenční mapa atd.

Sensors

Senzor interpretuje data o okolí a informace zapisuje do Robota. Parametr robot vlastně hraje ve zpracování v extension trošku roli jako self:
def beaconsExtension( robot, id, data ):
  if id == 0x188:
    assert( len(data) %2 == 0 ) 
    …
Senzor ale muže mít vlastní složitou třídu a pak volaní extension vypadá jinak a self se použije:
def extension( self, robot, id, data ):
    if self.reader:
      try: 
     …
Vedle jednoduchých senzorů, kterým stačí data z nejrychlejší řídící pipe (CAN, RS232), robot může mít složité senzory typu kamera, GPS nebo SICK laser finder. V návrhu z ZT2009/10 je spojit všechny zdroje do jednoho proudu dat ke zpracování, tj. GPS NMEA, obrázek nebo scan. Problém ale může být se zpětnou vazbou, kdy např. zpracování obrázku trvá 10x déle než pořízení a systém by byl zahlcen zbytečnými daty. Stejně tak nelze omezit frekvenci zdroje, protože bychom rádi nejnovejší data, když je příjemce připraven. Je-li příjemce jediný, tak může rovnou být se vstupem provázaný, tj. nový snímek se sejme jakmile skončí zpracování starého …
  • určení pozice na základě nejrůznějších měření
  • neměla by být součastí Robota pose().heading() vs. pose[2]??

Nice To Have … port do Playera (oboustranny)

robot = Robot() robot.attach( "compass", Compass() )
robot.compass.direction()
  • blok na pipe s nejvyssi freq, update vrati i vse ostatni

Pošlete email redakci.
Všechny materiály, které máme k dispozici, jsou již součástí článku, na který reagujete (tj. pokud tam tedy není např. plánek na stavbu, je to proto, že nic takového nemáme).

Vaši zprávu se bohužel nepodařilo odeslat, ale můžete nám napsat sami na adresu

Vaše zpráva byla úspěšně odeslána

Pro odeslání formulář je třeba mít zapnutý javascript.