Zastanawialiście się jak działa czujnik odległości firmy Sharp? Bawiliście się konsolą XBOX 360 z Kinect-em? Marzył wam się własny skaner 3D?
Jeśli któryś z tematów was interesuje, zachęcam do lektury niniejszego artykułu. Postaram się przedstawić zasadę działania laserowego czujnika i opiszę jak samemu go skonstruować.
Laser może być wykorzystywany na wiele sposobów do pomiaru odległości. Czujniki mogą wykorzystywać pomiar czasu przelotu wiązki, przesunięcie fazowe fali świetlnej, albo interferometrię. Niestety niezbędna aparatura może się okazać poza zasięgiem konstruktorów-amatorów. Możemy za to wykorzystać metodę nazywaną triangulacją. W przeciwieństwie do wymienionych poprzednio, nie wymaga ona znacznych nakładów finansowych, natomiast o jej skuteczności możemy się przekonać testując czujniki Sharp, albo Kinect.
Sharp
Kinect
Aby zbudować własny dalmierz laserowy będziemy potrzebowali dwóch rzeczy:
źródła promieniowania,
detektora.
Właściwie to jeszcze przyda nam się jakieś mocowanie tych elementów oraz oczywiście komputer. Ale najważniejsze są pierwsze dwa elementy. Jak zdobyć je nie inwestując nadmiernie? Laser możemy kupić za dosłownie kilka złotych. Popularny wskaźnik laserowy, to nie tylko zabawka, ale i w pełni sprawny laser półprzewodnikowy. W zestawie dostajemy od razu baterie, więc mamy gotowe źródło promieniowania laserowego. Wskaźnik działa w widzialnym paśmie promieniowania, co powinno ułatwić konstrukcję urządzenia.
Przy okazji ważna rada, albo raczej ostrzeżenie. Nigdy nie patrzcie na laser bez odpowiednich okularów ochronnych. Jak to ładnie powiedział kiedyś prowadzący laboratorium: na laser można popatrzeć dwa razy w życiu – raz lewym okiem i raz prawym.
Mamy już laser, czas na znalezienie detektora. Ponieważ wskaźnik działa w widzialnym widmie promieniowania, możemy plamkę lasera wykrywać za pomocą kamery. Podsumowując, do skonstruowania dalmierza wystarczy nam wskaźnik laserowy oraz kamerka internetowa.
Mam nadzieję, że brzmi to zachęcająco!
Kamera internetowa
Wskaźnik laserowy
Metoda triangulacji
Wyobraźmy sobie następującą sytuację: patrzymy przed siebie, prosto na przeszkodę, np. ścianę. Pod pewnym kątem do kierunku patrzenia świecimy laserem. Przed sobą zobaczymy plamkę światła odbitą od przeszkody. Teraz pomyślmy co będzie, jeśli źródło światła będzie na tej samej wysokości, co nasze oczy, a my będziemy się podchodzić do ściany?
Jeśli sytuacja będzie podobna do przedstawionej na rysunku, to plamka światła będzie się przesuwała w prawo. Ogólnie zasada jest następująca - miejsce w którym widzimy plamkę światła zależy od odległości od przeszkody. To jest dokładnie istota metody triangulacji.
Jak nasz eksperyment myślowy zrealizować? Wystarczy laser umieścić względem kamery w sposób podobny do opisanego wcześniej. Na jednej wysokości i pod pewnym kątem. Jakie powinny być odległości i kąt nachylenia? To ustalimy (obliczymy) później, na razie możemy dobrać wartości „empirycznie”. Ja przygotowałem prosty projekt uchwytu i wydrukowałem na drukarce 3D. Można wykorzystać dowolne inne metody – termo-gluta, taśmę, klej, co kto lubi. Ważne tylko, żeby wzajemne położenie kamery i lasera było stałe.
W moim przypadku kąt nachylenia lasera to 30 stopni. Niestety nie jest to najlepsza wartość dla wykorzystanej kamery (C920), ale na początek wystarczy (dla mnie jest to też nauczka, żeby nie wierzyć w to co wyczytamy w internecie).
Model podstawy
Dalmierz
Poniżej prezentuję kilka pierwszych obrazów. Widoczna przeszkoda (pudełko) znajduje się w odległości od 10, 20 i 30 cm.
10cm
20cm
30cm
Do pobierania obrazów można wykorzystać dowolny program obsługujący kamerę. Można też od razu napisać własny program np. wykorzystując OpenCV. Program, którym przygotowałem powyższe zdjęcia jest zaskakująco krótki:
C
1
2
3
4
5
6
7
VideoCapture cap(0);
Mat src;
cap>>src;
namedWindow("HelloCV");
imshow("HelloCV",src);
imwrite("image_01.jpg",src);
waitKey();
W sumie połowa kodu to wyświetlanie okienka, rezultatów i czekanie na przycisk. Biblioteka OpenCV nie jest taka straszna jak się wydaje, a jak widać może być bardzo użyteczna. Zmiana odległości od przeszkody wpływa na położenie plamki światła. Pozostaje nam więc wykonać dwie czynności. Po pierwsze musimy wykryć położenie tej plamki. Po drugie przeliczyć położenie na odległość od przeszkody.
Chcemy jedynie wykrywać odległość, więc zakładamy że kamera i laser znajdują się na tej samej wysokości, a interesuje nas tylko oś X.
Do wykrywania położenia plamki lasera można wykorzystać wiele, bardzo ciekawych rozwiązań. Na początek wykorzystajmy najłatwiejsze – po prostu poszukajmy najjaśniejszego punktu na obrazie. Biblioteka OpenCV bardzo nam to zadanie ułatwi. Najpierw zamieniamy obraz na czarno-biały. Następnie szukamy maksimum:
C
1
2
3
4
5
Mat dst;
Point maxPos;
cvtColor(src,dst,CV_BGR2GRAY);// zamień na odcienie szarości
Jak wspominałem wcześniej, interesuje nas tylko współrzędna X. Tak proste rozwiązanie wystarczy na początek. Niestety plamka lasera jest dość duża i punktów o maksymalnej jasności jest często kilka, co zmniejsza dokładność pomiaru i daje efekt „skakania” wyników. Możemy oczywiście zastosować nieco bardziej wymyślny algorytm detekcji położenia plamki i przez to poprawić wyniki. W załączniku znajdziecie program z dodanym filtrowaniem, które znacznie poprawia jakość pracy układu.
Mamy już nasz pomiar – wynikiem jest liczba z przedziału od 0 (lewy brzeg ekranu) do 639 w moim przypadku (prawy brzeg). Rozdzielczość 640x480 okazała się w zupełności wystarczająca. Nie musimy więc inwestować w super drogą kamerę. Niestety przydałby się laser z mniejszą plamką, ale nie można narzekać na sprzęt za 2 zł.
Gotowe wzory
Ponieważ nie wszyscy są miłośnikami matematyki, zacznę więc od strony praktycznej. Po prostu podam gotowe rozwiązanie. Musimy podać kilka stałych, związanych z naszym układem:
d – odległość między osią kamery, a laserem (w mm)
α - kąt nachylenia lasera (stopnie)
f – ogniskowa kamery (piksele)
x – pozycja plamki lasera na obrazie z kamery (piksele 0-639)
Żeby uprościć wzory, przyjmuję na stałe rozdzielczość kamery: 640 pikseli w poziomie. Wzór na odległość r od przeszkody wygląda wtedy następująco:\
Pomiary
W celu przetestowania układu wykonałem serię pomiarów. Testową przeszkodę umieszczałem coraz dalej od dalmierza. Poniżej prezentuję otrzymane wyniki:
Pierwsza kolumna zawiera rzeczywistą odległość od przeszkody, druga współrzędną x najjaśniejszego piksela w zarejestrowanym obrazie. Trzecia kolumna to odległość obliczona podanym wcześniej wzorem. Następne kolumny do oszacowanie błędu.
Wyniki wydają się całkiem niezłe, szczególnie że pomiar „rzeczywisty” mógł niestety być obarczony znacznym błędem. Również samo wykrywanie plamki lasera można byłoby poprawić.
Skaner 3D
Jeszcze kilka słów o możliwości rozbudowania układu. Opisywana wersja posiada na stałe zamocowany laser. Co by było gdybyśmy mogli zmieniać kąt lasera? Moglibyśmy wtedy wykonać pomiary odległości od wielu punktów, a z nich złożyć obraz przedmiotu przed nami. Mielibyśmy więc prosty skaner 3D. Dokładnie tak działa czujnik Kinect oraz część skanerów 3D.
Matematyka - wyjaśnienia dla ciekawskich
Dotychczas poznaliśmy możliwość konstrukcji własnego dalmierza, jednak aby zrozumieć jego zasadę działania musimy zagłębić się nieco w matematykę. Zacznijmy od modelu kamery.
Kamera rejestruje obraz za pomocą matrycy światłoczułej (przetwornika), najczęściej wykonanej w technologii CMOS. Obraz rejestrowanego przedmiotu przechodzi przez obiektyw i pada na matrycę.
Na przedstawionym rysunku widać zależność kąta widzenia kamery (φ), ogniskowej (f) oraz wymiarów przetwornika (h). Są to stałe parametry kamery, możemy je więc zmierzyć albo wyszukać w internecie (tej opcji nie polecam).
Najłatwiej zmierzyć kąt widzenia, jest on też często podawany w parametrach kamery. Ja wykonałem pomiar następująco: umocowałem kamerę na znanej wysokości (np. r = 10,5 cm), równolegle do powierzchni. Pod nią położyłem linijkę, w taki sposób, aby zero na skali znajdowało się w lewym rogu obrazu. W prawym rogu odczytałem wielkość widzianego obiektu – wyszło mi 11cm (oznaczmy jako a). Teraz można łatwo policzyć kąt widzenia kamery:
Po podstawieniu wyników pomiarów, otrzymałem kąt widzenia φ=55,74°.
Ogniskową możemy obliczyć na dwa sposoby. Powinniśmy wyrazić ją w metrach (albo mm), jednak to wymagałoby znajomości wymiarów matrycy (można też ewentualnie wykonać dwa pomiary). Możemy uprościć zadanie i wyrazić ogniskową w pikselach – znamy rozdzielczość ekranu (h=640) możemy więc obliczyć f jako:
Wartość 320 to połowa rozdzielczości (poziomej) obrazu.
Układ współrzędnych
Typowy układ współrzędnych dla obrazów wykorzystywanych w informatyce posiada punkt początkowy (0,0) w lewym górnym rogu ekranu. Współrzędne są zawsze dodatnie i rosną w prawo oraz w dół obrazu. Przy takim układzie współrzędnych oś kamery przechodzi przez punkt (319,239), co nie jest zbyt wygodne w obliczeniach. Znacznie łatwiej jest wykorzystać typowy układ z zerem na środku. Przeliczenia współrzędnych są bardzo proste:
x’ = x – 320
y’ = 240 – y
W takim układzie (x,y) to współrzędne pikseli w obrazie, a (x’,y’) będziemy wykorzystywać w obliczeniach. Ponieważ nasz dalmierz wykorzystuje tylko współrzędną x, nie będziemy się więcej zajmować y’ (wynosi ona 0, ponieważ laser przynajmniej teoretycznie jest zamocowany na tej samej wysokości co oś optyczna kamery).
Rzutowanie obrazu
Zanim przejdziemy do analizy działania dalmierza, potrzebujemy przeanalizować jeszcze jedną właściwość naszej kamery. Wyprowadźmy wzór na położenie obiektu w obrazie otrzymanym z kamery.
Obserwujemy płaszczyznę (ścianę) położoną w odległości r od kamery. Na tej płaszczyźnie widzimy punkt (plamkę lasera) oddaloną o a od osi kamery. Spróbujmy obliczyć współrzędną piksela w którym zobaczymy nasz wskaźnik.
Odpowiednie wyrażenie ma postać:
Minus we wzorze wynika z odwrócenia obrazu w naszym modelu. Wartość f zmierzyliśmy i obliczyliśmy już poprzednio. Ponieważ zarówno x’ jak i nasza wartość f jest wyrażona w pikselach, wyrażenie wydaje się mieć sens.
Pomiar odległości
Wreszcie możemy przejść od zrozumienia zasady działania naszego dalmierza. Schemat jego działania przedstawia rysunek:
W górnej części widzimy naszą, dobrze poznaną kamerę. Poniżej, w odległości d dodany został laser. Plamka lasera pada na przeszkodę w odległości a od osi kamery, a kamera rejestruje ją w punkcie x. Kąt zamocowania lasera możemy zmierzyć, więc alfa ma łatwą do ustalenia wartość. Odległość między laserem, a kamerą (d) jest również łatwa do zmierzenia.
Możemy teraz napisać następujące równości:
Teraz podstawiając (ii) oraz (i) do (iii) otrzymujemy kolejno:
Przekształcamy równanie, aby obliczyć r:
i ostatecznie:
Wnioski
Samodzielna konstrukcja dalmierza jest znacznie łatwiejsza i tańsza niż można byłoby przypuszczać. Dokładność rezultatów zależy od dokładności kalibracji. Jednak nawet nie idealny czujnik pozwala na nauczenie się zasady działania profesjonalnych urządzeń.
Własna konstrukcja pozwala na wybór zakresu działania czujnika. Dobierając kąt ustawienia lasera oraz odległość między osią kamery, a lasera można regulować zakres i dokładność urządzenia. Dodatkowym atutem jest możliwość wykorzystania dalmierza do zbudowania skanera 3D.
Dołącz do 20 tysięcy osób, które otrzymują powiadomienia o nowych artykułach! Zapisz się, a otrzymasz PDF-y ze ściągami (m.in. na temat mocy, tranzystorów, diod i schematów) oraz listę inspirujących DIY na bazie Arduino i Raspberry Pi.
To nie koniec, sprawdź również
Przeczytaj powiązane artykuły oraz aktualnie popularne wpisy lub losuj inny artykuł »
Dołącz do 20 tysięcy osób, które otrzymują powiadomienia o nowych artykułach! Zapisz się, a otrzymasz PDF-y ze ściągami (m.in. na temat mocy, tranzystorów, diod i schematów) oraz listę inspirujących DIY z Arduino i RPi.
Trwa ładowanie komentarzy...