Lab 03 - SLAM 2D i AMCL

Lab. 03 - SLAM 2D i AMCL

ROS2 Actions visualisation graph

1. Czym jest SLAM i AMCL?

SLAM, czyli Simultaneous Localization And Mapping, jest to problem ciągłej konstrukcji i aktualizacji mapy nieznanego środowiska z jednoczesną estymacją pozycji agenta (np. robota).

Przewaga robotów sprzątających wykorzystujących SLAM.
Przewaga robotów sprzątających wykorzystujących SLAM. źródło

AMCL, czyli Adaptive Monte Carlo Localization to system probabilistycznej lokalizacji agenta, który wykorzystuje filtr cząsteczkowy (ang. particle filter) do śledzenia pozycji na znanej mapie.

Strzałki są cząsteczkami obliczanymi przez AMCL. źródło

2. Cel zajęć

Celem tych zajęć będzie uruchomienie systemów SLAM i AMCL na symulowanym robocie turtlebot3. Zostanie wygenerowana mapa środowiska robota oraz przeprowadzona autonomiczna nawigacja w znanym środowisku.

Poprzez modyfikację parametrów systemów będzie można przeanalizować ich wpływ na działanie algorytmów.

3. Przygotowanie środowiska

Przed przystąpieniem do pracy należy przygotować środowisko: Instrukcja przygotowania środowiska do zajęć. Obraz bazuje na osrf/ros:jazzy-desktop-full (ROS 2 Jazzy Jalisco) z symulatorem Gazebo Harmonic.

Domyślnie kontener nosi nazwę ARM_03.

UWAGA! Skrypty po uruchomieniu usuwają kontener o takiej nazwie przed utworzeniem nowego.

Korzystanie z kontenera

Po każdym ponownym uruchomieniu komputera, 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_03 bash

ROS_DOMAIN_ID

W przypadku pracy na wielu komputerach w tej samej sieci lokalnej (eduroam też może tego wymagać), konieczne może być ustawienie zmiennej środowiskowej ROS_DOMAIN_ID na różnych wartościach. Należy wybrać dowolną liczbę całkowitą z zakresu 0-100. Wartość tę należy ustawić w pliku ~/.bashrc:

export ROS_DOMAIN_ID=10  # przykładowa wartość

lub bezpośrednio w terminalu (wtedy będzie obowiązywać tylko w tym terminalu):

export ROS_DOMAIN_ID=10  # przykładowa wartość

Sugerowane jest użycie dwóch ostatnich cyfr numeru IP komputera jako wartości ROS_DOMAIN_ID, aby uniknąć konfliktów z innymi użytkownikami w sieci. Aby sprawdzić swój adres IP, można użyć polecenia:

ip addr show

adres IP będzie widoczny przy interfejsie sieciowym, np. wlan0 lub eth0.

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

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

Gazebo: GZ_IP i GZ_PARTITION

Gazebo komunikuje się niezależnie od ROS 2 (biblioteka gz-transport), więc ROS_DOMAIN_ID nie rozdziela symulacji. Domyślnie Gazebo łączy ze sobą symulacje uruchomione przez tego samego użytkownika na komputerach o tej samej nazwie (hostname), a kontener uruchomiony z --network=host przejmuje nazwę komputera i działa jako root. Jeżeli komputery w sieci mają takie same nazwy, symulacje różnych osób mogą się wzajemnie zakłócać.

Dlatego w obrazie, w pliku ~/.bashrc, ustawiona jest zmienna GZ_IP=127.0.0.1, dzięki której Gazebo komunikuje się tylko w obrębie jednego komputera. W kontenerach utworzonych ze starszej wersji obrazu (polecenie echo $GZ_IP nic nie wypisuje) należy ją dopisać samodzielnie:

echo 'export GZ_IP=127.0.0.1' >> ~/.bashrc

Jeżeli na jednym komputerze działa kilka symulacji (np. w kilku kontenerach), można je dodatkowo rozdzielić, ustawiając w każdym kontenerze inną wartość zmiennej GZ_PARTITION (węzły Gazebo widzą się nawzajem tylko w obrębie tej samej partycji):

echo 'export GZ_PARTITION=<wybrana_nazwa>' >> ~/.bashrc  # np. arm_10

Wartość GZ_PARTITION musi być taka sama we wszystkich terminalach, w których korzysta się z Gazebo (uruchomienie symulacji, polecenia gz), dlatego lepiej ustawić ją w ~/.bashrc niż w pojedynczym terminalu. Zmiany w ~/.bashrc obowiązują w nowo otwartych terminalach, więc po ich wprowadzeniu należy ponownie uruchomić symulację.

4. Uruchomienie systemu SLAM

Prace będą odbywać się na robocie Turtlebot3, konieczne jest zatem podanie wersji, z której będziemy korzystać:

export TURTLEBOT3_MODEL=burger

Dostępne są: burger, waffle i waffle_pi.

Następnie można przejść do uruchomienia symulacji świata:

ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py

W nowym terminalu uruchamiamy węzeł cartographer, który jest modułem SLAM:

export TURTLEBOT3_MODEL=burger
ros2 launch turtlebot3_cartographer cartographer.launch.py use_sim_time:=True

Jak widać w rviz2, system zaczął proces budowania mapy. Jako, że robot aktualnie się nie porusza, otoczenie jest widziane cały czas z jednego punktu, więc nie ma pomiarów koniecznych do budowy kompletnej mapy. Niezbędne będzie ruszanie robotem i przejazd po “świecie”.

W osobnym terminalu uruchamiamy węzeł do teleoperacji przy użyciu klawiatury:

export TURTLEBOT3_MODEL=burger
ros2 run turtlebot3_teleop teleop_keyboard

Następnie, korzystając z klawiszy w, a, s, d oraz x należy sterować robotem tak, aby została zbudowana mapa całego “świata”.

Świat “turtlebot3_world” w symulatorze Gazebo i utworzona mapa w rviz2.

Utworzoną mapę możemy zapisać poleceniem:

cd /arm_ws
mkdir maps
ros2 run nav2_map_server map_saver_cli -f /arm_ws/maps/turtlebot3_world_map

Po zapisaniu mapy można wyłączyć symulację.

5. Uruchomienie AMCL

Podobnie jak w poprzednim przypadku, pracę należy rozpocząć od uruchomienia symulacji:

export TURTLEBOT3_MODEL=burger
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py

Następnie możliwe jest uruchomienie węzła navigation2. Konieczne jest przekazanie informacji o wykorzystywaniu czasu z symulacji oraz lokalizacji pliku z zapisaną wcześniej mapą. W nowym terminalu:

export TURTLEBOT3_MODEL=burger
ros2 launch turtlebot3_navigation2 navigation2.launch.py use_sim_time:=True map:=/arm_ws/maps/turtlebot3_world_map.yaml

Po uruchomieniu robot nie jest zlokalizowany w mapie. Konieczne jest podanie początkowej estymacji jego pozycji. 1. Kliknij 2D Pose Estimate w oknie rviz2. 2. Kliknij w miejsce na mapie, jak najlepiej oceniając gdzie znajduje się robot i przeciągnij w kierunku jego przodu. 3. Powtarzaj kroki 1 i 2 aż do satysfakcjonującego efektu.

Chmura cząsteczek AMCL po podaniu początkowej estymacji pozycji (“2D Pose Estimate”).

Autonomiczna nawigacja

Zadanie autonomicznej nawigacji można uruchomić klikając przycisk Nav2 Goal w menu rviz2. Strzałkę, podobnie jak w przypadku 2D Pose Estimate, należy ustawić zgodnie z żądaną końcową pozycją robota.
Nawigacja do celu wskazanego przyciskiem “Nav2 Goal” - widoczna zaplanowana ścieżka.

6. Zadanie do samodzielnej realizacji

W ramach pracy samodzielnej należy:

  1. Przeprowadzić procedury z punktów 4 i 5 dla innego świata symulacji - “turtlebot3_house”

  2. W paczce turtlebot3_navigation2, w folderze param znajduje się plik burger.yaml. Proszę opisać jak modyfikacja poniższych parametrów wpływa na działanie modułu nawigacji AMCL:

    1. beam_skip_distance przy do_beamskip ustawionym na True
    2. laser_max_range i laser_min_range
    3. max_beams
    4. max_particles
    5. resample_interval
    6. update_min_a i update_min_d

Na eKursy proszę udostępnić: - zapisaną mapę (przekonwertowaną do png lub zrzut ekranu) - odpowiedź na punkt 2 w formie tekstu na eKursach lub pliku .txt.


Autor: Kamil Młodzikowski
Na podstawie: Turtlebot3 Simulation docs.