Pojazdy autonomiczne powoli stają się ważną częścią przemysłu motoryzacyjnego. Wiele osób wierzy, że wkrótce w pełni autonomiczne pojazdy będą jeździć obok ludzi, a firmy technologiczne ścigają się, aby wdrożyć w pełni autonomiczne pojazdy. W grudniu 2018 roku Waymo, firma, która powstała z projektu samochodu autonomicznego Google, oficjalnie rozpoczęła swoją komercyjną usługę samochodów autonomicznych na przedmieściach Phoenix. Firmy takie jak May Mobility, Drive.ai i Uber podążają tą samą ścieżką.
Pojazdy autonomiczne mogą wydawać się wielką wizją, ale pojazdy półautonomiczne są już wśród nas. Nowe samochody Tesli mają funkcję Tesla Autopilot, która jest zdolna do rozpoznawania i śledzenia pasów ruchu, adaptacyjnej kontroli prędkości oraz samodzielnego parkowania. Umiejętność identyfikacji i śledzenia pasów na drodze jest jednym z wielu wymogów dla pojazdów bez kierowcy. Chociaż rozpoznawanie pasów może wydawać się trudnym problemem, możesz zacząć od rozwijania algorytmów rozpoznawania i śledzenia pasów z wykorzystaniem platformy sprzętowej NVIDIA Jetson Nano.
Jetson Nano COM jest nieco większy niż Raspberry Pi 3, ale może uruchamiać sieci neuronowe równolegle, dysponując mocą 472 Gflops. To około 22 razy więcej niż Raspberry Pi 3 i jest wysoce energooszczędny, zużywając tylko 5 W. Ta płyta jest idealna do wbudowanych aplikacji AI działających na uproszczonym jądrze Linuxa. Posiada wystarczającą moc obliczeniową i pamięć na pokładzie do aplikacji przetwarzających obrazy i wideo wysokiej jakości. Kluczowe funkcje Jetson Nano to:
Do tego projektu potrzebujemy modułu COM Jetson Nano lub płyty deweloperskiej oraz kamery CSI (kamera CSI Raspberry Pi v2 będzie odpowiednia). Pokażę tę aplikację, używając płyty deweloperskiej Nano, ale możesz łatwo zbudować niestandardową płytę bazową dla modułu COM Nano i wdrożyć tę aplikację. Kamera CSI zostanie podłączona do portu kamery na Jetson Nano, chociaż można użyć kamery USB lub kamer IP. Poniżej znajdują się wymagania niezbędne do pomyślnego zrealizowania tego projektu:
Pełna implementacja tego projektu jest dostępna na GitHub. Przejdź przez kolejne kroki, aby uruchomić demonstrację tego projektu. Te kroki są ważnymi etapami przetwarzania obrazu, które mają na celu zwiększenie dokładności rozpoznawania pasów ruchu.
Pierwszym krokiem naszego systemu wykrywania pasów jest możliwość odczytywania na żywo obrazów z kamery. Dla nowych użytkowników pracujących z Jetson Nano, obsługa kamer może być kłopotliwa. W tym celu będziemy używać biblioteki NanoCamera. Ta biblioteka nie jest najlepszą opcją dla aplikacji na poziomie produkcyjnym, ale sprawdza się w prostszej aplikacji, jak ta pokazana tutaj.
Najpierw zainstaluj bibliotekę za pomocą pip:
Odczytywanie na żywo obrazu z kamery:
Aby obraz był gładki i pozbyć się niechcianych szumów, możemy zastosować rozmycie gaussowskie. Polega to na obliczeniu wartości każdego piksela jako ważonej średniej z otaczających pikseli.
OpenCV zawiera funkcję do stosowania rozmycia gaussowskiego na obrazie:
Po zastosowaniu rozmycia gaussowskiego obraz nadal jest w przestrzeni kolorów RGB i musi zostać przekształcony do przestrzeni kolorów HSV. Separacja kolorów zostanie użyta do usunięcia niechcianych kolorów z obrazu. Gdy obraz znajdzie się w przestrzeni HSV, możemy "podnieść" wszystkie niepotrzebne kolory z obrazu, określając zakres skali szarości.
Rozszerzanie dodaje piksele do granic obiektów na obrazie. Zastosowanie rozszerzenia do obrazu pomoże zamknąć wszelkie luźne przestrzenie w liniowych obrazach.
Do wykrywania linii jezdni możemy użyć techniki zwanej detekcją krawędzi Canny. Detekcja krawędzi Canny może być używana do ekstrakcji użytecznych informacji strukturalnych z obiektu. Biblioteka OpenCV dostarcza funkcję detekcji krawędzi Canny, która może być używana do wykrywania krawędzi na obrazie. Aby detekcja Canny działała, musimy dostarczyć minimalne i maksymalne progi. OpenCV zazwyczaj rekomenduje wartość (100, 200) lub (200, 400), więc używamy (200, 400).
Obraz wyjściowy detekcji krawędzi Canny zawiera pewien szum. Wszystkie informacje inne niż pasy na obrazie mogą być izolowane przez redukcję regionu zainteresowania. Podczas wykonywania rozpoznawania pasów ruchu i nawigacji, nie musimy koniecznie widzieć całego obrazu. Łatwym sposobem na to jest po prostu wycięcie górnej połowy obrazu.
Kod do redukcji regionu zainteresowania to:
Po zmniejszeniu regionu zainteresowania pasy są wyraźnie widoczne z czterema odrębnymi liniami. Jednak komputer nie wie, że te linie reprezentują granice dwóch pasów. Dlatego potrzebujemy sposobu na wydobycie współrzędnych dla tych linii pasów. Transformata Hougha to technika używana w przetwarzaniu obrazów do wydobywania cech takich jak linie, koła i elipsy. Może być użyta do znajdowania prostych linii z liczby pikseli, które wydają się tworzyć linię. Można to zrobić za pomocą funkcji HoughLinesP w OpenCV. Funkcja dopasowuje wiele linii przez wszystkie białe piksele i zwraca najbardziej prawdopodobny zestaw linii podlegający pewnym minimalnym ograniczeniom progowym.
Oto nasz kod, który wykrywa segmenty linii za pomocą transformacji Hougha. Większość używanych tutaj parametrów można określić metodą prób i błędów lub wybierając parametry z obrazów referencyjnych.
Wynik funkcji detect_line_segments() produkuje zestaw małych linii z koordynatami punktów końcowych (x1, y1) i (x2, y2). Musimy znaleźć sposób, aby połączyć je w tylko dwie linie dla lewego i prawego pasa, ale jak to osiągnąć? Jednym ze sposobów jest klasyfikacja tych segmentów linii według ich nachyleń.
Wszystkie linie lewego pasa mają dodatni nachylenie, a segmenty linii należące do prawego pasa mają nachylenie ujemne. Na podstawie tych dwóch nowych grup możemy wziąć średnią z nachyleń i przecięć segmentów linii, aby uzyskać nachylenia i przecięcia linii lewego i prawego pasa. Jest to zaimplementowane za pomocą funkcji
average_slope_intercept(). Funkcja make_points() jest funkcją pomocniczą dla funkcji average_slope_intercept(), która przyjmuje nachylenie i przecięcie linii, i zwraca punkty końcowe segmentu linii. W tym momencie mamy już linie pasów!
W tym momencie wynik z tej funkcji byłby wprowadzany do innego algorytmu kontrolującego prędkość i kierunek pojazdu. Aby to zrobić, można obliczyć kąt skrętu na podstawie wykrytych linii pasów, a następnie przekazać go do kontrolera PID, aby zminimalizować kąt skrętu i utrzymać pojazd na środku.
Chociaż zostało to wykonane z użyciem płytki rozwojowej Nano, ten sam kod stanowi punkt wyjścia do wdrożenia systemu w systemie przetwarzania obrazu wbudowanym dla środowiska produkcyjnego. Aby to zrobić, musisz zbudować prawdziwą płytę bazową dla Jetson Nano. Jest to najłatwiejsze, gdy używasz modularnych narzędzi do projektowania elektroniki w aplikacji Upverter Board Builder. Przyjmując modularne podejście, możesz łatwo dostosować płytę bazową dla Jetson Nano, kamery i inne czujniki do rozpoznawania pasów ruchu.
Modularne narzędzia do projektowania elektroniki w Upverter dają dostęp do szerokiej gamy standardowych w branży COM-ów i popularnych modułów bez konieczności pobierania lub instalowania nowego oprogramowania. Możesz tworzyć sprzęt gotowy do produkcji dla różnorodnych zastosowań, w tym rozpoznawania pasów ruchu i innych zadań przetwarzania obrazu z Jetson Nano, używając interfejsu użytkownika typu przeciągnij i upuść. Jeśli twój system wymaga dodatkowej funkcjonalności, możesz dołączyć łączność bezprzewodową, szereg czujników i wiele więcej.
Zapoznaj się z niektórymi historiami sukcesu klientów Gumstix lub skontaktuj się z nami już dziś, aby dowiedzieć się więcej o naszych produktach, narzędziach do projektowania i usługach.