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

Podobne dokumenty