Linux a Python na Legu Mindstorms

Lego Mindstorms má nezastupitelnou roli ve výuce informatiky, programování a robotiky od základních škol po univerzity. Bohužel je mezi vyučujícími a dalšími uživateli povětšinou známa pouze možnost programování pomocí grafického nástroje ROBOLAB, založeného na LabVIEW, kde programování spočívá v přetahování a umísťování bloků na obrazovce. Touto metodou mnozí pedagogové na vyšších stupních škol, zejména technických, ať právem, či neprávem, pohrdají. Málokdo z nich však alespoň tuší, že na cihličce (Lego Brick), která skrývá řídící počítač Lego Mindstorms lze použít plnohodnotný Linux, který je vlastně upravený Debian. A navíc jeho použitím není nijak dotčen původní firmware, takže je možné stále pracovat s Lego cihličkou stejně jako dříve.

EV3DEV Linux

Ev3dev Linux je komunitou vyvíjená distribuce Linuxu určená k běhu na cihličkách Lego nebo na počítačích Raspberry Pi a BeagleBone, propojených s Legem. Distribuce je primárně určena k ovládání modelů sestavených ze stavebnice Lego Mindstorms. Aktuální verze je založena na poslední verzi Debianu, tedy Debianu 9 Stretch.

Ev3dev se instaluje na micro SD kartu a z ní také startuje. Původní software tak není nijak dotčen a můžeme jej stále používat. Pokud ve výuce potřebujeme pracovat v jedné třídě s Linuxem a v jiné s původním softwarem, nečiní to žádné problémy.

Pro Ev3dev je k dispozici několik programovacích jazyků, které obsahují podporu pro práci s perifériemi ze stavebnice Mindstorms.

Jsou to:

  • Python
  • Java
  • Go
  • C++
  • C
  • Jazyky Vala a Genie založené na knihovně GObject

Pro příznivce grafického programování pak je k dispozici prostředí Open Roberta Lab  s programovacím jazykem NEPO, ve kterém se programuje podobně jako ve Scratchi.

Příprava na instalaci

Co potřebujeme k instalaci? Počítač, na kterém Ev3dev poběží. Na výběr máme buď originální cihličku Lego nebo Raspberry Pi či BeagleBone. Při použití Raspberry Pi, potřebujeme ještě rozšíření BrickPi a PiStorms, k počítači BeagleBone potřebujeme rozšíření FatCatLab a QuestCape (které však už není v prodeji).

V tomto článku se budeme dále zabývat pouze instalací a používáním Ev3dev na cihličce Lego.

Pro instalaci potřebujeme Micro SD kartu o kapacitě minimálně 4 GB. Pokud budeme chtít uchovávat větší množství programů, pak je lepší volbou 8 GB karta. Tato kapacita je naprosto dostatečná.

Dále potřebujeme WiFi dongle. Ačkoliv je instalace možná i bez něj, práce s Ev3dev bez vzdáleného přístupu přes SSH je obtížná a nepohodlná. Lze se připojit pomocí USB kabelu, ale nemůžeme pak vzdáleně ovládat cihličku mimo dosah kabelu. Na rozdíl od originálního firmware spolupracuje Ev3dev s většinou WiFi dongle, které můžeme zakoupit. Abych upřesnil – autor se v praxi dosud nesetkal s nekompatibilním dongle. Je to dáno tím, že linuxová jádra obsahují podporu pro většinu běžně dostupného hardware.

Instalace

Nyní již můžeme přistoupit k samotné instalaci. Ze stránek Ev3dev Linuxu si stáhneme image požadované verze systému. Je třeba si dát pozor, abychom stáhli verzi pro Lego Mindstorms (a ne pro Raspberry nebo BeagleBone). Stahujte nejnovější verzi, která obsahuje aktuální knihovny programovacích jazyků.

Image systému nyní uložte na micro SD kartu. Autoři Ev3dev Linuxu doporučují program Etcher, ale můžete samozřejmě použít libovolný jiný program se stejnou funkcí. V Linuxu a MacOS třeba obyčejné dd.

Po úspěšném nahrání vložte micro SD kartu do štěrbiny na levé straně Lego Mindstorms. Současně zasuňte do vedlejšího USB portu WiFi dongle. Je vhodné, aby byl zasunut již při startu systému, linuxové jádro jej rozpozná a samo použije odpovídající ovladač.

Máte-li rovněž vloženy dostatečně nabité baterie nebo akumulátor, zapněte Lego cihličku. LED na čelní straně se rozsvítí červeně a po malé chvilce začne oranžově blikat. To nám oznamuje, že systém startuje. Nová verze Ev3dev Linuxu již vypisuje na displej cihličky informace o průběhu startu, takže víme, co se děje a zda se systém z nějakého důvodu nezasekl. První start trvá poměrně dlouho – v řádu minut, následující starty jsou ale už poměrně rychlé. Pokud vše proběhne v pořádku, na displeji se objeví základní menu.

Máte-li vložen WiFi dongle a k dispozici vhodnou WiFi síť (pozor nelze použít Eduroam – alespoň autorům se jej nepodařilo rozchodit), je čas nastavit Wifi. Z nabídky Wireless and Networks vyberte Connect, zvolte vhodnou síť a ovládacím křížem cihličky zadejte heslo. Není to příliš pohodlné a možná se vám to ani napoprvé nepovede, ale systém si toto nastavení pamatuje a příště tuto činnost nebudete muset opakovat.

Pokud vše dopadne dobře, uvidíte na displeji nahoře IP adresu, která byla cihličce přidělena. Nyní nastal čas se k systému připojit pomocí SSH.

Pokud nemáte k dispozici WiFi dongle, můžete připojit cihličku pomocí USB kabelu a postupovat dle návodu na stránkách Ev3Dev Linuxu.

Nastavení

Nyní máme připravený a nabootovaný systém a známe jeho IP adresu. Je čas se k němu připojit, dokončit konfiguraci a začít jej používat. Pro připojení ze systému Windows použijte program PuTTY, z MacOS nebo Linuxu běžný příkazový řádek a SSH.

Přihlašovací defaultní jméno je robot a heslo maker. Tento uživatel také může implicitně získat právo roota pomocí programu sudo.

Nyní jsme v příkazovém řádku. Ti z vás, kteří se vyznají v Linuxu se nyní cítí jistě jako doma. Můžete nyní zjistit některé informace o systému, např., že je použit dvaatřicetibitový ARM procesor a systém má pouze 64 MB RAM!

Pokud se v Linuxu nevyznáte, doporučuji nejprve absolvovat nějaký linuxový kurz pro úplné začátečníky. Potřebujete alespoň tyto znalosti:

  • Editace souborů
  • Správa souborů
  • Instalace a spouštění programů

Nyní rovněž můžete pomocí příkazu passwd změnit defaultní heslo pro účet robot a popřípadě i přidat dalšího uživatele, kterému nezapomeňte nastavit povolení pro sudo. Pokud nevíte, jak se to dělá, nepouštějte se do toho. Pokud máte více cihliček (pro třídu), tak nedoporučuji měnit ani uživatele, ani hesla, přes prázdniny to zapomenete nebo ztratíte papírek, kde jsou napsaná.

Doporučuji provést aktualizaci zdrojů software a upgradovat software pomocí známé dvojice příkazů:

apt update

apt upgrade

Pozor může to nějakou dobu trvat, klidně i hodinu nebo více, systém je opravdu hodně pomalý. Na druhou stranu získáte nejnovější verze programovacích jazyků a podpůrných knihoven.

Další své oblíbené programy můžete vyhledat a nainstalovat pomocí apt, např. pro správce souborů Midnight Commander:

apt search mc

apt install mc

Případné další nastavení a konfiguraci zde nebudeme popisovat, to ostatně ani není cílem tohoto článku. Pokud vás zajímá více, opět vás odkazuji na stránky Ev3Dev Linuxu.

Ještě je třeba se zmínit o vypínání systému. Ačkoliv (zejména uživatele znalé Linuxu) bude svádět použít pro vypnutí systému příkaz sudo halt anebo sudo shutdown now, nedělejte to, systém se zasekne a jediná možnost, jak jej znovu oživit je vyndat z něj baterie. Pro vypnutí anebo restart používejte pouze menu a klávesy cihličky.

Pokud chcete nastartovat Lego cihličku do originálního systému, postačí vyjmout micro SD kartu a případně i odstranit WiFi dongle. Pro bezproblémové vyjmutí micro SD karty doporučuji pinzetu.

PROGRAMOVÁNÍ v EV3DEV

Kompilované jazyky

Pokud pracujete s jazyky typu C, C++ anebo Go, pak je pro vás dobrá zpráva, že je máte k dispozici i zde včetně všech knihoven. Autor má (malé) zkušenosti pouze s použitím jazyka Go, proto se nebudeme hlouběji těmito jazyky zabývat.

Obecně platí, že vzhledem k výše popsanému slabému hardware cihličky není dobrý nápad kompilovat programy přímo na cihličce. Ostatně zde ani nemusí být vše nainstalováno. Mohly by vám dojít systémové zdroje, a navíc by kompilace trvala opravdu dlouho. Daleko lepší nápad je provést takzvanou cross kompilaci. Ta spočívá v tom, že na svůj počítač si nahrajete potřebný překladač a knihovny pro práci s ev3dev. Kompilaci pak provedete na svém počítači a přeložený program si zkopírujete pomocí scp (MacOS, Linux) nebo WinSCP (Windows) na cihličku a tam jej spustíte. Vše je poměrně zdlouhavé, ale rozhodně rychlejší, než se snažit kompilovat přímo na cihličce. Návody k jednotlivým programovacím jazykům najdete v odkazech uvedených na stránce Ev3Dev Linuxu v sekci programing languages.

Open Roberta Lab

Poměrně zajímavá možnost je grafické programování pomocí nástroje Open Roberta Lab. Na webové stránce si vytvoříte účet a přihlásíte se k němu. Vyberete možnost EV3 a ev3dev. Pomocí grafického prostředí sestavíte program. Prostředí trochu připomíná grafické prostředí pro programování Micro:bitu.

Před použitím je nutné z příkazového řádku Ev3dev Linuxu, tuto službu odemknout, spustit a povolit:

sudo systemctl unmask openrobertalab.service

sudo systemctl start openrobertalab.service

sudo systemctl enable openrobertalab.service

Nyní v menu Ev3dev spustíte možnost Open Roberta Lab a obdržíte kód. Tento kód zadáte na stránce OpenRoberta Lab a program se vám podle pokynů buď přímo spustí nebo stáhne do cihličky. Je rovněž třeba na web stránce nejprve nastavit připojení motorů a senzorů k jednotlivým portům cihličky.  Když si jej prohlédnete, ať v cihličce nebo na stránkách OpenRoberta Lab, zjistíte, že se vlastně jedná o kód v Pythonu.

Zůstává trochu otázka použitelnosti tohoto systému. Spuštění je poměrně zdlouhavé a pracné a je nutné nainstalovat Ev3Dev Linux atd. Proto pokud chcete programovat v grafickém režimu,  je možná lepší zůstat u původního programovacího nástroje, který má i více možností.

Snad jediné důvody, které mně napadají jsou:

  • Stránky Open Roberta Lab jsou kompletně lokalizovány do češtiny, a tak zejména mladším studentům bude programování za použití tohoto nástroje přístupnější.
  • Programování v Open Roberta Lab se nám zdá jednodušší a přehlednější než u originálního software. Na druhou stranu originální software je podobný LabView.
  • Open Roberta Lab může sloužit jako generátor pythonovského kódu, který pak můžeme ladit, zjednodušovat a upravovat i mimo tento systém.

EV3dev Python

EV3dev Python se v nedávné době dočkal aktualizaci na verzi 2. Tato verze je obsažena i v poslední verzi Ev3dev Linuxu Stretch. Dejte si, proto jak jsme již říkali výše pozor, zda instalujete poslední verzi Ev3dev Linuxu.

Poměrně čerstvá možnost je nainstalovat si Microsoft Visual Code s rozšířením EV3 (tato možnost nyní funguje pro Windows, MacOS i Linuxu (testováno na Ubuntu 18.04 LTS)). Jiný možný způsob je přihlásit se k cihličce pomocí SSH, editovat kód pomocí nějakého obyčejného linuxového editoru například nano program.py, nastavit ho jako spustitelný chmod a+x program.py a pak ho spustit ./program.py. Samozřejmě tento postup můžete použít i ve Windows a přihlásit se pomocí programu PuTTY.

Robot Explor3r

Pro demonstraci možností EV3 Pythonu na platformě Ev3dev Linux jsem si vybral robota Explor3r .

Robot Explorer

Jedná se o poměrně jednoduchého robota s dvěma koly poháněnými motory a dvěma senzory. Jednak dotykovým pro detekci překážek a pak volitelně buď detektor vzdálenosti anebo detektor barvy (případně dva máme-li je k dispozici) pro sledování čáry na podlaze. Na obrázku je s dotykovým senzorem.

Jedná se o jednoduchého, snadno ovládatelného robůtka, na kterém se dají dobře demonstrovat různé úlohy pro autonomní chování a současně i různé problémy autonomního chování.

Následující program umožňuje autonomní chování robota, který sám jezdí prostorem a pokud narazí na překážku (ať dotekovým senzorem anebo senzorem vzdálenosti) otočí se doprava pokračuje. Počet kolizí je omezen, aby robot nejezdil do nekonečna. Jedná se o podobný algoritmus, který používají například robotické vysavače v autonomním režimu.


#!/usr/bin/env python3
from ev3dev2.motor import MoveTank, OUTPUT_A, OUTPUT_B
from ev3dev2.sensor.lego import TouchSensor, InfraredSensor
from time import sleep

ts = TouchSensor()
ir = InfraredSensor()
tank_pair = MoveTank(OUTPUT_A, OUTPUT_B)

tank_pair.on(left_speed=30, right_speed=30)

pocet = 20 # povoleny pocet zaznamenanych prekazek
prekazka = 1

while (pocet):
    if (ts.is_pressed): # Stisknut touch senzor
        prekazka = 1
    elif (ir.proximity < 40):
        prekazka = 1
    else:
        prekazka = 0
    if (prekazka):
        tank_pair.on(left_speed=-20, right_speed=-20)
        sleep(0.5)
        tank_pair.on_for_degrees(30, -30, 30)
        tank_pair.on(left_speed=30, right_speed=30)
        pocet = pocet - 1
        prekazka = 0
    sleep(0.01)
tank_pair.off()
sleep(5)

Jedná se o jednoduchý prográmek pro demonstraci autonomního chování a na kterém lze například pěkně demonstrovat nebezpečí uvedení robota do stavu, ze kterého se nedokáže sám dostat – například zajede-li pod příčku lavice.

ZKUŠENOSTI S POUŽÍVÁNÍM

EV3 Python a Ev3dev Linux používám při výuce robotiky na naší fakultě. S jejich nasazením na nižším stupni škol bohužel dosud nemám zkušenosti. Na základě  zkušeností s výukou na nižších stupních škol si však dovoluji tvrdit, že by zde bylo minimálně vhodné je vyzkoušet.

Napadají mne minimálně tyto případy:

  • Tam kde se vyučuje robotika a studentům připadá originální Lego software příliš primitivní nebo nepřehledný.
  • Tam kde chtějí vyučující zajímavým způsobem oživit výuku.
  • Jedná se navíc o zajímavou možnost, jak vyučovat Python anebo navázat na výuku Pythonu. Použití specifických knihoven, metod, objektů atd. studentům obvykle nedělá potíže.
  • Zajímavá je rovněž možnost naučit tímto netradičním způsobem studenty práci s Linuxem. Studenti Linux obvykle vnímají velmi dobře a zde je možno jej zajímavě použít na neobvyklém hardware – Lego cihličce.

Pros and cons

Zkusme si nyní shrnout pro a proti použití těchto nástrojů:

Pro:

  • Možnost naučit se (prohloubit si znalosti) Linux a Python v praxi – výsledky programování hned vidíme.
  • Oproštění se od grafického programování – v určitém okamžiku již studenti chtějí zkusit něco jiného.
  • Výuka robotiky – příprava na reálné programování robotických systémů (příkazový řádek, Python).
  • Další využití robotických Lego Mindstorms stavebnic.
  • Možnost vyzkoušet i systém Open Roberta.

Proti:

  • Není to grafické programování – nutnost posunout se o stupínek výše.
  • Nutnost naučit se něco nového, zejména pro učitele.
  • Práce v příkazovém řádku může být pro studenty obtížná – nejsou na ni zvyklí.

Zkušenosti s použitím na VŠ

Rád bych ještě shrnul i mé zkušenosti s použitím tohoto software při výuce předmětu Robotika 1 na naší fakultě.

Studenti dostávají za úkol v rámci semestrálních projektů jednoduché roboty, přičemž si mohou zcela vybrat jaký hardware použijí. Jednou z možností je i Lego Mindstorms, kde máme k dispozici čtyři studentské a dvě učitelské stavebnice. Kromě Lego Mindstorms mohou například použít Raspberry Pi, Arduino a na konstrukce například Merkur. Stavebnice Totem u nás dosud není rozšířena.

Studenti si rádi volí Lego Mindstorms, pozorujeme na nich že si rádi „hrají s Legem“. Studenti si mohou volit mezi originálním softwarem a popsanou kombinací Ev3dev Linux a EV3 Python. Studenti si bez výjimky zatím zvolili Ev3dev Linux. Přijde jim to jaksi „dospělejší“. Kromě toho si někdy po vyzkoušení stěžují, že originální grafický software je poměrně nepřehledný.

Ukázka studentských prací

Co se týče volby EV3 Pythonu, tak není tak jednoznačná, zaznamenali jsme i pokusy použít Javu, ale obecně mají studenti Python rádi, oceňují na něm jednoduchost a přehlednost. Rovněž na studentech pozoruji, že si rádi odpočinou od striktně objektového programování Javy nebo C++. Na druhou stranu i v EV3 Pythonu se objekty používají, tam kde to vede k zjednodušení a zpřehlednění.

Výhodou nasazení na VŠ je to, že studenti v této fázi studia (obvykle letní semestr druhého ročníku) již obvykle mají slušnou znalost jak Linuxu, tak Pythonu. Pro ostatní připravujeme jedno cvičení na seznámení s Linuxem a jedno na seznámení s Pythonem.

Obecně hodnotí studenti Lego Mindstorms s nainstalovaným Ev3dev Linuxem a EV3 Pythonem velice kladně. Což je i vidět na zajímavých výstupech z jejich prací.

Příklad úlohy

Ze studentských úloh přikládám příklad jednoho modelu, který považuji za zdařilý a zajímavý. Jedná se o robotickou ruku pracující ve 3D prostoru. Viz následující obrázek.

Robotická ruka

Tato ruka má použity dva velké motory pro pohyb vpravo a vlevo. Malý motor je použit pro otevírání a zavírání kleští na konci ruky.

Velmi vtipně jsou řešeny detekce koncových stavů. Jsou použity dva dotykové spínače. Jeden vidíme na dolním konci ramene, pro detekci maximálního pohybu směrem dolů. Druhý pro detekci maximálního vychýlení vpravo je zabudován uvnitř konstrukce základny. Pro detekci maximálního vychýlení směrem vlevo je použit detektor vzdálenosti, který je vidět zcela vpravo.

Ruku je možné používat v autonomním režimu, tedy předem jí naprogramovat na dané pohyby. Další možností je dávat jí pokyny pomocí čtečky barev, umístěné na horní straně nejdelšího ramene. Ta defaultně snímá bílou součástku a může tak reagovat na jakoukoliv jinou barvu.
Protože motorky měly problém s tím, že nedržely danou výšku anebo směr a například při zatížení sjelo rameno dolů nezávisle na požadované poloze, byla konstrukce vylepšena o díly tištěné na 3D tiskárně. Jedná se o ozubená kola různých velikostí.

ZÁVĚR

Použití Ev3dev Linuxu a EV3 Pythonu na Lego Mindstorms je zajímavou možností, jak doplnit použití této oblíbené výukové stavebnice v procesu vzdělávání.


Tento článek vznikl úpravou textu, který vyšel ve sborníku na konferenci Didinfo 2019 v Bánské Bystrici.