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
 ![rosservice_list](img/rosservis_list.gif "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
  
 ![vsc_ls](img/VSC_ls2.gif "vsc_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).
 ![zamykanie](img/zamykanie.gif "zamykanie")
@@ -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
 ![Aktywacja konta na git.pg.gda.pl](img/git_create.gif "Aktywacja konta na git.pg.gda.pl")
   - zainicjalizuj repozytorium git w folderze pakietu
 ![Aktywacja konta na git.pg.gda.pl](img/git_init.gif "Aktywacja konta na git.pg.gda.pl")
-  - 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)
 ![Aktywacja konta na git.pg.gda.pl](img/git_check.gif "Aktywacja konta na git.pg.gda.pl")
 
-  - 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*
 ![ls_dev_one](img/VSC_ls_dev_one.gif "ls_dev_one")
  
  
-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**
  
 ![arduino](img/VSC_arduino_setup.gif "arduino")
 
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".