diff --git a/lab01/README.md b/lab01/README.md index b34f1dfd4eb0e12665bbdd4667e4e0d96099f201..c8d327399021eaf12c1c30a2776518f188264ae3 100644 --- a/lab01/README.md +++ b/lab01/README.md @@ -171,7 +171,7 @@ angular: ### Serwis KomunikacjÄ za poĹrednictwem "TopicĂłw" moĹźna porĂłwnaÄ z przepĹywem wody w rurach. Woda pĹynie jedynie w jednym kierunku i jeĹli coĹ wrzucimy na poczÄ tku rurociÄ gu nie dowiemy siÄ czy dotarĹo ono na koniec. W niektĂłrych przypadkach jednak chcemy uzyskaÄ informacje czy wiadomoĹÄ na pewno dotarĹa do odbiorcy, a dodatkowo czasem oczekujemy natychmiastowej odpowiedzi. W takich przypadkach w Ĺrodowisku ROS uĹźywa siÄ SerwisĂłw. -PrzykĹadem zastosowania serwisu moĹźe byÄ np. wyliczenie ĹcieĹźki robota z punktu A do B. Jeden Node wysyĹa informacje o punkcie poczÄ tkowym i koĹcyowym, a wtedy drugi Node, ktĂłry udostÄpnia usĹugÄ znajdywania trasy, odpowiada wyliczonÄ trasÄ . Serwisy mogÄ byÄ jednak jeszcze prostsze i sĹuĹźyÄ jedynie do wykonywania poleceĹ. +PrzykĹadem zastosowania serwisu moĹźe byÄ np. wyliczenie ĹcieĹźki robota z punktu A do B. Jeden Node wysyĹa informacje o punkcie poczÄ tkowym i koĹcowym, a wtedy drugi Node, ktĂłry udostÄpnia usĹugÄ znajdywania trasy, odpowiada wyliczonÄ trasÄ . Serwisy mogÄ byÄ jednak jeszcze prostsze i sĹuĹźyÄ jedynie do wykonywania poleceĹ. Symulacja turtlesim udostÄpnia kilka serwisĂłw. Wszystkie informacje o serwisach podobnie jak o topicach, moĹźemy uzyskaÄ poleceniem: ```bash @@ -190,7 +190,7 @@ rosservice list  -Wylistowane zostaĹy wszystkie serwisy aktualnie dostÄpne, jednak nazwy czasmi nie wskazujÄ , kto je udostÄpnia. Aby uzyskaÄ takÄ informacjÄ musimy uĹźyÄ flagÄ -n +Wylistowane zostaĹy wszystkie serwisy aktualnie dostÄpne, jednak nazwy czasami nie wskazujÄ , kto je udostÄpnia. Aby uzyskaÄ takÄ informacjÄ musimy uĹźyÄ flagÄ -n ```bash rosservice list -n @@ -220,7 +220,7 @@ name: ''" ## Äwiczenie 3 Trzecie Äwiczenie bÄdzie polegaĹo na stworzeniu wĹasnego pakietu w Ĺrodowisku ROS i napisaniu kilku testowych wÄzĹĂłw. -**Zadanie 8:** PoĹÄ cz siÄ z komputerem zdalnym przy pomocy progrmu Visual Studio Code i otwĂłrz katalog gĹĂłwny uĹźytkownika. +**Zadanie 8:** PoĹÄ cz siÄ z komputerem zdalnym przy pomocy programu Visual Studio Code i otwĂłrz katalog gĹĂłwny uĹźytkownika. Standardowo w Ĺrodowisku ROS katalog roboczy (work space) nazywany jest **catkin_ws**. OtwĂłrz terminal w Ĺrodowisku VSC (Ctrl+`) i sprawdĹş czy w katalogu domowym **~** znajduje siÄ folder **catkin_ws** przy pomocy komendy ```bash @@ -229,7 +229,7 @@ ls  -Na potrzeby laboratorium katalog roboczy zostaĹ juĹź wczeĹniej przygotowany. Informacje jak stworzyÄ katalog roboczy moĹźna znaleĹÄ pod tym [linkiem](http://wiki.ros.org/ROS/Tutorials/InstallingandConfiguringROSEnvironment). W przestrzeni roboczej w katalogu **~/catkin_ws/src** znajdujÄ siÄ wszystkie pakiety uĹźytkownika nad ktĂłrymi pracuje, a jej struktura wyglÄ da nastÄpujÄ co: +Na potrzeby laboratorium katalog roboczy zostaĹ juĹź wczeĹniej przygotowany. Informacje jak stworzyÄ katalog roboczy moĹźna znaleĹşÄ pod tym [linkiem](http://wiki.ros.org/ROS/Tutorials/InstallingandConfiguringROSEnvironment). W przestrzeni roboczej w katalogu **~/catkin_ws/src** znajdujÄ siÄ wszystkie pakiety uĹźytkownika nad ktĂłrymi pracuje, a jej struktura wyglÄ da nastÄpujÄ co: ```bash workspace_folder/ -- WORKSPACE src/ -- SOURCE SPACE @@ -275,7 +275,7 @@ my_package/ CMakeLists.txt package.xml ``` -Plik CMakeList.txt uĹźywany jest przy kompilacji pakietu i jest bardzo waĹźny w przypadku tworzenia aplikacji w jÄzyku C++, jednak na potrzeby tego laboratorium bÄdziemy uĹźywaÄ jÄzyka python, wiÄc nie bÄdziemy modyfikowaÄ pliku CMakeLists.txt. Drugi plik to manifest zaiwrajÄ cy informacje o pakiecie takie jak autor, wersja itp. jego rĂłwnieĹź nie bÄdziemy modyfikowaÄ. +Plik CMakeList.txt uĹźywany jest przy kompilacji pakietu i jest bardzo waĹźny w przypadku tworzenia aplikacji w jÄzyku C++, jednak na potrzeby tego laboratorium bÄdziemy uĹźywaÄ jÄzyka python, wiÄc nie bÄdziemy modyfikowaÄ pliku CMakeLists.txt. Drugi plik to manifest zawierajÄ cy informacje o pakiecie takie jak autor, wersja itp. jego rĂłwnieĹź nie bÄdziemy modyfikowaÄ. Po utworzeniu pakietu naleĹźy go zbudowaÄ. WyĹÄ cz **roscore** i wszystkie node'y (Ctrl+c).  @@ -294,7 +294,7 @@ source devel/setup.bash ``` ---- -Zdalne komputery bÄdÄ czyszczone pomiÄdzy zajÄciami laboratoryjnymi, dlatego aby nie straciÄ stwojej pracy naleĹźy stworzyÄ repozytorim git dla nowo stworzonego pakietu. +Zdalne komputery bÄdÄ czyszczone pomiÄdzy zajÄciami laboratoryjnymi, dlatego aby nie straciÄ swojej pracy naleĹźy stworzyÄ repozytorium git dla nowo stworzonego pakietu. # Utworzenie/aktywacja konta na git.pg.edu.pl: - Aktywacja konta na [git.pg.gda.pl](https://git.pg.edu.pl/users/sign_in) @@ -306,14 +306,14 @@ Zdalne komputery bÄdÄ czyszczone pomiÄdzy zajÄciami laboratoryjnymi, dlatego  - zainicjalizuj repozytorium git w folderze pakietu  - - sprawdĹş czy po odĹwierzeniu strony pojawiĹy siÄ pliki z lokalnego pakietu (pliki na poniĹźszym gifie bÄdÄ inne niĹź te w twoim pakiecie) + - sprawdĹş czy po odĹwieĹźeniu strony pojawiĹy siÄ pliki z lokalnego pakietu (pliki na poniĹźszym gifie bÄdÄ inne niĹź te w twoim pakiecie)  - - Na dalszym etapie prac, szczegĂłlnie na koniec laboratorium uaktualniaj repozytorium o nowe zmiany (przesyĹaj nowe pliki i zmiany do repozytorium na git.pg.gda.pl). Robi siÄ to mastÄpujÄ cymi komendami: + - Na dalszym etapie prac, szczegĂłlnie na koniec laboratorium uaktualniaj repozytorium o nowe zmiany (przesyĹaj nowe pliki i zmiany do repozytorium na git.pg.gda.pl). Robi siÄ to nastÄpujÄ cymi komendami: ```bash w katalogu pakietu git add . -git commit -m "<nazwa commitu - krĂłti opis dodawanych plikĂłw>" +git commit -m "<nazwa commitu - krĂłtki opis dodawanych plikĂłw>" git push ``` @@ -370,7 +370,7 @@ from sensor_msgs.msg import LaserScan pub = rospy.Publisher('witaj', String, queue_size=10) rospy.init_node('pierwszy_node', anonymous=True) ``` -W tej czÄĹci kodu najpierw tworzymy "publishera", ktĂłry bÄdzie pozwalaĹ na publikowanie danych na topic **witaj** o typie **String**, ktĂłry wczeĹniej zaimportowaliĹmy. Ostatni parametr queue_size odpowiada za liczbÄ wiadomoĹci, ktĂłre bÄdÄ przechowywane w kolejce jeĹli Ĺźaden z subskrybentĂłw nie bÄdzie nadÄ ĹźaĹ ich odbieraÄ. +W tej czÄĹci kodu najpierw tworzymy "publishera", ktĂłry bÄdzie pozwalaĹ na publikowanie danych na topic **witaj** o typie **String**, ktĂłry wczeĹniej zaimportowaliĹmy. Ostatni parametr queue_size odpowiada za liczbÄ wiadomoĹci, ktĂłre bÄdÄ przechowywane w kolejce, jeĹli Ĺźaden z subskrybentĂłw nie bÄdzie nadÄ ĹźaĹ ich odbieraÄ. Druga linijka kodu inicjalizuje Node'a w systemie ROS, co pozwala rozpoczÄ Ä komunikacjÄ z innymi aplikacjami. Pierwszy parametr tej funkcji to nazwa naszego Noda. Nazwy NodĂłw nie mogÄ siÄ powtarzaÄ, wiÄc aby to zapewniÄ uĹźywany jest parametr **anonymous=True**, dziÄki ktĂłremu dodawana jest losowa liczba do nazwy Node'a. ```python @@ -425,7 +425,7 @@ if __name__ == '__main__': ``` -Ostatni fragment kodu odpowiada za wywoĹanie naszej funkcji. Dodatkowo sprawdza on czy podczas wykonywania naszej funkcji nie pojawiĹ siÄ wyjÄ tek. WywoĹanie znajduje siÄ w warunku ``` if __name__ == '__main__':``` Jest to warunek specyficzny dla jÄzyka python. Pozwala on wywoĹaÄ fragment kodu jedynie w przypadku gdy dany skrypt (caĹy plik) zostanie uruchomiony, natomiast jeĹli nasz skrypt zostanie zaimportowany do innego skryptu przy pomocy instrukcji ```import ``` to ten fragment kodu nie zostanie uruchomiony. +Ostatni fragment kodu odpowiada za wywoĹanie naszej funkcji. Dodatkowo sprawdza on czy podczas wykonywania naszej funkcji nie pojawiĹ siÄ wyjÄ tek. WywoĹanie znajduje siÄ w warunku ``` if __name__ == '__main__':``` Jest to warunek specyficzny dla jÄzyka python. Pozwala on wywoĹaÄ fragment kodu jedynie w przypadku, gdy dany skrypt (caĹy plik) zostanie uruchomiony, natomiast jeĹli nasz skrypt zostanie zaimportowany do innego skryptu przy pomocy instrukcji ```import ``` to ten fragment kodu nie zostanie uruchomiony. Po zapisaniu skryptu naleĹź jeszcze nadaÄ mu prawa do wykonywania. W tym celu w terminalu przejdĹş do folderu ze stworzonym skryptem i wywoĹaj komendÄ: @@ -472,7 +472,7 @@ def listener(): if __name__ == '__main__': listener() ``` -Kod subskrybenta róşni siÄ od kodu pierwszego programu ale jest prostszy. +Kod subskrybenta róşni siÄ od kodu pierwszego programu, ale jest prostszy. ```python def listener(): @@ -482,13 +482,13 @@ def listener(): ``` Tak jak poprzednio definiujemy gĹĂłwnÄ funkcjÄ naszego programu i inicjalizujemy node'a, tym razem o nazwie **subskrybent** rĂłwnieĹź z parametrem anonimowoĹci. -NastÄpnie tworzymy subskrybenta. JeĹli nasĹuchiwali byĹmy kilku topicĂłw to byĹoby kilka takich poleceĹ. Pierwszy parametr to topic na, ktĂłrym bÄdziemy nasĹuchiwaÄ informacji, czyli **witaj**. ZdefiniowaliĹmy go w poprzednim programie. NastÄpny to typ danych, ktĂłre pojawiajÄ siÄ na topicu. Ostatni parametr to nazwa funkcji, ktĂłra ma zostaÄ wywoĹana w momencie gdy pojawi siÄ wiadomoĹÄ. +NastÄpnie tworzymy subskrybenta. JeĹli nasĹuchiwali byĹmy kilku topicĂłw to byĹoby kilka takich poleceĹ. Pierwszy parametr to topic, na ktĂłrym bÄdziemy nasĹuchiwaÄ informacji, czyli **witaj**. ZdefiniowaliĹmy go w poprzednim programie. NastÄpny to typ danych, ktĂłre pojawiajÄ siÄ na topicu. Ostatni parametr to nazwa funkcji, ktĂłra ma zostaÄ wywoĹana w momencie, gdy pojawi siÄ wiadomoĹÄ. ```python def callback(data): rospy.loginfo("Odebrany napis: %s", data.data) ``` -Ta funkcja zostanie wywoĹana za kaĹźdym razem gdy pojawi siÄ wiadomoĹÄ na topicu **witaj**. Jest to bardzo prosta funkcja zawierajÄ ca jedynie polecenie **rospy.loginfo** ktĂłrej zasada dziaĹania byĹa juĹź omĂłwiona. WyĹwietlana wiadomoĹÄ skĹadaÄ siÄ bÄdzie z napisu **Odebrany napis:** oraz treĹci odebranej wiadomoĹci. +Ta funkcja zostanie wywoĹana za kaĹźdym razem, gdy pojawi siÄ wiadomoĹÄ na topicu **witaj**. Jest to bardzo prosta funkcja zawierajÄ ca jedynie polecenie **rospy.loginfo** ktĂłrej zasada dziaĹania byĹa juĹź omĂłwiona. WyĹwietlana wiadomoĹÄ skĹadaÄ siÄ bÄdzie z napisu **Odebrany napis:** oraz treĹci odebranej wiadomoĹci. PozostaĹy kod jest wspĂłlny z pierwszym programem. @@ -521,7 +521,7 @@ ls /dev/ttyUSB*  -wyĹwietli nam tylko jednÄ ĹcieĹźkÄ, prowadzÄ cÄ do naszego mikrokontrolera. Nie mniej jednak zwykle podĹÄ czonych do komputera jest wiÄcej urzÄ dzeĹ. NajprostszÄ metodÄ okreĹlenia portu bÄdzie odĹÄ czenie naszego ardunio od komputera i ponowne jego podĹÄ czenie. Wtedy w wiadomoĹciach diagnostycznych jÄ dra systemu pojawi siÄ nowo dodane urzÄ dzenie. WiadomoĹci moĹźemy wyĹwietliÄ przy pomocy komendy: +wyĹwietli nam tylko jednÄ ĹcieĹźkÄ, prowadzÄ cÄ do naszego mikrokontrolera. Nie mniej jednak zwykle podĹÄ czonych do komputera jest wiÄcej urzÄ dzeĹ. NajprostszÄ metodÄ okreĹlenia portu bÄdzie odĹÄ czenie naszego arduino od komputera i ponowne jego podĹÄ czenie. Wtedy w wiadomoĹciach diagnostycznych jÄ dra systemu pojawi siÄ nowo dodane urzÄ dzenie. WiadomoĹci moĹźemy wyĹwietliÄ przy pomocy komendy: ```bash dmesg ``` @@ -572,7 +572,7 @@ while(1){ ``` WewnÄ trz funkcji naprzemiennie ustawiany jest stan wysoki i stan niski na pinie **LED_BUILTIN** przy pomocy funkcji **digitalWrite**. Zmiany stanu sÄ przedzielone funkcjÄ **delay**, ktĂłra zatrzymuje wykonywanie programu na wskazany czas w **ms**. -Przed wgraniem programu naleĹźy ustawiÄ odpowiedniÄ wersjÄ pĹytki jakÄ dysponujemy oraz port do ktĂłrego podĹÄ czone jest nasze urzÄ dzenie. Wybieramy **Tools -> Board -> Arduino Mega or Mega 2560** oraz odpowiedni port ktĂłry wczeĹniej znaleĹşliĹmy **Tools -> Port -> /dev/ttyUSBx** +Przed wgraniem programu naleĹźy ustawiÄ odpowiedniÄ wersjÄ pĹytki jakÄ dysponujemy oraz port do ktĂłrego podĹÄ czone jest nasze urzÄ dzenie. Wybieramy **Tools -> Board -> Arduino Mega or Mega 2560** oraz odpowiedni port, ktĂłry wczeĹniej znaleĹşliĹmy **Tools -> Port -> /dev/ttyUSBx**  diff --git a/lab03/README.md b/lab03/README.md index c3bd3a83e7d9057de6650026d49a8799e4f8145c..0bdac532f684fa7297ad5bf6e5525eaa5275a794 100644 --- a/lab03/README.md +++ b/lab03/README.md @@ -451,7 +451,7 @@ W powyĹźszym pliku moĹźemy zauwaĹźyÄ nowy znacznik "group". Pozwala on odseparo Wszystkie parametry moĹźliwe do ustawienia moĹźemy znaleĹşÄ tu [link](https://github.com/IntelRealSense/realsense-ros), w podpunkcie "Launch parameters". -Oprucz uruchomienia kamer, wĹÄ czany jest "static_transform_publisher", ktĂłry publikuje w systemie staĹÄ transformacjÄ pomiÄdzy jendÄ kamerÄ , a drugÄ . DziÄki temu wskazujemy jak kamery sÄ przesuniÄte wzglÄdem siebie i odometriÄ, ktĂłrÄ uzyskujemy z kamery t265, bÄdziemy mogli odnieĹÄ do drugiej kamery (bÄdziemy mogli ĹledziÄ poĹoĹźenie rĂłwnieĹź drugiej kamery). +OprĂłcz uruchomienia kamer, wĹÄ czany jest "static_transform_publisher", ktĂłry publikuje w systemie staĹÄ transformacjÄ pomiÄdzy jendÄ kamerÄ , a drugÄ . DziÄki temu wskazujemy jak kamery sÄ przesuniÄte wzglÄdem siebie i odometriÄ, ktĂłrÄ uzyskujemy z kamery t265, bÄdziemy mogli odnieĹÄ do drugiej kamery (bÄdziemy mogli ĹledziÄ poĹoĹźenie rĂłwnieĹź drugiej kamery). Ostatni uruchamiany node "depthimage_to_laserscan" jak sama nazwa wskazuje pozwala uzyskaÄ laserscan z obrazu gĹÄbi. Laser skan bÄdzie potrzebny przy tworzeniu mapy 3d. JeĹli nie posiadamy lidaru i uĹźywamy samych kamer to w ten sposĂłb moĹźemy go zasymulowaÄ. W przeciwnym wypadku uruchomilibyĹmy po prostu lidar juĹź bez programu "depthimage_to_laserscan".