Lab 08 - ORB-SLAM3 cz. 2

Lab. 08 - SLAM Wizyjny (ORB-SLAM3) cz. 2

Przykład wyszukiwania cech podczas działania ORB-SLAM3

1. Cel zajęć

Celem zajęć jest uruchomienie lokalizacji 3D z wykorzystaniem systemu ORB-SLAM3 na danych z eksperymentów przeprowadzonych na terenie Politechniki Poznańskiej i ocena jakości działania systemu.

2. Przygotowanie środowiska

Na dzisiejszych zajęciach będzie wykorzystywany obraz z zajęć poprzednich, jedyną różnicą jest wykorzystywana paczka ORB_SLAM3_ROS2. Aktualizację obrazu można wykonać na dwa sposoby:

cd /arm_ws/src
rm -r orbslam3_ros2
git clone -b humble https://github.com/kamilmlodzikowski/ORB_SLAM3_ROS2 orbslam3_ros2
cd /arm_ws/src/orbslam3_ros2/vocabulary 
tar xvzf ORBvoc.txt.tar.gz
cd /arm_ws
rm -r build log install
source /opt/ros/humble/setup.bash
colcon build --symlink-install

Wersja 1: Obraz (większy rozmiar)

UWAGA: Wersja z obrazem może nie działać na części komputerów z uwagi na brak kompatybilności budowanych bibliotek. Sugerowana jest opcja samodzielnego zbudowania obrazu z wykorzystaniem Dockerfile'a!

Przed przystąpieniem do pracy należy przygotować środowisko: pobrać obraz dockera i utworzyć na jego podstawie kontener.

Obraz konieczny do wykonywania dzisiejszych zajęć opiera się o osrf/ros:humble-desktop-full, ale zawiera paczki, które są niezbędne do prawidłowego wykonania zadań. Obraz można pobrać z tego linku.

Pobrany obraz należy wczytać, korzystając z polecenia, podając odpowiednią ścieżkę:

docker load < path/to/file.tar.gz

Następnie można przejść do tworzenia kontenera korzystając ze skryptów przygotowanych dla osób korzystających wyłącznie z CPU lub wyposażonych w GPU Nvidia. Można pobrać odpowiedni skrypt korzystając np. z wget.

Domyślnie kontener nosi nazwę ARM_07. UWAGA! Skrypty po uruchomieniu usuwają kontener o takiej nazwie przed utworzeniem nowego.

Wersja 2: Dockerfile

Plik Dockerfile jest dostępny tutaj. Można go pobrać poleceniem:

wget https://raw.githubusercontent.com/kamilmlodzikowski/LabARM/main/Lab07-ORB-SLAM/Dockerfile

Skrypt budujący jest dostępny tutaj. Można go pobrać poleceniem:

wget https://raw.githubusercontent.com/kamilmlodzikowski/LabARM/main/Lab07-ORB-SLAM/arm_07_build.sh

Następnie można przejść do tworzenia kontenera korzystając ze skryptów przygotowanych dla osób korzystających wyłącznie z CPU lub wyposażonych w GPU Nvidia. Można pobrać odpowiedni skrypt korzystając np. z wget.

Domyślnie kontener nosi nazwę ARM_07. UWAGA! Skrypty po uruchomieniu usuwają kontener o takiej nazwie przed utworzeniem nowego.

Korzystanie z kontenera

Po każdym ponownym uruchomieniu komputera (oraz w przypadku problemów z wyświetlaniem aplikacji okienkowych w dockerze), proszę pamiętać o wywoływaniu:

xhost +local:root

Nowy terminal można dołączyć do kontenera korzystając z polecenia:

docker exec -it ARM_07 bash

ROS_DOMAIN_ID

W przypadku pracy na komputerze w laboratorium może okazać się konieczne ustawienie ROS_DOMAIN_ID. Domyślnie, ROS2 rozgłasza wszystko innym komputerom w sieci z tym samym ROS_DOMAIN_ID. Wartość tej zmiennej można ustawić korzystając z:

export ROS_DOMAIN_ID = <wybrana_wartość>

Proszę wybrać losową wartość.

Wygodne może być dodanie tego exportu do bashrc:

echo 'export ROS_DOMAIN_ID=<wybrana_wartość>' >> ~/.bashrc 

3. Uruchomienie ORB-SLAM3 na danych z PP

Przed przystąpieniem do tego kroku konieczne będą dane z DGPS, które powstały w ramach poprzednich zajęć. Jeżeli ktoś z jakiegoś powodu nie otrzymał własnego wyniku, proszę od kogoś pożyczyć plik dgps.txt. Oczywiście proszę tego pliku nie przesyłać jako rozwiązanie zadania domowego z poprzednich zajęć.

Przygotowanie kalibracji układu stereowizyjnego

Każde uruchomienie systemu na własnej konfiguracji kamer wymaga podania parametrów użytego układu kamer. W naszym przypadku chcemy tę konfigurację umieścić w pliku PP.yaml, który znajduje się pod ścieżką /arm_ws/src/orbslam3_ros2/config/stereo. Wartości parametrów tym pliku są aktualne dla innego układu stereowizyjnego, w ramach zajęć konieczna bedzie modyfikacja tych parametrów:

Ponadto, aby poznać niektóre parametry konieczna będzie kalibracja układu. W tym przypadku zostało to już zrealizowane (wykorzystując pakiet kalibr). Uzyskano następujący wynik:

cam0:
  cam_overlaps: [1]
  camera_model: pinhole
  distortion_coeffs: [-0.23248459123344795, 0.08191912671589296, 7.839314739418238e-05, 4.2075874672940684e-05]
  distortion_model: radtan
  intrinsics: [589.7363083173951, 590.0729541236071, 369.91183932674056, 298.34374442536097]
  resolution: [720, 540]
  rostopic: /pylon_stereo_node/left/image_raw
cam1:
  T_cn_cnm1:
  - [0.9997283077554007, 0.02320592542857902, 0.0021899081072863703, -0.32185797263546406]
  - [-0.0232254786906617, 0.9996863295720175, 0.00937121157638949, 0.0074867236444067856]
  - [-0.001971753560855992, -0.00941952715496201, 0.9999536912757833, -0.002949869596374046]
  - [0.0, 0.0, 0.0, 1.0]
  cam_overlaps: [0]
  camera_model: pinhole
  distortion_coeffs: [-0.2303444874136257, 0.07876654742388302, 9.186197190170094e-05,
    -0.0005160611286370294]
  distortion_model: radtan
  intrinsics: [589.5069022640636, 589.958834706832, 379.29038618376575, 283.91319737264314]
  resolution: [720, 540]
  rostopic: /pylon_stereo_node/right/image_raw

Część tych parametrów można przepisać bezpośrednio do pliku PP.yaml (Camera.fx, Camera.fy, Camera.cx, Camera.cy, macierze D i K). Natomiast wartości macierzy R oraz P, a także Camera.bf można poznać dopiero po wykorzystaniu narzędzia stereoRectify z biblioteki OpenCV. W tym celu można skorzystać z przygotowanego skryptu. Znajduje się on w folderze scripts paczki orbslam3_ros2. Należy uzupełnić ten skrypt odpowiednimi wartościami.

Wartość Camera.bf znajdą Państwo jako wartość bezwzględną z wartości w macierzy P2 w prawym, górnym narożniku.

Uwaga! Należy zwrócić uwagę czy wynik kalibracji to układ prawej kamery w układzie lewej kamery czy też lewej w układzie prawej.

PUT Car

Po poprawnej kalibracji możliwe jest uruchomienie ORB-SLAM3 na danych z PP.

Baga można uruchomić poleceniem:

ros2 bag play -r 0.25 bags/put_car -p --remap /pylon_stereo_node/left/image_raw:=/camera/left /pylon_stereo_node/right/image_raw:=/camera/right

Uwaga! System ORB-SLAM3 jest dość wymagający obliczeniowo, więc przypominam o parametrze -r przy rosbag play, który umożliwia zwolnienie odtwarzania danych z rosbaga.

a ORB-SLAM3:

ros2 run orbslam3 stereo /arm_ws/src/orbslam3_ros2/vocabulary/ORBvoc.txt /arm_ws/src/orbslam3_ros2/config/stereo/PP.yaml true

Sugeruję użyć opcji Follow Camera, aby nawigowanie podczas tworzonej trajektorii było łatwiejsze.

Po zakończeniu działania systemu należy zapisać trajektorię klikając przycisk Stop w oknie ORB-SLAM3: Map Viewer.

4. Ewaluacja ORB-SLAM3

Ostatnim krokiem jest ewaluacja uzyskanego wyniku. Do ewaluacji wykorzystamy narzędzie evaluate_ate.py wraz z dodatkowym skryptem associate.py, które znajdą Państwo w katalogu /arm_ws/src/orbslam3_ros2/scripts. Korzystamy z niego następująco:

cd /arm_ws/src/orbslam3_ros2/scripts/
python3 evaluate_ate.py DGPS_PATH ORBSLAM_PATH --verbose --plot trajs.png

gdzie w miejsce DGPS_PATH podajemy ścieżkę do pliku dgps.txt, a w miejsce ORBSLAM_PATH ścieżkę do trajektorii zwróconej przez ORB-SLAM3.

Uzyskany wynik proszę zapisać. Narzędzie wylicza najlepsze nałożenie dwóch podanych trajektorii (brak konieczności znania transformacji pomiędzy układem DGPS i układem kamery) generując wykres porównujący obie trajektorie oraz wyliczający błąd.

Nałożone trajektorie można podejrzeć poleceniem:

apt install viewnior
viewnior trajs.png

5. Zadanie do samodzielnej realizacji

Państwa zadaniem jest umieszczenie na platformie e-kursy:


Autorzy: Michał Nowicki, Kamil Młodzikowski