Zapoznaj się z naszymimateriałami na stronie

���️ Programowanie: Sterowanie kamerą

Potrzebne materiały:

  • Co najmniej 1 robot lub symulacja w oprogramowaniu
  • 1 komputer/robot
  • Tor wyścigowy

Konfiguracja oprogramowania:

  • przykładowa konfiguracja: zależy od kontekstu kodu

Czas trwania:

1–2 godziny

Wiek:

+ 15 lat

Zalety tej aktywności:

  • Można to wykonać za pomocą symulatora

Programowanie w języku Python: obsługa czujnika ultradźwiękowego i kamery w celu zaprogramowania autonomicznych ruchów robota, a następnie zorganizowanie wyścigu robotów.

[Wkrótce dostępny materiał wideo]

Wprowadzenie

Celem tego ćwiczenia praktycznego jest zaprogramowanie robota AlphAI tak, aby poruszał się samodzielnie, a nie w trybie „zdalnego sterowania” przez ucznia, jak miało to miejsce w ćwiczeniu „AlphAI sterowany zdalnie”. W tym celu należy wykorzystać jego czujniki, aby mógł reagować na otoczenie, a zwłaszcza wykrywać przeszkody. 

Przyjrzymy się najpierw krótkiemu przykładowi z wykorzystaniem ultradźwięków, a następnie przejdziemy do kamery, aby zorganizować wyścigi autonomicznych robotów na torze.

Nawigacja za pomocą ultradźwięków

Odkrycie czujnika ultradźwiękowego

Funkcja get_distance() (szczegóły w dokumentacji API na ostatniej stronie) zwraca odległość zmierzoną przez czujnik ultradźwiękowy robota (w centymetrach). Należy pamiętać o włączeniu czujnika za pomocą funkcji set_distance(True), w przeciwnym razie funkcja nie zwróci odległości, a wartość None.

Wypróbuj tę funkcję na prawdziwym robocie, używając poniższego kodu:

set_distance(True) # włącza czujnik ultradźwiękowy
while True:
d = get_distance() # pobiera wartość z czujnika ultradźwiękowego robota
print("odległość:", d)

Przesuwając robota ręcznie, sprawdź, czy zmierzona odległość zmniejsza się, gdy robot znajduje się naprzeciw przeszkody. Możesz również zauważyć, że niestety, jeśli robot znajduje się przed ścianą nie dokładnie naprzeciwko niej, ale po przekątnej, ściana ta nie jest wykrywana (zmierzona odległość jest znacznie większa, ponieważ fale ultradźwiękowe odbijają się od ściany po przekątnej i nie wracają bezpośrednio do robota).

Samodzielne przemieszczanie się za pomocą ultradźwięków

Wykorzystując funkcję get_distance(), zdefiniuj, a następnie przetestuj funkcję ultrasound_race(), która powoduje, że robot porusza się do przodu, dopóki nie wykryje przeszkody za pomocą czujnika ultradźwiękowego, a po wykryciu przeszkody skręca w prawo. 

Nie staraj się, by zachowanie robota było idealne (byłoby to trudne) – gdy tylko robot będzie potrafił zawrócić, gdy natrafi na ścianę, i jechać prosto, gdy nie ma ściany, przejdź do kolejnego etapu.

Nawigacja za pomocą kamery

Kamera dostarcza znacznie bogatszych informacji niż czujnik odległości ultradźwiękowy i umożliwi podejmowanie bardziej przemyślanych decyzji.

Odkrywanie obrazu z kamery

Zacznijmy od wyświetlenia obrazu z kamery robota w oprogramowaniu. Otwórz zakładkę „Czujniki” po lewej stronie i wybierz tryb kamery „obraz 64x48”

: pojawia się obraz tego, co widzi robot. 

Obraz to siatka pikseli; w przypadku obrazu kolorowego, takiego jak ten, każdy piksel zawiera trzy wartości: intensywność koloru czerwonego, zielonego i niebieskiego w tym pikselu. Aby to dokładniej zobaczyć, wybierz teraz tryb kamery o niskiej rozdzielczości „obraz 8x6”

, a następnie w zakładce „Wizualizacja” zaznacz opcję „Kamera: obniżona rozdzielczość”

: pojawia się bardzo zgrubny obraz, a dla każdego piksela wyświetlane są wartości czerwonych, zielonych i niebieskich (wartości od 0 do 255). 

Aby ustawić rozdzielczość obrazu w kodzie w języku Python, a nie w oprogramowaniu, należy najpierw zainicjować kamerę, na przykład za pomocą set_camera("8x6"). Następnie pobiera się obraz za pomocą funkcji get_camera(). Funkcja ta zwraca trójwymiarową tablicę w postaci obiektu typu „List”. Jedyne, co należy wiedzieć na potrzeby tego zadania praktycznego w odniesieniu do tego obiektu, to sposób uzyskiwania dostępu do wartości pikseli: jeśli nazwemy ten zwracany obiekt „image”, to dostęp do wartości piksela w wierszu i, kolumnie j i kanale k (k=0 dla czerwonego, 1 dla zielonego, 2 dla niebieskiego) uzyskujemy za pomocą image[i][j][k].

Skopiuj i uruchom poniższy kod, a następnie sprawdź, czy trzy wyświetlone wartości odpowiadają trzem wartościom czerwonego, zielonego i niebieskiego w oprogramowaniu modułu Pixel wpiątym wierszu od góry (indeks 4, licząc od zera) oraz wczwartej kolumnie od lewej (indeks 3).

import * z modułu alphai

from time import sleep

set_camera("8x6") # włącza kamerę z odpowiednią rozdzielczością

sleep(1) # czeka 1 sekundę, aż oprogramowanie uruchomi kamerę

while True:
image = get_camera() # pobiera obraz z kamery

    line = image[4]

    pixel = line[3]
print('czerwony', pixel[0], 'zielony', pixel[1], 'niebieski', pixel[2])

Pierwsza samodzielna podróż z kamerą

Chcemy, aby robot samodzielnie pokonywał okrążenia toru. Jeśli korzystasz z areny dostarczonej wraz z robotami AlphAI, podłoga jest biała, zewnętrzna bariera czerwona, a centralna wyspa czarna. Zakładamy, że tak właśnie jest i że chcesz, aby robot poruszał się po torze, skręcając zgodnie z ruchem wskazówek zegara. 

Zacznij od napisania funkcji `camera_race()`, która będzie podejmować decyzje w sposób cykliczny, w następujący sposób (opierając się wyłącznie na kolorze pojedynczego piksela w dolnej części obrazu):

Si image[4][3][0] < 100 (canal rouge sombre 🡪 le pixel est noir), pivoter à gauche à vitesse 25 pendant 0.5 seconde.

Sinon, si image[4][3][1] < 100 (canal rouge lumineux et canal vert sombre 🡪 le pixel est rouge), pivoter à droite à vitesse 25 pendant 0.5 seconde.

W przeciwnym razie (świecące się czerwony i zielony kanał 🡪 piksel jest biały), jedź prosto z prędkością 40 przez 0,5 sekundy.

Wypróbuj ten program na torze.

Przypomnijmy, że konstrukcja „if-else-if-else” w języku Python ma następującą postać:

jeśli warunek_1:

action_1()

elif warunek_2:

action_2()

w przeciwnym razie:

action_3()

Zliczanie pikseli w różnych kolorach

Prawdopodobnie zauważyliście już, że podejmowanie decyzji na podstawie pojedynczego piksela nie zawsze jest najlepszym rozwiązaniem. Może się na przykład zdarzyć, że piksel wpiątym wierszu iczwartej kolumnie jest biały, więc robot decyduje się jechać dalej, podczas gdy z boku znajduje się ściana i powinien raczej skręcić.

Aby ulepszyć program, weźmiemy pod uwagę wszystkie piksele obrazu z kamery. Najpierw policzymy, ile pikseli jest czarnych, czerwonych i białych. Następnie podejmiemy decyzję w następujący sposób: jeśli większość pikseli jest czerwonych, skręcimy w prawo; jeśli większość pikseli jest ciemna, skręcimy w lewo; w przeciwnym razie pojedziemy prosto.

Aby policzyć liczbę pikseli danego koloru, należy wykonać serię pętli for dla każdego elementu obrazu: wierszy i kolumn, a następnie dla każdego piksela obliczyć jego kolor na podstawie wartości czerwonych, zielonych i niebieskich składających się na ten kolor. Można skorzystać z wcześniej ustalonych progów, aby określić kolor piksela. Możesz zacząć od poniższego kodu lub znaleźć własny sposób, jest ich kilka! 

def count_pixel_colors(image: lista):

# utwórz tutaj słownik

liczba_pikseli_czarnych = 0

liczba_pikseli_czerwonych = 0

liczba_pikseli_białych = 0

for i in range(len(image)):

linia = obraz[i] 

for j in range(len(linii)):

piksel = wiersz[j]

canal_rouge = pixel[0]

canal_vert = pixel[1]

canal_bleu = pixel[2]

jeśli ...

liczba_pikseli_czarnych += 1

...

w przeciwnym razie:

...

return {"noir": nombre_pxl_noir, "rouge": nombre_pxl_rouge, "blanc": nombre_pxl_blanc}

Wskazówka dotycząca składni języka Python dla pętli for: zamiast używać indeksów i oraz j do uzyskiwania dostępu do elementów tablicy, można zmienić składnię i po prostu napisać:

for wiersz in obraz:
for piksel in wiersz:
czerwony = piksel[0]
zielony = piksel[1]
niebieski = piksel[2]

Wyścig autonomicznych robotów i dalsze ulepszenia

Teraz możesz zacząć organizować wyścigi między swoimi robotami. 

Będą one jeszcze bardziej ekscytujące, jeśli będziesz nadal starał się ulepszać swój program, modyfikując na przykład: prędkości poruszania się, progi kolorów, dodatkowe akcje (oprócz obrotu w miejscu, na przykład skręt podczas poruszania się do przodu) itp.

Podsumowanie i wnioski

W programowaniu lista funkcji dostępnych w programie nazywa się API, co oznacza Application Programming Interface(interfejs programowania aplikacji). Programiści korzystają z niej, aby dowiedzieć się, w jaki sposób można współpracować z programem. API modułu python alphai można znaleźć pod tym linkiem: https://drive.google.com/file/d/1C4ovPW_eH5KFz5Y9JvSrzLhtmdOpcp6-/view

Zadania do pobrania (dla nauczycieli i uczniów)

Dokumentacja biblioteki alphai-api

Powiązane kierunki studiów