Lab 06 - SLAM 3D
Lab. 06 - SLAM 3D
1. Lokalizacja 2D a 3D
Lokalizacja 2D | Lokalizacja 3D |
---|---|
|
|
Różnice między odometrią, a mapowaniem:
- Odometria pracuje na punktach z różnych chwil czasowych, mapowanie na punktach przeliczonych do jednego, wspólnego momentu czasowego.
- Odometria dopasowywuje skan do skanu, mapowanie skan do mapy (zbioru skanów).
- Odometria jest szybsza (± stały czas), mapowanie może być czasochłonne (mapa rośnie).
2. Cel zajęć
Celem tych zajęć będzie uruchomienie lokalizacji 3D z wykorzystaniem skanera laserowego dla robota mobilnego.
3. Przygotowanie środowiska
Wersja 1: Obraz (większy rozmiar)
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, lub korzystając z polecenia:
wget --content-disposition --no-check-certificate https://chmura.put.poznan.pl/s/B1td9ifRL1S0js9/download
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_06. 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/Lab06-SLAM3D/Dockerfile
Skrypt budujący jest dostępny tutaj. Można go pobrać poleceniem:
wget https://raw.githubusercontent.com/kamilmlodzikowski/LabARM/main/Lab06-SLAM3D/arm_06_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_06. 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_06 bash
Konieczne będzie zbudowanie środowiska
cd /arm_ws
source /opt/ros/humble/setup.bash
colcon build --symlink-install
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
4. ROS2 Bag
Podczas tych zajęć będziemy wykorzystywać ROS2 Bag. Jest to narzędzie służące do zapisu i odtwarzania danych z wielu topiców ROS2. Jest to pomocne podczas replikowania wyników eksperymentów i testów, a także przydatne podczas udostępniania swojej pracy innym, jako przykład. Popularne jest również wykorzystanie bagów do porównywania działania różnych systemów na tych samych danych.
Nagrywanie bagów
Dane z topiców można zapisać do baga korzystając z polecenia:
ros2 bag record <topic_name1> <topic_name2> [...] <topic_name_n>
np.
ros2 bag record /turtle1/cmd_vel /turtle1/pose
Przerwać nagrywanie można kombinacją klawiszy Ctrl+C
.
Możliwe jest również nadanie nazwy baga korzystając z flagi -o
, np.:
ros2 bag record -o subset /turtle1/cmd_vel /turtle1/pose
W powyższym przypadku topici /turtle1/cmd_vel
oraz /turtle1/pose
zostaną zapisane do baga o nazwie subset
.
Odtwarzanie bagów
Odtworzyć baga można korzystając z polecenia:
ros2 bag play <bag_name>
Wszystkie wiadomości zapisane do baga zostaną odtworzone jednokrotnie, a następnie node publikujący zostanie zatrzymany.
Możliwe jest uruchomienie baga w pętli korzystając z flagi -l
. Rozpoczęcie odtwarzania od pauzy wymaga podania flagi -p
.
Kontrolę nad tempem odtwarzania baga umożliwia flaga -r
i podanie współczynnika, np.: rosbag play -r 0.5 <bag_name>
uruchomi odtwarzanie z tempem równym połowie normalnego. Jest to przydatne przy przetwarzaniu skomplikowanym obliczeniowo, jak np. SLAM 3D.
Informacje o bagu
Dane m.in. o topicach zapisanych w bagu można podejrzeć korzystając z polecenia info
:
ros2 bag info <bag_name>
Otrzymamy informacje takie jak rozmiar, czas trwania czy topici, które są zapisane.
5. Uruchomienie lidarslam_ros2
W tej instrukcji będziemy wykorzystywać paczkę lidarslam_ros2. Uruchomić system można następującym poleceniem:
cd /arm_ws
source install/setup.bash
ros2 launch lidarslam lidarslam.launch.py
Powinno pojawić się okno rviz2, w którym będzie wizualizowany przebieg lokalizacji i budowy mapy.
HDL_400
Kolejnym krokiem (w osobnym terminalu) będzie odtworzenie baga zawierającego dane zarejestrowane na potrzeby hdl_localization
:
ros2 bag play -p -r 0.5 bags/hdl_400
Bag zostanie odtworzony zapauzowany i z rate
wynoszącym 0.5 normalnego tempa.
Przed odpauzowaniem proszę jeszcze o dodanie do podglądu danych typu PointCloud2 z topicu /velodyne_points
. Zawierają one "aktualne" odczyty z lidara.
Uruchomienie odtwarzania nastąpi po wciśnięciu klawisza spacja
z aktywnym terminalem, w którym odtwarzany jest bag.
Proszę zwrócić uwagę na tworzoną mapę z topicu /map
i z topicu /modified_map
. Czym mogą się różnić? A /path
i /modified_path
?
Kitti 00
Na potrzeby zajęć zostało przygotowane również 200 pierwszych skanów z sekwencji 00 datasetu Kitti. Dane zawierają również informacje ground truth, które zostaną wykorzystane do (wizualnej) oceny działania systemu.
Przy ponownie uruchomionym lidarslam
można uruchomić baga:
ros2 bag play -p bags/kitti
Przed odpauzowaniem proszę jeszcze o dodanie do podglądu danych typu Path z topicu /path_gt_lidar
. Sugeruję jeszcze zmienić kolor wizualizowania tych danych dla większej czytelności (inny niż żółty i zielony). Po tym można odpauzować baga.
Prawdopodobnie linia ground truth
odbiega od ścieżki zwracanej przez lidarslam
. Proszę powtórzyć eksperyment dla -r
równego 0.3. Co się dzieje tym razem?
6. Zadanie do samodzielnej realizacji
Analizując dokumentację i kod źródłowy lidarslam oraz obserwując działanie systemu proszę opisać wpływ następujących parametrów z pliku /arm_ws/src/lidarslam_ros2/lidarslam/param/lidarslam.yaml
:
- ndt_resolution (scan_matcher i graph_based_slam)
- trans_for_mapupdate
- map_publish_period
- scan_period
- voxel_leaf_size
- loop_detection_period
- threshold_loop_closure_score
- distance_loop_closure
- range_of_searching_loop_closure
- search_submap_num
Dodatkowe materiały
Autorzy: Michał Nowicki, Kamil Młodzikowski