Skocz do zawartości

Prosty ultradźwiekowy skaner otoczenia 2D (360 stopni)


Pomocna odpowiedź

Napisano

Witam bardziej doświadczonych kolegów.

Jestem bardzo początkujący w temacie budowy robotów, dlatego proszę o wyrozumiałość.

Jestem na etapie gromadzenia informacji teoretycznych dot. budowy robotów (równania kinematyki robota, przetwarzanie informacji z enkoderów, układów MPU, algorytmów, typowych rozwiązań).

Posiadam doświadczenie w programowaniu w językach C/C++, Java, Python, C# (spora ilość języków wynika z faktu, że pracuję jako programista od wielu lat, jednak piszę zawodowo głównie oprogramowanie finansowe i wspomagające procesy produkcyjne). Mam też podstawową wiedzę z matematyki wyższej oraz elektroniki.

Jakiś czas temu próbowałem zbudować prostego robota (nie jest to jakiś konkretny rodzaj). Robot posiadał podwozie dwukołowe i sterownik silników (dwa małe silniczki) oraz czujnik ultradźwiękowy. Potrafił omijać przeszkody - prymitywny program (Arduino) na sterownik silników "Dagu S4A EDU". Oto krótki filmik i zdjęcie robota:

https://www.dropbox.com/s/9bc2ds95of0g5ct/Robot.mp4?dl=0

https://www.dropbox.com/s/devmry0blo7qxp9/JerryBot_Final.JPG?dl=0

Jak widać ze zdjęć, próbowałem rozbudować robota o kamerę z ruchem w pionie i poziomie oraz Raspberry 3 do obróbki obrazu z kamery, ale próba zakończyła się niepowodzeniem z powodu zasilania robota - brak wyprowadzonego złącza do ładowarki akumulatorów, co skutkowało tym iż trzeba było rozkręcać robota, aby dokonać wymiany akumulatorów.

Pomysł na skaner otoczenia 2D wynika z przemyśleń wynikających z budowy tego pierwszego bardzo prostego robota. Mam teraz większe podwozie 4-ro kołowe na którym oprócz sterownika silników chciałbym umieścić opisywany skaner otoczenia 2D oraz układ MPU - gyro + magnetometr (robiłem próby z enkoderami silników, ale koła robota się ślizgają po podłożu więc zdecydowałem ,że MPU będzie lepszym rozwiązaniem). Skaner otoczenia miałby służyć do planowania trasy robota.

Zdaję sobie sprawę, że istnieją dokładne skanery laserowe zarówno 2D jak i 3D, ale ceny nawet najtańszych są dla mnie za wysokie. Tanim skanerem 3D jest czujnik Kinect Microsoftu, ale jest spory i trzeba mieć dużo większe podwozie (znów wysokie koszty) no i API Kinecta jest gównie na Windows, stąd też droższy kontroler (np. Latte Panda).

Wiem ,że rozdzielczość kątowa jak i czas jednego skanu jest dużo gorszy dla czujników ultra-dźwiękowych, niż laserowych.

--------------------------------------------------------------------------------

Mój pomysł jest podobny do skanerów:

http://akademia.nettigo.pl/sonar/

https://www.forbot.pl/forum/topics53/skaner-3d-otoczenia-vt10262.htm?highlight=skaner

różnica polega na tym, że mój skaner skanowałby pełne 360 stopni.

Podstawowymi podzespołami użytymi do budowy prototypu są: dokładny ultra-dźwiękowy czujnik odległości URM37, serwo do pracy ciągłej, uchwyt do serwa, uC Arduino, uC ESP8266, mini lasery czerwone 5mW, wzmacniacz operacyjny LM358, bateria LI-Pol 3,2 Ah . Linki do głównych podzespołów:

https://botland.com.pl/ultradzwiekowe-czujniki-odleglosci/3413-ultradzwiekowy-czujnik-odleglosci-urm37-v4-5-500cm-z-korekcja-temperaturowa.html

https://botland.com.pl/serwa-praca-ciagla-360/4801-serwo-towerpro-mg-90d-micro-praca-ciagla-360-stopni.html

https://botland.com.pl/chwytaki-uchwyty-gimbale/1948-uchwyt-do-serw-micro-pantilt-sparkfun.html

Wykonałem, taki oto prosty prototyp skanera 2D. Patrz zdjęcie + filmik (bez uC ESP8266, na górnej platformie):

https://www.dropbox.com/s/h1xwrizrd1yq2x7/Scanner_2D.jpg?dl=0

https://www.dropbox.com/s/jg416g63mfnowi1/Scanner2D_01.mp4?dl=0

https://www.dropbox.com/sh/bhk0bfgvx48abb7/AADdW3gLtSYwnbejRLeqIMSAa?dl=0

-----------------------------------------------------------

Zasada działania:

Górna platforma z dokładnym czujnikiem ultra-dźwiękowym (i foto-tranzystorem z układem kształtowania impulsu z lasera na wzmacniaczu operacyjnym LM358) obraca się dookoła (360 stopni) poruszana micro-serwomechanizmem do pracy ciągłej. Na górnej platformie znajduje się jedna bateria LI-Pol 3,2 Ah + kontroler WiFi oparty na ESP8266. W dolnej platformie jest zamontowane wspomniane wyżej serwo (sterowane z Arduino) + dwa lasery czerwone służące do synchronizacji (moc 5mW) - służą one do oznaczenia przechodzenia czujnika (na wprost i 180 stopni dalej).

Kontroler ESP8266 wysyła tablicę punktów (odległości) zsynchronizowaną czasowo laserem poprzez serwer TCP/IP (po WiFi) do drugiej części robota (lub komputera PC).

Efekt będzie podobny do do opisanego tutaj:

http://akademia.nettigo.pl/sonar/

tylko kąt widzenia będzie 360 stopni. Czujnik ma zasięg do 5m (i kompensację temperaturową pomiaru). Nie ma problemów z kablami ponieważ pomiędzy platformą górna a dolną nie ma żadnych kabli połączeniowych - platforma górna jest niezależnie zasilana (przesłanie danych o skanie otoczenia za pomocą Wi-Fi).

Przestudiowałem dokumentację czujnika odległości URM37 i niestety najkrótszy czas jednego pomiaru wynosi 25 ms (50 us na jeden centymetr - taka wartość jest fabrycznie zapisana w pamięci EEPROM układu), co komplikuje sytuację.

Czas pełnego obrotu (360 stopni) górnej platformy wynosi około 0,7 s. Przy założeniu 25 ms czasu na jeden pomiar daje to 28skanów odległości na pełen obrót (14 na 180 stopni). Czyli jeden skan odległości jest wykonywany co około 13 stopni kątowych . Nie jest to może oszałamiająca rozdzielczość, lecz do mapowania otoczenia dla prostego robota mobilnego powinna być wystarczająca. Prawdopodobnie będę musiał wykorzystać 2 pełne obroty scannera na budowę mapy otoczenia (da to około 28 skanów na 180 stopni - półobrót, około 6 stopni kątowych na jeden skan) skomplikuje to niestety potrzebny program .

Impuls prostokątny z detektora promienia laserowego ma około 70 ms długości i całkiem strome zbocza - będzie on podłączony do jednego z pinów GPIO mikro-kontrolera ESP8266 i będzie wyzwalał zboczem rosnącym przerwanie programu. Pozwoli to na synchronizacje zbieranych skanów odległości. Ostatnią czynnością jest przeliczenie współrzędnych biegunowych skanów na współrzędne kartezjańskie (prostokątne) i mamy obrys otoczenia robota zakres około 5 metrów, podobną do tej:

http://akademia.nettigo.pl/sonar/radar.png

Niestety, po wykonaniu pierwszych prób miałem przez dłuższy czas duże obciążenie w pracy zawodowej i projekt utknął w miejscu.

Napiszcie, ci sądzicie o tym pomyśle, czy warto dokończyć jego realizację?

Będę wdzięczny za wszelkie uwagi i przemyślenia dot. tego pomysłu, także krytyczne.

Prosiłbym też o podawanie linków do sprawdzonych rozwiązań skanerów otoczenia dla robota mobilnego - zarówno 2D i 3D (cena/cena budowy max. 600 PLN).

Pozdrawiam

Nie wiem, czy ultradźwięki to najlepszy wybór. A może warto poszukać czegoś innego? Na szybko znalazłem coś takiego: https://botland.com.pl/skanery-laserowe/10198-laserowy-czujnik-odleglosci-lidar-tfmini-uart-12m.html?search_query=lidar&results=7

Nie wiem jak to działa, czy jest warte uwagi, ale cena przyzwoita a laser daje nadzieję na wyższą rozdzielczość. Pewnie są też inne czujniki dostępne na rynku - może nie wszystkie tanie, ale czas spędzony nad budowaniem urządzenia też ma swoją wartość i może warto zainwestować w droższy czujnik zamiast zmarnować czas?

  • Lubię! 1
Nie wiem, czy ultradźwięki to najlepszy wybór. A może warto poszukać czegoś innego? Na szybko znalazłem coś takiego: https://botland.com.pl/skanery-laserowe/10198-laserowy-czujnik-odleglosci-lidar-tfmini-uart-12m.html?search_query=lidar&results=7

Nie wiem jak to działa, czy jest warte uwagi, ale cena przyzwoita a laser daje nadzieję na wyższą rozdzielczość. Pewnie są też inne czujniki dostępne na rynku - może nie wszystkie tanie, ale czas spędzony nad budowaniem urządzenia też ma swoją wartość i może warto zainwestować w droższy czujnik zamiast zmarnować czas?

Cześć Elvis,

ten czujnik wygląda zachęcająco - jak przystępowałem do budowy opisanego prototypu (ponad rok temu to nic laserowego w takiej cenie nie było dostępne). Dzięki za link. A masz może linki do jakichś całościowych rozwiązań skanera 2D?

Pozdrawiam

Tu masz inny (nieco tańszy): https://botland.com.pl/czujniki-swiatla-i-koloru/7176-pololu-vl53l0x-time-of-flight-czujnik-odleglosci-i-swiatla-otoczenia-i2c.html. Nie wiem czy wystarczy - ma jakieś półtora metra zasięgu (katalogowe dwa metry dotyczą dłuższego czasu odczytu) i około centymetra rozdzielczości przy czasie odczytu 20 ms. Robiłem trochę eksperymentów z czujnikiem umieszczonym na serwie, 5 stopni rozdzielczości udało mi się spokojnie uzyskać.

Jest jeszcze jeden problem: w czasie dokonywania pomiaru odległość raczej nie powinna się zmieniać. Ja robiłem pomiary przy zatrzymanym serwie - Ty cały czas kręcisz platformą. Nie wiem, jak to wpłynie na dokładność wskazań.

  • Lubię! 1
Tu masz inny (nieco tańszy): https://botland.com.pl/czujniki-swiatla-i-koloru/7176-pololu-vl53l0x-time-of-flight-czujnik-odleglosci-i-swiatla-otoczenia-i2c.html. Nie wiem czy wystarczy - ma jakieś półtora metra zasięgu (katalogowe dwa metry dotyczą dłuższego czasu odczytu) i około centymetra rozdzielczości przy czasie odczytu 20 ms.

Cześć ethanak,

czujnik całkiem fajny (i cenowo przystępny), może go użyję do innego celu niż opisany. Niestety zasięg poniżej 2 metrów dyskwalifikuje go do użycia w skanerze otoczenia. Skanera otoczenia chciałbym używać do planowania trasy robota - minimalny zasięg to 5-6 m (a chciałbym uzyskać docelowo zasięg gdzieś do 10 m z rozdzielczością około 1 cm). Poza tym ten czujnik ma bardzo długi czas odczytu jednego pomiaru (25 ms ma ten czujnik ultradźwiękowy z mojego projektu) to dużo jak na czujnik laserowy, to daje około 40 odczytów na sekundę (czyli nic bym nie zyskał w stosunku do ultra-dźwiękowego). Ten czujnik podany przez Elvisa ma 100 pomiarów na sekundę, co jest dużo lepsze - możemy wykonać pełen skan otoczenia w ciągu jednego pełnego obrotu (a nie kilku co skraca czas skanowania).

Pozdrawiam

Pozdrawiam

[ Dodano: 07-01-2018, 16:56 ]

Jest jeszcze jeden problem: w czasie dokonywania pomiaru odległość raczej nie powinna się zmieniać. Ja robiłem pomiary przy zatrzymanym serwie - Ty cały czas kręcisz platformą. Nie wiem, jak to wpłynie na dokładność wskazań.

ethanak,

bardzo trafnie zwróciłeś na to uwagę - obawiam się tego faktu. Nie zdążyłem zrobić pomiarów i eksperymentów praktycznych. Wstępnie policzyłem o jaki kąt zmieni się oś czujnika (w stosunku do początku pomiaru). Jak już wspomniałem układ wykonuje 1 pełny obrót w czasie 0,7 s, co daje prędkość kątową (2PI/0,7s) = 8,971 rad/s. W przeliczeniu na stopnie kątowe:

514,23°/s. Dla mojego czujnika URM37 czas 1 pomiaru (max. dla 5 m - dla mniejszych odległości mniej - wynika z prędkości dźwięku w powietrzu) wynosi 25 ms. W tym czasie zmiana kąta czujnika wyniesie około 12,6 ° - czyli całkiem sporo. Nie wiem jak to wpłynie na pomiar, być może trzeba będzie obniżyć prędkość obrotową układu i dokonywać jednego pełnego skanu otoczenia w czasie kilku obrotów (dla zapewnienia odpowiedniej rozdzielczości kątowej pomiaru). Jest to wykonalne od strony programu skanera jednak go komplikuje, poza tym za długi czas jednego skanu otoczenia (360°) będzie spowalniał robota. Trzeba też wziąć pod uwagę, że robot się przemieszcza z pewną prędkością, a konieczność zatrzymywania go, aby wykonać skan otoczenia to też wada.

Tak, że pewnie rzeczywiście będę musiał wybrać czujnik laserowy o jeszcze bardziej "wyśrubowanych" parametrach niż oba podane 💡

A co jeśli chodzi o gotowe skanery (2D i 3D) ? Macie może jakieś linki (na razie pomińmy podany zakres cen) ?

Pozdrawiam

Cześć, super, że znowu rozmawiamy tutaj o robotach!

Po przeczytaniu twojego opisu przewiduję następujące możliwe problemy — to nie znaczy, że rzeczywiście muszą takie wystąpić, ale być może warto mieć na nie oko:

1. Czujniki ultradźwiękowe mają zazwyczaj dość szeroki kąt "widzenia", więc albo będziesz skanować tak, żeby pomiary się nie nakładały i będziesz mieć bardzo małą rozdzielczość, albo będziesz musiał w jakiś sposób rozgryźć jak sobie poradzić z nakładającymi się pomiarami w oprogramowaniu.

2. Pamiętaj, że podczas oczekiwania na sygnał powrotny czujnik nie powinien się ruszać, bo będziesz mieć zniekształcenia. Zatem wychodzi jeszcze wolniej, bo przed każdym pomiarem musisz poczekać, aż czujnik się zatrzyma.

3. Nie napisałeś czemu to całe skanowanie ma służyć, więc nie wiem jakiej rozdzielczości, szybkości i zasięgu oczekujesz. Ale według twojego opisu nie spodziewałbym się cudów. Tak jak koledzy napisali, czujnik laserowy może się okazać znacznie lepszy.

4. W jaki sposób śledzisz pozycję czujnika? Serwo ciągłej rotacji nie ma sprzężenia zwrotnego z pozycją, więc będziesz potrzebować jakiś swój enkoder.

5. Strasznie skomplikowany układ tylko po to, żeby uniknąć problemów z kablami. A przecież taki sam efekt mógłbyś mieć skanując wahadłowo, wtedy spokojnie możesz mieć kable.

6. Od razu ci mówię, że IMU + silniki elektryczne to bardzo złe połączenie, szczególnie jeśli chodzi o wbudowany tam magnetometr. Pracujące silniki lubią wytwarzać zmienne pole magnetyczne wokół siebie, a magnetometr to wszystko będzie łapał. Dlatego wiele robotów umieszcza czujnik na długiej tyczce maksymalnie oddalonej od silników. Do tego z samego IMU będziesz mieć dryf.

7. Pracę skanera można przyśpieszyć montując na głowicy więcej niż jeden czujnik. Rozwiązuje to też problem z obracaniem głowicą — przy dwóch czujnikach nie musisz już obracać o 360°, wystarczy 180°. Niestety w przypadku ultradźwięku pojawiają się problemy z odbiciami, prawdopodobnie będzie trzeba robić pomiary na zmianę wtedy.

8. Wiem, że relatywnie tanie są lidary z odkurzaczy Neato — nadal dość drogie, ale nie kosmicznie. Przyglądałeś się temu?

  • Lubię! 1
Cześć, super, że znowu rozmawiamy tutaj o robotach!

Po przeczytaniu twojego opisu przewiduję następujące możliwe problemy — to nie znaczy, że rzeczywiście muszą takie wystąpić, ale być może warto mieć na nie oko:

1. Czujniki ultradźwiękowe mają zazwyczaj dość szeroki kąt "widzenia", więc albo będziesz skanować tak, żeby pomiary się nie nakładały i będziesz mieć bardzo małą rozdzielczość, albo będziesz musiał w jakiś sposób rozgryźć jak sobie poradzić z nakładającymi się pomiarami w oprogramowaniu.

2. Pamiętaj, że podczas oczekiwania na sygnał powrotny czujnik nie powinien się ruszać, bo będziesz mieć zniekształcenia. Zatem wychodzi jeszcze wolniej, bo przed każdym pomiarem musisz poczekać, aż czujnik się zatrzyma.

3. Nie napisałeś czemu to całe skanowanie ma służyć, więc nie wiem jakiej rozdzielczości, szybkości i zasięgu oczekujesz. Ale według twojego opisu nie spodziewałbym się cudów. Tak jak koledzy napisali, czujnik laserowy może się okazać znacznie lepszy.

4. W jaki sposób śledzisz pozycję czujnika? Serwo ciągłej rotacji nie ma sprzężenia zwrotnego z pozycją, więc będziesz potrzebować jakiś swój enkoder.

5. Strasznie skomplikowany układ tylko po to, żeby uniknąć problemów z kablami. A przecież taki sam efekt mógłbyś mieć skanując wahadłowo, wtedy spokojnie możesz mieć kable.

6. Od razu ci mówię, że IMU + silniki elektryczne to bardzo złe połączenie, szczególnie jeśli chodzi o wbudowany tam magnetometr. Pracujące silniki lubią wytwarzać zmienne pole magnetyczne wokół siebie, a magnetometr to wszystko będzie łapał. Dlatego wiele robotów umieszcza czujnik na długiej tyczce maksymalnie oddalonej od silników. Do tego z samego IMU będziesz mieć dryf.

7. Pracę skanera można przyśpieszyć montując na głowicy więcej niż jeden czujnik. Rozwiązuje to też problem z obracaniem głowicą — przy dwóch czujnikach nie musisz już obracać o 360°, wystarczy 180°. Niestety w przypadku ultradźwięku pojawiają się problemy z odbiciami, prawdopodobnie będzie trzeba robić pomiary na zmianę wtedy.

8. Wiem, że relatywnie tanie są lidary z odkurzaczy Neato — nadal dość drogie, ale nie kosmicznie. Przyglądałeś się temu?

Cześć deshipu,

dziękuję za szczegółowe uwagi. Postaram się odnieść do nich:

1) Problem nakładających się pomiarów chciałem rozwiązać poprzez zmniejszenie prędkości obrotowej górnej platformy z czujnikiem i dokonywaniem jednego pełnego skanu otoczenia (360°) w ciągu kilku obrotów platformy. Stąd lasery w dolnej części i fototranzystor z układem kształtowania impulsu w górnej połączony z µC ESP8266. Wyzwalałby on przerwania co 180° (czujnik w pozycji "na wprost" robota i "do tyłu") - miałbym oznaczone te dwa punkty czasowe. Timing dla poszczególnych pomiarów dla czujnika URM37 generowałbym co 25 ms poprzez timer na ESP8266. Wtedy pełna mapa skanów powstawałaby w ciągu kilku pełnych obrotów górnej platformy (przesyłana przez WiFi do dolnej części robota). Stąd (taki pomysł na skaner) wynika chyba za duże przekombinowanie całości układu 🙄

2) Albo wolno obracać platformą, aby przesunięcia kątowe podczas pomiaru były do pominięcia. Ale nie wiem, czy zdałoby to egzamin?

3) Skaner ma służyć do planowania trasy robota. Zasięg gdzieś do 5-6 m( ideał do 10 m) rozdzielczość około 1 cm przy tym zasięgu. Czas wykonania jednego pełnego skanu otoczenia do 3s.

4) Opisałem to w odpowiedzi do punktu 1. Lasery w dolnej części - chassis robota zawiera ciągle świecące lasery czerwone małej mocy (5 mW). W obrotowej platformie (pod środkiem czujnika) jest fototranzystor z układem analogowym (wzm. operacyjny) do kształtowania impulsu. µC ESP8266 w górnej platformie dostaje przerwanie (zbocze narastające impulsu) w momencie przejścia czujnika nad jednym z dwóch laserów. Stad mam 2 znaczniki czasowe, gdy górna platforma przechodzi nad każdym z tych dwóch laserów (patrz filmik - można go zwolnić) co 180° kątowych. Resztę potrzebnych timingów dla wykonania pomiarów jest generowana przez ESP8266 za pomocą wewnętrznych timerów. Mapa całego skanu otoczenia jest przesyłana poprzez WiFI do dolnej części robota.

5) Dokładnie tak jak mówisz - dla uniknięcia problemów z kablami 🙄

6) Powiem szczerze, że nie pomyślałem o zakłóceniach dla magnetometr spowodowanych silnikami - bardzo cenna uwaga.

7) O tym nie pomyślałem - ale chyba nie chciałbym iść w tym kierunku.

8) Jestem Ci bardzo wdzięczny, za tą informację - zaraz zaczynam szukać w sieci.

Ogólnie bardzo dziękuję za wszystkie uwagi deshipu i pozostałym kolegom, właśnie dlatego zawsze warto się poradzić bardziej doświadczonych osób w danym temacie. Stawiam wszystkim po piwie 😉 i pozdrawiam

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...