Ta strona używa ciasteczek (plików cookies), dzięki którym może działać lepiej. Dowiedz się więcejRozumiem i akceptuję
PROMOCJA30% rabatu na wszystkie książki Grupy Helion, kod: FORBOT30 Przejdź na stronę księgarni »

Wszystko o budowie własnego dalmierza laserowego

Programowanie 14.11.2014 Elvis

laserZastanawialiś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.

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!

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ść 640×480 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.

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.

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.

Artykuł zgłoszony do VII edycji konkursu (po)wakacyjnego!
Nagrody ufundował sponsor główny:

satland

 oraz sponsorzy:

and-techavthelion

ebookpointstrefakursów

Powiadomienia o nowych, darmowych artykułach!

Załączniki

Kody programów (zip, 7 KB) - Pobierz

Pliki STL (zip, 4 KB) - Pobierz

Komentarze

danioto

23:59, 15.11.2014

#1

Super! Bardzo fajne spojrzenie na samodzielne zbudowanie czujnika odległości. Nie chcę być malkontentem, ale zbudowanie niezawodnego czujnika działającego w mniej odizolowanym środowisku byłoby nieco trudniejsze. Należałoby wziąć pod uwagę kilka czynników:

1) Jeżeli działami w paśmie widzialnym to mamy bardzo zmienne warunki oświetleniowe

2) Jeżeli przeszlibyśmy na podczerwień, to kamery/linijki kosztują nieco więcej, poza tym tło też daje o sobie znać (np. słońce)

3) Jeżeli modulowalibyśmy źródło, to i wszystkie części byłyby zdecydowanie droższe i algorytm byłby bardziej skomplikowany.

Może nie wszystko jest takim problemem jak mi się wydaje. Na pewno takie doświadczenia z budową własnego czujnika są bardzo wartościowe - na prawdę przyjemnie było czytać artykuł :)

Bobby

1:58, 26.12.2014

#2

Taki mi wpadł teraz do głowy pomysł, jak można by sporządzić całkiem użyteczny dalmierz. Przyda nam się do tego Raspberry Pi i kamerka pod nie (max 120fps@120x240px), do tego linijka laserowa zawieszona nad kamerą, pod kątem w dół - w ten sposób mielibyśmy poziomą linię na całym obrazie, a jeśli coś wjechałoby w zasięg, odpowiednio by się podnosiła lub opuszczała (--- gdy nic nie ma, _-- coś z lewej, --_ coś z prawej itd). Pozwoliłoby to na symultaniczne liczenie odległości na całej szerokości obrazu, ale oczywiście mamy wtedy narzucone ograniczenie w minimalnej wysokości obiektu (tzn podczas zbliżania obiektu, mógłby zostać zgubiony z pola widzenia w wypadku, gdyby był niżej niż laser. W przyszłości, żeby nie świecić na czerwono wystarczyłoby zmienić diodę na laserówkę z CD-Romu (one są IR) - byłoby to też niestety dużo bardziej niebezpieczne - w końcu to laser, a teraz dodatkowo niewidoczny.

Elvis
Autor wpisu

8:05, 26.12.2014

#3

Jeśli wysokość obiektów jest problemem, zawsze można zamienić miejscami kamerkę i linijkę, tzn. umieścić poziomo linijkę na dole, a kamerkę wyżej, pod kątem.

Co do pomysłu z linijką, to jest to kierunek jakim poszli twórcy Kinceta. Tam nie ma linijki, ale laser zamiast w jedno miejsce, oświetla siatkę punktów. Efekty są zaskakująco dobre.

Bobby

16:48, 26.12.2014

#4

Haha, zamiana miejscami kamery i linijki nie przyszła mi do głowy :) Czyli generalnie wychodzi na to, że mogłoby coś z tego wyjść - muszę sobie zorganizować kamerkę do RPi i linijkę laserową.

Elvis
Autor wpisu

16:57, 26.12.2014

#5

Co do kamerki to na poczatek mozna podpiąć zwykłą, po USB.

Natomiast do RPi dostępne są dwie wersji, zwykła z filtrem IR oraz "NoIR" bez filtru podczerwieni. Chyba warto pomyśleć o wersji bez filtra. Można byłoby w przyszłości zmienić linijkę z czerwonej na pod-czerwoną.

Zobacz powyższe komentarze na forum

FORBOT Damian Szymański © 2006 - 2017 Zakaz kopiowania treści oraz grafik bez zgody autora. vPRsLH.