
Autorstwa Piotra Rybickiego
W Nomagic uczymy roboty rozumieć prawdziwy świat. Nie jest tajemnicą, że świat jest naprawdę uniwersalny i wykonuje pewne zadania, które mogą być potrzebne do stosowania na oczy. Niektóre z naszych robotów czuły na samo, więc postanowiliśmy im pomóc.
W tym poście udostępniamy nasze doświadczenie w budowie systemu, który umożliwia szybkie robienie zdjęć kolorowych io wysokiej głębi z maksymalnym 16 kamerami Intel RealSense przy obciążeniu dodatkowym, z użyciem systemu operacyjnego robota (ROS1). Dołączamy kod źródłowy!
Na pierwszy rzut oka można to zrobić, wystarczy kupić kilka koncentratorów USB 3, podłączyć wszystkie urządzenia i urządzenie. Jednak wymagana liczba portów USB 3 to tylko liczba powierzchownych wyzwań.
Prawdziwym wyzwaniem jest ograniczona przepustowość USB 3. Firma Intel opublikowała artykuł wyjaśniający różne szczegóły związane z podłączeniem wielu kamer. Główne wnioski polegają na tym, że należy podążać za maksymalizacji liczby i jakości kontrolerów USB 3 wydajnych kamer. Ponieważ nasze komputery mają tylko jeden kontroler USB, zdecydowaliśmy się na zakup karty PCIe USB, która ma oddzielny kontroler USB dla każdego portu: https://www.delock.com/produkte/2072_Type-A/89365/merkmale.html.

Aby uzyskać dostęp do portów (16) i poszczególnych kamerze zasilania moc, zakupiliśmy także cztery dodatkowe źródła zasilania zewnętrznego koncentratory USB: https://www.delock.de/produkte/G_64053/merkmale.html.

Pod wyłączeniem wszystkich kamer było możliwe zabawą:

Przed wieloma robotami można się wydostać, ale nie przed tym 🙂
robot wymaga tylko jednej kamery, a nawet gdy używa ich więcej, zwykle jest ich od 2 do 4. Podłączenie 16 kamer do jednego komputera brzmi ambitnie. Pomyśleliśmy więc: zróbmy to!
Podłączyliśmy i aktywowaliśmy kamery po kolei, na ekranie wideo z głębokością ros-realsense i RViz. Po chwili zauważyliśmy spadek liczby sekund (FPS). Szybkie dotarcie do przyczyny:

Jeden ze znaków, że kamery istnieją 🙂
Powyższy zrzut ekranu będzie znajomy użytkowników Linuksa — pełne wykorzystanie, co jest częścią składową, szczególnie części uruchamiających na komputerach innych programów. Na naszym komputerze pojedyncza kamera stosowana około 1,2 podziemnego. Konieczne było dostarczenie dodatkowego źródła.

Przeprowadziliśmy połączenie profilowania i doprowadziliśmy do tego, że system operacyjny został wprowadzony w końcowym ros-realsense. zamknięta klatka wychodząca z kamer jest filtrowana w celu usunięcia szumu i uzupełnienia hamulców danych za pomocą interpolacji przestrzennej i/lub czasowej. Filtrowanie wyprowadzania wyprowadza kilka milisekund, więc około 10 kamer wystarczających, aby obsłużyć nawet dostępny procesor. Podczas filtrowania w ros-realsense jest opcjonalny, dostępny w wersjach głębinowych, więc chcieliśmy go zastosować.
Zauważyliśmy, że naprawdę nie trzeba filtrować wszystkich klatek, ponieważ ostatecznie wynikają tylko z jednej klatki co kilka sekund. Aby rozwiązać dziesięć problemów, rozwiedliśmy i rozwinęliśmy ros-realsense użycie dziesięciu przypadków użycia. Oprócz filtrowania dostępu, przechowujemy najnowsze klatki w buforze zestawowym i stosowaliśmy filtry tylko na żądanie za pośrednictwem usługi ROS. Zachowanie i filtrowanie kilku klatek (zamiast tylko jednego) było konieczne, ponieważ niektóre procesy filtrowania są następstwem na wystąpieniu.
Ta optymalizacja zabezpieczeń obciążeniowych około 20% na kamerę. Jednak walk jeszcze się nie rozpada. Niska liczba klatek na sekundę została zastosowana, chociaż schemat został zmieniony — zamiast dotyczyć wszystkich kamer, problem stał się bardziej lokalny, dotyczy okresu, który wpływa na poszczególne kamery. (Przewidywalny) winowajca został zidentyfikowany w ros-realsense dzienniki, które zostały wypełnione wiadomościami elektronicznymi jak:
13/05 10:16:06,190 OSTRZEŻENIE [140247325210368] (backend-v4l2.cpp:1057) Odebrano niekompletną ramkę: Wykryto niekompletną ramkę wideo! Rozmiar 541696 z 1843455 bajtów (29%)
Mimo że przepustowość USB była niższa od teoretycznej, kamery powodują problemy z przesyłaniem całych klatek. Zmniejszyliśmy liczbę urządzeń na sekundę do 6 i wyłączyliśmy strumienie radiowe. Na szczęście to wystarczające, aby uzyskać źródło.
Po zwycięstwie, sprawdziliśmy nasze rozwiązanie, aby ocenić skutki, które można zastosować.

Kolorowe ramki (niebieskie) nie wymagają przetwarzania, więc można je szybko wysłać – zwykle poniżej 10 milisekund. Żądanie ramki głębokości (zielona) uruchamia filtrowanie oczekujące, które trwa około 150 ms, w zależności od harmonogramu. Wyrównane ramki głębokości (czerwone) wymagają więcej przetwarzania, stąd niewielkie zwiększenie szerokości.
Kamera z dostępnymi składnikami na drugim końcu stosowania oznacza, że klatki dostarczane przez nasze usługi są lekko przestarzałe. Jeśli jednak scena jest większa statyczna, tak jak nasza, wspólna 0,5 sekundy jest akceptowalna.

Powyższy histogram przedstawia wiek odebranych klatek, mierzony przy użyciu znaczników czasu wprowadzonych na początku ekspozycji (stąd wiek jest równy odstępowi między klatkami — 166 milisekund).
nasza modyfikacja powoduje zmniejszenie obciążenia przez kamery Intel RealSense, gdy tylko jest to konieczne od czasu do czasu. Dzięki tej funkcjonalności i dodatkowemu sprzętowi możliwe jest korzystanie z ponad tuzina kamery.
Kod źródłowy tej wersji można znaleźć tutaj: https://github.com/NoMagicAi/realsense-ros.