Projekt polega na zaprojektowaniu i zbudowaniu dwóch autonomicznych robotów mobilnych, które realizują algorytm zabawy w "berka". Głównym celem jest implementacja systemu wizyjnego opartego na tanim i wydajnym module ESP32 CAM, który pozwoli robotowi goniącemu na lokalizowanie, śledzenie i podążanie za robotem uciekającym w czasie rzeczywistym.
- 2 roboty Sharky
- 2 płytki ESP32 CAM
- Źródło czerwonego światła
Robot Uciekający : Może poruszać się po z góry określonej ścieżce (np. po okręgu, losowo). Jego kluczową cechą jest posiadanie wyrazistego, jednolitego elementu obudowy w jaskrawym kolorze (u nas czerwony), który kontrastuje z otoczeniem.
Robot Goniący : Wyposażony w kamerę ESP32-Cam. Jego zadaniem jest ciągłe skanowanie otoczenia, wykrywanie koloru robota-uciekiniera, obliczanie jego pozycji w kadrze i sterowanie napędem tak, aby zmniejszyć dystans dzielący oba pojazdy.
-
Uruchomienie kamery oraz połączenie jej z Wifi
(schemat poglądowy postępowania w zdjęciach)
1.1. Aby umożliwić programowanie układu ESP32 w środowisku Arduino IDE, należy dodać wsparcie dla architektury ESP32:
- W menu Plik -> Preferencje (File -> Preferences), w polu „Dodatkowe adresy URL do menedżera płytek” dodano oficjalny odnośnik do pakietu narzędzi:
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
- Następnie w Menedżerze Płytek (Tools -> Board -> Boards Manager) wyszukano i zainstalowano pakiet ESP32 dostarczony przez Espressif Systems.
1.2. Konfiguracja sprzętowa i wybór parametrów w IDE
- Moduł ESP32-CAM został umieszczony w dedykowanej podstawce programatora i podłączony do komputera za pomocą przewodu USB.
- W menu Narzędzia -> Płytka wybrano odpowiedni model mikrokontrolera: AI Thinker ESP32-CAM oraz wskazanie odpowiedniego portu.
1.3. Implementacja kodu i konfiguracja sieci Wi-Fi
const char* ssid = "NAZWA_TWOJEJ_SIECI";
const char* password = "HASLO_DO_SIECI";
Te linijki kodu należy zmienić uzupełniając odpowiednio nazwę oraz hasło do danej sieci.
1.4. Wgranie programu i uruchomienie modułu
- Należy uruchomić Monitor Portu Szeregowego (Serial Monitor) z prędkością transmisji ustawioną na 115200 baud.
- Po zresetowaniu płytki przyciskiem RST, w konsoli pojawił się komunikat potwierdzający nawiązanie połączenia: WiFi connected wraz z dynamicznie przydzielonym adresem IP w sieci lokalnej (np. http://192.168.1.XX).
1.5. Weryfikacja działania (Podgląd obrazu)
Wpisanie wygenerowanego adresu IP do przeglądarki internetowej urządzenia pracującego w tej samej sieci pozwala na dostęp do panelu sterowania i uruchomienie wideo na żywo (funkcja Start Stream).
-
Detekcja koloru (czerwonego)
Następnym krokiem było zaimplementowanie rozpoznawania koloru. W naszym przypadku czerwonego. Jak to działa? Zewnętrznie. Obraz z kamery przesyłany jest tym samym, omówionym wyżej streamem, na stacjonarny komputer, który za pomocą kodu Python analizuje obraz i rozpoznaje zadany kolor. Technicznie działa to tak, że program w Pythonie rozpoznaje średnią koloru wartość piksela RGB, jeśli proporcja czerwonego do pozostałych spełnia minimum, piksel jest uznany za czerwony. Następnym zadaniem Pythona jest ustalenie współrzędnych naszej grupy czerwonych pikseli na obrazie. Na tej podstawie Python decyduje, czy robot ma jechać prosto czy skręcić. Po rozpoznaniu czy i gdzie ma jechać Sharky, Python odsyła tę informację płytce Sharkyego, która rozumie to jako sygnał do aktywacji silników.
Płytka sama w sobie nie jest w stanie rozpoznawać koloru, dlatego należy wyręczyć ją, przy użyciu komputera, dokładniej Pythona. Polecamy użyć udostępnionego w ramach tego projektu kodu, ale jeśli Czytelnik jest obyty z Pythonem, lub wspomaga się AI, poniżej opisano, co należy zrobić.
2.1. Konieczne jest pobranie Pythona oraz odpowiedniej biblioteki. Jest nią OpenCV. Instalację Pythona pominiemy.
2.2. Po pobraniu Pythona i OpenCV należy wpisać do terminalu CMD (dla Windows) "python -m pip install opencv-python numpy requests".
2.3. Następnie, za pomocą funkcji z OpenCV, 'VideoCapture", należy otworzyć połączenie ze wcześniej wspomnianą stroną, aby pobierać obraz.
2.4. Użyj następnej funkcji - "findCuntours" aby identyfikować kontury wykrywanych obiektów.
2.5. Oblicz momenty geometryczne konturów, żeby wiedzieć, gdzie znajdują się środki wykrytych obiektów - to będzie współrzędna decydująca o kierunku jazdy robota.
-
Opis zawartości kodów
Do realizacji zadania autonomicznego podążania robota za źródłem czerwonego światła wykorzystano skrypt w języku Python z użyciem biblioteki OpenCV. Program przetwarza obraz ze strumienia wideo ESP32-CAM w czasie rzeczywistym, podejmuje decyzje o kierunku ruchu i przesyła gotowe komendy sterujące do robota za pomocą szybkiego protokołu UDP.
Do realizacji zadania ucieczki robota przed drugą jednostką wykorzystano program w języku C++ (środowisko Arduino), uruchomiony na mikrokontrolerze ESP32-CAM. Aby uniemożliwić robotowi goniącemu łatwe przewidzenie trasy, algorytm w czasie rzeczywistym generuje ciągłe, losowe zakręty.
Robot, który ucieka, ma na sobie zamontowaną czerwoną lampkę LED. Świeci ona światłem ciągłym, co pozwala systemowi wizyjnemu robota goniącego na łatwe wykrycie i śledzenie celu.
Poniżej- dwa kody ( robot goniący- Python; robot uciekający- Arduino)