Przewodnik po kodowaniu
Ten dokument opisuje RobomationLAB — platformę edukacyjną do programowania robotów, będącą częścią opracowanego przez Robomation „silnika wykonawczego i zintegrowanego środowiska twórczego dla usługi strumieniowania ruchów robota".
Szczegółowy opis pojawia się w następującej kolejności:
- najważniejsze cechy RobomationLAB
- sposób programowania robotów w RobomationLAB
- podstawy składni programowania robotów w RobomationLAB
Spis treści
RobomationLAB — platforma edukacyjna do programowania robotów
1-1) Programy do kodowania robotów
1-2) Dwukierunkowy przekład bloki ↔ Python na żywo
1-3) Najważniejsze cechy programów do kodowania
1-4) Sterowanie robotem na żywoSposób programowania robotów w RobomationLAB
2-1) Wykonywanie sekwencyjne i równoległe
2-2) Funkcja setup
2-3) Funkcja loopPodstawy składni programowania robotów w RobomationLAB
3-1) Import pakietu robomation
3-2) Tworzenie instancji robota
3-3) Metody sterowania robotem
3-4) Odczyt czujników i stanu
3-5) Wykrywanie zdarzeń
3-6) Czekanie na zakończenie działania (wait)
3-7) Funkcje narzędziowe (Utils)
RobomationLAB — platforma edukacyjna do programowania robotów
RobomationLAB to platforma przygotowana pod edukację w zakresie AI, robotyki i oprogramowania,
udostępniająca zintegrowane środowisko twórcze w przeglądarce Chrome, przeznaczone do nauki programowania robotów w szkole podstawowej i średniej.
RobomationLAB udostępnia programy edukacyjne do kodowania robotów na różne sposoby: kodowanie blokowe, kodowanie skryptowe i inne.
Pozwala nie tylko poznać teorię programowania, ale też realnie poruszać robotami Robomation i nimi sterować,
czyli uczyć się programowania i robotyki naraz.
Programy do kodowania robotów
Block Composer
Block Composer to narzędzie, w którym łatwo i szybko sterujesz robotami Robomation za pomocą kodowania blokowego i poznajesz podstawy sterowania robotem.
środowisko twórcze przygotowane pod physical computing
kodowanie przeciąganiem bloków, proste nawet dla początkujących
nauka od podstawowych pojęć, bez błędów składniowych
automatyczny przekład na kod skryptowy w Pythonie
zestawy bloków z gotowymi funkcjami dla każdego robota i wiele przykładów do wypróbowania
podgląd wyniku na żywo podczas wykonywania kodu
rozwijanie umiejętności rozwiązywania problemów i kreatywności przez układanie bloków
dopasowane wskazówki dzięki analizie kodu skryptowego przez AI
Script Composer
Script Composer to narzędzie, w którym łatwo i szybko sterujesz robotami Robomation w Pythonie i poznajesz podstawy składni Pythona oraz programowania robotów.
edytor Pythona
automatyczne uzupełnianie kodu i wstawianie kodu dla każdego języka
wiele przykładowych kodów do wypróbowania dla każdego robota
podgląd wyniku na żywo podczas wykonywania kodu
dopasowane wskazówki dzięki analizie kodu skryptowego przez AI
Najważniejsze cechy programów do kodowania
Programy do kodowania robotów w RobomationLAB mają następujące cechy.
- działają w przeglądarce Chrome, więc nie zależą od systemu operacyjnego
- dzięki komunikacji Web Serial sterują sprzętem robota bezpośrednio przez adapter USB
- obsługują jednoczesne sterowanie wieloma robotami — bez ograniczeń co do rodzaju i liczby robotów
- przy zapisie pliku wynik jest przekształcany na tekstowy plik JSON
Sterowanie robotem na żywo
Programy do kodowania robotów w RobomationLAB sterują robotem na żywo w następujący sposób.
- W kodowaniu blokowym albo skryptowym piszesz kod, który ustawia wartości obiektów Effector i Command sterujących robotem albo korzysta z wartości Sensor i zdarzeń Event robota.
- Uruchamiasz kod.
- Przez komunikację Web Serial program odbiera od robota pakiety z danymi Sensor i Event i zapisuje je w obiekcie Device robota.
- Kod jest interpretowany na bieżąco: dane w obiektach Effector i Command są nadpisywane, a wartości obiektów Sensor i Event odczytywane.
- Program tworzy pakiet z danymi obiektu Device robota, wysyła go do robota przez Web Serial i sprawdza, czy robot naprawdę zadziałał.
- Przez cały czas wykonywania kodu kroki 3, 4 i 5 powtarzają się mniej więcej co 10-20 ms.
Dwukierunkowy przekład bloki ↔ Python na żywo
RobomationLAB udostępnia jednocześnie edytor kodu blokowego i edytor kodu Python, a oba są na bieżąco synchronizowane w obie strony.
- Gdy dodasz, zmienisz albo usuniesz blok w edytorze kodu blokowego, zmiana od razu pojawia się w kodzie Python.
- I odwrotnie: gdy zmienisz kod w edytorze Pythona, zmiana od razu pojawia się w blokach.
Ponieważ bloki i kod Python odpowiadają sobie jeden do jednego i są przekładane w obie strony,
można szybko ułożyć całą strukturę z bloków, a potem dopracować szczegóły w Pythonie albo uczyć się składni Pythona, porównując ją z blokami —
czyli pracować, swobodnie przechodząc między kodowaniem blokowym a skryptowym.
Uwaga: przekład Python → bloki działa tylko dla kodu, który da się wyrazić blokami.
(Przy błędnej składni albo kodzie, którego nie da się zamienić na bloki, przejście może się nie udać.
Więcej znajdziesz w dokumencie Zasady kodowania.)
Sposób programowania robotów w RobomationLAB
Wykonywanie sekwencyjne i równoległe
Roboty programuje się na dwa sposoby: sekwencyjnie i równolegle.
Wykonywanie sekwencyjne to takie, w którym następna czynność zaczyna się po zakończeniu poprzedniej; nadaje się do programowania prostych zachowań.
Jeśli na przykład robot ma pojechać do przodu, a potem zatrzymać się i zapalić diodę LED, potrzebne jest wykonywanie sekwencyjne, żeby ułożyć kod poszczególnych czynności po kolei i wykonać je w czasie.
Wykonywanie równoległe to takie, w którym kilka czynności dzieje się naraz; jest potrzebne przy programowaniu bardziej złożonych i zaawansowanych zachowań.
Jeśli na przykład chcesz zaprogramować chód robota dwunożnego, potrzebne jest kodowanie równoległe, bo chód wymaga jednoczesnego ruchu stóp i nóg robota.
Programy do kodowania robotów w RobomationLAB opierają się na strukturze setup / loop, podobnej do środowiska programowania sprzętu w Arduino,
i obsługują jednocześnie wykonywanie sekwencyjne i równoległe.

Po pierwszym wejściu do Block Composera w obszarze roboczym widać dwa puste bloki funkcji:
blok „funkcja setup" odpowiada funkcji setup, a blok „funkcja loop" — funkcji loop.
Bloki są na bieżąco przekładane na kod Python,
a kod ma następującą strukturę podstawową.
# podstawowa struktura kodu Python
from robomation import *
# umieść tutaj kod konfiguracji wykonywany jeden raz:
def setup():
pass
# umieść tutaj kod sterujący wykonywany cyklicznie:
def loop():
passŻeby sterować robotem, umieść na samej górze kodu
from robomation import *i zadeklaruj używanego robota jako instancję. (np.hamster_s = HamsterS(0))
Funkcja setup
Funkcja setup wykonuje się tylko raz, w chwili uruchomienia kodu.
W funkcji setup umieszcza się przede wszystkim kod, który nadaje zmiennym wartości początkowe albo ustawia tryb i funkcje robota.
Na przykład sterując robotem jeżdżącym na kołach, można w funkcji setup ustawić początkową prędkość kół.
Jeśli w funkcji potrzebne jest odczekanie czasu, funkcja Utils.wait(...) pozwala pisać kod, który wykonuje się po kolei w czasie, jakby synchronicznie.Utils.wait(...) czeka podany czas (w sekundach), a potem wykonuje dalszy kod, czyli budzi się po ustalonym czasie albo po zakończeniu czynności i wykonuje kod dalej.
Połączenie tego z funkcją loop, która działa równolegle, pozwala nie tylko na proste wykonywanie sekwencyjne, ale też na naprawdę rozbudowane programowanie robotów.
Poniżej przykład kodu, w którym robot HamsterS jedzie sekundę do przodu, a potem sekundę do tyłu.
Zaprogramowanie tego w równolegle działającej funkcji loop wymagałoby mieszania obliczeń czasu z kodem sterującym, przez co kod stałby się bardzo zawiły.
Zamiast tego wystarczy w funkcji setup użyć funkcji opóźnienia Utils.wait i napisać kod, który wykonuje się po kolei w czasie, jakby synchronicznie.
( Funkcję Utils.wait opisujemy jeszcze raz dalej, w części Funkcje narzędziowe (Utils). )
Przykładowy kod (Python)
from robomation import *
hamster_s = HamsterS(0)
# umieść tutaj kod konfiguracji wykonywany jeden raz:
def setup():
# jazda do przodu z prędkością obu kół ustawioną na 50
hamster_s.set_wheel_speed('both', 50)
Utils.wait(1) # czekaj sekundę
# jazda do tyłu z prędkością obu kół ustawioną na -50
hamster_s.set_wheel_speed('both', -50)
Utils.wait(1) # czekaj sekundę
hamster_s.stop()
# umieść tutaj kod sterujący wykonywany cyklicznie:
def loop():
pass( Składnię instancji i metod robota opisujemy jeszcze raz dalej, w części Podstawy składni programowania robotów w RobomationLAB. )
Funkcja loop
Funkcja loop obsługuje wykonywanie równoległe i powtarza się mniej więcej co 10 ms przez cały czas działania kodu.
W funkcji loop umieszcza się przede wszystkim kod, który cyklicznie ustawia wartości zmiennych albo wykrywa i obsługuje zdarzenia robota.
Poniżej przykład kodu, w którym prędkość kół i kolor diod LED robota HamsterS zmieniają się z upływem czasu.
( Zmienną zadeklarowaną poza funkcjami setup i loop trzeba wewnątrz funkcji zadeklarować słowem kluczowym global, żeby dało się ją zmienić. )
from robomation import *
hamster_s = HamsterS(0)
frame = 0
# umieść tutaj kod konfiguracji wykonywany jeden raz:
def setup():
global frame
frame = 0
# umieść tutaj kod sterujący wykonywany cyklicznie:
def loop():
global frame
frame += 1 # przy każdym wywołaniu funkcji loop wartość zmiennej frame rośnie o 1
# nowa wartość frame ustawia prędkość obu kół i wartości RGB obu diod LED
hamster_s.set_wheel_speed('both', frame % 100)
hamster_s.set_led_color('left', frame % 256, 0, 0)
hamster_s.set_led_color('right', 0, 0, frame % 256)( Składnię instancji i metod robota opisujemy jeszcze raz dalej, w części Podstawy składni programowania robotów w RobomationLAB. )
Poniżej przykład kodu, w którym lekkie stuknięcie w obudowę robota HamsterS (zdarzenie Tap) zapala diody LED na czerwono.
from robomation import *
hamster_s = HamsterS(0)
# umieść tutaj kod konfiguracji wykonywany jeden raz:
def setup():
pass
# umieść tutaj kod sterujący wykonywany cyklicznie:
def loop():
# w chwili stuknięcia wykrywane jest zdarzenie
if hamster_s.tap(): # przy wykryciu zdarzenia True
hamster_s.set_led_color('both', 'red') # zapal obie diody LED na czerwono
else:
hamster_s.turn_off('both') # zgaś obie diody LED( Składnię wykrywania zdarzeń (tap()) i pozostałe opisujemy jeszcze raz dalej, w części Podstawy składni programowania robotów w RobomationLAB. )
Podstawy składni programowania robotów w RobomationLAB
Pisząc kod w programach do kodowania robotów w RobomationLAB, trzeba trzymać się poniższych podstaw składni.
Robotem steruje się przez pakiet Pythona robomation:
najpierw tworzy się instancję robota, a potem wywołuje jej metody.
Import pakietu robomation
Żeby korzystać z klas (robotów) i narzędzi (Utils) potrzebnych do sterowania robotem, umieść na samej górze kodu ten jeden wiersz.
from robomation import *Tworzenie instancji robota
Zadeklaruj używanego robota jako instancję.
Nazwa klasy oznacza rodzaj robota, a liczba w nawiasie — indeks instancji (licząc od 0).
hamster_s = HamsterS(0) # jeden robot HamsterSNazwy klas i domyślne nazwy zmiennych dla poszczególnych robotów są następujące.
| Robot | Nazwa klasy | Domyślna nazwa zmiennej |
|---|---|---|
| HamsterS | HamsterS | hamster_s |
| Hamster | Hamster | hamster |
| Piobot | Pio | pio |
| Turtle | Turtle | turtle |
| Beagle | Beagle | beagle |
| RaccoonBot | RaccoonBot | raccoon |
| Cheese Stick | CheeseStick | cheesestick |
Używając kilku robotów tego samego rodzaju, zwiększaj indeksy: 0, 1, 2 …
hamster_s = HamsterS(0)
hamster_s_1 = HamsterS(1)Metody sterowania robotem
Robotem steruje się, wywołując metody instancji.
Metody wykonują czynności robota: ustawiają prędkość kół, jadą, sterują diodami LED, dźwiękiem i tak dalej.
hamster_s.set_wheel_speed('both', 50) # ustawienie prędkości obu kół
hamster_s.move_distance(10, 'cm') # jazda 10 cm do przodu
hamster_s.set_led_color('both', 'red') # obie diody LED na czerwonoListę metod i parametrów dostępnych dla danego robota znajdziesz w jego dokumencie (np. „HamsterS").
Odczyt czujników i stanu
Wartości czujników i stan robota też odczytuje się przez metody, które zwracają tę wartość.
left = hamster_s.floor('left') # odczyt lewego czujnika podłoża
dist = hamster_s.proximity('right') # odczyt prawego czujnika zbliżeniowegoWykrywanie zdarzeń
Zdarzenia wynikające ze zmiany stanu albo otoczenia wykrywa się tak,
że odpowiednia metoda zdarzenia zwraca True w chwili jego wystąpienia.
if hamster_s.tap(): # True w chwili wystąpienia zdarzenia stuknięcia (Tap)
hamster_s.set_led_color('both', 'red')Czekanie na zakończenie działania (wait)
Metody, których wykonanie trwa — jazda, obrót, odtwarzanie dźwięku — mają parametr wait.
wait=True(domyślnie): czeka na zakończenie czynności, a potem wykonuje dalszy kod.wait=False: rozpoczyna czynność i od razu wykonuje dalszy kod.
hamster_s.move_distance(10, 'cm', wait=True) # czeka, aż jazda się skończy
hamster_s.move_distance(10, 'cm', wait=False) # rozpoczyna jazdę i od razu wykonuje dalszy kodFunkcje narzędziowe (Utils)
Wspólne funkcje niezależne od rodzaju robota — odczekanie czasu, odtworzenie dźwięku, zapis w dzienniku, kolory — wywołuje się przez metody klasy Utils.
Utils.wait(1) # czekaj sekundę
Utils.speak('Dzień dobry') # odtworzenie mowy (TTS)
Utils.log(0, '', '') # zapis w dzienniku konsoli