Wszystko o budowie własnego dalmierza laserowego

Wszystko o budowie własnego dalmierza laserowego

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.

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.

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!

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?

traingulacja

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).

Poniżej prezentuję kilka pierwszych obrazów. Widoczna przeszkoda (pudełko) znajduje się w odległości od 10, 20 i 30 cm.

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:

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:

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:\

dalmierz_wzor_1

Pomiary

W celu przetestowania układu wykonałem serię pomiarów. Testową przeszkodę umieszczałem coraz dalej od dalmierza. Poniżej prezentuję otrzymane wyniki:

dalmierz_tabelka

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.

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.

triangulacja_2

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:

dalmierz_wzor_2

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:

dalmierz_wzor_3

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.

triangulacja_3

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ć:

dalmierz_wzor_4

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:

triangulacja_4

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:

dalmierz_wzor_5

Teraz podstawiając (ii) oraz (i) do (iii) otrzymujemy kolejno:

dalmierz_wzor_6

Przekształcamy równanie, aby obliczyć r:

dalmierz_wzor_7

i ostatecznie:

dalmierz_wzor_8

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.

Załączniki

Kody programów (zip, 7 KB)

Pliki STL (zip, 4 KB)

czujnik, dalmierz, laser, sharp

Trwa ładowanie komentarzy...