Určitě nejsem sám kdo si rád hraje a LEGO byla (a ode dneška opět je) jedna z mých nejoblíbenějších hraček :-). Díky Michalovi mi z Microsoftu půjčili na několik dní na vyzkoušení LEGOvého robota (prodává se pod jménem LEGO NXT). Robot samotný stojí kolem $250, ale převozem do Čech se vše docela prodraží. Proč ale píšeme o hračce z LEGA na vývojářovi, tedy serveru pro .NET programátory? Odhadujete správně - je to proto, že robota můžete programovat a to dokonce v .NETu.
Robot od LEGA je složený z jedné "inteligentní kostky", která obsahuje 32bit procesor. K procesoru je možné připojit 3 motory (při programování se jim dá nastavit i rychlost) a několik různých senzorů. Nejzajímavější je asi ultrazvukový senzor, který je schopný poznat jak daleko je robot od nějakého předmětu (do 250cm), dále je robot vybarven senzorem pracujícím se světlem (dokáže podle odrazu světla poznat i barvu), dotekovým senzorem a do jako čtvrtý lze použít senzor detekující hlasitost zvuku.
Pokud vás zajímá co takový robot umí (máme i video:-)) a jak ho naprogramovat pomocí .NETu tak čtěte dále!
reklama
Určitě nejsem sám kdo si rád hraje a LEGO byla (a ode dneška opět je) jedna z mých nejoblíbenějších hraček :-). Díky Michalovi mi z Microsoftu půjčili na několik dní na vyzkoušení LEGOvého robota (prodává se pod jménem LEGO NXT). Robot samotný stojí kolem $250, ale převozem do Čech se vše docela prodraží. Proč ale píšeme o hračce z LEGA na vývojářovi, tedy serveru pro .NET programátory? Odhadujete správně - je to proto, že robota můžete programovat a to dokonce v .NETu.
Robot od LEGA je složený z jedné "inteligentní kostky", která obsahuje 32bit procesor. K procesoru je možné připojit 3 motory (při programování se jim dá nastavit i rychlost) a několik různých senzorů. Nejzajímavější je asi ultrazvukový senzor, který je schopný poznat jak daleko je robot od nějakého předmětu (do 250cm), dále je robot vybarven senzorem pracujícím se světlem (dokáže podle odrazu světla poznat i barvu), dotekovým senzorem a do jako čtvrtý lze použít senzor detekující hlasitost zvuku.
Pro programování robotů máte k dispozici několik možností. Nejjednodušší varianta je použít software, který dodává samotné LEGO. Jejich prostředí je pouze vizuální, takže žádný kód člověk nepíše. Program se skládá jako takové sekvenční workflow z WF (a to je na krabici napsáno, že je robot vhodný pro děti od 10ti let). Je tedy možné za sebe napojit jednotlivé povely, jako například zapnutí motoru, podmínku testující vzdálenost od překážky (tedy test hodnoty z ultrazvukového senzoru). Při podmínce se vytvoří dvě větve kam lze zapojovat další akce a samozřejmě je možné použít i cyklus. Není toho tedy mnoho a člověk by ani nevěřil co vše lze v tomto prostředí vytvořit. Program se v tomto případě nahrává na robota (do kostky) a běží i bez připojení k počítači. Jedna hezká ukázka je program, který naučí robota jezdit podél čáry nakreslené na zemi [1]. Další možnosti nabízí varianta jazyka C, která je kompilovaná pro kostku (takže také běží přímo na robotovi). V tomto jazyce je mimo jiné napsaný program (bohužel pro starší verzi robota), který umí složit rubikovu kostku [2] - to je hodně slušný výkon!
Tak a teď jak je to s robotem a platformou .NET. Bohužel verze NXT nemá .NET nainstalovaný přímo v kostce, takže lze robota ovládat pouze programem z počítače (přes rozhraní Bluetooth to jde ale docela pohodlně). K programování robotů má Microsoft produkt (původně vznikal v Microsoft Research v Cambridge), který se jmenuje Robotics Studio [3]. Tento nástroj je zaměřený hlavně na asynchroní zpracování, což je u robotů velmi důležité (a v softwaru od LEGA se robot asynchroně naprogramovat nedá). Kromě samotné knihovny a nástrojů pro programování robotů obsahuje Robotics Studio ještě komponentu concurrency&coordination runtime na které je vývoj založenž, ale kterou lze použít i nezávisle v libovolných jiných .NET aplikacích (pár užitečných odkazů na další informace jsem kdysi psal do svého blogu [4]).
Ukázka
|
|
Následující video ukazuje co je možné s robotem provádět (je to trošku tmavé, ale myslím že to důležité vidět bude). Robot, kterého na videu vidíte se chová celkem jednoduše - vyrazí vpřed a pomocí ultrazvukového senzoru kontroluje zda se blíží k nějaké překážce. Pokud se přiblíží na méně než 20cm (všiměte si, že nikdy nenarazí) tak se začne otáčet doleva dokud není natočený tak aby měl před sebou dostatečný prostor, poté opět vyrazí vpřed. Druhý senzor, který robot sleduje je senzor zvuku - jak je vidět na videu robot tedy reaguje i na tlesknutí.
(pokud vám nefunguje videa vložené do stránky, můžete si ho stáhnotu ve VMW formátu) |
Programování robotů
Software od Lega
Jak jsem již psal, první možností jak programovat Lego NXT roboty je pomocí softwaru, který dodává LEGO. Jak takový program vypadá ukazuje následující obrázek (po kliknutí uvídíte celé vývojové prostředí). Pomocí několika podmínek a cyklů vidíte na obrázku program pro robota, který dělá přesně to co robot natočený na videu. Zelené kostky zapínají nebo vypínají motory a žluté kostky detekují zvuk a vzdálenost od překážek. Za zmínku stojí ještě to, že celý program je synchroní a nelze tedy reagovat na události z postředí pokud robot dělá něco jiného. To je celkem nešikovné, takže pro jakýkoliv složitější projekt je to nepraktické.
Robotics Studio a .NET jazyky
Pokud chcete programovat roboty v .NETu tak budete potřebovat Microsoft Robotics Studio, které je v současné době uvolňováno v CTP verzích. Vývoj je založen na Concurrency&Coordination runtime (zkratka "CCR"), což je knihovna vyvinutá v Microsoft Research. Tato knihovna řeší u robotů koordinaci mezi jednotlivými aktivitami, které robot může dělat (program je tedy co nejvíce asynchroní). Knihovna je založená na portech (třída Port), pod kterými si lze představit objekt který může obsahovat frontu zpráv, nebo dat nějakého typu. V případě robotů jsou porty všechny senzory a motory (ze senzorů bude vaše aplikace data číst a do portů pro motory zapisovat).
Druhou důležitou třídou v CCR je třída Arbiter, pomocí které se dají vytvářet handlery událostí (pokud přijde zpráva do portu) a zároveň se pomocí ní dají handlery reagující na události z portů spojovat dohromady (například pokud chcete aby robot začal nějak reagovat až poté co se ve dvou různých portech objeví zpráva) - v terminologii CCR se toto propojení nazývá join. To znamená, že můžete například napsat handler, který se vyvolá pouze pokud bude robot blízko nějaké překážky a zároveň "uslyší" hlasité tlesknutí. Další možností jak spojit události je pomocí propojení choice, které vyjadřuje, že robot má čekat na jeden z několika povelů a poté začít vykonávat reakci.
To snadno umožňuje zapsat program, kterým se řídí robot z výše uvedeného videa a který šlo v LEGO softwaru napsat jen těžko. Robot totiž při jízdě čeká na dvě různé události - jednak dokud se nepřiblíží k překážce (poté se začne otáčet), za druhé "poslouchá" a čeká na tlesknutí (poté také zamává pařátky). V standardním neasynchroním přístupu musíte v cyklu kontrolovat obě podmínky a aby se robot choval správně (tedy uměl reagovat na tlesknutí i když se otáčí a i když jede dopředu) musíte hlasitost kontrolovat na dvou místech (při jízdě dopředu a při otáčení). Tento problém právě řeší propojení choice, kterému zadáte dvě události a dva handlery a ono automaticky zavolá handler v případě že dojde k jedné z událostí (přesnějí řeknete, že robot se má začít otáčet pokud se v portu s daty z ultrazvukového senzoru objeví zpráva, že robot je blízko překážky a že robot má zamávat pařátky pokud se v portu kam chodí zprávy od zvukového senzoru objeví zpráva s hlasitým zvukem).
Jako ukázku jak se robot programuje použijeme kousek kódu z tutoriálů, které jsou nainstalovány spolu s Robotics Studiem (vše bude vysvětleno v následujícím odstavečku).
// 1: Vše jsou služby
// 2: Povely se vracejí z metody pomocí enumerátoru
[ServiceHandler(ServiceHandlerBehavior.Concurrent)]
public virtual IEnumerator<ITask> TurnLeftHandler(TurnLeft turnLeft)
{
// 3: Nejprve zapneme motor
if (!_state.MotorEnabled)
{
yield return EnableMotor();
}
// 4: Požadavek na nastavení motoru
drive.SetDrivePowerRequest request = new drive.SetDrivePowerRequest();
request.LeftWheelPower = -0.5;
request.RightWheelPower = 0.5;
// 5: Ošetření případných chyb
yield return Arbiter.Choice(
_drivePort.SetDrivePower(request),
delegate(DefaultUpdateResponseType response) { },
delegate(Fault fault) {
LogError(null, "Unable to turn left", fault);
});
}
Komentáře jsem úmyslně označil čísly, abych k nim mohl napsat podrobnější vysvětlení. První komentář upozorňuje na to, že celý program určující chování robota se tváří jako služba. To je důležité k tomu, aby spolu mohly jednotlivé robotí komponenty snadno spolupracovat. Další komentář se týká návratové hodnoty (tedy enumerátor vracející instance objektů implementujících rozhraní ITask). To dává autorům možnost vracet z metody postupně (a asynchroně) jednotlivé příkazy které se mají v rámci ošetření události vykonat. Tyto události vnitřně vykoná CCR framework. Jednotlivé povely obsahují delegáty, které runtime spustí. Nejprve se tedy vrací povel na zapnutí motoru (komentář #3) a poté se vytvoří složený příkaz, který nastavuje rychlost motoru a po nastavení reaguje na výsledek (na úspěšné nastavení rychlosti reaguje prázdný delegát a reakce na případnou chybu obsahuje zalogování problému).
Celé Robotics Studio je velmi zajímavé a používá se nejen pro hraní s roboty, ale i pro ovládání řádově složitějších strojů (třeba robotů podobným těm, které staví ve Škodovce auta). Jedním z robotů, které je možné ovládáat z Robotics Studia je i virtuální robot, který žije ve 3D světě (s velmi věrnou simulací fyzikálních zákonů), můžete si tedy s roboty hrát i pokud (zatím :-)) doma žádného nemáte. Robotics Studio je tedy napsané velmi obecně a je kromě hraní použitelné i pro velmi seriózní projekty i vědecké bádání. CCR samo o sobě je také zajímavý framework (ikdyž sami autoři přiznávají, že s tímto typem koordinace ještě nemají vývojáři moc zkušeností a proto se framework ještě vyvíjí), ale určitě o něm ještě uslyšíme.
Robotics Studio a Visual Programming Language
Microsoft Robotics Studio obsahuje nástroj pojmenovaný Visual Programming Language (tedy zkratkou "VPL"). Tento nástroj slouží podobně jako software od LEGA ke grafickému programování, ale narozdíl od LEGA je založený na výše popsaném a celkem propracovaném frameworku. Do VPL lze snadno přidávat vlastní komponenty (říká se jim služby), napsané třeba v C# a ty lze pospojovat do složitějších programů.
|
Tento program ukazuje jak vytvořit robota, který jede (respektive zapne motor) pokud má aktivovaný nějaký senzor (v tomto případě dotykový). Po stisknutí senzoru se honota (zda je senzor stisknutý) uloží do proměnné a na základě této proměnné se pomocí podmínky rozhoduje zda se má motor zaponout či vypnout (kromě zapínání motorů zobrazuje aplikace i dialogové okno - tedy na počítači ze kterého robota řídíte).
Tím, že je celé zpracování asynchroní se návrh takového programu zjednodušuje, protože při změně dat v senzoru se vyvolá událost a celý řetěz příkazů (nastavení proměnné, manipulace s motory) se postupně provede. Není tedy třeba psát žádné složité cykly. |
|
Konkurenční roboti
Abych nepsal pouze o LEGU, tak musím zmínit i další zajímavé roboty - pravděpodobně ještě zajímavější výrobky nabízí společnost Fischertechnik [5]. Jednak proto, že je jde také programovat z Microsoft Robotics studia, což je celkem profesionální nástroj, za druhé proto, že jejich roboti toho umí o něco víc než roboti z LEGA a jsou používání nejen jako hračky ale i pro simulaci reálných výrobních linek v různých komerčních společnostech a to už je pořádná výzva :-).
Odkazy