PyRoMania
python robot interface
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í.
If you have any experience with this software that you'd like to share with other visitors of this site, please contact us.
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
Send email to the editors
Your message could not be sent
but you can also reach us at webmaster-at-robotika.cz
Your message was successfully sent.
You need to turn on javascript to submit this form.