Skip to content

knei-knurow/lidar-2d-to-3d

Repository files navigation

Lidar 2D to 3D

Celem projektu było stworzenie urządzenia zdolnego do skanowania otaczającej go przestrzeni w 3D z użyciem lidaru 2D.

ezgif-3-d5575b524c23

Spis treści

Galeria

3D

2D

2d-room

Submoduły

W tym repozytorium pod jednym dachem zebrane są repozytoria z przedrostkiem lidar- rozwijane w ramach KNEI, które mają związek ze skanowaniem 3D. Więcej informacji o każdym z tych projektów można znaleźć w ich plikach README.

Gwiazdka * oznacza repozytoria, które są wymagane do skanowania 3D. Pozostałe projekty mogą się przydać podczas zabawy ze skanowaniem 2D.

lidar-tools*

Zbiór programów narzędzi przydatnych podczas pracy z lidarem.

sync*

Najważniejsze z narzędzi. Do jego zadań należy:

  • Ustanowienie połączenia z mikrokontrolerem (który steruje serwem i akcelerometrem) oraz lidarem.
  • Synchronizacja danych/pomiarów z dostępnych źródeł.
  • Obliczanie punktów chmury 3D.
  • Wypisywanie punkt po punkcie (x, y, z) na standardowe wyjście (stdout).

servoctl

Wysyła do mikrokontrolera ramkę danych ustawiającą serwomechanizmu na zadanej pozycji.

transmitter/receiver

Wysyła/odbiera dane lidaru 2D (uzyskane np. za pomocą lidar-scan) przez UDP.

scan-dummy

Udaje lidar-scan. Generuje przykładowe dane.

Autorzy: Szymon Bednorz, Bartek Pacia

lidar-avr*

Oprogramowanie przeznaczone do bycia wgranym na mikrokontroler AVR Atmega328p, którego zadaniem jest obsługa serwomechanizmu i akcelerometru oraz komunikacja poprzez USART z urządzeniem operatora.

Więcej o dokładnej konfiguracji i działaniu w dalszych sekcjach tego dokumentu.

Autorzy: Szymon Bednorz, Bartek Pacia

lidar-scan*

Projekt wywodzący się z lidar-visualizations. Pomysł polegał na stworzeniu programu, który robi jedną rzecz i robi ją dobrze.

Zadaniem programu jest ustanowienie połączenia z lidarem oraz wypisywanie na standardowe wyjście (stdout) odebranych danych w formie tekstowej. Docelowo dane mogą być przekazane dowolnemu innemu programowi, który rozumie wejściowy format danych.

Zgodny z systemami Linux, macOS, Windows.

Przykładowe wyjście:

# A comment
# ! ID Number   Elapsed time [ms]
# Angle [°]   Distance [mm]
! 0 0
120  100
240  100
360  100
! 1 500
120  200
240  200
360  200
! 2 500

Autorzy: Szymon Bednorz, Bartek Pacia

lidar-vis

Graficzie wyświetla dane otrzymane z lidaru za pomocą lidar-scan.

Projekt wywodzący się z lidar-visualizations. Jest to "siostrzany" program do _lidar-scan – robi jedną rzecz i robi ją dobrze.

Zgodny z systemami Linux, macOS, Windows.

Autorzy: Szymon Bednorz, Bartek Pacia

lidar-visualizations

Wyświetla dane z lidaru w postaci tekstowej lub graficznej w czasie rzeczywistym.

Oprogramowanie kilkukrotnie zmieniło prawie całkowicie swoją formę. Stworzone zostało na potrzeby artykułu do "Elektroniki Praktycznej". Na chwilę obecną nie jest aktywnie rozwijane. Kod składa się z kilku interfejsów, które teoretycznie umożliwiają tworzenie dodatkowych funkcjonalności. Program korzysta z oficjalnego RPLIDAR SDK oraz wysokopoziomowej biblioteki graficznej SFML.

Zgodny z systemami Linux, macOS, Windows.

Więcej informacji można przeczytać w artykule "Wizualizacja pomiarów skanera LIDAR" w "Elektronice Praktycznej" z marca 2021.

Autor: Szymon Bednorz

lidar-stm32

Ciekawy projekt, który podobnie jak lidar-visualizations, stworzony został na potrzeby "Elektroniki Praktycznej". Uruchamiany jest na płytce STM32, która za pomocą UART wysyła/odbiera dane do/z lidaru, a następnie je wizualizuje.

RPLIDAR SDK nie jest przystosowany do urządzeń embeddeed, więc na jego podstawie stworzona została autorska implementacja przeznaczona na STM32.

Więcej informacji można przeczytać w artykule "Wizualizacja pomiarów skanera LIDAR" w "Elektronice Praktycznej" z marca 2021.

Autor: Bartek Dudek

Elementy

Lidar

Wykorzystywany w projekcie lidar to Slamtec RPLIDAR A3. Producent dostarcza także RPLIDAR SDK wspierające systemy Linux, macOS i Windows, które pozwala na pracę ze sprzętem.

Lidar posiada swoje własne zasilanie. Dysponuje również przewodem USB, aby przesyłać dane do urządzenia operatora.

Specyfikacja

Wielkość A3
Zakres pomiarów do 25m
Częstotliwość pomiarów do 16kHz
Częstotliwość wykonywania chmur 5Hz - 20Hz
Rozdzielczość kątowa do 0.225°
Interfejs komunikacji TTL UART
Prędkość komunikacji 256000bps

Źródła

Tryby skanowania

RPLIDAR oferuje kilka trybów skanowania. Godne uwagi są tylko dwa: domyślny sensitivity (indoor) i stability (outdoor). Podczas pracy na zewnątrz, szczególnie w bardzo słoneczne dni, wyraźnie widać różnicę w ilości poprawnie wykonanych pomiarów. Pozostałe tryby istnieją dla kompatybilności wstecznej z poprzednimi generacjami urządzenia i/lub wymagają niższego baudrate'u podczas transmisji danych.

ID Scan mode Sample time [us] Frequency
0 Standard 252 0.484406
1 Express 126 0.968812
2 Boost 63 1.93762
3 Sensitivity/Indoor (domyślny) 63 1.93762
4 Stability/Outdoor 100 1.2207

Dane

  • Domyślnym formatem danych lidaru są pary (kąt, odległość) w jednostkach [stopnie, milimetry].
  • Pary pomiarów są pogrupowane po 360 stopni - jedna chmura punktów.
  • Jeżeli pomiar dla danego kąta się nie powiódł, wartość odległości jest równa 0.
  • Maksymalna ilość punktów w jednej chmurze to 8192, jest to narzucone przez producenta ograniczenie.
  • Ilość punktów w chmurze - 360 stopniach - zależy od trybu skanowania oraz od ilości obrotów na minutę (ang. RPM, revolutions per minute). Im wolniejsza prędkość obrotu, tym więcej punktów w chmurze. Zalecany przez autora zakres pracy to od 200 do 1023 rpm. Przy mniejszych wartościach niż 200 istnieje ryzyko przekroczenia wartości 8192 punktów na chmurę co może powodować problemy. Domyśla wartość to 660rpm.

Pomiary szybkości silnika lidaru

Software RPM Measured RPM Software RPS Measured RPS Error
200 196.62 3.33 3.28 ~1.7%
400 432.02 6.67 7.20 ~8.0%
600 684.52 10.00 11.41 ~14.0%
800 965.14 13.33 16.09 ~20.6%
1000 1268.98 16.67 21.15 ~26.8%

Ogólne pomiary rezultatów lidaru

Tryb skanowania: Sensitivity

zadany RPM całk. czas [s] punktów punktów na chmurę chmur śr. czas na chmurę [s] zmierzony RPM
200 28.369 447133 4860.14 92 0.31 194.58
400 28.187 444097 2198.50 202 0.14 429.99
600 28.308 446794 1387.56 322 0.09 682.49
660* 28.378 448529 1274.23 352 0.08 744.24
800 26.792 423121 984.00 430 0.06 962.97
1000 27.327 432130 748.93 577 0.05 1266.88

* domyślny

Serwomechanizm

Serwomechanizm odpowiada za obrót płaszczyzny, która jest skanowana przez lidar. Sterowane jest ono sygnałem PWM za pomocą mikrokontrolera.

Wymaga własnego zasilania.

IMU

IMU (ang. inertial measurement unit) to urządzenie służące do nawigacji inercyjnej wyposażone w akcelerometr i żyroskop. Układ wykorzystywany przez nas to MPU-6050 o 6 stopniach swobody (akcelerometr X, Y, Z i żyroskop X, Y, Z). W początkowej fazie rozwoju projektu zauważono, że konstrukcja składająca się z samego lidaru i serwa może być podatna na niedokładności spowodowane tym, że:

  • konstrukcja podczas ruchu mogłaby być mniej lub bardziej przechylana w każdą ze stron podczas skanowania,
  • wykorzystywany przez nas serwomechanizm ma ograniczoną dokładność.

Oba problemy miały zostać rozwiązane przez IMU, które dostarczałoby w czasie rzeczywistym danych dotyczących aktualnego przechylenia/obrotu płaszczyzny skanowania.

Niestety wyniki z wykorzystujące opisane IMU i metody szacowania obrotu płaszczyzny okazują się jeszcze bardziej niedokładne, niż wykorzystywanie samego lidaru i serwa. Powodów należy szukać w szacowaniu pozycji, które polega na ciągłym aktualizowaniu stanu, opierającego się na poprzednich pomiarach. W ten sposób bardzo szybko rośnie błąd, który sprawia, że dwa skany tej samej sceny mogą mocno różnić się od siebie.

Projekt w wersji finalnej przygotowany jest do pracy z jak i bez IMU. Dla lepszych rezultatów zalecane jest niekorzystanie z IMU. Jeżeli zamierza się ruszać konstrukcją podczas skanowania, można zdecydować się jego wykorzystanie, chociaż ma się wtedy do czynienia z rosnącym błędem.

MPU-6050

Podstawową funkcjonalnością urządzenia jest wykorzystywanie 3-osiowego akcelerometru i żyroskopu. W ten sposób otrzymujemy strumień surowych pomiarów składających się z sześciu 2-bajtowych liczb zmiennoprzecinkowych w opisanej w dokumentacji skali. Moduł komunikuje się interfejsem I2C.

MPU-6050 w bazie i2cdevlib

MPU-9250

Moduł całkowicie kompatybilny z MPU-6050. Różnicą jest posiadanie dodatkowo 3-osiowego magnetometru, który wymaga specjalnej kalibracji. Magnetometr aktualnie nie jest wykorzystywany w projekcie.

Kalibracja

Kalibracja MPU-6050 polega na ustawieniu go na możliwie płaskiej powierzchni, wykonanie serii pomiarów (po 6 wartości na pomiar), obliczenie ich średniej i zapisanie wyników. Należy też uwzględnić przyspieszenie grawitacyjne, które powinno być wyraźnie widoczne na jednej z osi. Wyniki kalibracji powinny zostać z odpowiednim znakiem dodane do każdego późniejszego pomiaru.

Program lidar-tools/sync wykonuje kalibrację automatycznie przed rozpoczęciem skanowania (jeżeli korzystamy z IMU).

DMP

Ciekawą częścią MPU jest moduł DMP (Digital Motion Processor), którym chwali się producent, ale jednocześnie oficjalne dokumentacje całkowicie pomijają jego istnienie. W internecie znaleźć można liczne nieoficjalne dyskusje i biblioteki próbujące wykorzystywać jego funkcjonalności. Do jednej z wielu (w tym dalej nieodkrytych) funkcjonalności należy szacowanie obrotu na podstawie surowych danych (obliczanie kwaternionu).

Mikrokontroler

Wykorzystywany w projekcie mikrokontroler to ATmega328p. Oprogramowanie, które musi się na nim znaleźć znajduje się w repozytorium lidar-avr. Odpowiada ono za:

  • sterowanie sygnałem PWM w celu kontroli serwomechanizmu,
  • komunikacja poprzez I2C z MPU-6050 (lub MPU-9250),
  • komunikacja z komputerem operatora (odbieranie/wysyłanie ramek danych).

Szczegóły na temat połączeń przewodów i elementów projektu znajduje się w sekcji hardware (wykorzystana została płytka Arduino UNO, ale mikrokontroler jest programowany bezpośrednio).

Głowica

Mechaniczna konstrukcja na której zamontowane są poszczególne elementy projektu.

Prototyp

ezgif-3-d5575b524c23

Wersja finalna

Konstrukcja zaprojektowana w programie Autodesk Fusion 360 i wydrukowana w technologii 3D.

Skanowanie 3D

Skanowania 3D polega na zbieraniu danych z kilku źródeł i łączeniu ich w taki sposób, aby otrzymać informację o otoczeniu.

Najważniejszym urządzeniem jest lidar, który po uruchomieniu jest w stanie generować kilka chmur punktów na sekundę. Punkty reprezentowane są w postaci par (kąt, odległość) w jednostkach [stopnie, milimetry].

Kolejnym istotnym elementem jest serwomechanizm. Znana jest zadana przez nas pozycja na jaką ma się ustawić. W tym celu wykorzystywana jest wewnętrzna jednostka, która może zostać przeliczona na stopnie.

Ostatnim (ale opcjonalnym) elementem jest IMU, który dostarczać może pomiary w postaci 3 wartości (x, y, z) akcelerometru, 3 wartości (x, y, z) żyroskopu.

Program lidar-tools/sync po uruchomieniu na urządzeniu operatora:

  1. tworzy subproces i uruchamia program lidar-scan, który łączy się z podłączonym do urządzenia operatora lidarem; uruchamia pętlę odbierająca od lidar-scan pomiary lidaru,
  2. łączy się z mikrokontrolerem, na którym powinien znajdować się program lidar-avr.
  3. uruchamia pętlę wysyłającą rozkazy do mikrokontrolera sterującą serwomechanizmem.
  4. uruchamia (opcjonalnie) pętlę odbierająca od mikrokontrolera pomiary IMU.

Pomiary IMU i zadane pozycje serwomechanizmu są gromadzone wraz z czasem, w którym miały miejsce. Do każdej odebranej chmury punktów lidaru dobierany jest najlepiej pasujący czasowo pomiar IMU lub zadana pozycja serwomechanizmu. Metoda jaka zostanie obrana zależy od użytkownika (innymi słowy, to użytkownik decyduje, czy wykorzystywać IMU czy zadane pozycje serwomechanizmu).

Następnie dokonywane są obliczenia, w efekcie których powstaje grupa gotowych punktów. Wypisywane są one na standardowe wyjście (stdout).

Obróbka surowych pomiarów IMU

MPU-6050 dostarcza sześć 2-bajtowych zmiennoprzecinkowych wartości w każdym surowym pomiarze. Aby zrozumieć dane, można je łatwo zwizualizować na wykresie. Będą one odpowiadały ruchom i obrotom urządzenia.

Film z wizualizacją

Przykładowy wykres:

Surowe dane po odebraniu przez lidar-tools/sync są przekazywane estymatora pozycji (ang. attitude estimator), który aktualizowany jest o kolejne wartości. Jako wynik estymator zwraca kwaternion - obiekt matematyczny składającą się z 4 liczb zmiennoprzecinkowych (w, x, y, z), które mogą zostać zinterpretowane jako obrót obiektu.

Konfiguracja

Hardware

  1. Mikrokontroler musi być podłączony do urządzenia operatora, aby umożliwić komunikację USART.
  2. Serwomechanim musi być połączony do zasilania oraz mikrokontrolera w sposób przedstawiony na schemacie.
  3. IMU (MPU-6050 lub kompatybilne MPU-9250) może być podłączone do mikrokontrolera w sposób przedstawiony na schemacie.
  4. Lidar musi być podłączony do stabilnego źródła zasilania i do urządzenia operatora.

Software

Na mikrokontrolerze musi być zaflashowany program lidar-avr.

Na urządzeniu operatora musi znaleźć się:

  • lidar-tools/sync
  • lidar-scan

Następnie można przystąpić do konfiguracji lidar-tools/sync. Wszystkie dostępne parametry programu należy dostrajać korzystając z argumentów wiersza poleceń. Ich liczba może być spora, dlatego wygodnie jest przygotować skrypt, który uruchomi lidar-tools/sync przekazując mu odpowiednie parametry (jak np. sync.ps1 znajdujący się w głównym repozytorium projektu lidar-tools).

Parametry lidar-tools/sync

Parametr Opis Uwagi
avrport port, przez który odbywa się komunikacja z mikrokontrolerem
avrbaud baudrate, z którego korzysta mikrokontroler do komunikacji domyślnie 19200
lidarexe ścieżka do pliku wykonywalnego lidar-sync
lidarport port, przez który odbywa się komunikacja z lidarem
lidarmode tryb pracy lidaru 3 (indoor, domyślnie) lub 4 (outdoor)
lidarpm ilość obrotów na minutę lidaru (RPM) 200-1023, domyślnie 660
servostep pojedynczy krok serwomechanizmu w jego jednostkach
servodelay odstęp czasowy serwomechanizmu pomiędzy krokami w milisekundach
servomin minimalna pozycja serwomechanizmu w jego jednostkach domyślnie 1000
servomax maksymalna pozycja serwomechanizmu w jego jednostkach domyślnie 3000
servocalib pozycja serwomechanizmu, dla której płaszczyzna lidaru będzie w możliwie równoległej do ziemi pozycji domyślnie 2500
servostart pozycja startowa serwomechanizmu do skanowania domyślnie 3000
servounit ważna wartość wyznaczona eksperymentalnie, która służy do przeliczenia jednostki serwomechanizmu na stopnie: 1 jednostka serwa = servounit ° domyślnie około -0.047
cloudrotation wszystkie punkty leżące na płaszczyźnie zeskanowanej przez lidar zostaną obrócone o cloudrotation radianów dla głowicy prototyp: -π/4, (-0.785398)
acceluse jeżeli prawda to bierze pod uwagę IMU, jeśli fałsz to tylko zadane pozycje serwomechanizmu true lub false

Materiały

Oprogramowanie pomocnicze

Oprogramowanie, które powstało jako pomoc podczas pracy nad projektami. Są to proste programy/skrypty realizujące jedno zadanie.

Przykłady chmur punktów

About

💡 Making 2D lidar behave more 3D.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published