Szybkie metody dopasowywania obrazów w stereowizji
Transkrypt
Szybkie metody dopasowywania obrazów w stereowizji
Politechnika Wrocławska Wydział Elektroniki Instytut Cybernetyki Technicznej Praca magisterska Szybkie metody dopasowywania obrazów w stereowizji Autor: Olaf Burdziakowski Opiekun: dr Marek Wnuk Wrocław 1999 1. Szybkie metody dopasowywania obrazów w stereowizji 1.1 Sprecyzowanie tematu W chwili podjęcia pracy (luty 1998) temat był określany w następujący sposób: „Należy przeanalizować znane metody dopasowywania obrazów pod kątem ich realizacji sprzętowej i przetwarzania równoległego, a następnie zaimplementować i zbadać wybrane ich elementy. Można wykorzystać komputer wizyjny IC40 z magistralami VME i VIB, programowane filtry linowe IMSA110 i uniwersalne układy logiczne (FPGA).” Wymienione możliwości sprzętowe wynikały z istniejących w laboratorium robotyki elementów systemu wizyjnego. Już w trakcie prac, w związku z kolejnymi wynikami, dzięki finansowaniu z grantu KBN, aparatura została wzbogacona o wieloprocesorowy system DSP, co umożliwiło implementację algorytmu stereowizji w sposób równoległy. 1.2 Cel pracy Celem pracy jest stworzenie systemu wizyjnego, dostarczającego danych potrzebnych do lokalizacji w nieznanym, zmiennym środowisku. System powinien pozwalać na nawigację robotom poruszającym się z prędkościami zbliżonymi do tych, w jakich funkcjonują ludzie. System powinien, na podstawie obrazu z kamer, generować mapę głębi obrazu w możliwie krótkim czasie. 1.3 Wyzwania związane z przetwarzaniem obrazu Przetwarzanie obrazu jest zadaniem bardzo pracochłonnym ze względu na: • Ilość danych - np. dla obrazu 320x240 punktów przy dziesięciu podwójnych obrazach na sekundę daje 1,28MB na sekundę danych wejściowych i tyle samo wyjściowych. Dane te trzeba umieć odebrać, zapamiętać, przetworzyć i wysłać. • Skomplikowanie algorytmów. Jak bardzo skomplikowane jest przetwarzanie obrazu można sobie wyobrazić, uświadamiając sobie fakt, że, według aktualnego stanu wiedzy, prawie połowa mózgu ludzkiego zajmuje się szeroko pojętym przetwarzaniem obrazu. Nie istnieją aktualnie urządzenia mogące równać się mocą obliczeniową z ludzkim mózgiem, więc wymagania stawiane systemom wizyjnym, powinny być odpowiednio mniejsze. 1.2 1.4 Dobór sprzętu do postawionych zadań 1.4.1 Jednostka obliczeniowa Przy generowaniu mapy głębi obrazu jest możliwie wykorzystanie obliczeń równoległych. Dlatego warto się zastanowić nad wykorzystaniem procesorów do tego przystosowanych. Zaletą pojedynczych jednostek obliczeniowych jest prostsza (w porównaniu z równoległymi) architektura, programowanie, niższa cena. Obserwując postęp w dziedzinie mikroprocesorów można dojść do wniosku, iż lepiej poczekać rok czy dwa na szybszy procesor, niż trwonić czas i pieniądze na inwestycje w procesory równoległe. Odpowiadając na przedstawione argumenty warto podkreślić, że wymagania nakładane na systemy wizyjne zaniża się ze względu na możliwości sprzętowe. Rozwój mikroprocesorów może się nagle zatrzymać, przecież gdzieś istnieje granica „podkręcania” zegarów, choć nikt nie wie gdzie. Podstawową wadą zwiększania wydajności przez przyspieszenie zegara procesora, jest uzależnienie postępu wyłącznie od rozwoju technologii półprzewodnikowej. Ponadto, zwiększanie częstotliwości występujących w układach, stoi w bezpośredniej sprzeczności z wymogami EMC (Electromagnetic Compatibility) zarówno w związku z generowaniem zakłóceń, jak i odpornością na nie. Z drugiej strony, wzrost mocy obliczeniowych procesorów nie przeszkadza - dopełnia -prowadzone badania, w dziedzinie optymalizacji ideowej i sprzętowej algorytmów. Gdybyśmy nawet posiadali układ zdolny podołać stawianym zadaniom, to system wizyjny obliczający mapę głębi obrazu, zapewne będzie tylko jedną ze składowych rozbudowanego systemu percepcji, a ten z kolei może być jednym z modułów przetwarzania w robocie, więc i tak potrzebna jest architektura pozwalająca na rozbudowę. Na temat ceny warto dodać, że istnieją procesory sygnałowe przystosowane do pracy równoległej w cenach zbliżonych do pospolitych procesorów. Wzrost wydajności przy połączeniu dwóch procesorów może nie jest satysfakcjonujący, ale przy czterech, ośmiu... 1.4.2 Zasoby procesorów Po wyborze procesorów równoległych, trzeba zdecydować się na konkretną jednostkę. Zanim podejmie się taką decyzję, trzeba zdawać sobie sprawę z tego, iż zadanie nie da się podzielić na dowolnie małe, niezależne kroki. Istnieje pewne minimum zasobów, które należy umieścić na jednej jednostce obliczeniowej: • wystarczająca ilość pamięci, potrzebnej do wykonania podstawowego zadania; • wystarczająca prędkość potrzebna do wykonania algorytmu; • wystarczająca prędkość komunikacji między procesorami, potrzebna do koordynacji działań i przesyłania obrabianych danych; • wystarczająca prędkość wymiany danych ze światem zewnętrznym. 1.3 1.5 Wybór algorytmu W przypadku stereowizji dwukamerowej, mapę głębi tworzy się na podstawie rozbieżności zobrazowania (disparity) obiektu na dwuwymiarowych obrazach z obu kamer. Mapę rozbieżności można tworzyć na kilka sposobów: • Najpierw rozpoznając obiekty na obrazach lewym i prawym, następnie próbując je skorelować ze sobą. Ta metoda, w przypadku popranej identyfikacji, daje lepsze wyniki (nie zaszumione) od pozostałych, ponadto dostarcza dodatkowych danych o obrazie. Niestety identyfikacja obiektów jest bardzo skomplikowana, aby rozpoznawać dobrze należałoby posiadać jakąś bazę wiedzy, przeglądać ją, uaktualniać w nowym środowisku. Ten sposób jest praktycznie niewykonalny. • Można, modyfikując poprzednią metodę, wydzielać tylko wybrane cechy obrazu (np. krawędzie, proste figury geometryczne, koncentracje barw...), a następnie próbować dopasować je na obu obrazach. Ta metoda jest wykonalna, niestety przy bardziej skomplikowanych obrazach może zawodzić, a ponadto trudno ją zrównoleglić. • Kolejna metoda znacznie różni się od poprzednich. Zakłada ona, iż kamery są dobrze skalibrowane. Wtedy każda n-ta linia obrazu lewego odpowiada n-tej linii obrazu prawego. Znajdując dopasowanie pikseli jednej linii do drugiej, tworzy się mapę głębi obrazu. To podejście jest niezależne od zawartości obrazu oraz pozwala stosunkowo łatwo się zrównoleglić. Ze względu na opisane właściwości, wybrany został trzeci z wymienionych sposobów, uwzględniający implementację równoległą. 1.6 Połączenie algorytmu z możliwościami sprzętowymi Należy dobrać wymagania algorytmu do możliwości sprzętowych i odwrotnie. Ta interakcja powinna być uwzględniana zarówno podczas zakupu sprzętu, jak i w trakcie implementacji. Np. szerokość obrazu powinna być możliwie duża, ale ograniczona ze względu na złożoność algorytmu i zasoby procesora. Aby podołać tym rekurencyjnym zależnościom, dokonano zakupu kontrolnego, w celu przetestowania możliwości sprzętowych, a dopiero po uwzględnieniu wyników testu zdecydowano się na całościowy zakup. Wyniki tego rozpoznania są omówione w dalszej części pracy. 1.7 Opis ideowy systemu wizyjnego 1.7.1 Opis algorytmu Podstawowym założeniem jest poprawne skalibrowanie układu kamer [1]. Jeżeli ten warunek jest spełniony, to każda n-ta linia obrazu lewego, odpowiada n-tej linii obrazu prawego [2,3], co obrazuje rysunek 1. 1.4 n-ta linia obrazu lewego n-ta linia obrazu prawego Obraz lewy Obraz prawy Rysunek 1. Odpowiadające sobie linie obrazu lewego i prawego. Dalej algorytm opisany jest dla dwóch linii. Wszystkie pary linii traktowane są w ten sam sposób. Należy znaleźć przypisanie punktów jednej linii do punktów drugiej. Dopasowanie to powinno być monotoniczne, tzn. nie powinno zawierać przyporządkowań wzajemnie się przecinających. Przykład poprawnego przyporządkowania przedstawia rysunek 2. n-ta linia obrazu lewego n-ta linia obrazu prawego Rysunek 2. Przykład dopasowania dwóch linii Osie optyczne kamer Odwrócona kolejność Obraz Baza Prosta przecinająca bazę Kamera lewa Kamera prawa Rysunek 3. Przykład odwrócenia kolejności obiektów na obrazach. 1.5 Założenie o monotoniczności jest równoważne stwierdzeniu, że jeżeli na obrazie lewym występują jakieś obiekty w konkretnej kolejności, to na obrazie prawym wystąpią w kolejności identycznej. Założenie to nie jest spełnione w sytuacji, gdy prosta łącząca dwa nie przesłaniające się wzajemnie obiekty, przetnie bazę układu kamer. W tym przypadku nastąpi odwrócenie kolejności zobrazowania punktów. Jest to sytuacja dość rzadka, jej przykład przedstawia rysunek 3. Omawiane przyporządkowanie powinno minimalizować kryterium kosztu dopasowania. Najczęściej używane bywają kryteria: • modułowe Li - Pj • kwadratowe i 2 i ( L i - Pj ) gdzie: Li - jasność i-tego punku lewej linii Pj - jasność j-tego punku prawej linii j - numer punktu linii prawej przyporządkowanego do linii lewej Zakładając monotoniczność i znając kryterium, można dobrać metodę znajdowania przyporządkowania. Aktualne zadanie da się sprowadzić do znalezienia drogi w grafie. Taki graf przedstawia rysunek 4. Węzły grafu Rysunek 4. Sprowadzenie zadania dopasowania punktów linii do szukania drogi w grafie 1.6 Przejścia oznaczają: • w pionie - niewidoczny punkt w linii lewej; waga równa karze • w poziomie - niewidoczny punkt w linii prawej; waga równa karze • na ukos - przypisanie sobie dwóch punktów; waga wg kryterium Kara jest parametrem algorytmu. Znalezienie drogi w grafie niecyklicznym jest zadaniem o złożoności O(s2) (s - szerokość linii). Aby możliwie skrócić algorytm, można zastosować następujące usprawnienia: • Przy założeniu, że maksymalne przesunięcie nie jest równe szerokości linii, ale nie większe od pewnej stałej, można przyciąć graf, co skróci algorytm, w sposób pokazany na rysunku 5. Rysunek 5. Graf dopasowań z ograniczonym przesunięciem • Jeżeli dysponujemy informacją, który obraz jest prawy, a który lewy, tak jest w naszym przypadku, można nie rozpatrywać przeciwnego przypadku. To skraca algorytm o połowę. Przycięcie grafu wygląda w sposób pokazany na rysunku 6. Rysunek 6. Graf dopasowań lewego obrazu względem prawego Zastosowanie obu chwytów ogranicza obszar przeszukiwania grafu do postaci przedstawionej na rysunku 7. 1.7 Rysunek 7. Graf dopasowań lewego obrazu względem prawego z ograniczonym przesunięciem 1.7.2 Algorytm znajdowania najkrótszej drogi w grafie niecyklicznym 1. Przypisać wszystkim węzłom maksymalne wagi. 2. Wziąć węzeł bez poprzedników (A) 3. Zmodyfikować wagi jego następników (B) w następujący sposób: WBN = min ( WB, WA + JAB) gdzie: WBN - nowa waga następnika (B) WB - poprzednia waga następnika (B) WA - waga poprzednika (A) JAB - koszt przejścia z A do B 4. Usunąć węzeł A 5. Powtarzać krok 2, 3 i 4, aż nie pozostanie w grafie żaden węzeł 6. Odszukać drogę od węzła końcowego do początkowego, wybierając jako poprzedni ten węzeł, który ma najmniejszą wagę. 1.7.3 Obliczanie odległości na podstawie mapy przesunięć Algorytm dopasowywania linii obrazu, dalej nazywany również algorytmem stereowizji, generuje mapę przesunięć. Znając parametry układu optycznego kamer, za pomocą prostych zależności geometrycznych, przedstawionych na rysunku 8, można napisać wzór: Xl - X r b k ζ Podstawiając przesuniecie (disparity) d = Xl -Xr otrzymujemy: k ζ d b 1.8 Obserwowany punkt Osie symetrii kamer ζ Płaszczyzna obrazu Xl Xr k b Kamera lewa Kamera prawa Rysunek 8. Konstrukcja odległości do obiektu. Więc odległość do obiektu wynosi: ζ b* k d Jeżeli przesunięcie jest zerowe, to odległość jest nieskończona, co w praktyce oznacza, że nie wykryto żadnego obiektu. Mapa przesunięć jest bardziej ogólnym wynikiem (poprawnym dla różnych parametrów układu kamer), a opisane przejście jest nieskomplikowane, dane wyjściowe z systemu wizyjnego są wysyłane jako mapa przesunięć. W dalszej części tekstu mapa przesunięć będzie utożsamiana z mapą głębi obrazu. 1.7.4 Wybrany procesor W chwili obecnej sytuacja na rynku procesorów zmienia się dynamicznie. Firmy takie jak Texas Instruments, czy Analog Devices, wprowadzają coraz nowsze modele, o coraz większych możliwościach. Wprawdzie do wybranego algorytmu nie są potrzebne obliczenia zmiennoprzecinkowe, ale w systemach wizyjnych są one często używane. Ze względów ekonomicznych, zakupiony system wizyjny ma umożliwiać implementowanie różnych algorytmów (nie tylko stereowizji), do wymagań należy więc dodać możliwości arytmetyki zmiennoprzecinkowej. Biorąc pod uwagę ceny i możliwości najlepszymi kandydatami są: • TMS320C6x firmy Texas Instruments • ADSP-2106x - SHARC firmy Analog Devices 1.9 W momencie wyboru dostępna wersja C6x to C601. Jest to procesor stałoprzecinkowy, a C67x (zmiennoprzecinkowy) był jeszcze niedostępny. Porównanie zalet procesora SHARC względem C6x można znaleźć na stronie internetowej [4]. Rodzina procesorów sygnałowych SHARC składa się z trzech wersji różniących się dostępną pamięcią wewnętrzną. Dodatkowo najsłabsza nie posiada portów szybkiej wymiany danych między procesorami (link port). • • • • • • • • • • • • • • • • Do zalet SHARC-a zalicza się [5]: pamięć 4,2,1Mbit SDRAM* dwudostępna, zgromadzona w dwóch bankach arytmetyka stało i zmiennoprzecinkowa, 40 bitowa osobne magistrale dla danych i dla programu zintegrowana obsługa WE/WY 40MIPS mocy obliczeniowej efektywne wykonywanie instrukcji - w jednym cyklu (włącznie z mnożeniem) wbudowane obsługiwanie pętli do sześciu zagnieżdżeń 10 kanałów DMA możliwość transferu danych przez magistralę z prędkością 40MHz interfejs do procesora nadrzędnego możliwość łączenia z innymi SHARC-ami bez dodatkowych urządzeń sześć link port-ów z transferem do 40MBajtów/s każdy dwa porty szeregowe narzędzia: EZ-ICE - emulator ze złączem JTAG kompilator C wygodny asembler *Zależnie od wersji 1.8 Ideowy opis przepływu danych i podziału zadań Uwzględniając posiadany sprzęt, którego dokładniejszy opis znajduje się w dalszej części pracy, przepływ danych można podzielić na następujące kroki: 1. 2. 3. 4. 5. 6. 7. Pobranie obrazów z kamer przez układ akwizycji obrazu (frame grabber) Przesyłanie z układu akwizycji do głównego procesora SHARC Wysyłanie po parze linii do procesorów podrzędnych Właściwe przetwarzanie w podrzędnych procesorach Odsyłanie wyników do procesora głównego Wysyłanie kolejnych par linii do procesorów podrzędnych Po obliczeniu przesunięć dla wszystkich par linii, wysyłanie wyników na zewnątrz układu Opisany przepływ danych przedstawia rysunek 9. 1.10 Kamery UKŁAD AKWIZYCJI OBRAZU SHARC SHARC SHARC SHARC Pamięć obrazu INNE URZĄDZENIA MONITOR Rysunek 9. Przepływ danych w systemie stereowizji. 1.11 2. Wykonane prace wstępne 2.1 Testowanie algorytmu Aby sprawdzić poprawność wprowadzonych udoskonaleń oraz dobrać parametry algorytmu, został on zaimplementowany w języku C++ i testowany na komputerze klasy PC. Szczegóły implementacyjne zostały ujęte w stosownym raporcie [6]. Test wypadł pomyślnie. Tabela 1 przedstawia wyniki badań. Badania zostały przeprowadzone na komputerze z procesorem Pentium 166, z 32M RAM i systemem WINDOWS95. Rozdzielczość czas obliczeń dla kryterium czas obliczeń dla kryterium modułowego [s] kwadratowego [s] 160x120 0,16 0,28 320x240 1,15 1,60 640x480 5,49 7,08 Tabela 1. Wyniki testów prędkości algorytmu na procesorze PENTIUM 166 Wyniki dotyczą dopuszczalnego przesunięcia 127. Analogiczne dane dla procesora sygnałowego SHARC ( kryterium kwadratowe i modułowe trwa tyle samo). Rozdzielczość czas obliczeń obrazu [s] 160x120 0,605586 320x240 3,08379 640x480 13,56215 Tabela 2. Wyniki testów prędkości algorytmu na procesorze ADSP21061 SHARC Wyniki dotyczą dopuszczalnego przesunięcia 127. Należy zauważyć, że powyższe wyniki nie uwzględniają czasu przesyłania obrazów. 2.1.1 Wnioski 1. Prędkość procesora sygnałowego SHARC jest o połowę mniejsza od Pentium 166. Stosowanie tych jednostek jest opłacalne przy pracy wieloprocesorowej (cztery i więcej). W przypadku omawianego algorytmu, dwa procesory obliczą obraz dwa razy szybciej od jednego, trzy procesory trzy razy szybciej, itd. 2. Przy użyciu procesorów sygnałowych SHARC, można korzystać z kryterium kwadratowego bez spadku prędkości obliczeń. 3. Dla obrazów o rozmiarach 320x240 należy się spodziewać, przy czterech SHARC-ach, 1,5 klatki na sekundę, przy przesunięciu 100 oraz dla obrazu o rozmiarach 160x120, 9 klatek na sekundę, przy przesunięciu 60. Dla mniejszych obrazów odpowiednio szybciej. 4. Dla danej szerokości linii, nakład obliczeń, jest proporcjonalny do kwadratu z dopuszczalnego przesunięcia - O( s2 ), gdzie s to szerokość linii. 2.12 2.2 Rozpoznanie właściwości procesora sygnałowego SHARC Zanim został zakupiony system wieloprocesorowy z procesorami SHARC i potrzebnym oprogramowaniem, należało przetestować opisywane ich możliwości i ocenić przydatność pod kątem postawionych zadań. W tym celu został dokonany zakup kontrolny. Pakiet EZKIT-Lite składa się z: • płytki drukowanej z procesorem SHARC w najuboższej wersji (ADSP21061), z układami do generacji dźwięków, transmisji szeregowej i innymi urządzeniami towarzyszącymi • programów narzędziowych do tworzenia oprogramowania (w niepełnej wersji) • symulatora programowego procesora SHARC • programu do ładowania programów do procesora SHARC i oglądania jego rejestrów • dokumentacji umieszczonej na płycie CDROM. Pakiet ten umożliwił poznanie asemblera i C dla rodziny procesorów ADSP21k. Przetestowany wcześniej algorytm został przetłumaczony na asembler i ponownie testowany za pomocą symulatora. Otrzymane wyniki [6] pozwoliły oszacować przydatność procesora i prędkość dopasowywania. Nie została przetestowana prędkość transmisji, i jej implementacja, ponieważ na płytce znajdował się tylko jeden procesor, a ponadto ta wersja nie posiada szybkich portów wymiany międzyprocesorowej (link port). Na tym etapie sprawdzono wydajność procesora, natomiast prędkość transmisji przyjęto z danych producenta. 3. Zalety procesorów SHARC SHARC jest procesorem sygnałowym. Posiada architekturę przystosowaną do wykonywania skomplikowanych obliczeniowo algorytmów, szybkiego przesyłania dużej ilości danych, oraz pracy wieloprocesorowej [7]. 3.1 Wykorzystywane możliwości procesorów sygnałowych Wiele rejestrów ogólnego zastosowania Piętnaście rejestrów ogólnego zastosowania, dodatkowo wiele adresowych i innego przeznaczenia, pozwoliło na zaimplementowanie algorytmu stereowizji tak, że wszystkie zmienne pośrednie, oraz stałe, trzymane są w rejestrach. To przyśpieszyło wykonanie algorytmu. ... m0=0; m1=1; m2=-1; r0=320; r1=255; ... //w rejestrach przechowywane są wszystkie stałe //używane w algorytmie 3.13 Równoległe instrukcje Instrukcje programu pozwalają np. jednocześnie przesyłać dane i wykonywać obliczenia. Te możliwości skracają program i jednocześnie przyśpieszają jego wykonanie. r0=r0+r1, r2=dm(i0,m1); //jednoczesne wykonywane obliczeń //i czytanie pamięci Jednocyklowe instrukcje Na podstawie testów algorytmu [6] wiadomo, że kryterium kwadratowe daje lepsze wyniki niż modułowe. Jednak w procesorze Pentium, wersja kwadratowa działa znacznie wolniej, ze względu na czas mnożenia. SHARC potrafi mnożyć równie szybko jak liczyć moduł: w jednym cyklu zegara. //jednoczesne obliczanie i przesyłanie, //to mnożenie zajmuje tylko jeden takt zegara r0=r0*r1(SSI), r2=dm(i1,m1); Sprzętowe pętle W SHARC-u zostały wbudowane mechanizmy pozwalające na automatyczne wykonywanie instrukcji pętlowych, takich jak inkrementacje, sprawdzanie warunku końca pętli, aż do sześciu zagnieżdżeń. To wystarczyło do algorytmu stereowizji i znacznie przyśpieszyło krytyczne części kodu. //początek pętli LCNTR=r8, DO wewn1 UNTIL LCE; //.......... wnętrze pętli //ostatnia instrukcja wewn1:dm(i0,m3)=r0; Zasobna pamięć Wersja zakupiona, ADSP-21062, jest zaopatrzona w 2Mbity pamięci (256kB). Ta ilość wystarczyła aby zmieściły się w niej zarówno dane (wystarczająco duży graf, czy dwa obrazy, lewy i prawy) jak i, oczywiście, program. Dwa banki pamięci Pamięć podzielona jest na dwa banki. Do każdego banku prowadzą osobne magistrale. Takie rozwiązanie pozwala jednocześnie przesyłać dane i czytać program, co znacznie przyśpiesza pracę procesora. DMA 3.14 Kanały DMA służą do przesyłania danych bez zajmowania czasu procesora. W tym czasie może on zajmować się czym innym, więc znacznie przyśpiesza to jego pracę. Dodatkowo prędkość przesyłania jest wyjątkowo duża ponieważ DMA pozwala na dostęp nawet w jednym takcie zegara. Ponieważ kanałów jest aż dziesięć, więc można jednocześnie, o ile czytane banki pamięci są różne, wykorzystywać kilka z nich. DMA samo zajmuje się pakowaniem danych gdy magistrala jest wąska, generuje przerwanie po zakończeniu transmisji, potrafi samo rozpocząć następny transfer (tryb chained). //wywołanie tych kilku linii kodu w C, //spowoduje wysłanie dwóch obrazów do FPGA //to jest przesłanie 153,6kB bez zajmowania procesora //Czyszczenie DMA IOP(DMAC9)=0; IOP(DMAC9)=DMAC_FLSH; //bufor wewnętrzny IOP(II9)=TabObraz; IOP(IM9)=1; IOP(C9)=38400; //adres początku obszaru //przyrost adresu //ilość elementów do przesłania //bufor zewnętrzny IOP(EI9)=& FPGA_DEVICE(0);//adres początku obszaru IOP(EM9)=0; //przyrost adresu IOP(EC9)=38400; //ilość elementów do przesłania IOP(CP9)=CPx_INTEN; //generowanie przerwania po //zakończeniu transferu IOP(GP9)=0; //uruchomienie DMA IOP(DMAC9)=DMAC_DEN | DMAC_TRAN | DMAC_MASTER; Kanały szybkiej transmisji międzyprocesorowej (link port) Posiadany model procesora SHARC, ADSP21062, ma sześć portów szybkiej transmisji międzyprocesorowej (link port). Służą one do wymiany danych między poszczególnymi jednostkami z pominięciem głównej magistrali danych. Dają one możliwość łączenia procesorów SHARC w tablice dwu- i trójwymiarowe oraz grona. W naszym systemie wykorzystywany jest model grona. Kanały te są tylko 4-bitowe, mogą przesłać w jednym takcie zegara jeden bajt danych, ale przypisane im DMA rekompensują tę wadę. //te linie kodu inicjują transmisję bloku pamięci przez //kanały szybkiej transmisji międzyprocesorowej //zerowanie LCTL IOP(LCTL)=0; //bufor wewnetrzny IOP(II3)=linie_do_przeslania; IOP(IM3)=1; IOP(C3)=SZER/2; 3.15 //uruchomienie DMA IOP(LCTL)=L1EN | L1DEN | L1TRAN; Ponieważ szerokość magistrali tych portów wynosi cztery bity i potrafi ona pracować dwa razy szybciej niż zegar, więc przesyła jeden bajt w jednym takcie zegara. Przy zegarze 40MHz daje to maksymalnie 240Mbitów/s (40MBajtów/s). Zintegrowane WE/WY Rozwiązania zastosowane do obsługi pamięci i urządzeń zewnętrznych są bardzo elastyczne, a możliwość transferu DMA, do i z procesorów, ułatwia i przyśpiesza obsługę zewnętrznych zasobów. Wieloprocesorowość Rodzina procesorów SHARC jest przeznaczona do pracy równoległej. WE/WY jest tak pomyślane, aby nie były potrzebne żadne dodatkowe układy do komunikowania się między poszczególnymi procesorami. Każdy SHARC jest w stanie operować na wspólnej mapie pamięci, wysyłać dane dostępem bezpośrednim lub pośrednim - za pomocą kanałów DMA. Prosta i intuicyjna składnia asemblera Program napisany w asemblerze procesorów SHARC jest łudząco podobny składnią do C. To bardzo ułatwia pisanie programów. //ponownie przykład pętli, jak „ładnie” i czytelnie wygląda LCNTR=r8, DO wewn1 UNTIL LCE; //.......... wnętrze pętli //ostatnia instrukcja wewn1:dm(i0,m3)=r0; 4. Posiadany sprzęt Na pakiet zakupionego systemu wieloprocesorowego składają się [8]: • Płyta główna ASP-V3 • SHARCPAC ASP-M54 z czterema procesorami ADSP21062 SHARC • SHARCPAC ASP-M92 z jednym procesorem ADSP21062 SHARC i programowalnym układem logicznym (FPGA) firmy Xilinx 4.16 4.1.1 Płyta główna ASP-V3 Rysunek 10. Płyta ASP-V3. Ten typ płyty głównej jest przeznaczony do umieszczenia w magistrali VME, jednak pozwala tylko na pobieranie z niej zasilania i obsługę sygnału SYSRESET oraz generowanie SYSFAIL. Nie zapewnia natomiast komunikacji przez VME. Na płycie znajdują się trzy gniazda dla płyt typu TRANSPAC, lub dwa SHARCPAC, wyjścia flag, przerwań, portów transmisji szeregowej oraz złącze JTAG do procesorów SHARC. Płyta pozwala łączyć ze sobą odpowiednie porty szybkiej komunikacji międzyprocesorowej wybranych płyt TRANSPAC. Dodatkowo na płycie znajduje się układ sprzętowego nadzoru nad poprawnością pracy (Watchdog Timer). 4.17 4.1.2 TRANSPAC ASP-M54 Rysunek 11. Płyta ASP-M54 . Płyty TRANSPAC tworzą standard, który pozwala tworzyć grona procesorów SHARC by później je ze sobą łączyć. Standard TRANSPAC jest zgodny ze standardem SHARCPAC, ale dzięki mniejszym gabarytom zapewnia większe upakowanie. Na posiadanej płycie znajdują się cztery procesory sygnałowe. Płyta udostępnia ich dziesięć portów szybkiej komunikacji międzyprocesorowej, cztery porty szeregowe, łącze JTAG itd. Dodatkowo umieszczona jest pamięć typu FLASH do zaprogramowania procesorów po restarcie. 4.18 4.1.3 TRANSPAC ASP-M92 Rysunek 12. Płyta ASP-M92. Ten moduł TRANSPAC zawiera jeden procesor SHARC oraz FPGA (XC4013E PQ240) firmy Xilinx, wraz z przyłączonymi dodatkowymi czterema łączami WE/WY, programowalnym zegarem AV9110 i FIFO od FPGA do procesora SHARC. Dodatkowo pamięć ośmiobitowa typu FLASH pozwala na uruchomienie programu dla SHARC-a bez ładowania go z zewnątrz. System został pomyślany tak, aby dane były wprowadzane przez FPGA do procesora SHARC, za pośrednictwem FIFO lub bez niego, dalej były rozdzielane przez porty szybkiej komunikacji międzyprocesorowej do drugiej płyty TRANSPAC. Potem z powrotem przez te porty do pojedynczego procesora SHARC, dalej do FPGA i przez jego łącza WE/WY na zewnątrz (rysunek 13). Standard TRANSPAC, umożliwia połączenie między płytami TRANSPAC przez główną magistralę, jednak płyta główna ASP-V3 nie zezwala na taki transfer. 4.19 ASP -M92 FIFO Xilinx SHARC SHARC SHARC SHARC SHARC ASP-M54 ASP-V3 Rysunek 13. Przepływ danych z uwzględnieniem płyt ASP. 5. Używane narzędzia Wykorzystanie posiadanego sprzętu wymaga programowania procesorów sygnałowych oraz uniwersalnych bramek logicznych (FPGA). W związku z tym używano wielu narzędzi pośrednich. 5.1 Programowanie FPGA Programowanie FPGA [9] odbywa się za pomocą narzędzi oferowanych przez producenta posiadanej wersji FPGA - firmę Xilinx. W naszym przypadku jest to pakiet „Xilinx Foundation Series Software” pracujący w środowisku WINDOWS95. 5.20 Rysunek 14. Widok okna programu Project Manager Nadrzędnym programem jest „Project Manager” ( rysunek 14). Organizuje on pracę z różnego rodzaju plikami składającymi się na projekt, uruchamia inne programy z aktualną wersją implementacji. Tutaj między innymi znajduje się plik *.ucf, w którym opisane są połączenia wyprowadzeń FPGA do wewnętrznej struktury. Programować FPGA można na trzy sposoby: 1. Za pomocą edytora schematów ( Schematic Editor ) 2. W języku HDL ( HDL Editor ) 3. Używając edytora stanów ( State Editor ) W projekcie używany był edytor schematów (rysunek 15). Służy on do programowania wizualizowanego jako łączenie standardowych bloczków i makr . Rysunek 15. Widok okna programu Schematic Editor 5.21 Po napisaniu programu, w jednym z trzech dostępnych edytorów, można zasymulować jego działanie za pomocą symulatora ( Logic Simulator ). Jest on przydatnym, i poręcznym, narzędziem. Przykładową symulację przedstawia rysunek 16. Rysunek 16. Widok okna programu Logic Simulator Napisany, lub narysowany, projekt programu, można wysłać do programu zarządzającego kolejnymi wersjami implementacji (Xact Step). Rysunek 17. Widok okna programu Xact Step Z programu Xact Step, po przetworzeniu schematów, na język programujący fizyczną strukturę FPGA, można umieszczać program w układzie logicznym. Jest to możliwe na kilka sposobów. W pracy wykorzystywana była droga przez generację pliku *.hex, za pomocą kolejnego programu - PROM File Formatter. 5.22 Rysunek 18. Widok okna programu PROM File Formatter 5.2 Przejście od FPGA do procesora SHARC Otrzymany program dla FPGA można zapisać w postaci pliku *.hex. Niestety na posiadanej płycie nie istnieje możliwość bezpośredniego wpisania programu do FPGA przez JTAG. Trzeba to zrobić pośrednio - przez procesor sygnałowy. Podczas inicjacji programu głównego, należy umieścić dane programu bramek logicznych w FPGA za pomocą odpowiedniego protokołu. Aby to było możliwe, kod tego programu musi się znaleźć w kodzie programu procesora SHARC. ff043c91f9ea7f7ffdf5d75f7ffdf5d75f7ffdf5bddbbddfbb7beffb7edb6df fbd5f7b7fb73ff8fffefbebfbfffefbefbffffe7b ............ dbfdf7df77fffdfda7ffdf5f7ffdf5d75fdffff5d75f7ffdedb7bffe7aebefe edd6efbffbfdefaeb0x9b43feff Wydruk 1. Plik *.hex z programem dla FPGA Plik programu *.hex (przykład na wydruku 1) jest przerabiany za pomocą programu HexToH.exe napisanego w C, stworzonego na przez autora tej pracy. Potrzebne dane umieszczane są w macierzy o odpowiedniej długości i formowane w postać pliku nagłówkowego typu *.h rozpoznawalnego przez kompilator C (przykład na wydruku 2). 5.23 // plik zawierający tablicę danych do zaprogramowania fpga #ifndef _progfpga_h #define _progfpga_h //----------------------------------------------int TabProgram[30400]={0xff043c91,0xf9ea7f7f,0xfdf5d75f, 0x7ffdf5d7,0x5f7ffdf5,0xbddbbddf,0xbb7beffb,0x7edb6dff, 0xbd5f7b7b,0xb73ff8ff,0xfefbefbf,0xfffefbef,0xbffffe7b, ............. 0xdbfdf7df,0x77fffdfd,0xa7ffdf5f,0x7ffdf5d7,0x5fdffff5, 0xd75f7ffd,0xedb7bffe,0x7aebefee,0xdd6efbff,0xbfdefaeb, 0x9b43feff,0x00000000}; #define PROGRAM_COUNT 7749 //----------------------------------------------#endif Wydruk 2. Plik progfpga.h z programem dla FPGA 5.3 Programowanie procesora SHARC Program dla procesora SHARC może zostać napisany w asemblerze lub w C. Kompilatory obu języków zostały zakupione łącznie ze sprzętem: 1. programy asemblerowe [10]: • ADSP21000 Family Assembler • ADSP21000 Family Linker • Boot Loader (nie był używany) • PROM Splitter (nie był używany) • Librarian (nie był używany) • Simulator 2. C - G21K [11] jest wersją kompilatora GNU Free Software Foundation W trakcie kompilacji programu systemu wizyjnego, dołączana jest tablica zawierająca program dla FPGA. Podczas inicjacji SHARC, za pomocą odpowiedniego protokołu, umieści ją w miejscu przeznaczenia. Posiadając wykonywalną wersję programu można ją przez złącze JTAG wpisać do procesorów SHARC. Ponieważ te procesory są przystosowane do pracy równoległej, do ich programowania potrzebne jest specjalne narzędzie. Nadrzędnym programem kontrolującym pracę wieloprocesorową jest Focus Manager. Jest on niewidoczny dla użytkownika jako okno, pojawia się jako zadanie w pasku zadań. Focus Manager koordynuje pracę emulatorów (rysunek 19), te z kolei łączą się z przypisanymi im procesorami sygnałowymi przez złącze JTAG. 5.24 Rysunek 19. Widok okna programu emulatora Aby wpisać odpowiedni program do odpowiedniego procesora, musi być uruchomiony Focus Manager oraz emulator przypisany danemu procesorowi. Po uruchomieniu wymienionych programów, najpierw należy załadować plik opisu architektury, mówiący o konfiguracji pamięci procesora SHARC, a dopiero program. Emulator umożliwia ładowanie programów, ich uruchamianie oraz wyszukiwanie i usuwanie błędów (debugging). Można zatrzymać wykonywanie programu w dowolnym miejscu i obejrzeć wartości rejestrów, czy zawartość pamięci. 6. Implementacja Na implementację algorytmu składają się zarówno schematy FPGA, program dla procesorów SHARC jak i zdefiniowana mapa pamięci. 6.1 Konfiguracja pamięci Pamięć procesorów SHARC składa się z dwóch banków ( Block0 i Block1 ). Dwie magistrale adresowe i danych pozwalają na jednoczesny dostęp pod warunkiem, że czytają różne banki. Te dwa odczyty są różne - jeden dotyczy danych, drugi programu. Jeżeli procesor wykonując program będzie czytał kolejne instrukcje z jednego banku i w instrukcjach otrzyma rozkaz czytania z tego samego banku, to będzie wykonany dodatkowy cykl, aby dwa razy odczytać ten sam blok pamięci. Optymalizując kod programu, najlepiej tak rozplanować dane i program, żeby program znajdował się w jednym bloku ( Block0 ), a dane w drugim (Block1). W procesorach ADSP21062 znajduje się 2Mbity pamięci. Na jeden blok przypada 32K słów 32-bitowych (dane) lub 24K słów 48-bitowych (dane lub program). Graf dla linii o szerokości 320 punktów i dopuszczalnym przesunięciu 115, jest zapisywany do tablicy o długości 30392 słów. Dane programu dopełniają pamięć do 32K. Liczenie dopasowań z większym dopuszczalnym przesunięciem, wymaga innej konfiguracji pamięci. Podobnie jest 6.25 z obrazami w procesorze nadrzędnym. 320*240*2 = 153600 bajtów, czyli 38400 słów 32bitowych. Dwa obrazy przekraczają wielkość jednego banku. Mapa pamięci procesora SHARC znajduje się w pliku architektury ( *.ach ). Definiuje się w nim wielkość segmentów przeznaczonych na dane, program, stos... Segmentów może być wiele, lecz muszą spełniać jeden warunek: tworzyć dwa rozłączne bloki: 48-bitowy i 32-bitowy. Podział nie następuje w dowolnych miejscach - jest związany z budową pamięci w ADSP2106x. Blok pamięci składa się z szesnastu kolumn szesnastobitowych. W ADSP21062 mają one długość 4K (w ADSP21060 8K). 16*16*4K=1Mbit. Dodatkowym ograniczeniem jest wymaganie, aby początki bloków 32-bitowych były tylko w parzystych kolumnach. Jeżeli bank pierwszy zostanie przeznaczony na dane, to w zerowym musi się znaleźć co najmniej jeden blok programu, który zajmie trzy kolumny. Czwarta będzie nie wykorzystana, a pozostała część może być przeznaczona na dane 32-bitowe. Podział zerowego banku pamięci przedstawia rysunek 20. Taką mapę pamięci należy wygenerować w pliku architektury: !komentarze rozpoczynają się od wykrzyknika !nazwa mapy pamięci .SYSTEM YER_BASIC_062_C_ACH; !wersja procesora ( od niej zależy długość bloków ) .PROCESSOR = ADSP21062; !bank 0... ! segment 48-bitowy z wektorami startu .SEGMENT/RAM/BEGIN = 0x00020000 /END = 0x000200ff /PM seg_rth; ! segment 48-bitowy na inicjalizację .SEGMENT/RAM/BEGIN = 0x00020100 /END = 0x000201ff /PM seg_init; ! segment 48-bitowy na kod programu .SEGMENT/RAM/BEGIN = 0x00020200 /END = 0x00020fff /PM seg_pmco; ! tutaj podzielony jest blok zerowy pamięci ! dalej dane są 32-bitowe ! segment 32-bitowy, dodatkowo uzyskana pamięc z bloku 0 .SEGMENT/RAM/BEGIN = 0x00022000 /END = 0x00027fff /WIDTH=32 seg_pmda; !bank 1... ! segment 32-bitowy, główny segment danych .SEGMENT/RAM/BEGIN = 0x00028000 /END = /WIDTH=32 seg_dmda; /DM 0x0002fdff /DM ! segment 32-bitowy potrzebny dla C .SEGMENT/RAM/BEGIN = 0x0002fe00 /WIDTH=32 seg_heap; /END = 0x0002feff /DM ! segment 32-bitowy - stos .SEGMENT/RAM/BEGIN = 0x0002ff00 /WIDTH=32 seg_stak; /END = 0x0002ffff /DM 6.26 .ENDSYS; Rysunek 20. Używana konfiguracja pamięci banku zerowego. 6.2 Implementacja algorytmu Przycięty graf jest trapezem. W implementacji dzieli się go na trójkąt i równoległobok, pokazuje to rysunek 21. Rysunek 21. Podział grafu na trójkąt i równoległobok. W pamięci graf jest umieszczony w jednowymiarowej tablicy, co utrudnia odwoływanie się do niego, ale zapewnia oszczędność pamięci, co jest bardzo jest ważne, szczególnie dla procesora sygnałowego. Schematyczne zapisana implementacja programu wygląda następująco: 6.27 //najpierw kryterium w trójkącie pierwszy element; for ( wysokość trójkąta -1 ) { oblicz kryterium dla pierwszego elementu linii; for ( szerokość linii trójkąta -2) {oblicz kryterium } oblicz kryterium dla ostatniego elementu linii; } //teraz równoległobok for ( wysokość równoległoboku ) { oblicz kryterium dla pierwszego elementu linii; for ( szerokość linii trapezu-1 ) { oblicz kryterium } } //wyłuskanie drogi (od końca) //najpierw równoległobok while ( powyżej trójkąta ) { if ( przejście na ukos ) dopasowanie; else if ( przejście w pionie) nie dopasowanie i jasność++; else przejście w poziomie i jasność--; } //potem trójkąt while ( powyżej dołu trójkąta ) { if ( przejście na ukos ) dopasowanie; else if ( przejście w pionie ) nie dopasowanie i jasność++; else przejście w poziomie i jasność--; } //koniec Źródło w C i asemblerze znajduje się w raporcie [6]. Wypełniana tablica jednowymiarowa ma rozmiar: r = (p+1)*(p+2) 2 + ( s - p - 1 ) * (p + 1 ) gdzie: r - rozmiar tablicy p - dopuszczalne przesunięcie s - szerokość linii Natomiast maksymalna długość drogi w grafie wynosi 2*s, z czego wynika, że istotny wpływ na złożoność algorytmu ma wypełnianie tablicy. Po uproszczeniu wzoru na r, złożoność 6.28 obliczeniowa algorytmu jest rzędu O( p2 / 2 + p * s ). Warto zauważyć, iż zależy liniowo od s i kwadratowo od p oraz że p << s. 6.3 Szczególne techniki wykorzystywane w implementacji algorytmu W implementacji algorytmu zostały zastosowane szczególne techniki, mające na celu maksymalne wykorzystanie możliwości procesorów SHARC. 6.3.1 Asembler Podstawowym sposobem na przyśpieszanie jest unikanie niepotrzebnych opóźnień. Zatem cały algorytm został napisany w asemblerze. Warto podkreślić, że jest on czytelny i wygodny (jak na asembler). 6.3.2 Rejestry Wykorzystywana jest możliwie duża liczba rejestrów przeznaczenia ogólnego. Pozwoliło to na umieszczenie w nich wszystkich stałych i zmiennych lokalnych. Dzięki temu dodatkowe czytania pomięci odbywają się możliwie rzadko i częściej możliwe jest zrównoleglenie instrukcji. 6.3.3 Pętle W algorytmie potrzebne są pętle o potrójnym zagnieżdżeniu. Sprzętowa ich implementacja pozwala na usunięcie, wszystkich instrukcji inkrementacji liczników pętli oraz sprawdzania warunków końca pętli. LCNTR=r8, DO wewn1 UNTIL LCE; //.......... wnętrze pętli //ostatnia instrukcja wewn1:dm(i0,m3)=r0; 6.3.4 Postmodyfikacja Rejestry adresowe pozwalają na ustalenie wartości modyfikujacych je automatycznie po zapisie lub odczycie. To pozwala skrócić program o te instrukcje. //wcześniej został ustawiony jeden z rejestrów modyfikacji m3=240; ............ r0=dm(i0,m3); //po umieszczeniu w rejestrze r0 danej // z adresu i0, rejestr indeksowy //zostanie zmodyfikowany o zawartość //m3 (+240) 6.29 6.3.5 Jedynka w operacjach arytmetycznych W operacjach matematycznych można dodawać, czy odejmować, rejestry, jednocześnie modyfikując wynik o 1, lub -1. To również skraca liczbę instrukcji. r0=r1-r2+1; r3=rr-r1-1; 6.3.6 Sortowanie SHARC posiada instrukcje wyboru większej, lub mniejszej, z dwu liczb. Pozwala to wybrać najmniejszą liczbę z trzech w dwóch instrukcjach asemblerowych. //wcześniej w rejestrach r0, r1 i r2 zostały umieszczone dane r0=... r1=... r2=.. //teraz w dwóch instrukcjach znajdzie się najmniejszą r0=MIN(r0,r1); r0=MIN(r0,r2); //wynik znajduje się w r0 6.3.7 Mnożenie Wykonywanie mnożenia w jednym takcie zegara pozwala na wybranie lepszej wersji algorytmu bez wydłużania czasu obliczeń. Zapewnia to na lepszą jakość wyników w identycznym czasie. r4=r5*r6(SSI); //to mnożenie zajmuje jeden takt 6.3.8 Równoległość Możliwość wykonywania jednoczesnych obliczeń na rejestrach i przesyłania danych pozwala w wielu miejscach, tam gdzie nie zostanie zakłócona przyczynowość, skrócić ilość instrukcji, a w rezultacie przyśpieszyć wykonanie algorytmu. // w jednym takcie zegara mnożenie, zapis danej do pamięci // i modyfikacja rejestru indeksowego o ustaloną wartość r4=r5*r6(SSI), r0=dm(i0,m3); 6.4 Komunikacja między procesorami sygnałowymi W implementacji algorytmu wykorzystywany jest model grona. Polega on na tym, że jeden procesor nadrzędny komunikuje się z wszystkimi podrzędnymi, natomiast procesory podrzędne nie komunikują się ze sobą. Ilustruje to rysunek 22. 6.30 SHARC SHARC SHARC SHARC Rysunek 22. Struktura grona. 6.5 Struktura programu w procesorze nadrzędnym 1. Inicjacja • Zaprogramowanie FPGA • Zaprogramowanie zegara AV9110 • Ustawienie rejestrów FIFO • Podłożenie procedur obsługi przerwań • Przypisanie wartości początkowych zmiennym • Zainicjowanie odbierania obrazów 2. Przesyłanie danych • Pobieranie po linii obrazów z FIFO • Wysyłanie po parze linii do procesorów podrzędnych • Odbieranie wyników obliczeń • Po obliczeniu całej mapy głębi wysłanie jej przez FPGA na zewnątrz • Inicjacja pobierania kolejnej pary obrazów 6.6 Struktura programu w procesorze podrzędnym 1.Inicjacja • Ustawienie kanału komunikacji międzyprocesorowej na odbieranie 2.Praca • Po odebraniu danych - uruchomienie algorytmu • Przestawienie kanału przesyłania na nadawanie i wysłanie wyników • Ponowne przejście w tryb odbierania 6.31 6.7 Programowanie FPGA SHARC znajdujący się na płycie ASP-M92 podczas inicjacji programuje FPGA według następującego protokołu: 1. Inicjacja programowania FPGA • wyłączenie wyjść FPGA MACH_FPGA_OUTPUT_DISABLE = MACH_ON; • pozytywny impuls na wejściu programowania MACH_FPGA_PROG = MACH_OFF; delay( 200 ); MACH_FPGA_PROG = MACH_ON; delay( 200 ); MACH_FPGA_PROG = MACH_OFF; • odczekanie delay( 2000 ); • kolejny impuls MACH_FPGA_PROG = MACH_ON; delay( 200 ); MACH_FPGA_PROG = MACH_OFF; delay( 2000 ); 2. Wpisywanie po bajcie tablicy programu danych • wpisanie bajtu FPGA_DEVICE( 0 ) = val; delay( 5 ); • czekanie na potwierdzenie while(...) { got = FPGA_DEVICE( 0 ) & 0xff; if(got!=val) ... } 3.Zakończenie programowania • sprawdzenie poprawności while( ! IS_FPGA_PROG_DONE ) { ... delay(500); } • włączenie FPGA MACH_FPGA_OUTPUT_DISABLE = MACH_OFF; 6.8 Programowanie zegara AV9110 Podczas inicjacji programu nadrzędnego procesora, jest inicjowany również programowalny zegar AV9110. Jego sygnał synchronizuje wysyłanie w FPGA obrazu wyjściowego do VIBus. Do zaprogramowania tego zegara potrzebne są 24 bity kontrolne. Ich znczenie opisane jest w literaturze [12]. Bity te wysyła się w następujący sposób: 1. Inicjacja 6.32 • ustawienie zegara programu AV9110 na stan niski MACH_CLOCK_GEN_DATA_CLOCK = MACH_OFF; • ustawienie bitu programowania zegara MACH_CLOCK_GEN_DISABLE = MACH_OFF; 2. Programowanie • wpisanie bitu danej do wejścia programu AV910 MACH_CLOCK_GEN_DATA_VALUE = bit; • wygenerowanie impulsu zegara programu AV9110 MACH_CLOCK_GEN_DATA_CLOCK = MACH_ON; MACH_CLOCK_GEN_DATA_CLOCK = MACH_OFF; 3. Zakończenie • skasowanie bitu programowania zegara MACH_CLOCK_GEN_DISABLE= MACH_ON; 6.9 Pobieranie danych z magistrali VIBus Dane na wejściu systemu wizyjnego przekazywane są przez magistralę VIBus. Aby uzyskać potrzebne informacje należy obsługiwać w zdefiniowany sposób [12] jej sygnały sterujące. Problem ten rozwiązano przez odpowiednie zaprogramowanie FPGA. 6.9.1 VIBus • • • • • • Sygnały VIBus mają następujące znaczenie: EVENFIELD Sygnał wykorzystywany w trybie wysyłania obrazu z przeplotem - na przemian parzyste i nieparzyste linie. Służy do rozróżnienia parzystych i nieparzystych linii. DATAVALID Sygnalizuje poprawność danych. /HSYNC Sygnał który oddziela od siebie kolejne linie. Generowany jest jako impuls trwający kilka taktów zegara. /VSYNC Sygnał który oddziela od siebie kolejne obrazy. Generowany jest jako impuls trwający kilka linii. RAWCLOCK Zegar magistrali. Jego narastające zbocze synchronizuje dane. D0-D7 Linie danych. Pozostałe sygnały są nieistotne dla tej implementacji. Znak / przed sygnałem oznacza, że jest on aktywny w stanie niskim. Dokładny opis znaczenia sygnałów, i ich zależności czasowych, znajduje się w specyfikacji magistrali VIBus [12]. Sygnały złącza VIBus przedstawia tabela 3. 6.33 Nr 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 Sygnał Nr Sygnał reserved 2 reserved EVENFIELD 4 DATAVALID /CSYNC 6 /HSYNC /VSYNC 8 DCHAIN reserved 10 reserved REQUEST 12 GND RAWCLOCK 14 GND reserved 16 GND reserved 18 GND D15 20 D23 (GND) D14 22 GND D13 24 D22 (GND) D12 26 GND D11 28 D21 (GND) D10 30 GND D9 32 D20 (GND) D8 34 GND D7 36 D19 (GND) D6 38 GND D5 40 D18 (GND) D4 42 GND D3 44 D17 (GND) D2 46 GND D1 48 D16 (GND) D0 50 GND Tabela 3. Sygnały złącza VIBus 6.10 Droga danych w systemie wizyjnym 6.10.1 Od VIBus przez FPGA do FIFO Dane przychodzące przez magistralę VIBus są ośmiobitowe. Magistrale do FIFO i dalej są trzydziestodwubitowe. Aby zmniejszyć ilość przesyłanych słów, dane są już w FPGA pakowane po cztery bajty. Takie zagęszczanie jest niezbędne, żeby zmieścić dwa obrazy w pamięci ADSP21062. Jego sprzętowa realizacja odciąża procesor sygnałowy. Linie wysyłane przez kamery mają szerokość 640 punktów. To zbyt szeroki obraz, jak na możliwości przetwarzania w posiadanych procesorach sygnałowych, dlatego jeszcze przed pakowaniem, zmniejsza się rozdzielczość poziomą o połowę, przez podział sygnału zegara synchronizacji punktów (RAWCLOCK). Rozdzielczość pionowa jest zmniejszona przez tryb wyświetlania - pobierany jest tylko jeden półobraz, parzyste linie. Aby pobierać tylko jeden obraz, zaprogramowany został następujący mechanizm: 1. Wpis z procesora do odpowiedniego adresu w FPGA odblokowuje (START) czekanie na synchronizację pionową. 2. Pierwsza synchronizacja pionowa (VSYNC) zeruje bit oczekiwania na pierwszą synchronizację i odblokowuje odbieranie danych. 3. Kolejna synchronizacja pionowa zeruje zezwolenie na odbieranie danych. 6.34 Schemat odbierania danych i wysyłania do fifo 6.35 Wpisanie do FIFO zgromadzonych danych polega na podaniu ich na wyprowadzenie wejść danych FIFO (O[31:0]) i wygenerowanie impulsu zapisu do FIFO (WR). Mechanizm przesyłania danych z VIBus do FIFO przedstawia schemat 1. 6.10.2 Od FIFO do głównego procesora SHARC W FIFO gromadzą się dane. Program w nadrzędnym SHARC-u po uruchomieniu mechanizmu wczytującego dane inicjuje kanał DMA (ze względu na szczególne sygnały sterujące wybrano kanał siódmy), tak żeby wczytana została jedna linia. Zakończenie przesyłania generuje przerwanie, w którym uaktualniane są liczniki linii i jeżeli należy odebrać kolejne linie, ponownie inicjowane jest siódme DMA w celu wczytania linii. Kolejne linie umieszczane są w pamięci nie jedna za drugą, ale z przerwami - tak aby po wczytaniu kolejnego obrazu, w pamięci ułożone były na przemian linie z lewego i prawego obrazu. Takie rozmieszczenie pozwala przesyłać dwie linie jedną transmisją DMA do podrzędnych procesorów SHARC. Dodatkowo łączna szerokość wynosi 640 punktów, czyli tyle ile obraz wizyjny. Dzięki temu można wysłać dwa obrazy wynikowe do VIBus jedną transmisją DMA. 6.10.3 Komunikacja między procesorami SHARC Procesor główny używa tego samego sposobu zadawania pracy każdemu „pracownikowi”. Wymiana dokonuje się przez porty szybkiej wymiany danych (link port). Link port-y mogą być zaprogramowane na nadawanie albo na odbieranie, dlatego ważne jest aby współpracując nie nadawały jednocześnie. Aby zapewnić odpowiednią kolejność przestrzegany jest następujący protokół: 1. Przy starcie procesory podrzędne ustawiają się na odbiór. 2. Procesor główny po wczytaniu obrazów z prawej i lewej kamery zaczyna wysyłać zadania (nadawać). Dlatego ważne jest aby najpierw uruchomić program na procesorach podrzędnych, a na końcu na nadrzędnym. 3. Po wysłaniu zadania procesor główny przestawia odpowiedni link port na odbieranie. 4. „Pracownik” po odebraniu zadania uruchamia algorytm stereowizji. Kiedy dane wyjściowe są gotowe, port komunikacji jest przestawiany na nadawanie i wysyłane są wyniki. 5. Po zakończeniu transmisji link port jest przestawiany ponownie na odbiór. 6. Procesor nadrzędny ponownie na nadawanie przestawia się dopiero w momencie gdy gotowe jest kolejne zadanie. Podczas transmisji ważna jest nie tylko synchronizacja kierunku, ale również długość transmisji. Optymalność czasowa wymusza następującą konwencję: 1. Z nadrzędnego procesora przesyłana jest para linii (z obrazu lewego i prawego ) 2. Z podrzędnego procesora wysyłana jest jedna linia - wynik obliczeń ( przesunięcie) 6.36 Należy zaznaczyć, że przesyłane linie są spakowane. Ponieważ adresowanie w procesorze SHARC dotyczy słów 32-bitowych, dane 8-bitowe, pakuje się po cztery bajty w słowie. Procesor podrzędny przed uruchomieniem algorytmu najpierw rozpakowuje dane, a wyniki po spakowaniu przesyła przez link port. Ten zabieg pozwala zmieścić obrazy z lewej i prawej kamery w pamięci procesora nadrzędnego, przyśpiesza transmisję. Rozpakowywanie i pakowanie po stronie pracowników nie obciąża procesora nadrzędnego i wykonuje się odpowiednio szybciej, proporcjonalnie do ich liczby. Wyniki obliczeń trafiają na miejsce prawego obrazu. Takie rozwiązanie nie wymaga miejsca na trzeci obraz i ułatwia wysyłanie wyników (zob. wysyłanie wyników do FPGA). Procesor nadrzędny w pętli czeka na gotowość któregoś z podrzędnych. Jeżeli jest ustawiona zmienna ready-n i są pary linii do dopasowania, to inicjowane jest DMA do ntego pracownika, aby przesłało linie i zerowana jest zmienna ready-n. Zakończenie transferu generuje przerwanie, w którym przestawia się link port na odbiór. Ponowne przerwanie generowane po transferze informuje o odebraniu wyników. Tym razem, w procedurze obsługi przerwania, zmienna ready-n jest ustawiana na wartość jeden. 6.10.4 Od procesora SHARC przez FPGA do VIBus Kolejny kanał DMA dokonuje transferu do FPGA. W odróżnieniu od połączenia z FIFO, gdzie arbitraż jest fizycznie podłączony do odpowiednich linii, i ( za wyjątkiem ustawienia odpowiedniego trybu ) poza zasięgiem programisty, tutaj musi być zaprogramowany sposób komunikacji o odebraniu danych w FPGA. Jest to istotne, ponieważ zegar VIBus jest trzykrotnie wolniejszy od zegara procesora sygnałowego (12,5MHz a 40MHz) oraz dane są rozpakowywane w FPGA i wysyłane po bajcie, co dodatkowo opóźnia transfer. Ten problem rozwiązuje generowanie sygnału ACK. Transfer przebiega następująco: 1. DMA wpisuje pod odpowiedni adres ( &FIFO_DEVICE(0) ) daną i czeka na potwierdzenie (ACK). 2. W FPGA wysyłane są kolejne bajty (O[7:1]) na VIBus, z prędkością taktowaną przez programowalny zegar AV9110 (CLOCK). 3. Po wysłaniu czwartego bajtu generowane jest potwierdzenie. Dopiero teraz DMA może wysłać kolejną daną. Zakończenie transferu przez DMA jest sygnalizowane odpowiednim przerwaniem ( od ósmego DMA ). W obsłudze przerwania rozpoczyna się procedurę odebrania kolejnej pary obrazów. W trybie pracy z przeplotem, należy wysłać wyniki dwa razy. Zostaną one potraktowane jako parzysta i nieparzysta część obrazu. Strukturę części wysyłającej obraz do VIBus przedstawia schemat 2. 6.37 Schemat wysyłania obrazu 6.38 6.11 Komunikacja z IC40 Praca systemu sterowizyjnego wymaga kontaktu z układem sterującym akwizycją obrazu. Komputer wizyjny IC40 zarządza przepływem danych z kamer. To z nim należy się porozumiewać w sprawie przełączania danych. W celu umożliwienia komunikacji wykorzystano jedno ze złączy FPGA. System komunikowania wygląda następująco: Dostępne są cztery bity sterujące. Trzy od IC40 do FPGA i jeden w przeciwną stronę. Bit STEREO (od IC40 do FPGA) Bit sterujący multiplekserem zaprogramowanym w FPGA. Jeżeli jest zerem to FPGA przepuszcza sygnał VIBus bez zmian. Jeżeli jest jedynką, to działa algorytm stereowizji. Bit RIGHT (od IC40 do FPGA) Sygnał mówiący czy wysyłany obraz pochodzi z kamery lewej czy prawej. Bit RESET (od IC40 do FPGA) Polecenie zresetowania algorytmu na procesorach SHARC. FPGA po zanegowaniu przypisuje go na wejście przerwania ( IRQ2 ) głównego SHARC-a. Narastające zbocze generuje przerwanie, w obsłudze którego zerowane są DMA i algorytm rozpoczyna pracę od początku. Bit READY (od SHARC-a przez FPGA do IC40) Sygnał gotowości do odebrania kolejnego obrazu. Jest ustawiany przez wpis z nadrzędnego procesora sygnałowego ( &FIFO_DEVICE(3) ), a gaszony w momencie zmiany bitu RIGHT, lub ustawiania bitu RESET. Jeżeli włączony jest tryb pracy stereo (bit STEREO), to współpraca między IC40 a systemem stereowizji wygląda następująco: 1. Nadrzędny SHARC wpisuje bit gotowości do FPGA (READY=1) 2. IC40 reagując na READY zmienia kamerę na przeciwną i ustawia bit RIGHT 3. Zmiana na bicie RIGHT odblokowuje polecenie wczytywania obrazu do FIFO (&FIFO_DEVICE(1)) oraz zeruje READY w FPGA Dodatkowo, wiadomo że pierwszy obraz jaki przyjdzie po restarcie, pochodzi z kamery lewej (RIGHT=0). 6.12 Schemat ogólny programu FPGA Ogólny widok programu FPGA przedstawia schemat 3. 6.39 Schemat ogólny programu FPGA 6.40 6.13 Schematyczne przedstawienie programu nadrzędnego procesora SHARC programowanie_FPGA; podstawienie_obsługi_przerwań; programowanie_zegara_AV9110; ustawienie_rejestrów_FIFO; ustawienie_parametrów_link_portów; przypisanie_początkowych_wartości_zmiennym; uruchomienie_odbierania_jednego_obrazu_przez_FIFO; ustawienie_DMA_czytającego_linie_zFIFO; while(1) { if(reset) { if(ready1 && ready2) { przypisanie_początkowych_wartości_zmiennym; uruchomienie_odbierania_obrazu_przez_FIFO; ustawienie_DMA_czytającego_linie_zFIFO; } }else { if(są_pary_linii_do_dopasowania) { if(ready1) { ustawienie_DMA_wysyłsjącego_parę_linii; ready1=0; }else if(ready2) { ustawienie_DMA_wysyłsjącego_parę_linii; ready2=0; } } } } if(trzeba_wysłać_wyniki) { ustawienie_DMA_wysyłającego_obrazy_do_FPGA; } 6.41 //procedura obsługi DMA link port-u------------------------gdy_przerwanie_DMA_pracownik1() { if(ostatnio_nadawałem) { ustawienie_DMA_link_portu_na_odbiór; }else ready1=1; } //procedura obsługi DMA link port-u------------------------gdy_przerwanie_DMA_pracownik2() { if(ostatnio_nadawałem) { ustawienie_DMA_link_portu_na_odbiór; }else ready2=2; } //procedura obsługi DMA od FIFO-----------------------------gdy_przerwanie_DMA_FIFO() { if(czy_odbierać_kolejne_linie) { ustawienie_DMA_czytającego_linie_zFIFO; }else if(czy_odebrać_prawy_obraz) { uruchomienie_odbierania_jednego_obrazu_przez_FIFO; ustawienie_DMA_czytającego_linie_zFIFO; } } //procedura obsługi DMA od wysyłania obrazów do FPGA-------gdy_przerwanie_DMA_FPGA() { if(czy_wysłano_drugi_raz) { uruchomienie_odbierania_jednego_obrazu_przez_FIFO; ustawienie_DMA_czytającego_linie_zFIFO; } }else { ustawienie_DMA_wysyłającego_obrazy_do_FPGA; } 6.42 7. Wyniki pracy 7.1 Działanie algorytmu Aby zilustrować działanie algorytmu stereowizji przeprowadzono krótki test. 7.1.1 Aranżacja sceny Do zobrazowania działania algorytmu dopasowywania, została przygotowana scena testowa. Przed kamerami zostały umieszczone przedmioty na trzech poziomach, co przedstawia rysunek 23. 60 120 560 Kamery Rysunek 23. Przedstawienie sceny testowej. 7.43 7.1.2 Przykładowe wyniki obliczeń Przesunięcie 0 Przesunięcie 68 Przesunięcie 76 Przesunięcie 88 Niedopasowanie Lewy obraz Przesunięcie 78 Mapa głębi (przesunięć) Obraz 1.Mapa głębi dla dopuszczalnego przesunięcia 100 i kary 1000. Obraz 1 jest popranym wynikiem. Na mapie głębi widać, że w odpowiednich miejscach występują zmiany głębi. Rozróżniane są nie tylko trzy poziomy, ale również różnice między płaszczyznami, na których znajdują się obiekty, a powierzchnią obiektów. Na odległości 56cm rozróżniane są różnice odległości rzędu jednego centymetra. Ponieważ tło występujące na obrazie jest jednorodne, to z jednej strony obiektów zostało dopasowane bez przesunięcia, to typowe zjawisko dla takich algorytmów. Poprawnych wyników należy spodziewać się od momentu wystąpienia wyraźnych krawędzi. Tło po prawej stronie obiektów zostało dopasowane poprawnie. Również wystąpienie niedopasowań z lewej strony jest dobrym rezultatem. Na prawym obrazie te części są niewidoczne. Przesunięcie 0 Przesunięcie 68 Przesunięcie 100 Niedopasowanie Przesunięcie 78 Obraz 2.Mapa głębi dla dopuszczalnego przesunięcia 100 i kary 100. 7.44 Obraz 2 przedstawia wynik dopasowywania, w którym znacznie zmniejszono karę w porównaniu z pierwszym. Obiekty na nim są poszarpane, a prawa część tła nie została poprawnie dopasowana. Przesunięcie 0 Przesunięcie 76 Przesuniuęcie 0 Niedopasowanie Obraz 3.Mapa głębi dla dopuszczalnego przesunięcia 100 i kary 10000. Na obrazie trzecim znacznie zwiększono karę, w porównaniu z pierwszym. Otrzymane przesunięcia są zaniżone, a mniejsze obiekty zostały niedopasowane. Przesunięcie 0 Przesunięcie 69 Przesunięcie 75 Przesunięcie 75 Niedopasowanie Przesunięcie 75 Obraz 4.Mapa głębi dla dopuszczalnego przesunięcia 75 i kary 1000. Na obrazie czwartym widać wynik zmniejszenia dopuszczalnego przesunięcia. Przesunięcia, które na obrazie pierwszym były większe niż 75, uległy ograniczeniu. Podczas analizy wyników przez system wyższego rzędu, należy traktować wyniki zbliżone do ograniczenia jako niepewne, bo być może obiekt znajduje się bliżej niż założenia dopuszczają. 7.45 Przesunięcie 0 Przesunięcie 50 Przesunięcie 50 Przesunięcie 50 Przesunięcie 0 Niedopasowanie Obraz 5.Mapa głębi dla dopuszczalnego przesunięcia 50 i kary 1000. Na obrazie piątym jeszcze bardziej ograniczono maksymalne przesunięcie. Widać, że wszystkie odległości zostały obcięte. 7.2 Przykładowe rozpoznanie sceny Aby zilustrować dalsze przetwarzanie wyjściowej mapy głębi, wyniki systemu stereowizji poddano interpretacji wcześniej istniejącego programu rozpoznawania. Obraz 6. Mapa głębi poddana interpretacji. Danymi wejściowymi był obraz 6 oraz wcześniej zidentyfikowane parametry głowicy wizyjnej. Otrzymano obraz (7) wyjściowy z rozpoznanymi położeniami obiektów. 7.46 Obraz 7. Rozpoznane kontury obiektów. Wygenerowane pozycje: ilosc obiektow na scenie = 3 Obiekt 1 Polozenie: Xl Yl 209.95 40.12 66 37.12 -59.39 567.42 Xl Yl 185.44 106.68 75 16.67 -9.15 499.33 Xl Yl 184.17 207.62 86 13.95 49.57 435.47 Rozbieznosc Wspolrzedne: ksi psi zeta Obiekt 2 Polozenie: Rozbieznosc Wspolrzedne: ksi psi zeta Obiekt 3 Polozenie: Rozbieznosc Wspolrzedne: ksi psi zeta 7.3 Prędkość systemu wizyjnego Testy prędkości algorytmu zostały wykonane dla obrazów o rozmiarach 320x240 i różnych dopuszczalnych przesunięciach (z dwoma podrzędnymi procesorami). Wyniki przedstawia tabela 4. 7.47 * Dopuszczalne Czas obliczenia przesunięcie mapy głębi [s] [ piksele ] 50 0,74 75 0,83 100 1,22 138 1,77* Tabela 4. Wyniki testów prędkości dla obrazów 320x200; graf znajduje się w dwóch bankach pamięci, co zwalnia jego wypełnianie Aby sprawdzić udział przesyłania i obliczeń w czasie całkowitym, częściowe zrównoleglenie operacji przesyłania zostało wyłączone. Otrzymane wyniki, dla dopuszczalnego przesunięcia 100, przedstawia tabela 5. Operacja na parze obrazów Czas trwania [s] 0,15 Przesyłanie danych bez obliczeń 2,33 Obliczenia wykonuje jeden procesor podrzędny 1,24 Obliczenia wykonują dwa procesory podrzędne 0,87 Obliczenia wykonują trzy procesory podrzędne* * 0,70 Obliczenia wykonują cztery procesory podrzędne * 0,59 Obliczenia wykonuje pięć procesorów podrzędnych * Obliczenia wykonuje sześć procesorów podrzędnych 0,51 Tabela 5. Czasy obliczania dopasowań dla różnej ilości procesorów SHARC. * Czas estymowany Porównując wyniki z innymi opracowaniami [2,3], wyniki prędkości są podobne, natomiast znacznie większe są możliwości: Ograniczenie Implementacje cytowane Implementacja na procesorach [2,3] ADSP21062 320 punktów Dopuszczalne przesunięcie 60 punktów 255 punktów Maksymalna szerokość linii 256 punków 5 bitów 8 bitów Zakres wyników 5 2 Ilość kamer Tabela 6. Porównanie ograniczeń implementacji. 7.4 Inne spostrzeżenia Zaobserwowana została nieudokumentowana własność procesorów ADSP21062. Podczas dostępu do pomięci za pośrednictwem rejestrów indeksowych, przy indeksowaniu ujemnym, odwołanie z postmodyfikacją obliczają niewłaściwy adres: //wpisanie do rejestrów adresowych i0 = adres; m0=-1; //natomiast po instrukcji r0=dm(i0,m0); //i0 zmieni się na adres-2, a nie adres-1 7.48 8. Wnioski 8.1 Osiągnięcia Główny cel pracy - stworzenie działającego systemu wizyjnego czasu rzeczywistego zostało osiągnięte. Uzyskane prędkości obliczeń dorównują cytowanym z innych prac, natomiast przewyższają jakością (większa szerokość linii, wartości przesunięć ośmiobitowe). Za osiągnięcie należy uznać sukces implementacji usprawnień (dobre pomysły nie powędrowały do szuflady). Zostały wykryte słabe punkty posiadanego sprzętu, co jest niezbędne do usprawniania i planowania rozbudowy. Sukcesem jest również wybór rodziny procesorów dających dobre perspektywy na przyszłość. Na rynku już znajduje się następna generacja SHARC-ów, z większymi możliwościami (także szybszym - 100MHz - zegarem). Wypracowane rozwiązania są nadal aktualne, a w nowych ADSP21160 (SHARC2) zaowocują optymalnym wykorzystaniem mocy procesorów sygnałowych. 8.2 Sugerowane rozszerzenia Słabą częścią stworzonego systemu wizyjnego jest zbieranie obrazów. Niezsynchronizowane kamery bardzo opóźniają akwizycję. Ponieważ zbierany jest na przemian prawy i lewy obraz, to obrazy szybko zmienne nie spełnią podstawowego założenia algorytmu: że n-ta linia lewego obrazu odpowiada n-tej prawego. Usprawnieniem jest zakup kamer umożliwiających zewnętrzną synchronizację. Jednak oprócz odpowiednich kamer, niezbędny jest układ akwizycji obrazu z co najmniej dwoma równoległymi wejściami. Ponieważ w procesorach SHARC pamięć jest dwudostępna, to najbardziej efektywny kod umieszcza dane 32-bitowe w innym banku niż pamięć programu. Aby to było możliwe dla dwóch obrazów 320x240, lub grafu z większymi dopuszczalnymi przesunięciami, warto zakupić wersję procesorów SHARC z większą ilością pamięci. Od strony programowej, rzeczą godną uwagi jest automatyczne ładowanie się programu po restarcie systemu. Pamięci typu FLASH znajdujące się na płytach SHARCPAC umożliwiają takie działanie. Jak dotąd nie zostało to zaimplementowane, nie było to celem pracy, ale może usprawnić działanie systemu (w sensie niezawodności, nie szybkości). 8.3 Dodatkowe wyniki Wynikiem pracy jest nie tylko system stereowizyjny, ale gotowe narzędzia i programy do zaimplementowania dowolnego algorytmu przetwarzającego obraz i nie tylko. Przetarty szlak umożliwi kontynuatorom tworzenie własnych programów w oparciu o wiele przykładów i rozwiązań problemów sprzętowych czy implementacyjnych, powstałych podczas tworzenia tej pracy. Za wynik pracy należy również uznać wiedzę, opisaną we wnioskach, o słabych stronach zakupionego sprzętu, możliwych ulepszeniach i niespodziewanych przeszkodach. 8.49 9. Literatura 1. Geometryczna kalibracja systemu wizyjnego Marek Wnuk, V krajowa konferencja robotyki, Tom 1, Wrocław 1996 2. Developement of Video-Rate Stereo Machine Takeo Kanade, Hiroshi Kano, Shigeru Kimura, Atushi Yoshida, Kazuo Oda, Robotic Institute, Carnegie Mellon University 5000 Forbes Ave., Pittsburgh PA 15213 3. Stereo Without Regularization Ingemar J.Cox, Sunita Hingorani, Bruce M.Maggs and Satish B.Rao NEC Research Institute, 4 Independence Way, Princeston, NJ 08540, U.S.A 4. www.analog.com/.../C6xwhite.html 5. Analog Devices, ADSP-2106x SHARC DSP Microcomputer Family 6. WWWA Modyfikacja i implementacja algorytmu stereowizji Olaf Burdziakowski, Raport serii Sprawozdania nr 17/98 7. ADSP-2106x SHARC User’s Manual 1995 Analog Devices, Inc. 8. ASP SHARC Handbook, Document reference number SHARC M. 7 13 Copright 1997 Transtech Parallel Systems 9. Quick Sart Guide for Xilinx Foundation Series F1.3 - 0401663 01 Xilinx Development System 10. Assembler Tools & Simulator Manual, 1995 Analog Devices 11. C Tools Manual, 1995 Analog Devices 12. ELTEC VME-SYSTEM, Specification, Video Interface Bus, Eltec Elektronik GmbH, Eltec order number: V-VIB-B990 9.50 10. Spis treści 1. SZYBKIE METODY DOPASOWYWANIA OBRAZÓW W STEREOWIZJI .......................................1.2 1.1 SPRECYZOWANIE TEMATU ...........................................................................................................................1.2 1.2 CEL PRACY...................................................................................................................................................1.2 1.3 WYZWANIA ZWIĄZANE Z PRZETWARZANIEM OBRAZU .................................................................................1.2 1.4 DOBÓR SPRZĘTU DO POSTAWIONYCH ZADAŃ ...............................................................................................1.3 1.4.1 Jednostka obliczeniowa........................................................................................................................1.3 1.4.2 Zasoby procesorów ..............................................................................................................................1.3 1.5 WYBÓR ALGORYTMU ...................................................................................................................................1.4 1.6 POŁĄCZENIE ALGORYTMU Z MOŻLIWOŚCIAMI SPRZĘTOWYMI ......................................................................1.4 1.7 OPIS IDEOWY SYSTEMU WIZYJNEGO .............................................................................................................1.4 1.7.1 Opis algorytmu.....................................................................................................................................1.4 1.7.2 Algorytm znajdowania najkrótszej drogi w grafie niecyklicznym........................................................1.8 1.7.3 Obliczanie odległości na podstawie mapy przesunięć .........................................................................1.8 1.7.4 Wybrany procesor ................................................................................................................................1.9 1.8 IDEOWY OPIS PRZEPŁYWU DANYCH I PODZIAŁU ZADAŃ .............................................................................1.10 2. WYKONANE PRACE WSTĘPNE.............................................................................................................2.12 2.1 TESTOWANIE ALGORYTMU.........................................................................................................................2.12 2.1.1 Wnioski...............................................................................................................................................2.12 2.2 ROZPOZNANIE WŁAŚCIWOŚCI PROCESORA SYGNAŁOWEGO SHARC..........................................................2.13 3. ZALETY PROCESORÓW SHARC ...........................................................................................................3.13 3.1 WYKORZYSTYWANE MOŻLIWOŚCI PROCESORÓW SYGNAŁOWYCH .............................................................3.13 4. POSIADANY SPRZĘT ................................................................................................................................4.16 4.1.1 Płyta główna ASP-V3.........................................................................................................................4.17 4.1.2 TRANSPACPAC ASP-M54 ................................................................................................................4.18 4.1.3 TRANSPAC ASP-M92........................................................................................................................4.19 5. UŻYWANE NARZĘDZIA...........................................................................................................................5.20 5.1 PROGRAMOWANIE FPGA...........................................................................................................................5.20 5.2 PRZEJŚCIE OD FPGA DO PROCESORA SHARC...........................................................................................5.23 5.3 PROGRAMOWANIE PROCESORA SHARC ....................................................................................................5.24 6. IMPLEMENTACJA.....................................................................................................................................6.25 6.1 KONFIGURACJA PAMIĘCI ............................................................................................................................6.25 6.2 IMPLEMENTACJA ALGORYTMU ...................................................................................................................6.27 6.3 SZCZEGÓLNE TECHNIKI WYKORZYSTYWANE W IMPLEMENTACJI ALGORYTMU ...........................................6.29 6.3.1 Asembler ............................................................................................................................................6.29 6.3.2 Rejestry ..............................................................................................................................................6.29 6.3.3 Pętle ...................................................................................................................................................6.29 6.3.4 Postmodyfikacja .................................................................................................................................6.29 6.3.5 Jedynka w operacjach arytmetycznych ..............................................................................................6.30 6.3.6 Sortowanie .........................................................................................................................................6.30 6.3.7 Mnożenie ............................................................................................................................................6.30 6.3.8 Równoległość .....................................................................................................................................6.30 6.4 KOMUNIKACJA MIĘDZY PROCESORAMI SYGNAŁOWYMI .............................................................................6.30 6.5 STRUKTURA PROGRAMU W PROCESORZE NADRZĘDNYM ............................................................................6.31 6.6 STRUKTURA PROGRAMU W PROCESORZE PODRZĘDNYM .............................................................................6.31 6.7 PROGRAMOWANIE FPGA...........................................................................................................................6.32 6.8 PROGRAMOWANIE ZEGARA AV9110 .........................................................................................................6.32 6.9 POBIERANIE DANYCH Z MAGISTRALI VIBUS ..............................................................................................6.33 6.9.1 VIBus..................................................................................................................................................6.33 10.51 6.10 DROGA DANYCH W SYSTEMIE WIZYJNYM.................................................................................................6.34 6.10.1 Od VIBus przez FPGA do FIFO ......................................................................................................6.34 6.10.2 Od FIFO do głównego procesora SHARC ......................................................................................6.36 6.10.3 Komunikacja między procesorami SHARC......................................................................................6.36 6.10.4 Od procesora SHARC przez FPGA do VIBus..................................................................................6.37 6.11 KOMUNIKACJA Z IC40 .............................................................................................................................6.39 6.12 SCHEMAT OGÓLNY PROGRAMU FPGA .....................................................................................................6.39 6.13 SCHEMATYCZNE PRZEDSTAWIENIE PROGRAMU NADRZĘDNEGO PROCESORA SHARC .............................6.41 7. WYNIKI PRACY..........................................................................................................................................7.43 7.1 DZIAŁANIE ALGORYTMU ............................................................................................................................7.43 7.1.1 Aranżacja sceny .................................................................................................................................7.43 7.1.2 Przykładowe wyniki obliczeń .............................................................................................................7.44 7.2 PRZYKŁADOWE ROZPOZNANIE SCENY ........................................................................................................7.46 7.3 PRĘDKOŚĆ SYSTEMU WIZYJNEGO ...............................................................................................................7.47 7.4 INNE SPOSTRZEŻENIA .................................................................................................................................7.48 8. WNIOSKI ......................................................................................................................................................8.49 8.1 OSIĄGNIĘCIA .............................................................................................................................................8.49 8.2 SUGEROWANE ROZSZERZENIA ...................................................................................................................8.49 8.3 DODATKOWE WYNIKI.................................................................................................................................8.49 9. LITERATURA..............................................................................................................................................9.50 10. SPIS TREŚCI ............................................................................................................................................10.51 10.52