Lab 4 - Zastosowanie ROS’a w robotyce
Modelowanie i sterowanie robotów - laboratorium
Lab 4 - Zastosowanie ROS’a w robotyce
Politechnika Poznańska
Instytut Robotyki i Inteligencji Maszynowej
Jakub Chudziński, Bartłomiej Kulecki
Instalacja potrzebnego oprogramowania
Na zajęciach będziemy pracować z ROS Noetic Ninjemys (bazującym na Ubuntu 20.04). Rekomendowane jest skorzystanie z dostarczonego i skonfigurowanego oprogramowania tworzącego tzw. kontener. Instalacja jest opisana zarówno dla użytkowników Windowsa jak i Ubuntu. Na komputerach w laboratorium można pominąć proces instalacji i przejść do sekcji "Uruchomienie ROS'a".
Windows
- Pobierz XLaunch Server ze strony https://sourceforge.net/projects/vcxsrv/ i zainstaluj.
- Pobierz Docker Desktop ze strony https://docs.docker.com/desktop/install/windows-install/ i zainstaluj.
- Pobierz Visual Studio Code ze strony https://code.visualstudio.com/download i zainstaluj.
- Otwórz VS Code i zainstaluj rozszerzenie (skrót CTRL+SHIFT+X) o nazwie "Remote Development".
- Pobierz repozytorium:
a) w przeglądarce:
wciśnij przyciskCode --> Download ZIP
, rozpakuj w wybranej lokalizacji na dysku,
b) lub w wierszu polecenia:
użyj komendy:git clone https://github.com/Jakubach/pilz_ros_docker.git
Ubuntu
- Pobierz Docker Engine, instrukcja: https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository
- Opcjonalnie, możesz wykonać kroki poinstalacyjne dla Docker Engine przedstawione na stronie:
https://docs.docker.com/engine/install/linux-postinstall/ - Pobierz i zainstaluj Visual Studio Code poleceniem w Terminalu:
sudo apt-get install code
- Otwórz VS Code i zainstaluj rozszerzenie (skrót CTRL+SHIFT+X) o nazwie "Remote Development"
- Pobierz repozytorium:
a) w przeglądarce:
zmień branch na Ubuntu, wciśnij przyciskCode --> Download ZIP
, rozpakuj w wybranej lokalizacji na dysku,
b) lub w Terminalu:
użyj komendy:git clone https://github.com/Jakubach/pilz_ros_docker.git -b Ubuntu
Dla chętnych: instalacja bez Dockera
Instalacja bez Dockera na systemie Ubuntu 20.04
Oprócz rekomendowanej instalacji oprogramowania z wykorzystaniem Dockera, można również zastosować podejście, w którym instaluje się system operacyjny Ubuntu równolegle (obok) systemu Windows. Wówczas przy uruchamianiu komputera pojawia się możliwość wyboru systemu, który chcemy włączyć.
UWAGA! Zachowaj szczególną ostrożność przy instalacji Ubuntu na dysku twardym, zapoznaj się dokładnie z dostępnymi w sieci instrukcjami instalacji, tak aby nie usunąć przez przypadek Windowsa, jeśli tego nie chcesz.
Poniżej znajduje się instrukcja instalacji. Dotyczy ona instalacji dla systemu Ubuntu w wersji 20.04. Jeśli masz już na swoim komputerze system operacyjny Ubuntu 20.04 LTS:
- zainstaluj ROS Noetic (w wersji full)
- utwórz workspace:
source /opt/ros/noetic/setup.bash
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/
catkin_make
- pobierz i zainstaluj potrzebne pakiety:
cd ~/catkin_ws/
git clone https://github.com/Jakubach/pilz_ros_docker.git -b Ubuntu .
bash src/pilz_tutorial/install.sh
catkin_make
Po wykonaniu tych operacji możesz korzystać z paczki pilz_tutorial
, która jest potrzebna w zadaniach z instrukcji do zajęć 5 i 6.
Uruchomienie ROS'a
Windows
- Uruchom XLaunch Server z domyślnymi ustawieniami.
- Uruchom Docker Desktop (pozostawiając w tle).
- Uruchom VS Code i otwórz folder
pilz_ros_docker/src
, jak pokazano na obrazku (aby powiększyć grafikę, otwórz ją w nowej karcie przeglądarki).
Przy pierwszym uruchomieniu należy poczekać nieco dłużej na pobranie i instalację potrzebnego oprogramowania.
Ubuntu (lab)
- Otwórz Terminal i uruchom Docker Engine poleceniem
sudo systemctl start docker
(może nie być konieczne). - Uruchom VS Code i otwórz folder
pilz_ros_docker/src
, jak pokazano na obrazku (aby powiększyć grafikę, otwórz ją w nowej karcie przeglądarki).
Przy pierwszym uruchomieniu należy poczekać nieco dłużej na pobranie i instalację potrzebnego oprogramowania.
Wprowadzenie do ROS'a
Robot Operating System (ROS) jest oprogramowaniem open-source umożliwiającym tworzenie aplikacji dla robotów i systemów zrobotyzowanych. Środowisko między innymi dostarcza narzędzia do obsługi urządzeń zewnętrznych (np. sterowniki do kamer, czujników), do modelowania oraz sterowania robotów i ich otoczenia oraz udostępnia interfejs do komunikacji między procesami. ROS cechuje się rozproszoną (modułową) architekturą bazującą na SOA (ang. Service-Oriented Architecture), czyli taką, w której system realizuje niezależne zadania, które mogą być łączone w większe procesy. Celem korzystania z ROS'a jest tworzenie modułów, które mogą zostać przeniesione i wykorzystane w różnych aplikacjach robotycznych.
Programowanie w ROS'ie odbywa się najczęściej z wykorzystaniem języków C++ lub Python.
Wybór języka programowania zdeterminowany jest przeznaczeniem aplikacji, a także rozplanowaniem rozwiązania. Aplikacje, które mają działać w czasie rzeczywistym, czyli przykładowo moduł do sterowania robotem, najczęściej spotyka się napisane w C++. Python jako język trochę wyższego poziomu pozwala na uzyskanie szybszego efektu (prototypu), ale też jest częściej wykorzystywany w przypadku przetwarzania obrazów, co ma zawsze miejsce kiedy robot współpracuje z kamerą. Przy planowaniu rozwiązania opartego o ROS'a warto przejrzeć gotowe moduły udostępnione przez społeczność.
Programowanie w ROS'ie wymaga znajomości Linuxa (i języka angielskiego).
Gdyby zapytać przypadkowo spotkaną osobę o ROS'a pod Windowsem, na jej twarzy pojawiłby się niepewny wyraz, a w głowie pytanie "po co?". Wiąże się to z założeniem, że osoba tworząca w ROS'ie, raczej nie będzie miała problemu z zapoznaniem się z systemem Linuxowym. Nie bez powodu, żadna dystrubucja ROS'a przez długi czas (do 2018 roku) nie była dostępna pod Windowsem. Ubuntu, czy inne dystrybucje Linuxa są bardziej "customowymi" systemami, tzn. udostępniają użytkownikom bardziej zaawansowany dostęp do narzędzi i konfiguracji systemowych. Dla większości użytkowników, pierwszym systemem pod aplikacje związane z tworzeniem systemów robotycznych są Linuxowe dystrybucje. Warto korzystać z czegoś, co posiada dużą społeczność, ponieważ większość problemów, na które napotkamy, została już rozwiązana. Do tego zalecany jest również język angielski jako systemowy.
Programowanie w ROS'ie to również praca ze sprzętem i dokumentacją.
Dobre, zaawansowane oprogramowanie w ROS'ie, na przykład sterownik dla robota, posiada wersję symulacyjną oraz działającą na realnym sprzęcie. Jest to wykorzystanie potencjału ROS'a w kwestii przenośności oprogramowania. Podejście to pozwala na szybkie testowanie i rozwój oprogramowania, a także na weryfikację parametrów (np. dokładności pozycjonowania) na realnym sprzęcie. Użytkownik ROS'a oprócz wygenerowania obrazu z kamery w środowisku symulacyjnym, powinien również być w stanie uruchomić fizyczną kamerę połączoną z komputerem. W większości przypadków, oprogramowanie do obsługi urządzeń jest już udostępnione wraz z informacją o interfejsowaniu.
Wreszcie, programowanie w ROS'ie to przyjemność.
Utworzenie własnego robota, którym można sterować i nic nie stoi na przeszkodzie, aby w prosty sposób rozwijać o nowe sensory - taka obserwacja efektów i dostrzeganie nowych możliwości są dużą motywacją w pracy. ROS jest środowiskiem intuicyjnym i pozwala na realizowanie pomysłów zarówno początującym jak i bardziej zaawansowanym użytkownikom. Słabymi punktami, które zostały poprawione w wersji ROS2, jest system bezpieczeństwa oraz trud we współpracy z niektórymi systemami rzeczywistymi, pomimo to ROS jest wykorzystywany w przemyśle (ROS Industrial).
Struktura funkcjonalna ROS'a
Robot Operating System jest zainstalowany w systemie (natywnie lub wewnątrz kontenera) pod ścieżką /opt/ros/noetic
lub w przypadku innych dystrybucji ROS'a: /opt/ros/<ROS-DISTRO>
.
❗ Otwierając nowy terminal należy zawsze przed rozpoczęciem pracy wykonać komendę: ❗
❗ source /opt/ros/noetic/setup.bash
❗
Komenda ta wskazuje potomnym procesom, gdzie jest zainstalowany ROS, ustawia wymagane zmienne środowiskowe - po prostu umożliwia korzystanie z ROS'a.
ROS Master
Jest to serwer, który umożliwia komunikację pomiędzy procesami (węzłami).
Jest pierwszą rzeczą, którą uruchamiamy korzystając z ROS'a. Wykonaj to poleceniem:
roscore
Węzeł (ang. node)
Proces pełniący określone zadanie. W obrębie modułu może być utworzone wiele współpracujących węzłów.
Polecenie roscore
zablokowało okno terminala, dlatego otwórz nowe okno (CTRL+SHIFT+`). Wyświetl listę aktywnych węzłów poleceniem:
rosnode list
W efekcie powinien zostać wyświetlony pojedyczny węzeł rosout
, który został utworzony automatycznie. Gromadzi on logi ze wszystkich węzłów.
Jeśli w terminalu jest uruchomiony proces, który blokuje to okno i chcemy go zakończyć, należy użyć skrótu CTRL+C
Moduł (ang. module, package)
Moduł to zbiór procesów realizujących określone zadanie. Na moduł może składać się jeden lub więcej węzłów. Przykładowym modułem może być aplikacja do przetwarzania danych biomedycznych, w której jeden z węzłów odpowiada za odbiór danych z różnych czujników, a drugi za przetwarzanie ich na komendy sterujące robotem.
Aby uruchomić pojedyczny węzeł z danego modułu wykorzystujemy komendę:
rosrun [package_name] [node_name]
Wykonaj poniższe polecenie, aby uruchomić przykładowy, domyślnie zainstalowany węzeł:
rosrun turtlesim turtlesim_node
Wyświetl ponownie listę aktywnych węzłów.
Temat (ang. topic)
Węzły mogą się komunikować za pomocą tematów. Jeden z węzłów jest nazywany publikującym (ang. publisher lub advertiser), a drugi subskrybującym (ang. subscriber). Węzeł publikujący przesyła wiadomości na danym temacie i mogą być one odbierane przez wielu subskrybentów.
Jeśli węzeł turtlesim_node
jest wyłączony, uruchom go. W nowym oknie terminala uruchom kolejny węzeł poleceniem:
rosrun turtlesim turtle_teleop_key
Ten węzeł dodaje możliwość sterowania symulowanym żółwiem za pomocą strzałek klawiatury. Aby sterować żółwiem, kliknij najpierw na okno terminala z tym węzłem.
W nowym oknie terminala wyświetl listę dostępnych tematów poleceniem:
rostopic list
Wyświetl dane publikowane na temacie /turtle1/cmd_vel
poniższym poleceniem. Poruszaj żółwiem i zaobserwuj publikowane dane.
rostopic echo /turtle1/cmd_vel
Wiadomość (ang. message)
Węzły przekazują pomiędzy sobą wiadomości, mogą to być np. przetworzone dane z czujnika.
Wyświetl typ danych publikowanych na temacie /turtle1/cmd_vel
.
rostopic type /turtle1/cmd_vel
W efekcie wyświetlone zostanie: geometry_msgs/Twist
. Aby wyświetlić informację o typie tej wiadomości, wykonaj polecenie:
rosmsg show geometry_msgs/Twist
Zazwyczaj wiadomości publikujemy wewnątrz zaprogramowanego węzła, ale istnieje również możliwość publikowania wiadomości z poziomu okna terminala:
rostopic pub [topic] [msg_type] [args]
Wykonaj poniższe polecenie, aby wysterować symulowanego źółwia:
rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
Możesz jednocześnie publikować dane z wielu okien lub wielu węzłów. Spróbuj publikować powyższą komendę i jednocześnie sterować źółwiem za pomocą klawiatury.
Bibliotekami, które implementują powyższą funkcjonalność są rospy dla Pythona oraz roscpp dla C++, umożliwiają one np. tworzenie węzłów, czy dodawanie subskrybentów/publikujących.
Przykłady projektów w ROS'ie
Poniżej przedstawiono przykładowe projekty, aby odpowiedzieć na pytanie "co można w tym ROS'ie zrobić?", niekoniecznie od 0, ale z wykorzystaniem istniejących narzędzi.
Sterowanie manipulatorami Pilz - Pilz_robots
Wymieniony w tytule projekt posiada wiele modułów (paczek). Jego celem jest umożliwienie planowania zadań dla manipulatorów kooperacyjnych Pilz.
Moduł | Przeznaczenie |
---|---|
prbt_support | Dostarczenie opisu kinematyki robota PRBT 6, limitów obrotów osi i wizualizacji. |
prbt_moveit_config | Integracja robota z modułem do planowania ruchu MoveIt. |
prbt_pg70_support | Integracja chwytaka pg70 z robotem. |
pilz_trajectory_generation | Dostarczenie planerowi ruchu MoveIt komend technologicznych PTP, Lin, Circ. |
pilz_robot_programming | Dostarczenie użytkownikowi API w Pythonie do programowania robota. |
Sterowanie manipulatorami Universal Robots - Universal_Robots_ROS_Driver
Celem paczki jest umożliwienie planowania zadań dla manipulatorów kooperacyjnych Universal Robots. Poniżej przedstawiono moduły składające się na projekt.
Moduł | Przeznaczenie |
---|---|
universal_robot | Dostarczenie opisu kinematyki robotów Universal Robots, limitów obrotów osi i wizualizacji. |
ur_robot_driver | Integracja robota z modułem do planowania ruchu MoveIt. |
ur_controllers | Rozszerzenie interfejsu sterowania o informacje dedykowane dla UR. |
ur_calibration | Dostarczenie (poprawa) opisu kinematyki na podstawie kalibracji robota. |
controller_stopper | Zapewnienie ciągłości działania sterownika ROS'owego w razie wystąpienia błędu na sterowniku robota (np. zatrzymanie z powodu przekroczenia dopuszczalnej siły). |
Narzędzie do nauki ROS'a - turtlesim
Celem paczki jest stworzenie środowiska do zapoznania się z ROS'em. Poniżej przestawiono kreatywne projekty utworzone na jej bazie.
Turtle Pong - żółwi ping-pong
Turtle Sketch - żółwi da Vinci
Turtle Snake - żółwi snake
Turtle Planner - żółwi unikacz zderzeń
Więcej projektów dla początkujących dostępne na stronie roboacademy.
💥 🔥 Zadania do wykonania: 💥 🔥
Zadanie 1.
Uruchom terminal i przejdź do katalogu catkin_ws
, zapoznaj się z jego strukturą. Jest to Twoje środowisko pracy z ROS'em. Wyświetl jego zawartość korzystając z odpowiedniej komendy, następnie przejdź do folderu src
i ponownie wyświetl zawartość tego katalogu. Jak nazywają się paczki zainstalowane w Twoim środowisku? Uwaga, wpisując nazwę docelowego folderu warto wykorzystywać auto-uzupełnianie nazw po wciśnięciu klawisza TAB.
Zadanie 2.
Przejdź do katalogu catkin_ws
, ustaw zmienne środowiskowe (oraz nazwy globalnie zainstalowanych paczek w /opt/ros/noetic
) i wywołaj komendę catkin_make
, aby dokonać kompilacji środowiska ROS'owego.
ros-student@rosstudent-PC:~$ cd ~/catkin_ws
ros-student@rosstudent-PC:~/catkin_ws$ source /opt/ros/noetic/setup.bash
ros-student@rosstudent-PC:~/catkin_ws$ catkin_make
Otwierając terminal mamy możliwość komunikacji z urządzeniami wyjścia (np. wyświetlenie tekstu na ekranie) poprzez komendy powłoki systemu. Każde nowe okno terminala (Ctrl+Shift+`) posiada domyślną konfigurację shella. Środowisko ROS'a posiada zmienne (ang. ROS Environment Variables), które domyślnie nie są znane shellowi. Przykładem takich zmiennych są ROS_ROOT, ROS_MASTER_URI, and PYTHONPATH. Nadpisywanie tych zmiennych w obecnym oknie terminala będziemy nazywali "source'owaniem". Każde otwarte okno terminala, w którym planujemy pracować z ROS'em będzie wymagało tej operacji.
ros-student@rosstudent-PC:~$ cd ~/catkin_ws
ros-student@rosstudent-PC:~/catkin_ws$ source devel/setup.bash
Komenda source
powoduje wywołanie skryptu w obrębie obecnej powłoki systemu. devel/setup.bash
to lokalizacja skryptu, który ustawia ROS'owe zmienne środowiskowe oraz nazwy lokalnie zainstalowanych paczek (w catkin_ws/src
). Skrypt ten jest tworzony automatycznie w trakcie kompilacji.
Wyświetl jedną ze zmiennych środowiskowych (nie musisz być w katalogu catkin_ws
):
ros-student@rosstudent-PC:~/catkin_ws$ echo $ROS_PACKAGE_PATH
Możesz zdecydować się na nadpisanie domyślnej konfiguracji shella (zawartą w ukrytym pliku .bashrc
), przez co nie będziesz musiał pamiętać o source'owaniu, lecz nie jest to zalecane dla początkujących użytkowników. Aby zmienić ustawienie shella globalnie (i móc bez source'owania korzystać z paczek zainstalowanych globalnie dla ROS'a) możesz zastosować poniższą komendę:
ros-student@rosstudent-PC:~$ echo "NIE ZALECANE POCZATKUJACYM UZYTKOWNIKOM"
ros-student@rosstudent-PC:~$ echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
Lub aby pominąć source'owanie lokalnego workspace:
ros-student@rosstudent-PC:~$ echo "BARDZO NIE ZALECANE POCZATKUJACYM UZYTKOWNIKOM"
ros-student@rosstudent-PC:~$ echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
Powyższa komenda będzie prawidłowo konfigurować Twój workspace
catkin_ws
do czasu usunięcia katalogudevel
lub zmiany środowiska (gdy zamiastcatkin_ws
utworzysz inny ROS'owy folder i będziesz chciał pracować w nowym).
Zastosowanie
>
na istniejącym pliku powoduje nadpisanie jego całej zawartości, natomiast podwójny operator>>
dodaje wiersz na końcu pliku.
Zalecane jest ręczne używanie poleceń source devel/setup.bash
, gdy foldery setup
i devel
istnieją, a w przeciwnym wypadku source /opt/ros/noetic/setup.bash
(zazwyczaj przed pierwszym zbudowaniem).
Zadanie 3.
Utwórz nowe okno terminala (Ctrl+Shift+`) bez "source'owania" i wyświetl zmienną środowiskową $ROS_PACKAGE_PATH
. Jaki będzie efekt? Dokonaj "source'owania" i zaobserwuj zmianę.
Zadanie 4.
Uruchom symulację robota Fanuc LR Mate 200iD\7l.
Zastosuj plik uruchomieniowy (launch
) o nazwie demo.launch
z paczki fanuc_lrmate200id7l_moveit_config
. Wywołaj go komendą:
ros-student@rosstudent-PC:~$ roslaunch nazwa_paczki nazwa_launcha
Przejrzyj plik demo.launch
i podaj nazwy węzłów (ang nodes), które są uruchamiane (pomiń węzły includowane z innych plików launch). Komenda Roslaunch
tworzy automatycznie ROS Master'a
, jeśli nie został uruchomiony. Zapoznaj się z robotem, wykorzystaj panel do sterowania przegubami.
Zadanie 5.
a) W nowym terminalu (nie wyłączaj symulacji) uruchom program rqt
. Otwórz zakładkę Plugins --> Introspection --> Node Graph
i sprawdź jakie węzły (nodes) i tematy (topics) są aktywne oraz jakie są między nimi połaczenia.
b) Sprawdź listę tematów w terminalu komendą rostopic list
c) Sprawdź listę tematów w rqt
za pomocą zakładki Plugins --> Topics --> Topic Monitor
. Odczytaj wiadomości z wybranego tematu.
Zadanie 6.
Pobierz i uruchom przykładowy projekt Turtle Snake. Instrukcja znajduje się wewnątrz repozytorium.
Zadanie domowe
Jeśli nie udało Ci się wykonać wszystkich zadań podczas laboratorium, dokończ je w domu. Umiejętności z tych zajęć są konieczne podczas kolejnego laboratorium. Dla osób chętnych pogłębienia wiedzy i zrozumienia materiału warte uwagi są tutoriale opisujące działanie ROS'a i Linux'a:
🐢 Tworzenie środowiska, tworzenie paczki, budowanie środowiska
🐢 Struktura środowiska - katalogi source, devel, build
🐢 Wczytywanie środowiska - source'owanie
🐢 Uruchamianie wielu węzłów na raz - roslaunch