Hlavní navigace

Jak na inteligentního robota (1)

7. 3. 2014 14:50 (aktualizováno) zboj

V poslední době se k výuce programování čím dál častěji používají roboti. Různé podvozky pro Arduino jsou relativně levné a ani Lego Mindstorms nezatíží rozpočet přespříliš. Na ZŠ pochopitelně stačí jednoduchý kód pro dálkové ovládání, jde spíše o výuku základů algoritmizace (dokonalé „škola hrou“). Ale ani takové EV3 není jen hračka, na VŠ se často používá k experimentům s pokročilými algoritmy umělé inteligence (lokalizace, mapování apod.). Pojďme se podívat, jak lze takového robota naučit „inteligenci“.

Já jsem použil k výuce EV3 a následující rozhraní:

class Robot { public: Robot(float gauge, float wheelDiameter); auto move(int speed, unsigned int distance); auto turnLeft(int speed, unsigned int angle); auto turnRight(int speed, unsigned int angle); };

Pochopitelně lze stejným způsobem ovládat jakéhokoliv robota s nezávislým ovládáním pásů (parametry konstruktoru jsou rozchod kol a průměr kola). Později budeme potřebovat ještě senzory (infračervený, ultrazvukový, kompas a akcelerometr). V případě EV3 lze výše uvedené rozhraní implementovat například v Monobricku, což je knihovna fungující na všech OS. (U EV3 se řídící jednotka nazývá brick, česky kostka.)

Robota budeme ovládat pro jednoduchost z počítače, nicméně EV3 je plnohodnotný Linux a umí přímo vykonávat programy v C++, Javě i .NET. V praxi je autonomicita důležitá, například NASA se snaží mít na Marsu maximálně autonomní vozítka, protože dálkové ovládání je v tomto případě značně nepraktické (v nejhorším případě signál na Zemi „cestuje“ 21 minut, takže než vozítko pošle data ze senzorů a obdrží další instrukce, může uplynout i více než 40 minut). My budeme jezdit po místnosti, takže stačí zařízení s Bluetooth, a pokud by někdo chtěl experimentovat a jezdit po venku na větší vzdálenosti mimo dosah signálu, jednoduše si stejný program nahraje přímo na kostku.

Rozhraní Robot je poměrně hloupé, odborněji řečeno jde jen o rozhraní k senzorům a efektorům robota. Později si ukážeme, jak nad tímto základem naimplementovat třídu Agent s pokročilou inteligencí.

Pro začátek je dobré zkusit si jednoduchý program:

for (auto i = 0; i < 10; i++) { for (auto j = 0; j < 4; j++) { auto travelled = robot.move(10, 500); // move forwards by 50 cm auto turned = robot.turnLeft(10, 90); // turn left by 90 deg } }

Uvedený kód názorně ukazuje, jak se při hýbání robotem akumuluje chyba. Robot má jezdit co čtverce a skončit na stejném místě, odkud vyjel. Ale i když zadáte velmi přesně rozchod kol a průměr kola, zjistíte, že startovní pozice se trochu liší od koncové. Jak se lze s chybovostí odometrie vyrovnat si ukážeme někdy příště.

Poznámka: Veškerý kód jsem pochopitelně vyzkoušel přímo v praxi. Zájemcům můžu poskytnout kód pro EV3 (vyzkoušený na OS X s Mono).