Celem projektu było stworzenie urządzenia zdolnego do skanowania otaczającej go przestrzeni w 3D z użyciem lidaru 2D.
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.
Zbiór programów narzędzi przydatnych podczas pracy z lidarem.
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).
Wysyła do mikrokontrolera ramkę danych ustawiającą serwomechanizmu na zadanej pozycji.
Wysyła/odbiera dane lidaru 2D (uzyskane np. za pomocą lidar-scan) przez UDP.
Udaje lidar-scan. Generuje przykładowe dane.
Autorzy: Szymon Bednorz, Bartek Pacia
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
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
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
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
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
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.
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 |
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 |
- 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.
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% |
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 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 (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.
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.
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 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).
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).
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).
Mechaniczna konstrukcja na której zamontowane są poszczególne elementy projektu.
Konstrukcja zaprojektowana w programie Autodesk Fusion 360 i wydrukowana w technologii 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:
- 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,
- łączy się z mikrokontrolerem, na którym powinien znajdować się program lidar-avr.
- uruchamia pętlę wysyłającą rozkazy do mikrokontrolera sterującą serwomechanizmem.
- 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).
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.
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.
- Mikrokontroler musi być podłączony do urządzenia operatora, aby umożliwić komunikację USART.
- Serwomechanim musi być połączony do zasilania oraz mikrokontrolera w sposób przedstawiony na schemacie.
- IMU (MPU-6050 lub kompatybilne MPU-9250) może być podłączone do mikrokontrolera w sposób przedstawiony na schemacie.
- Lidar musi być podłączony do stabilnego źródła zasilania i do urządzenia operatora.
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).
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 |
Oprogramowanie, które powstało jako pomoc podczas pracy nad projektami. Są to proste programy/skrypty realizujące jedno zadanie.