diff --git a/README.md b/README.md index dda75812c8a77ce8fe64a3a5cdc6afcb031e8b47..084cb345ad2d4dd8e3aecbc41c49e152506c31e3 100644 --- a/README.md +++ b/README.md @@ -18,19 +18,19 @@ Celem tego laboratorium jest zaznajomienie z oprogramowaniem oraz sprzÄtem wyko **Wynik**: Po wykonaniu tego Äwiczenia uczestnik kursu bÄdzie posiadaĹ wiedzÄ jak tworzy siÄ oprogramowanie dla robotĂłw w Ĺrodowisku ROS. Ponadto bÄdzie w stanie poĹÄ czyÄ elementy fizyczne jak efektory czy sensory z oprogramowaniem komputerowym. -## Laboratorium 3 +## Laboratorium 2 ### Sensory bezprzewodowej detekcji przeszkĂłd **Opis**: W tym Äwiczeniu przedstawione zotanÄ podstawowe zagadnienia zwiÄ zane z zaawansowanymi sensorami bezprzewodowej detekcji przeszkĂłd. Uczestnik uruchomi sensory przy pomocy jednoukĹadowego komputera i przetworzy uzyskiwane dane. -**Instrukcja**: [lab03/README.md](lab03/README.md) +**Instrukcja**: [lab02/README.md](lab02/README.md) **Wynik**: Po wykonaniu tego Äwiczenia uczestnik kursu bÄdzie posiadaĹ wiedzÄ jak korzystaÄ z bardziej zaawansowanych sensorĂłw detekcji przeszkĂłw oraz jak tworzyÄ mapy przestrzeni w 2D i 3D. -## Laboratorium 4 +## Laboratorium 3 ### Systemy nawigacji zliczeniowej i inercyjnej **Opis**: Ostatnie Äwiczenie bÄdzie poĹwiÄcone nawigacji zliczeniowej i zagadnienia transformacji ukĹadĂłw wspĂłĹrzÄdnych. Dodatkowo Äwiczenie wykorzystuje platformÄ pixhawk do uzyskiwania danych inercyjnych. -**Instrukcja**: [lab04/README.md](lab04/README.md) +**Instrukcja**: [lab03/README.md](lab03/README.md) **Wynik**: Po wykonaniu tego Äwiczenia uczestnik kursu bÄdzie posiadaĹ wiedzÄ jak korzystaÄ z nawigacji zliczeniowej oraz jakie zastosowanie ma w przypadku peĹnego systemu nawigacji robota. Ponadto uczestnik zapozna siÄ z platformÄ pixhawk bÄdÄ cÄ ukĹadem sterowania dla pojazdĂłw naziemnych, wodnych i powietrznych. diff --git a/ROS_setup/README.md b/ROS_setup/README.md index c29920b504a6b40a7f3242f2d58bf2038758e726..47fce66eabd82205143b49f490d6c7738c2120be 100644 --- a/ROS_setup/README.md +++ b/ROS_setup/README.md @@ -57,7 +57,9 @@ sudo apt-key adv --keyserver keys.gnupg.net --recv-key F6E65AC044F831AC80A06380C sudo add-apt-repository "deb http://realsense-hw-public.s3.amazonaws.com/Debian/apt-repo bionic main" -u +## reinstall librealsense2-dkms if system img was cloned sudo apt-get install librealsense2-dkms +## sudo apt-get install librealsense2-utils sudo apt-get install librealsense2-dev sudo apt-get install librealsense2-dbg diff --git a/lab02/README.md b/lab02/README.md new file mode 100644 index 0000000000000000000000000000000000000000..db28ff5a75bd842ab0cb631c516911843a5c01d4 --- /dev/null +++ b/lab02/README.md @@ -0,0 +1,629 @@ +# PoĹÄ czenie ze zdalnym Ĺrodowiskiem +- PoĹÄ cz siÄ ze zdalnym Ĺrodowiskiem przy pomocy programu NoMachine oraz Visual Studio code + +Przypomnienie [lab00](https://git.pg.edu.pl/p962302/ppb_tpa_lab2020/tree/master/lab00) + +# Przygotowanie przestrzeni roboczej +SprawdĹş czy w przestrzeni roboczej **catkin_ws** znajduje siÄ pakiet, ktĂłry stworzyĹeĹ na wczeĹniejszych zajÄciach laboratoryjnych. JeĹli pakiet nie znajduje siÄ w folderze **src** to ĹciÄ gnij pakiet z repozytorium, ktĂłre stworzyĹeĹ na pierwszym laboratorium. +- PrzejdĹş do folderu **catkin_ws/src** +- ĹciÄ gnij repozytorium: +```bash +git clone <url do repozytorium> +``` + + +# RPLidar S1 +Na potrzeby Äwiczenia zostanie wykorzystany lidar RPlidar S1, ktĂłry zostaĹ podĹÄ czony do komputera zdalnego przez USB. WiÄcej informacji o lidarze [link](https://www.slamtec.com/en/Lidar/S1). + + + +# Uruchomienie Lidaru RPLiDAR S1 +Tak samo jak w przypadku arduino, aby uruchomiÄ urzÄ dzenie podĹÄ czone pod usb musimy wiedzieÄ pod ktĂłry port zostaĹo ono podĹÄ czone. WywoĹujemy komendÄ: +```bash +ls -l /dev/serial/by-id +``` +ID Lidaru bÄdzie rozpoczynaĹo siÄ od nazwy **usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_** + + + +**Zadanie 1:** Zidentyfikuj port ttyUSBx do ktĂłrego podĹÄ czony jest lidar. + +Aby moĹźna byĹo korzystaÄ z urzÄ dzeĹ zewnÄtrznych potrzebne sÄ sterowniki i programy je obsĹugujÄ ce. Wz przypadku RPlidaru bÄdzie to pakiet rplidar_ros stworzony przez producenta urzÄ dzenia [link](https://github.com/Slamtec/rplidar_ros) +Pakiet zostaĹ juĹź ĹciÄ gniÄty na komputer zdalny i znajduje siÄ w katalogu **catkin_ws/src/** + +Zedytuj plik **rplidar_s1.lauch** w folderze **catkin_ws/src/rplidar_ros/launch** + +ZmieĹ parametr **serial_port** na znaleziony wczeĹniej port do ktĂłrego podĹÄ czony jest lidar i zapisz zmiany + + + + + +Uruchom lidar wraz z wizualizacjÄ przy pomocy komendy (w tym przypadku nie potrzeba uruchamiaÄ roscore) w terminalu na maszynie zdalnej (przez program noMachine): +```bash +roslaunch rplidar_ros view_rplidar_s1.launch +``` + +Po uruchomieniu komendy powinno pojawiÄ siÄ okno programu RVIZ wraz z wizualizacjÄ danych z lidaru w postaci czerwonych punktĂłw. + + + +Przy pomocy myszki moĹźemy przemieszczaÄ siÄ i zmieniaÄ orientacjÄ kamery w wizualizacji. + +**Zadanie 2:** ZmieĹ rozmiar wyĹwietlanych punktĂłw na wiÄksze (parametr "size"), zmieĹ kolor wyĹwietlanych punktĂłw (najpierw zmieĹ parametr "color transformer" na "FlatColor", a nastÄpnie parametr "Color") + +Zamknij program Rviz i zatrzymaj dziaĹanie programu w konsoli **Ctrl+c** + +Jak mogĹeĹ juĹź zauwaĹźyÄ tym razem program w Ĺrodowisku ROS zostaĹ uruchomiony przy pomocy innej komendy niĹź dotychczas. WczeĹniej uĹźywaliĹmy komendy +```bash +rosrun <nazwa pakietu> <nazwa aplikacji> +``` +Tym razem uĹźyliĹmy komendy +```bash +roslaunch <nazwa pakietu> <nazwa pliku launch> +``` +Komenda ta uruchamia plik launch, ktĂłry pozwala uruchomiÄ wiele node'Ăłw naraz wraz z odpowiednimi parametrami. Uruchamia on rĂłwnieĹź roscore jeĹli ten nie byĹ wĹÄ czony wczeĹniej. Pliki launch bardzo uĹatwiajÄ pracÄ w ROS. WczeĹniej, aby uruchomiÄ kilka programĂłw, musieliĹmy uruchomiÄ kaĹźdy program w oddzielnej konsoli, co przy duĹźej iloĹci programĂłw wprowadzaĹo mocne zamieszanie. Przy pomocy plikĂłw launch moĹźemy uruchomiÄ wszystko przy pomocy jednej komendy. PrzykĹadowy plik launch do uruchomienia Lidaru wyglÄ da nastÄpujÄ co: +```xml +<launch> + <node name="rplidarNode" pkg="rplidar_ros" type="rplidarNode" output="screen"> + <param name="serial_port" type="string" value="/dev/ttyUSB1"/> + <param name="serial_baudrate" type="int" value="256000"/> + <param name="frame_id" type="string" value="laser"/> + <param name="inverted" type="bool" value="false"/> + <param name="angle_compensate" type="bool" value="true"/> + </node> +</launch> +``` +Jak widaÄ jest to plik **rplidar_s1.launch**, ktĂłry juĹź wczeĹniej zmodyfikowaliĹmy. Pliki launch pisane sÄ w jÄzyku xml, ktĂłry wykorzystuje znaczniki do reprezentowania danych w strukturalny sposĂłb. Plik lauch rozpoczyna siÄ i koĹczy znacznikiem o tej samej nazwie: +```xml +<launch> + +</launch> +``` +WewnÄ trz tego znacznika moĹźemy uĹźyÄ wielu innych znacznikĂłw, ktĂłre odpowiednio uruchamiajÄ nody, inne pliki launch lub deklarujÄ parametry (WiÄcej informacji o znacznikach [link](http://wiki.ros.org/roslaunch/XML)). W przytoczonym pliku launch widzimy jedynie dwa warianty znacznikĂłw +```xml +<node></node> +oraz +<param> +``` +Znacznik **node** pozwala nam na uruchomienie okreĹlonego programu, wedĹug poniĹźszego schematu: +```xml +<node name="rplidarNode" pkg="rplidar_ros" type="rplidarNode" output="screen"> +</node> +``` +gdzie: +- name - dowolna nazwa jakÄ chcemy nadaÄ naszemu node'owi +- pkg - nazwa pakietu, ktĂłrym znajduje siÄ node (tak samo jak przy komendzie rosrun) +- type - nazwa programu (node'a), ktĂłry chcemy uruchomiÄ (tak samo jak przy komendzie rosrun) +- output - temu parametrowi moĹźemy nadaÄ dwie wartoĹci "log" lub "screen" ("log" jest wartoĹciÄ domyĹlnÄ ). Pozwala on na wskazanie, gdzie majÄ byÄ wyĹwietlane komunikaty wypisywane normalnie w konsoli. JeĹli wybierzemy "screen" wtedy komunikaty bÄdÄ wyĹwietlane w terminalu, jeĹli "log" to bÄdÄ zapisywane do pliku log. Ten parametr jest o tyle waĹźny, Ĺźe jeĹli uruchomimy kilka nodĂłw, ktĂłre bardzo czÄsto wypisujÄ dane w terminalu jak np. pierwsze stworzone node'y podczas pierwszego laboratorium, ktĂłre wypisywaĹy wysĹany i odebrany komunikat, to po uruchomieniu ich w jednym terminalu, komunikaty stajÄ siÄ nieczytelne z powodu ich pojawiajÄ cej siÄ iloĹci. + +Kolejne znaczniki **param** odpowiadajÄ za definicje parametrĂłw dla okreĹlonego node'a. + +- serial_port - nazwa portu USB do ktĂłrego podĹÄ czony jest lidar +- serial_baudrate - szybkoĹÄ transmisji +- frame_id - nazwa ukĹadu odniesienia dla liadru +- inverted - JeĹli lidar byĹby zamontowany do gĂłry nogami to moĹźna by odwrĂłciÄ jego orientacjÄ +- angle_compensate - tryb kompensacji kÄ ta, ktĂłry powoduje, Ĺźe kolejne pomiary sÄ przesuniÄte wzglÄdem siebie o ten sam kÄ t + +Znaczniki **param** znajdujÄ siÄ pomiÄdzy znacznikiem **node** co oznacza, Ĺźe parametry dotyczÄ tylko tego node'a, aby dowiedzieÄ jakie parametry obsĹuguje dany node naleĹźy zajrzeÄ do dokumentacji danego node'a [link](http://wiki.ros.org/rplidar). + + +Przy uruchamianiu Lidaru wraz z wizualizacjÄ nie uruchomiliĹmy jednak pliku **rplidar_s1.launch**, a plik **view_rplidar_s1.launch**. + +OtwĂłrz go w VSC. + +```xml +<launch> + <include file="$(find rplidar_ros)/launch/rplidar_s1.launch" /> + + <node name="rviz" pkg="rviz" type="rviz" args="-d $(find rplidar_ros)/rviz/rplidar.rviz" /> +</launch> +``` +Jak widaÄ plik ten posiada znacznik, ktĂłrego jeszcze nie widzieliĹmy, czyli **include**. Znacznik ten pozwala uruchamiaÄ inne pliki launch podajÄ c do nich ĹcieĹźkÄ, dziÄki czemu moĹźemy grupowaÄ i uruchamiaÄ poszczegĂłlne funkcjonalnoĹci np. jeĹli chcielibyĹmy uruchomiÄ sam lidar wtedy uruchomilibyĹmy tylko plik **rplidar_s1.launch**, natomiast jeĹli chcielibyĹmy dodaÄ do tego wizualizacje to nie musimy kopiowaÄ zawartoĹci pliku **rplidar_s1.launch** do nowego pliku i dodawaÄ do niego uruchomienia wizualizacji tylko wystarczy uruchomiÄ pierwszy plik i wizualizacjÄ. DziÄki takiemu podejĹciu nie powielamy juĹź raz napisanego kodu, co zmniejsza moĹźliwoĹÄ pojawiania siÄ bĹÄdĂłw oraz upraszcza modyfikacjÄ. + +To co jeszcze ciekawego moĹźemy zauwaĹźyÄ w pliku **view_rplidar_s1.launch** to uĹźycie tzw. argumentu podstawienia **$(find rplidar_ros)** w znaczniku **include**: +```xml +<include file="$(find rplidar_ros)/launch/rplidar_s1.launch" /> +``` +DziÄki niemu nie musimy znaÄ ĹcieĹźki do pakietu rplidar_ros. Przy wywoĹaniu pliku **launch** ĹcieĹźka zostanie znaleziona automatycznie, wiÄc niezaleĹźnie od miejsca w ktĂłrym pakiet zostaĹ zainstalowany plik zostanie uruchomiony prawidĹowo. + + +**Zadanie 3:** StwĂłrz nowy plik launch we wĹasnym pakiecie. Pliki launch standardowo znajdujÄ siÄ w folderze launch. JeĹli nie posiadasz takiego w gĹĂłwnym katalogu swojego pakietu to stwĂłrz folder o takiej nazwie. Nazwa pliku launch moĹźe byÄ dowolna. Stworzony plik ma uruchamiaÄ dwa node: **turtlesim_node** oraz **turtle_teleop_key**, gdzie pierwszy node ma wypisywaÄ komunikaty do pliku "log", natomiast drugi na terminal. Zapisz plik i uruchom go. (Pakiet nie musi byÄ skompilowany przy takiej operacji). W sprawozdaniu przedstaw zarĂłwno kod pliku launch jak i graf z programu rqt_graph (z uruchomionym plikiem launch). + +Skoro potrafimy juĹź uruchomiÄ Lidar i zwizualizowaÄ z niego dane to moĹźemy teraz przyjrzeÄ siÄ jak konkretnie te dane wyglÄ dajÄ . Node obsĹugujÄ cy lidar wysyĹa zbierane dane na topic **/scan** standardowy komendÄ **rostopic** moĹźemy sprawdziÄ jakiego typu dane pojawiajÄ siÄ na tym topicu. + + + +Jak widzimy dane sÄ typu sensor_msgs/LaserScan.msg ([link](http://wiki.ros.org/rplidar) do dokumentacji) + + + +Jest to doĹÄ zĹoĹźony typ danych opisujÄ cy scan laserowy dla lidaru 2D. Pola, ktĂłre bÄdÄ nas interesowaÄ to kolejno +- angle_min - jest to minimalny kÄ t, od ktĂłrego nasz lidar zaczyna pomiar odlegĹoĹci, w tym przypadku bÄdzie to -pi (wartoĹÄ w radianach) +- angle_max - jest to maksymalny kÄ t, na ktĂłrym nasz lidar koĹczy pomiar odlegĹoĹci, w tym przypadku bÄdzie to pi (wartoĹÄ w radianach) +- angle_increment - odlegĹoĹÄ kÄ towa pomiÄdzy dwoma kolejnymi pomiarami odlegĹoĹci +- range_min/max - po przekroczeniu tych wartoĹci dany pojedynczy pomiar odlegĹoĹci jest odrzucany +- ranges - tablica pomierzonych odlegĹoĹci (pierwszy element tablicy to pomiar dla kÄ t angle_min, natomiast kolejne to angle_min + angle_increment) + + +**Zadanie 4:** WykorzystujÄ c poniĹźszy szablon napisz program, ktĂłry przyjmuje dane z lidaru, a nastÄpnie sprawdza czy ktĂłraĹ wartoĹÄ w tablicy **ranges** przekracza wartoĹÄ 2. JeĹli tak, to zmieĹ tÄ wartoĹÄ na 0. (WartoĹÄ range_min jest ustawiona na 0.15, dlatego wartoĹci 0 zostanÄ zignorowane przy wyĹwietlaniu). WskazĂłwka - elementy msg.ranges nie mogÄ byÄ modyfikowane wprost, dlatego stwĂłrz nowÄ tablicÄ i przepisz do niej wszystkie wartoĹci, a na koniec przypisz jÄ do msg.ranges. + + +```python +#!/usr/bin/env python + +import rospy +from sensor_msgs.msg import LaserScan + +pub = rospy.Publisher('/scan_filtered', LaserScan, queue_size=10) +def callback(data): + msg = data + ################# + #Dodaj swoj kod + #Zamien wszystkie wartosci w zmiennej msg.ranges powyzej 2 na wartosc 0 + + + ########### + pub.publish(msg) + +def laser_filter(): + rospy.init_node('laser_filter', anonymous=False) + + rospy.Subscriber("/scan", LaserScan, callback) + rospy.loginfo("Filter started") + rospy.spin() + + +if __name__ == '__main__': + try: + laser_filter() + except rospy.ROSInterruptException: + pass + +``` +Uruchom **view_rplidar_s1.launch** oraz stworzony node. W programie RVIZ dodaj nowy element wizualizacji + + + +**Zadanie 5:** ZmieĹ kolor wyĹwietlania danych z lidaru po filtracji, tak aby moĹźna byĹo odróşniÄ skan przed i po filtracji. + +Zapisz konfiguracje Rviza w folderze rviz w swoim pakiecie. + + + + +**Zadanie 6:** WzorujÄ c siÄ na pliku **view_rplidar_s1.launch** napisz swĂłj plik launch, w ktĂłrym uruchomisz **rplidar_s1.launch**, swĂłj node filtrujÄ cy oraz program Rviz z zapisanÄ konfiguracjÄ wyĹwietlajÄ ce oba skany. + +# Tworzenie mapy pomieszczenia +Do przedstawienia procesu tworzenia map w postaci siatki zajÄtoĹci posĹuĹźymy siÄ symulacjÄ . Symulacja pozwala na swobodne poruszanie siÄ robotem po stworzonym Ĺwiecie, a co za tym idzie wiÄkszy wpĹyw na dziaĹanie algorytmu mapowania. + + + +Na potrzeby Äwiczenia uĹźyjemy symulacji robota turtlebot3 waffle [(opis)](https://emanual.robotis.com/docs/en/platform/turtlebot3/overview/) w symulatorze [Gazebo](http://gazebosim.org/), ktĂłry jest domyĹlnym symulatorem dla Ĺrodowiska ROS. + +Do przeprowadzenia symulacji robota potrzebujemy nastÄpujÄ cych pakietĂłw: +- https://github.com/ROBOTIS-GIT/turtlebot3_simulations +- https://github.com/ROBOTIS-GIT/turtlebot3 + +Pakiety zostaĹy ĂłwczeĹnie zainstalowane na komputerze zdalnym. +Uruchom symulacjÄ: +```bash +export TURTLEBOT3_MODEL=waffle +roslaunch turtlebot3_gazebo turtlebot3_world.launch +``` + + +**Zadanie 7:** Po uruchomieniu symulacji sprawdĹş jakie topici pojawiĹy siÄ w Rosie i jak wyglÄ da rqt_graph. + +Uruchom program Rviz z odpowiedniÄ konfiguracjÄ +```bash +export TURTLEBOT3_MODEL=waffle +roslaunch turtlebot3_gazebo turtlebot3_gazebo_rviz.launch +``` + +**Zadanie 8:** Uruchom program do sterowania robotem i przemieĹÄ robota z jednego koĹca mapy na drugi. Obserwuj, jak wyglÄ da symulacja oraz dane w programie RVIZ. Po uruchomieniu programu w konsoli pojawi siÄ opis jak sterowaÄ robotem. +```bash +export TURTLEBOT3_MODEL=waffle +roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch +``` + +--------- +Do stworzenia mapy pomieszczenia potrzebny jest nam algorytm SLAM. Tym razem wykoĹźystamy bardzo popularny i prosty w uĹźyciu [Gmapping](http://wiki.ros.org/gmapping) + +Do dziaĹania tego algorytmu potrzebne sÄ trzy elementy: +- Dane z Lidaru (scan 2d) +- Odometria (przemieszczenie) +- tf (przeksztaĹcenie ukĹadu wspĂłĹrzÄdnych pomiÄdzy startem odometrii, robotem, a lidarem) + +Zagadnienia zwiÄ zane z odometriÄ oraz tf zostanÄ omĂłwione w kolejnym Äwiczeniu laboratoryjnym. + +Wszystkie powyĹźsze elementy dostarcza nam symulacja, dziÄki czemu moĹźemy skupiÄ siÄ na samym mapowaniu. + +Zamknij wszystkie aplikacje zwiÄ zane z ROSem (Gazebo, RVIZ itd.) + +Uruchom nowÄ symulacjÄ robota w innym Ĺrodowisku. +```bash +export TURTLEBOT3_MODEL=waffle +roslaunch turtlebot3_gazebo turtlebot3_house.launch +``` + +Uruchom Rviz +```bash +export TURTLEBOT3_MODEL=waffle +roslaunch turtlebot3_gazebo turtlebot3_gazebo_rviz.launch +``` + +NajproĹciej, bez ustawiania parametrĂłw uruchomiÄ gmapping nastÄpujÄ co: +```bash +rosrun gmapping slam_gmapping +``` +PrzejdĹş do RVIZa i dodaj nowy element wizualizacji z zakĹadki "by topic" z topicu /map + + + +<!-- WĹÄ czyÄ tf - zobaczyÄ map-odom --> + +**Zadanie 9:** Uruchom sterowanie robotem i przemieszczajÄ c siÄ po Ĺrodowisku, obserwuj jak w programie RVIZ tworzy siÄ mapa danego Ĺrodowiska. Zmapuj co najmniej jedno pomieszczenie. +```bash +export TURTLEBOT3_MODEL=waffle +roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch +``` + +JeĹli uznamy, Ĺźe stworzona mapa jest juĹź kompletna albo wystarczajÄ ca to moĹźemy jÄ zapisaÄ poleceniem (mapa musi zostaÄ zapisana przed zamkniÄciem terminalu z aplikacjÄ gmapping. JeĹli zamkniemy jÄ wczeĹniej to mapa bÄdzie dalej wyĹwietlana w RVIZ jednak nie bÄdzie juĹź moĹźliwoĹci jej zapisu): + +```bash +rosrun map_server map_saver -f <ĹcieĹźka zapisu i nazwa mapy> +``` + + +**Zadanie 10:** Zobacz jakie pliki zostaĹy stworzone w podanym katalogu i co zawiera kaĹźdy z plikĂłw. + + +Jak widaÄ uruchomienie algorytmu SLAM byĹo bardzo proste. JeĹli chcemy uruchomiÄ gmapping z innymi parametrami niĹź domyĹlne, to najlepiej stworzyÄ plik launch np.: +```xml +<launch> + <arg name="scan_topic" default="scan" /> + + <node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen"> + <param name="base_frame" value="base_footprint"/> + <param name="odom_frame" value="odom"/> + <param name="map_update_interval" value="5.0"/> + <param name="maxUrange" value="6.0"/> + <param name="maxRange" value="8.0"/> + <param name="sigma" value="0.05"/> + <param name="kernelSize" value="1"/> + <param name="lstep" value="0.05"/> + <param name="astep" value="0.05"/> + <param name="iterations" value="5"/> + <param name="lsigma" value="0.075"/> + <param name="ogain" value="3.0"/> + <param name="lskip" value="0"/> + <param name="minimumScore" value="100"/> + <param name="srr" value="0.01"/> + <param name="srt" value="0.02"/> + <param name="str" value="0.01"/> + <param name="stt" value="0.02"/> + <param name="linearUpdate" value="0.1"/> + <param name="angularUpdate" value="0.5"/> + <param name="temporalUpdate" value="-1.0"/> + <param name="resampleThreshold" value="0.5"/> + <param name="particles" value="30"/> + <param name="xmin" value="-5.0"/> + <param name="ymin" value="-5.0"/> + <param name="xmax" value="5.0"/> + <param name="ymax" value="5.0"/> + + <param name="delta" value="0.05"/> + <param name="llsamplerange" value="0.01"/> + <param name="llsamplestep" value="0.01"/> + <param name="lasamplerange" value="0.005"/> + <param name="lasamplestep" value="0.005"/> + <remap from="scan" to="$(arg scan_topic)"/> + </node> +</launch> +``` +WyjaĹnienie wszystkich parametrĂłw moĹźna znaleĹşÄ w dokumnetacji [Gmapping](http://wiki.ros.org/gmapping). + +JeĹli chcielibyĹmy uĹźyÄ tego algorytmu na wĹasnym robocie to musielibyĹmy zadbaÄ o trzy elementy, ktĂłre byĹy wymienione wczeĹniej. Parametry, ktĂłre za te elementy odpowiadajÄ to +- scan (topic na ktĂłrym pojawiajÄ siÄ scany 2d z lidaru) +- odom_frame (nazwa ukĹadu wspĂłĹrzÄdnych odometrii) +- base_frame (nazwa ukĹadu wspĂłĹrzÄdnych robota) + +JeĹli robot jest stworzony w sposĂłb standardowy to ukĹady wspĂłĹrzÄdnych powinny mieÄ domyĹlne nazwy, jednak nie zawsze tak jest. + +Z parametrĂłw, ktĂłre warto wymieniÄ to np. +- maxUrange i maxRange - maksymalny uĹźyteczny i maksymalny rzeczywisty zasiÄg Lidaru. W przypadku RPLidar S1 maksymalny zasiÄg wynosi 40 m, natomiast wartoĹÄ uĹźytecznÄ dla tego lidaru moĹźna ustawiÄ np. na 20 m. +- delta - rozdzielczoĹÄ mapy (domyĹlnie 1 pixel to kwadrat 5x5 cm) +- linearUpdate i angularUpdate - odlegĹoĹÄ liniowa i kÄ towa po przejechaniu, ktĂłrej zaktualizowana zostanie mapa. + +**Zadanie 11:** StwĂłrz plik launch w swoim pakiecie zawierajÄ cy ustawienia przedstawione powyĹźej, zmieĹ parametry delta, linearUpdate i map_update_interval. Zaobserwuj zmiany w dziaĹaniu algorytmu. + + +Zamknij wszystkie aplikacje + +------- + +# Kamery Realsense + + + +Przedmiotem kolejnej czÄĹci Äwiczenia bÄdzie tworzenie map 3d z wykorzystaniem kamery gĹÄbi. Do realizacji celu posĹuĹźÄ nam dwie kamery: +- realsense t265 - kamera stereowizyjna z ukĹadem logicznym realizujÄ ca slam wizyjny pozwalajÄ ca na uzyskanie pozycji i orientacji kamery. Test kamery [link](https://www.youtube.com/watch?v=mrdegXnG_no). + +- realsense d435 - Kamera stereowizyjna z projektorem ĹwiatĹa podczerwonego. Pozwala na uzyskanie informacji o gĹÄbi w obrazie. Test kamery [link](https://www.youtube.com/watch?v=UgwHXH-jT0U). + + +W odróşnieniu od peryferiĂłw, ktĂłre byĹy wykorzystywane wczeĹniej (Lidar, arduino) komunikacja z kamerami nie jest realizowana przez serial port tylko przez sterownik usb. Do obsĹugi kamer potrzebujemy nastÄpujÄ cego oprogramowania i sterownikĂłw: +- https://github.com/IntelRealSense/realsense-ros + +Oprogramowanie jest juĹź zainstalowane, dziÄki czemu moĹźemy od razu uruchomiÄ program testowy dostarczony przez producenta. Uruchom go w terminalu: +```bash +realsense-viewer +``` + + +**Zadanie 12:** WĹÄ cz obie kamery i zaobserwuj dane w widoku 2d i 3d. + +SprawdĹş i zapisz numer seryjny obu kamer, ktĂłre bÄdÄ potrzebne za chwilÄ przy uruchamianiu ich w Ĺrodowisku ros (odczytywanie numeru seryjnego przedstawiono rĂłwnieĹź na powyĹźszym gifie). + +Aby uruchomiÄ obie kamery w Ĺrodowisku ROS potrzebujemy pliku launch, takiego jak poniĹźej: +```xml +<launch> + <arg name="device_type_camera1" default="t265"/> + <arg name="device_type_camera2" default="d4.5"/> + <arg name="serial_no_camera1" default=""/> <!-- Note: Replace with actual serial number --> + <arg name="serial_no_camera2" default=""/> <!-- Note: Replace with actual serial number --> + <arg name="camera1" default="t265"/> + <arg name="camera2" default="d400"/> + <arg name="tf_prefix_camera1" default="$(arg camera1)"/> + <arg name="tf_prefix_camera2" default="$(arg camera2)"/> + <arg name="initial_reset" default="false"/> + <arg name="enable_fisheye" default="true"/> + <arg name="color_width" default="640"/> + <arg name="color_height" default="480"/> + <arg name="depth_width" default="640"/> + <arg name="depth_height" default="480"/> + <arg name="clip_distance" default="-2"/> + <arg name="topic_odom_in" default="odom_in"/> + <arg name="calib_odom_file" default=""/> + + + + <group ns="$(arg camera1)"> + <include file="$(find realsense2_camera)/launch/includes/nodelet.launch.xml"> + <arg name="serial_no" value="$(arg serial_no_camera1)"/> + <arg name="device_type" value="$(arg device_type_camera1)"/> + <arg name="tf_prefix" value="$(arg tf_prefix_camera1)"/> + <arg name="initial_reset" value="$(arg initial_reset)"/> + <arg name="enable_fisheye1" value="$(arg enable_fisheye)"/> + <arg name="enable_fisheye2" value="$(arg enable_fisheye)"/> + <arg name="topic_odom_in" value="$(arg topic_odom_in)"/> + <arg name="calib_odom_file" value="$(arg calib_odom_file)"/> + <arg name="fisheye_fps" default="30"/> + <arg name="gyro_fps" default="200"/> + <arg name="accel_fps" default="62"/> + <arg name="enable_gyro" default="true"/> + <arg name="enable_accel" default="true"/> + <arg name="enable_pose" default="true"/> + + <arg name="enable_sync" default="false"/> + + <arg name="linear_accel_cov" default="0.01"/> + <arg name="unite_imu_method" default=""/> + + <arg name="publish_odom_tf" default="true"/> + + </include> + </group> + + <group ns="$(arg camera2)"> + <include file="$(find realsense2_camera)/launch/includes/nodelet.launch.xml"> + <arg name="serial_no" value="$(arg serial_no_camera2)"/> + <arg name="device_type" value="$(arg device_type_camera2)"/> + <arg name="tf_prefix" value="$(arg tf_prefix_camera2)"/> + <arg name="initial_reset" value="$(arg initial_reset)"/> + <arg name="align_depth" value="true"/> + <arg name="filters" value="pointcloud"/> + <arg name="color_width" value="$(arg color_width)"/> + <arg name="color_height" value="$(arg color_height)"/> + <arg name="depth_width" value="$(arg depth_width)"/> + <arg name="depth_height" value="$(arg depth_height)"/> + <arg name="clip_distance" value="$(arg clip_distance)"/> + </include> + </group> + <node pkg="tf" type="static_transform_publisher" name="t265_to_d400" args="0 0.0168 0.03 0 0 0 /$(arg tf_prefix_camera1)_link /$(arg tf_prefix_camera2)_link 100"/> + + <node pkg="depthimage_to_laserscan" type="depthimage_to_laserscan" name="depthimage_to_laserscan"> + <remap from="image" to="/$(arg camera2)/aligned_depth_to_color/image_raw"/> + <remap from="camera_info" to="/$(arg camera2)/depth/camera_info"/> + <remap from="scan" to="/scan"/> + <param name="output_frame_id" value="$(arg camera2)_depth_frame"/> + <param name="range_max" type="double" value="4"/> + <param name="range_min" type="double" value="0.2"/> + <param name="scan_time" type="double" value="0.033"/> + <param name="scan_height" type="double" value="100"/> + </node> + +</launch> + +``` +W powyĹźszym pliku moĹźemy zauwaĹźyÄ nowy znacznik "group". Pozwala on odseparowaÄ parametry jednej kamery od drugiej. Jest to konieczne, poniewaĹź w plikach launch uruchamianych w znacznikach "include" argumenty majÄ takÄ samÄ nazwÄ np. "serial_no". Gdyby nie grupowanie to po uruchomieniu drugiej kamery parametry pierwszej zostaĹyby zmienione. + +Wszystkie parametry moĹźliwe do ustawienia moĹźemy znaleĹşÄ tu [link](https://github.com/IntelRealSense/realsense-ros), w podpunkcie "Launch parameters". + +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". + +**Zadanie 13:** StwĂłrz plik launch uruchamiajÄ cy obie kamery w swoim pakiecie. UzupeĹnij powyĹźszy plik o odpowiednie numery seryjne kamer (w czwartej i piÄ tej linii, gdzie kamera1 to kamera t265, a kamera2 to kamera d400). + +Uruchom stworzony plik oraz Rviz. W programie Rviz otwĂłrz konfiguracjÄ "test_kamer.rviz" z pakietu "laboratorium_pliki_dodatkowe" w folderze "catkin_ws/src". + + + + + +W konfiguracji zostaĹy przedstawione obrazy z dwĂłch kamer. Jak widaÄ kamera t265 jest wyposaĹźona w obiektyw rybie oko, dziÄki czemu ma duĹźo wiÄksze pole widzenia. W Ĺrodkowej czÄĹci programu widoczna jest chmura punktĂłw uzyskana z kamery gĹÄbi, ktĂłrÄ moĹźna obejrzeÄ z róşnych stron zmieniajÄ c widok kamery przy pomocy myszki. + +**Zadanie 14:** Uruchom program na arduino do sterowania serwem. Ustaw flagÄ w pozycji pionowej i zobacz czy flaga pojawiĹa siÄ w chmurze punktĂłw. + +W programie Rviz znajduje siÄ narzÄdzie measure dziÄki ktĂłremu moĹźemy zmierzyÄ odlegĹoĹci w scenie. Przy dokonywaniu pomiaru najlepiej zmieniÄ styl wyĹwietlania chmury punktĂłw. Po zmianie stylu na punkty, krawÄdĹş obiektu jest lepiej widoczna i moĹźna dokonaÄ lepszego pomiaru. + + + + +**Zadanie 15:** UĹźywajÄ c narzÄdzia measure, zmierz szerokoĹÄ uniesionej flagi. + +--------- + +# Tworzenie mapy 3d + +Do przygotowania mapy 3d tak samo jak w przypadku mapy 2d potrzebowaliĹmy algorytmu slam. Tym razem uĹźyjemy rtabmap: +- http://introlab.github.io/rtabmap/ +- http://wiki.ros.org/rtabmap_ros + +Jest to slam przeznaczony typowo dla kamer gĹÄbi (RGB-D). Ze wzglÄdu zdalnej natury przeprowadzanego laboratorium nie ma moĹźliwoĹci na swobodnÄ manipulacjÄ kamerami i stworzenia mapy dowolnej przestrzeni, dlatego prezentowane sÄ metody pracy z danym nie pobieranymi z czujnikĂłw w czasie rzeczywistym. W przypadku lidaru 2d i mapy 2d zaprezentowane byĹo podejĹcie symulacyjne. Tym razem przedstawione zostanie uĹźycie prawdziwych danych z rzeczywistych czujnikĂłw, ktĂłre zostaĹy zapisane wczeĹniej. To podejĹcie pozwala wielokrotnie pracowaÄ na tych samych rzeczywistych pomiarach i testowaÄ róşnego typu algorytmy. + +W systemie ROS do zapisu danych uĹźywa siÄ plikĂłw bag [link](http://wiki.ros.org/rosbag). Rosbag pozwala na nagrywanie i późniejsze odtwarzanie wybranych topicĂłw oraz wiadomoĹci, ktĂłre siÄ na nich pojawiajÄ . Jak juĹź wczeĹniej byĹo wspomniane jest to Ĺwietne narzÄdzie do testowania algorytmĂłw oraz analizy dziaĹania robota (wyszukiwania bĹÄdĂłw itp.). + +Z plikami bag moĹźna pracowaÄ przy pomocy dwĂłch narzÄdzi do odtwarzania, analizy i nagrywania danych: +- rqt_bag - narzÄdzie graficzne +- rosbag - narzÄdzie konsolowe + +Uruchom roscore oraz rqt_bag. + +Stworzony plik bag znajduje siÄ w pakiecie "laboratorium_pliki_dodatkowe" w folderze bagfiles. + + + +Po zaĹadowaniu pliku pokazaĹy siÄ wszystkie topici, ktĂłre zostaĹy zapisane w pliku. Po prawej stronie znajdujÄ siÄ osie czasu po zbliĹźeniu ktĂłrych widzimy poszczegĂłlne wiadomoĹci. MoĹźemy podejrzeÄ dane na topicu klikajÄ c na nim prawym przyciskiem myszki i wybierajÄ c opcjÄ view. W zaleĹźnoĹci od danych jest kilka moĹźliwych wariantĂłw podglÄ du. +- raw - podglÄ d poszczegĂłlnych wiadomoĹci, podobnie jak rostopic echo +- plot - wykreĹlenie caĹego przebiegu wybranych wartoĹci z wiadomoĹci +- image - w przypadku obrazu z kamery moĹźliwe jest podejrzenie poszczegĂłlnych klatek + +**Zadanie 16:** Podejrzyj dane na topicu d400/color/image_raw oraz t265/odom/sample. Pierwszy topic podejrzyj w trybie image (view -> image), natomiast drugi w trybie plot. Zmaksymalizuj okno rqt_bag, powiÄksz okno wykresu plot przeciÄ gajÄ c jego krawÄdĹş w lewÄ stronÄ. W oknie plot po prawej stronie jest wyĹwietlana struktura wiadomoĹci odom. WyĹwietl pozycjÄ x i y (pose -> pose -> position -> x/y). Lewym przyciskiem myszki moĹźesz zmieniaÄ pozycjÄ czasu na osi. Zaobserwuj, jak zmieniajÄ siÄ klatki filmu z kamery oraz jak zmienia siÄ pozycja pionowej czerwonej osi na wykresie plot. Dodatkowo moĹźesz uruchomiÄ odtwarzanie wiadomoĹci w czasie ciÄ gĹym klikajÄ c zielonÄ strzaĹkÄ bÄdÄ cÄ 7 opcjÄ na panelu w lewym gĂłrnym rogu ekranu + +Niestety odtwarzanie plikĂłw bag z programu rqt_bag tak aby wiadomoĹci byĹy widziane w systemie ROS nie jest efektywne, dlatego zamknij program rqt_bag. Do odtworzenia posĹuĹźymy siÄ narzÄdziem konsolowym rosbag. + +OtwĂłrz terminal i przejdĹş do katalogu zawierajÄ cego plik bag, ktĂłry otwieraĹeĹ przed chwilÄ . Tak samo jak przy pomocy rqt_bag i przy uĹźyciu rosbag moĹźemy dowiedzieÄ siÄ podstawowych informacji o pliku. +UĹźyj komendy: +```bash +rosbag info <nazwa pliku> +``` + + + +Jak widzimy otrzymaliĹmy informacje o czasie trwania pliku, kiedy byĹ nagrywany, wielkoĹci pliku, ale co najwaĹźniejsze widzimy jakie topici zostaĹy nagrane oraz jakiego typu wiadomoĹci siÄ na nich znajdujÄ . + +JeĹli chcemy otworzyÄ plik bag ze wszystkimi topicami to musimy uĹźyÄ komendy: +```bash +rosbag play <nazwa pliku> +``` + + +UĹźywajÄ c przycisku **spacja** moĹźemy zatrzymywaÄ odtwarzanie pliku. + +W przypadku kiedy chcemy aby odtwarzaĹy siÄ jedynie wybrane topici wtedy komenda powinna wyglÄ daÄ nastÄpujÄ co +```bash +rosbag play <nazwa pliku> --topics <topic 1> <topic 2 ...> +``` + +rosbag posiada jeszcze wiele róşnych moĹźliwoĹci jak przyspieszanie i opóźnianie odtwarzania plikĂłw. Wszystkie dostÄpne moĹźliwoĹci moĹźna sprawdziÄ w dokumnetacji [link](http://wiki.ros.org/rosbag/Commandline) + +**Zadanie 17:** OdtwĂłrz plik bag, ktĂłry otwieraĹeĹ w rqt_bag, przy pomocy rosbag. Podczas odtwarzania, otwĂłrz program RVIZ i podejrzyj obraz z kamery (topic - /t265/fisheye1/image_raw) i zmieniajÄ cÄ siÄ pozycjÄ kamery (topic - /t265/odom/sample). Oba elementy moĹźesz dodaÄ do widoku RVIZa przez Add -> by topic -> nazwa topica + +----- + +PosiadajÄ c juĹź dane na ktĂłrych moĹźemy uĹźyÄ algorytmu slam, moĹźemy zajÄ Ä siÄ przygotowaniem pliku launch do jego uruchomienia. Plik launch do uruchamiania samego algorytmu wyglÄ da nastÄpujÄ co: + +```xml +<launch> + <arg name="camera1" default="t265"/> + <arg name="camera2" default="d400"/> + <node name="rtabmap" pkg="rtabmap_ros" type="rtabmap" output="screen" args="--delete_db_on_start"> + <param name="frame_id" type="string" value="/$(arg camera2)_link"/> + + <param name="subscribe_depth" type="bool" value="true"/> + <param name="subscribe_scan" type="bool" value="true"/> + + <remap from="odom" to="/$(arg camera1)/odom/sample"/> + <remap from="scan" to="/scan"/> + + <remap from="rgb/image" to="/$(arg camera2)/color/image_raw"/> + <remap from="depth/image" to="/$(arg camera2)/aligned_depth_to_color/image_raw"/> + <remap from="rgb/camera_info" to="/$(arg camera2)/color/camera_info"/> + + <param name="queue_size" type="int" value="200"/> + + <!-- RTAB-Map's parameters --> + <param name="RGBD/ProximityBySpace" type="string" value="false"/> + <param name="RGBD/AngularUpdate" type="string" value="0.01"/> + <param name="RGBD/LinearUpdate" type="string" value="0.01"/> + <param name="RGBD/OptimizeFromGraphEnd" type="string" value="false"/> + <param name="Reg/Force3DoF" type="string" value="true"/> + <param name="Vis/MinInliers" type="string" value="12"/> + <param name="RGBD/OptimizeMaxError" type="string" value="0.1"/> + </node> + +</launch> +``` +DziÄki tak stworzonemu plikowi moglibyĹmy uruchomiÄ algorytm rtabmap przy uĹźyciu rzeczywistych sensorĂłw. JeĹli uĹźywamy plik bag musimy zadbaÄ o jeszcze jednÄ rzecz. JeĹli uruchomilibyĹmy powyĹźszy plik z danymi odtwarzanymi z pliku bag to algorytm zwrĂłciĹby bĹÄ d o braku aktualnych danych. Jest to spowodowane róşnicÄ pomiÄdzy aktualnym czasem, a czasem zawartym w wiadomoĹciach. WiÄkszoĹÄ wiadomoĹci w systemie ROS posiada nagĹĂłwek, w ktĂłrym zawarta jest informacja w jakiej chwili dany pomiar/wiadomoĹÄ zostaĹ wysĹany/stworzony/zmierzony tzw. timestamp. Skoro odtwarzamy nasze wiadomoĹci to ich timestamp moĹźe byÄ nawet z przed kilku dni. Natomiast algorytm wymaga, aby dane byĹy nie starsze niĹź 5s. Aby rozwiÄ zaÄ ten problem uĹźyjemy czasu symulowanego. Podczas symulacji oraz odtwarzania danych symulacja czasu pozwala nie tylko przyspieszaÄ czy zwalniaÄ czas, ale rĂłwnieĹź rozpoczynaÄ wielokrotnie danÄ sekwencjÄ od staĹego punktu w czasie. + +W systemie ROS, gdy chcemy uĹźywaÄ czasu symulowanego potrzebujemy dwĂłch rzeczy: +- ustawiÄ parametr "use_sim_time" na true +- oraz zapewniÄ program, ktĂłry bÄdzie publikowaĹ symulowany czas na topic /clock + +DziÄki parametrowi "use_sim_time" ROS wie, Ĺźe kaĹźdy node powinien uĹźywaÄ czasu z topicu /clock, a nie czasu systemowego (rzeczywistego). W naszym przypadku programem publikujÄ cym czas, bÄdzie rosbag. Wystarczy przy jego uruchamianiu dodaÄ flagÄ ```--clock``` + +JeĹli uruchamiali byĹmy wszystko po kolei w terminalu, komendy wyglÄ daĹby nastÄpujÄ co (kaĹźda kolejna komenda w osobnym terminalu): +```bash +roscore +rosparam set /use_sim_time true +rosbag play <nazwa pliku> --clock +``` + + +Jaki widaÄ po ustawieniu parametru /use_sim_time oraz argumentu --clock, pojawiĹ siÄ topic /clock. Dodatkowo w programie Rviz w dolnej czÄĹci okna moĹźna zauwaĹźyÄ, Ĺźe czas ROS Time oraz Wall Time róşniÄ siÄ od siebie. +- ROS Time - Czas uĹźywany przez system ROS (w tym przypadku symulowany) +- Wall Time - Czas rzeczywisty pobrany z systemu operacyjnego + +Do realizacji mapy 3d posĹuĹźymy siÄ jednak plikiem launch, Ĺźeby uproĹciÄ proces uruchamiania caĹoĹci +```xml +<launch> + <arg name="bag_file_dir" default="$(find laboratorium_pliki_dodatkowe)/bagfiles/lab_kor.bag"/> + <param name="use_sim_time" type="bool" value="true"/> + <node name="bag_file" pkg="rosbag" type="play" output="screen" args="--clock $(arg bag_file_dir)"/> +</launch> +``` +Najpierw jako argument definiujemy ĹcieĹźkÄ do naszego pliku bag. NastÄpnie ustawiamy parametr "use_sim_time" aby ROS uĹźywaĹ czasu symulowanego. Na koĹcu uruchamiamy nasz plik bag dodajÄ c argumenty zawierajÄ ce parametr **--clock** powodujÄ cy publikowanie czasu symulacji oraz ĹcieĹźkÄ do pliku bag. + + +**Zadanie 18:** StwĂłrz plik lauch uruchamiajÄ cy odtwarzanie pliku bag oraz algorytm rtabmap. + +Po uruchomieniu stworzonego pliku, zatrzymaj go klawiszem **spacja**. W konsoli powinien pojawiÄ siÄ komunikat **[PAUSED]**. NastÄpnie otwĂłrz program RVIZ i zaĹaduj konfiguracjÄ **mapowanie_wizualizacja.rviz** z pakietu **laboratorium_pliki_dodatkowe**. + +Konfiguracja RVIZ przedstawia: +- MapCloud - wizualizacja chmur punktĂłw skĹadajÄ cych siÄ na mapÄ 3d +- Tf - wizualizacja ukĹadĂłw wspĂłĹrzÄdnych +- Widok kameru ustawiony w taki sposĂłb, aby podÄ ĹźaĹ za jednym z ukĹadĂłw wspĂłĹrzÄdnych. + +W konsoli z uruchomionym plikiem launch uĹźyj ponownie klawisza **spacja** aby dane znĂłw byĹy odtwarzane. Przy pomocy myszki moĹźesz zmieniaÄ orientacjÄ kamery i odlegĹoĹÄ od ukĹadu wspĂłĹrzÄdnych. + + + + +Plik zawiera dwa przejazdy po korytarzu. Poczekaj, aĹź stworzy siÄ caĹa mapa. Podczas drugiego przejazdu zaobserwujesz mocne skoki kamery. Skoki te zostanÄ wyjaĹnione w laboratorium nr 4. Gdy pojawi siÄ skakanie kamery przeĹÄ cz "Target Frame" na map lub Fixed frame. Opcje zmiany widoku znajdujÄ siÄ po prawej stronie okna. + +**Zadanie 19:** ZrĂłb zrzut ekranu, na ktĂłrym bÄdzie widoczna caĹa stworzona mapa. + +Po zatrzymaniu mapowania (Ctrl+c w terminalu z uruchomionym plikiem launch), mapa zapisuje siÄ w **/home/robot/.ros/rtabmap.db**. MoĹźemy jÄ otworzyÄ i przeglÄ daÄ dziÄki programowi +```bash +rtabmap +``` + + +Niestety przy poĹÄ czeniu zdalnym program **rtabmap** nie radzi sobie z poprawnym wyĹwietlaniem danych. + +StworzonÄ mapÄ moĹźna rĂłwnieĹź wygenerowaÄ w standardowym formacie .ply czy .pcd do dalszej analizy czy obrĂłbki. + + \ No newline at end of file diff --git a/lab03/img/d435_t265.jpg b/lab02/img/d435_t265.jpg similarity index 100% rename from lab03/img/d435_t265.jpg rename to lab02/img/d435_t265.jpg diff --git a/lab03/img/git_clone.gif b/lab02/img/git_clone.gif similarity index 100% rename from lab03/img/git_clone.gif rename to lab02/img/git_clone.gif diff --git a/lab03/img/kamery_rviz.png b/lab02/img/kamery_rviz.png similarity index 100% rename from lab03/img/kamery_rviz.png rename to lab02/img/kamery_rviz.png diff --git a/lab03/img/laserScan.png b/lab02/img/laserScan.png similarity index 100% rename from lab03/img/laserScan.png rename to lab02/img/laserScan.png diff --git a/lab03/img/launch_mod.gif b/lab02/img/launch_mod.gif similarity index 100% rename from lab03/img/launch_mod.gif rename to lab02/img/launch_mod.gif diff --git a/lab03/img/ls_serial_dev.gif b/lab02/img/ls_serial_dev.gif similarity index 100% rename from lab03/img/ls_serial_dev.gif rename to lab02/img/ls_serial_dev.gif diff --git a/lab03/img/map_export.png b/lab02/img/map_export.png similarity index 100% rename from lab03/img/map_export.png rename to lab02/img/map_export.png diff --git a/lab03/img/map_save.gif b/lab02/img/map_save.gif similarity index 100% rename from lab03/img/map_save.gif rename to lab02/img/map_save.gif diff --git a/lab03/img/map_save.png b/lab02/img/map_save.png similarity index 100% rename from lab03/img/map_save.png rename to lab02/img/map_save.png diff --git a/lab03/img/realsense_view.gif b/lab02/img/realsense_view.gif similarity index 100% rename from lab03/img/realsense_view.gif rename to lab02/img/realsense_view.gif diff --git a/lab03/img/rosbag_info.gif b/lab02/img/rosbag_info.gif similarity index 100% rename from lab03/img/rosbag_info.gif rename to lab02/img/rosbag_info.gif diff --git a/lab03/img/rosbag_play.gif b/lab02/img/rosbag_play.gif similarity index 100% rename from lab03/img/rosbag_play.gif rename to lab02/img/rosbag_play.gif diff --git a/lab03/img/rosbag_play_map.gif b/lab02/img/rosbag_play_map.gif similarity index 100% rename from lab03/img/rosbag_play_map.gif rename to lab02/img/rosbag_play_map.gif diff --git a/lab03/img/rosbag_play_sim_time.gif b/lab02/img/rosbag_play_sim_time.gif similarity index 100% rename from lab03/img/rosbag_play_sim_time.gif rename to lab02/img/rosbag_play_sim_time.gif diff --git a/lab03/img/rplidar_s1.jpg b/lab02/img/rplidar_s1.jpg similarity index 100% rename from lab03/img/rplidar_s1.jpg rename to lab02/img/rplidar_s1.jpg diff --git a/lab03/img/rqt_bag.gif b/lab02/img/rqt_bag.gif similarity index 100% rename from lab03/img/rqt_bag.gif rename to lab02/img/rqt_bag.gif diff --git a/lab03/img/rtabmap.gif b/lab02/img/rtabmap.gif similarity index 100% rename from lab03/img/rtabmap.gif rename to lab02/img/rtabmap.gif diff --git a/lab03/img/rviz.png b/lab02/img/rviz.png similarity index 100% rename from lab03/img/rviz.png rename to lab02/img/rviz.png diff --git a/lab03/img/rviz_conf.gif b/lab02/img/rviz_conf.gif similarity index 100% rename from lab03/img/rviz_conf.gif rename to lab02/img/rviz_conf.gif diff --git a/lab03/img/rviz_pomiar.gif b/lab02/img/rviz_pomiar.gif similarity index 100% rename from lab03/img/rviz_pomiar.gif rename to lab02/img/rviz_pomiar.gif diff --git a/lab03/img/rviz_test_kamer.gif b/lab02/img/rviz_test_kamer.gif similarity index 100% rename from lab03/img/rviz_test_kamer.gif rename to lab02/img/rviz_test_kamer.gif diff --git a/lab03/img/scan2.gif b/lab02/img/scan2.gif similarity index 100% rename from lab03/img/scan2.gif rename to lab02/img/scan2.gif diff --git a/lab03/img/scan_info.gif b/lab02/img/scan_info.gif similarity index 100% rename from lab03/img/scan_info.gif rename to lab02/img/scan_info.gif diff --git a/lab03/img/sim_map_on.gif b/lab02/img/sim_map_on.gif similarity index 100% rename from lab03/img/sim_map_on.gif rename to lab02/img/sim_map_on.gif diff --git a/lab03/img/sim_on.gif b/lab02/img/sim_on.gif similarity index 100% rename from lab03/img/sim_on.gif rename to lab02/img/sim_on.gif diff --git a/lab03/img/turtlebot3.png b/lab02/img/turtlebot3.png similarity index 100% rename from lab03/img/turtlebot3.png rename to lab02/img/turtlebot3.png diff --git a/lab03/README.md b/lab03/README.md index db28ff5a75bd842ab0cb631c516911843a5c01d4..af7b581e8869b4765450fbad7b2d0829a02bf533 100644 --- a/lab03/README.md +++ b/lab03/README.md @@ -1,629 +1,303 @@ -# PoĹÄ czenie ze zdalnym Ĺrodowiskiem -- PoĹÄ cz siÄ ze zdalnym Ĺrodowiskiem przy pomocy programu NoMachine oraz Visual Studio code - -Przypomnienie [lab00](https://git.pg.edu.pl/p962302/ppb_tpa_lab2020/tree/master/lab00) - # Przygotowanie przestrzeni roboczej -SprawdĹş czy w przestrzeni roboczej **catkin_ws** znajduje siÄ pakiet, ktĂłry stworzyĹeĹ na wczeĹniejszych zajÄciach laboratoryjnych. JeĹli pakiet nie znajduje siÄ w folderze **src** to ĹciÄ gnij pakiet z repozytorium, ktĂłre stworzyĹeĹ na pierwszym laboratorium. -- PrzejdĹş do folderu **catkin_ws/src** -- ĹciÄ gnij repozytorium: -```bash -git clone <url do repozytorium> -``` - - -# RPLidar S1 -Na potrzeby Äwiczenia zostanie wykorzystany lidar RPlidar S1, ktĂłry zostaĹ podĹÄ czony do komputera zdalnego przez USB. WiÄcej informacji o lidarze [link](https://www.slamtec.com/en/Lidar/S1). - - - -# Uruchomienie Lidaru RPLiDAR S1 -Tak samo jak w przypadku arduino, aby uruchomiÄ urzÄ dzenie podĹÄ czone pod usb musimy wiedzieÄ pod ktĂłry port zostaĹo ono podĹÄ czone. WywoĹujemy komendÄ: -```bash -ls -l /dev/serial/by-id -``` -ID Lidaru bÄdzie rozpoczynaĹo siÄ od nazwy **usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_** - - - -**Zadanie 1:** Zidentyfikuj port ttyUSBx do ktĂłrego podĹÄ czony jest lidar. - -Aby moĹźna byĹo korzystaÄ z urzÄ dzeĹ zewnÄtrznych potrzebne sÄ sterowniki i programy je obsĹugujÄ ce. Wz przypadku RPlidaru bÄdzie to pakiet rplidar_ros stworzony przez producenta urzÄ dzenia [link](https://github.com/Slamtec/rplidar_ros) -Pakiet zostaĹ juĹź ĹciÄ gniÄty na komputer zdalny i znajduje siÄ w katalogu **catkin_ws/src/** - -Zedytuj plik **rplidar_s1.lauch** w folderze **catkin_ws/src/rplidar_ros/launch** - -ZmieĹ parametr **serial_port** na znaleziony wczeĹniej port do ktĂłrego podĹÄ czony jest lidar i zapisz zmiany +PoĹÄ cz siÄ ze zdalnym Ĺrodowiskiem i ĹciÄ gnij swoje repozytorium do przestrzeni roboczej catkin_ws. +# Transformacje pomiÄdzy ukĹadami wspĂłĹrzÄdnych +Przed przystÄ pieniem do omawiania nawigacji waĹźnym jest, aby rozumieÄ jak wiele ukĹadĂłw wspĂłĹrzÄdnych znajduje siÄ w platformie robotycznej, jak sÄ one ze sobÄ poĹÄ czone oraz jak okreĹlaÄ poĹoĹźenie i orientacjÄ wzglÄdem poszczegĂłlnych ukĹadĂłw wspĂłĹrzÄdnych. - +DziaĹanie zaleĹźnoĹci pomiÄdzy ukĹadami wspĂłĹrzÄdnych zostanie zwizualizowane na przykĹadzie manipulatora o 5 stopniach swobody. -Uruchom lidar wraz z wizualizacjÄ przy pomocy komendy (w tym przypadku nie potrzeba uruchamiaÄ roscore) w terminalu na maszynie zdalnej (przez program noMachine): -```bash -roslaunch rplidar_ros view_rplidar_s1.launch -``` - -Po uruchomieniu komendy powinno pojawiÄ siÄ okno programu RVIZ wraz z wizualizacjÄ danych z lidaru w postaci czerwonych punktĂłw. - - + -Przy pomocy myszki moĹźemy przemieszczaÄ siÄ i zmieniaÄ orientacjÄ kamery w wizualizacji. +W systemie ROS moĹźemy wizualizowaÄ roboty i elementy Ĺrodowiska przy pomocy opisu URDF. Na niniejszym laboratorium jednak nie zostanie on wyjaĹniony. JeĹli chcesz dowiedzieÄ jak tworzy siÄ pliki URDF i jak stworzyÄ model wĹasnego robota, to tu znajdziesz wiÄcej informacji [link](http://wiki.ros.org/urdf/Tutorials) (tutorial opisuje, jak stworzyÄ prosty model robota R2D2). -**Zadanie 2:** ZmieĹ rozmiar wyĹwietlanych punktĂłw na wiÄksze (parametr "size"), zmieĹ kolor wyĹwietlanych punktĂłw (najpierw zmieĹ parametr "color transformer" na "FlatColor", a nastÄpnie parametr "Color") +W skrĂłcie pliki URDF pozwalajÄ opisaÄ jak zĹoĹźony jest robot. Z jakich skĹada siÄ elementĂłw i jak sÄ one poĹÄ czone ze sobÄ . -Zamknij program Rviz i zatrzymaj dziaĹanie programu w konsoli **Ctrl+c** +Aby uruchomiÄ naszÄ wizualizacjÄ potrzebujemy pliku launch. -Jak mogĹeĹ juĹź zauwaĹźyÄ tym razem program w Ĺrodowisku ROS zostaĹ uruchomiony przy pomocy innej komendy niĹź dotychczas. WczeĹniej uĹźywaliĹmy komendy -```bash -rosrun <nazwa pakietu> <nazwa aplikacji> -``` -Tym razem uĹźyliĹmy komendy -```bash -roslaunch <nazwa pakietu> <nazwa pliku launch> -``` -Komenda ta uruchamia plik launch, ktĂłry pozwala uruchomiÄ wiele node'Ăłw naraz wraz z odpowiednimi parametrami. Uruchamia on rĂłwnieĹź roscore jeĹli ten nie byĹ wĹÄ czony wczeĹniej. Pliki launch bardzo uĹatwiajÄ pracÄ w ROS. WczeĹniej, aby uruchomiÄ kilka programĂłw, musieliĹmy uruchomiÄ kaĹźdy program w oddzielnej konsoli, co przy duĹźej iloĹci programĂłw wprowadzaĹo mocne zamieszanie. Przy pomocy plikĂłw launch moĹźemy uruchomiÄ wszystko przy pomocy jednej komendy. PrzykĹadowy plik launch do uruchomienia Lidaru wyglÄ da nastÄpujÄ co: -```xml -<launch> - <node name="rplidarNode" pkg="rplidar_ros" type="rplidarNode" output="screen"> - <param name="serial_port" type="string" value="/dev/ttyUSB1"/> - <param name="serial_baudrate" type="int" value="256000"/> - <param name="frame_id" type="string" value="laser"/> - <param name="inverted" type="bool" value="false"/> - <param name="angle_compensate" type="bool" value="true"/> - </node> -</launch> -``` -Jak widaÄ jest to plik **rplidar_s1.launch**, ktĂłry juĹź wczeĹniej zmodyfikowaliĹmy. Pliki launch pisane sÄ w jÄzyku xml, ktĂłry wykorzystuje znaczniki do reprezentowania danych w strukturalny sposĂłb. Plik lauch rozpoczyna siÄ i koĹczy znacznikiem o tej samej nazwie: ```xml <launch> + <param name="robot_description" command="$(find xacro)/xacro.py '$(find katana_description)/urdf/katana_300_6m180.urdf.xacro'" /> + <node pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher"> + </node> + + <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher"> + <param name="ignore_timestamp" value="false"/> + </node> + <node pkg="tf" type="static_transform_publisher" name="katana_base_link_to_box" args="0 0.5 0 0 0 0 /katana_base_link /box 100"/> </launch> ``` -WewnÄ trz tego znacznika moĹźemy uĹźyÄ wielu innych znacznikĂłw, ktĂłre odpowiednio uruchamiajÄ nody, inne pliki launch lub deklarujÄ parametry (WiÄcej informacji o znacznikach [link](http://wiki.ros.org/roslaunch/XML)). W przytoczonym pliku launch widzimy jedynie dwa warianty znacznikĂłw -```xml -<node></node> -oraz -<param> -``` -Znacznik **node** pozwala nam na uruchomienie okreĹlonego programu, wedĹug poniĹźszego schematu: -```xml -<node name="rplidarNode" pkg="rplidar_ros" type="rplidarNode" output="screen"> -</node> -``` -gdzie: -- name - dowolna nazwa jakÄ chcemy nadaÄ naszemu node'owi -- pkg - nazwa pakietu, ktĂłrym znajduje siÄ node (tak samo jak przy komendzie rosrun) -- type - nazwa programu (node'a), ktĂłry chcemy uruchomiÄ (tak samo jak przy komendzie rosrun) -- output - temu parametrowi moĹźemy nadaÄ dwie wartoĹci "log" lub "screen" ("log" jest wartoĹciÄ domyĹlnÄ ). Pozwala on na wskazanie, gdzie majÄ byÄ wyĹwietlane komunikaty wypisywane normalnie w konsoli. JeĹli wybierzemy "screen" wtedy komunikaty bÄdÄ wyĹwietlane w terminalu, jeĹli "log" to bÄdÄ zapisywane do pliku log. Ten parametr jest o tyle waĹźny, Ĺźe jeĹli uruchomimy kilka nodĂłw, ktĂłre bardzo czÄsto wypisujÄ dane w terminalu jak np. pierwsze stworzone node'y podczas pierwszego laboratorium, ktĂłre wypisywaĹy wysĹany i odebrany komunikat, to po uruchomieniu ich w jednym terminalu, komunikaty stajÄ siÄ nieczytelne z powodu ich pojawiajÄ cej siÄ iloĹci. - -Kolejne znaczniki **param** odpowiadajÄ za definicje parametrĂłw dla okreĹlonego node'a. - -- serial_port - nazwa portu USB do ktĂłrego podĹÄ czony jest lidar -- serial_baudrate - szybkoĹÄ transmisji -- frame_id - nazwa ukĹadu odniesienia dla liadru -- inverted - JeĹli lidar byĹby zamontowany do gĂłry nogami to moĹźna by odwrĂłciÄ jego orientacjÄ -- angle_compensate - tryb kompensacji kÄ ta, ktĂłry powoduje, Ĺźe kolejne pomiary sÄ przesuniÄte wzglÄdem siebie o ten sam kÄ t +ZostaĹ on juĹź stworzony w pakiecie "laboratorium_pliki_dodatkowe". -Znaczniki **param** znajdujÄ siÄ pomiÄdzy znacznikiem **node** co oznacza, Ĺźe parametry dotyczÄ tylko tego node'a, aby dowiedzieÄ jakie parametry obsĹuguje dany node naleĹźy zajrzeÄ do dokumentacji danego node'a [link](http://wiki.ros.org/rplidar). +Po pierwsze musimy zaĹadowaÄ opis naszego robota jako parametr pod nazwÄ **robot_description**. +NastÄpnie uruchamiamy trzy node'y. Pierwszy odpowiada za publikowanie stanu poszczegĂłlnych przegubĂłw robota. Po uruchomieniu zobaczysz okno z interfejsem, ktĂłry pozwoli na zmianÄ pozycji poszczegĂłlnych przegubĂłw robota. JeĹli posiadalibyĹmy prawdziwego robota, ktĂłrego chcielibyĹmy wizualizowaÄ, wtedy jego sterownik publikowaĹby aktualne stany poszczegĂłlnych przegubĂłw. -Przy uruchamianiu Lidaru wraz z wizualizacjÄ nie uruchomiliĹmy jednak pliku **rplidar_s1.launch**, a plik **view_rplidar_s1.launch**. +Kolejny node na podstawie pliku urdf oraz danych publikowanych przez **joint_state_publisher** uaktualnia pozycje wizualizowanych elementĂłw robota. -OtwĂłrz go w VSC. +Ostatni node **static_transform_publisher** publikuje staĹe przeksztaĹcenie (odsuniÄcie o 0.5 m w osi y) pomiÄdzy ukĹadem wspĂłĹrzÄdnych **katana_base_link**, a **box**. Ma on symulowaÄ poĹoĹźenie przykĹadowego elementu i posĹuĹźy do lepszego wyjaĹnienia omawianego zagadnienia. -```xml -<launch> - <include file="$(find rplidar_ros)/launch/rplidar_s1.launch" /> +Uruchom plik launch **wizualizacja_urdf** z paketu **laboratorium_pliki_dodatkowe**. NastÄpnie uruchom program RVIZ i dodaj wizualizacje modelu robota, tf oraz zmieĹ staĹy ukĹad wspĂłĹrzÄdnych na **katana_base_link**. - <node name="rviz" pkg="rviz" type="rviz" args="-d $(find rplidar_ros)/rviz/rplidar.rviz" /> -</launch> -``` -Jak widaÄ plik ten posiada znacznik, ktĂłrego jeszcze nie widzieliĹmy, czyli **include**. Znacznik ten pozwala uruchamiaÄ inne pliki launch podajÄ c do nich ĹcieĹźkÄ, dziÄki czemu moĹźemy grupowaÄ i uruchamiaÄ poszczegĂłlne funkcjonalnoĹci np. jeĹli chcielibyĹmy uruchomiÄ sam lidar wtedy uruchomilibyĹmy tylko plik **rplidar_s1.launch**, natomiast jeĹli chcielibyĹmy dodaÄ do tego wizualizacje to nie musimy kopiowaÄ zawartoĹci pliku **rplidar_s1.launch** do nowego pliku i dodawaÄ do niego uruchomienia wizualizacji tylko wystarczy uruchomiÄ pierwszy plik i wizualizacjÄ. DziÄki takiemu podejĹciu nie powielamy juĹź raz napisanego kodu, co zmniejsza moĹźliwoĹÄ pojawiania siÄ bĹÄdĂłw oraz upraszcza modyfikacjÄ. - -To co jeszcze ciekawego moĹźemy zauwaĹźyÄ w pliku **view_rplidar_s1.launch** to uĹźycie tzw. argumentu podstawienia **$(find rplidar_ros)** w znaczniku **include**: -```xml -<include file="$(find rplidar_ros)/launch/rplidar_s1.launch" /> -``` -DziÄki niemu nie musimy znaÄ ĹcieĹźki do pakietu rplidar_ros. Przy wywoĹaniu pliku **launch** ĹcieĹźka zostanie znaleziona automatycznie, wiÄc niezaleĹźnie od miejsca w ktĂłrym pakiet zostaĹ zainstalowany plik zostanie uruchomiony prawidĹowo. + -**Zadanie 3:** StwĂłrz nowy plik launch we wĹasnym pakiecie. Pliki launch standardowo znajdujÄ siÄ w folderze launch. JeĹli nie posiadasz takiego w gĹĂłwnym katalogu swojego pakietu to stwĂłrz folder o takiej nazwie. Nazwa pliku launch moĹźe byÄ dowolna. Stworzony plik ma uruchamiaÄ dwa node: **turtlesim_node** oraz **turtle_teleop_key**, gdzie pierwszy node ma wypisywaÄ komunikaty do pliku "log", natomiast drugi na terminal. Zapisz plik i uruchom go. (Pakiet nie musi byÄ skompilowany przy takiej operacji). W sprawozdaniu przedstaw zarĂłwno kod pliku launch jak i graf z programu rqt_graph (z uruchomionym plikiem launch). +**Zadanie 1:** Przy pomocy **joint_state_publisher** obrĂłÄ poszczegĂłlne przeguby robota i zobacz, jak zmienia siÄ wizualizacja. ZmieĹ staĹy ukĹad wspĂłĹrzÄdnych (Fixed frame) na wybrany ukĹad zaczynajÄ cy siÄ od nazwy **katana_motor**. SprawdĹş jak teraz zmienia siÄ wizualizacja przy ruchach przegubĂłw. -Skoro potrafimy juĹź uruchomiÄ Lidar i zwizualizowaÄ z niego dane to moĹźemy teraz przyjrzeÄ siÄ jak konkretnie te dane wyglÄ dajÄ . Node obsĹugujÄ cy lidar wysyĹa zbierane dane na topic **/scan** standardowy komendÄ **rostopic** moĹźemy sprawdziÄ jakiego typu dane pojawiajÄ siÄ na tym topicu. - - -Jak widzimy dane sÄ typu sensor_msgs/LaserScan.msg ([link](http://wiki.ros.org/rplidar) do dokumentacji) + - +Jak widaÄ robot zĹoĹźony jest z wielu ukĹadĂłw wspĂłĹrzÄdnych poĹÄ czonych ze sobÄ . KaĹźdy kolejny ukĹad wspĂłĹrzÄdnych jest zaczepiony w poprzednim i wzglÄdem niego jest okreĹlana jego pozycja. Taki sposĂłb organizacji wszystkich ukĹadĂłw wspĂłĹrzÄdnych pozwala nam w Ĺatwy sposĂłb wyliczyÄ, gdzie np. znajduje siÄ koĹcĂłwka robota wzglÄdem podstawy lub dowolnego innego obiektu np. pudeĹka o ukĹadzie wspĂłĹrzÄdnych **box**. Wszystkie poĹÄ czenia pomiÄdzy ukĹadami wspĂłĹrzÄdnych sÄ zorganizowane w postaci struktury drzewa. AktualnÄ strukturÄ moĹźemy zobaczyÄ przy pomocy narzÄdzia rqt i TF Tree. -Jest to doĹÄ zĹoĹźony typ danych opisujÄ cy scan laserowy dla lidaru 2D. Pola, ktĂłre bÄdÄ nas interesowaÄ to kolejno -- angle_min - jest to minimalny kÄ t, od ktĂłrego nasz lidar zaczyna pomiar odlegĹoĹci, w tym przypadku bÄdzie to -pi (wartoĹÄ w radianach) -- angle_max - jest to maksymalny kÄ t, na ktĂłrym nasz lidar koĹczy pomiar odlegĹoĹci, w tym przypadku bÄdzie to pi (wartoĹÄ w radianach) -- angle_increment - odlegĹoĹÄ kÄ towa pomiÄdzy dwoma kolejnymi pomiarami odlegĹoĹci -- range_min/max - po przekroczeniu tych wartoĹci dany pojedynczy pomiar odlegĹoĹci jest odrzucany -- ranges - tablica pomierzonych odlegĹoĹci (pierwszy element tablicy to pomiar dla kÄ t angle_min, natomiast kolejne to angle_min + angle_increment) +**Zadanie 2:** Uruchom program rqt przy pomocy komendy ``` rqt ``` w terminalu. NastÄpnie wĹÄ cz wizualizacje TF Tree (Plugins -> Visualization -> TF Tree). +Po uruchomieniu TF Tree moĹźesz zobaczyÄ jak caĹa struktura jest zorganizowana. Dodatkowo, dziÄki temu narzÄdziu moĹźemy sprawdziÄ czy na pewno wszystko jest ze sobÄ poĹÄ czone. JeĹli ktĂłryĹ z elementĂłw nie bÄdzie poĹÄ czony z resztÄ to dane z takiego elementu nie mogÄ byÄ odniesione do innych np. jeĹli nie wprowadzimy jak zamontowany jest lidar na robocie to bÄdziemy wiedzieÄ jak daleko znajduje siÄ przeszkoda od lidaru, ale nie bÄdziemy wiedzieÄ jak blisko znajduje siÄ od np. przedniego zderzaka robota. -**Zadanie 4:** WykorzystujÄ c poniĹźszy szablon napisz program, ktĂłry przyjmuje dane z lidaru, a nastÄpnie sprawdza czy ktĂłraĹ wartoĹÄ w tablicy **ranges** przekracza wartoĹÄ 2. JeĹli tak, to zmieĹ tÄ wartoĹÄ na 0. (WartoĹÄ range_min jest ustawiona na 0.15, dlatego wartoĹci 0 zostanÄ zignorowane przy wyĹwietlaniu). WskazĂłwka - elementy msg.ranges nie mogÄ byÄ modyfikowane wprost, dlatego stwĂłrz nowÄ tablicÄ i przepisz do niej wszystkie wartoĹci, a na koniec przypisz jÄ do msg.ranges. + +W dowolnej chwili moĹźemy sprawdziÄ aktualne przesuniÄcie (transformacje) pomiÄdzy dwoma dowolnymi ukĹadami wspĂłĹrzÄdnych. MoĹźemy to zrobiÄ przy pomocy komendy: +```bash +rosrun tf tf_echo <nazwa ukĹadu wspĂłĹrzÄdnych> <nazwa ukĹadu wspĂłĹrzÄdnych> +``` -```python -#!/usr/bin/env python + -import rospy -from sensor_msgs.msg import LaserScan + -pub = rospy.Publisher('/scan_filtered', LaserScan, queue_size=10) -def callback(data): - msg = data - ################# - #Dodaj swoj kod - #Zamien wszystkie wartosci w zmiennej msg.ranges powyzej 2 na wartosc 0 - - - ########### - pub.publish(msg) +Program tf co sekundÄ pokazuje nam odlegĹoĹÄ i zmianÄ orientacji pomiÄdzy dwoma ukĹadami wspĂłĹrzÄdnych. PrzesuniÄcie okreĹlone jest kolejno w osiach X,Y,Z. Natomiast zmiana orientacji podana jest w trzech róşnych jednostkach. -def laser_filter(): - rospy.init_node('laser_filter', anonymous=False) - rospy.Subscriber("/scan", LaserScan, callback) - rospy.loginfo("Filter started") - rospy.spin() +**Zadanie 3:** Uruchom tf_echo pomiÄdzy ukĹadami wspĂłĹrzÄdnych **katana_gripper_tool_frame** i **box**, a nastÄpnie ustaw koĹcĂłwkÄ robota na tyle blisko ukĹadu wspĂłĹrzÄdnych **box**, aby odlegĹoĹÄ w Ĺźadnej osi nie przekraczaĹa 0.2 m. +----------- -if __name__ == '__main__': - try: - laser_filter() - except rospy.ROSInterruptException: - pass +# Odometria -``` -Uruchom **view_rplidar_s1.launch** oraz stworzony node. W programie RVIZ dodaj nowy element wizualizacji +PrzechodzÄ c do pojazdĂłw, standardowa struktura ukĹadĂłw wspĂłĹrzÄdnych i ich nazewnictwo przedstawia siÄ nastÄpujÄ co: - + -**Zadanie 5:** ZmieĹ kolor wyĹwietlania danych z lidaru po filtracji, tak aby moĹźna byĹo odróşniÄ skan przed i po filtracji. +Standardowo wszystkie elementy umieszczone na robocie sÄ ostatecznie poĹÄ czone z ukĹadem **base_link**. NastÄpnie ukĹad **base_link** jest poĹÄ czony z ukĹadem **base_footprint**, ktĂłry jest rzutem na pĹaszczyznÄ ukĹadu **base_stabilized**, ale zwykle pomija siÄ ukĹad **base_stabilized** i zwykle siÄ go nie tworzy. -Zapisz konfiguracje Rviza w folderze rviz w swoim pakiecie. +Kolejne poĹÄ czenie jest tworzone pomiÄdzy **base_footprint**, a **odom**. Tym razem jest to juĹź poĹÄ czenie odpowiedzialne za lokalizacjÄ. Tak jak poprzednie ukĹady wspĂłĹrzÄdnych byĹy raczej statyczne wzglÄdem siebie, tak **base_footprint** i **odom** juĹź nie. Transformacja ta obrazuje przesuniÄcie robota wzglÄdem punktu poczÄ tkowego (poczÄ tkiem ukĹadu wspĂłĹrzÄdnych odom) i zwykle wykorzystywane sÄ do tego metody przyrostowe. Co waĹźne w systemie ROS przyjÄte jest, Ĺźe w tej transformacji nie mogÄ wystÄpowaÄ przeskoki w pozycji (pozycja musi zmieniaÄ siÄ w sposĂłb ciÄ gĹy). - +Ostatnim zaprezentowanym poĹÄ czeniem jest pomiÄdzy **odom** i **map**. To poĹÄ czenie pozwala pokazaÄ, gdzie robot znajduje siÄ na mapie. Tu mogÄ juĹź wystÄpowaÄ przeskoki w pozycji tzn. transformacja pomiÄdzy **map** i **odom** jest tak dobierana, aby koĹcowa pozycja robota wzglÄdem mapy byĹa zgodna z rzeczywistoĹciÄ (dokonuje tego zwykle algorytm SLAM). +Czasami stosuje siÄ jeszcze ukĹad wspĂłĹrzÄdnych **earth**, ktĂłra jest juĹź ostatecznym ukĹadem wspĂłĹrzÄdnych i zwykle odnosi siÄ do koordynatĂłw GPS. Ten ukĹad wspĂłĹrzÄdnych pozwala nam na odniesienie wzglÄdem siebie kilku map i przypisaÄ im rzeczywistÄ pozycjÄ na "Ĺwiecie" -**Zadanie 6:** WzorujÄ c siÄ na pliku **view_rplidar_s1.launch** napisz swĂłj plik launch, w ktĂłrym uruchomisz **rplidar_s1.launch**, swĂłj node filtrujÄ cy oraz program Rviz z zapisanÄ konfiguracjÄ wyĹwietlajÄ ce oba skany. +------ -# Tworzenie mapy pomieszczenia -Do przedstawienia procesu tworzenia map w postaci siatki zajÄtoĹci posĹuĹźymy siÄ symulacjÄ . Symulacja pozwala na swobodne poruszanie siÄ robotem po stworzonym Ĺwiecie, a co za tym idzie wiÄkszy wpĹyw na dziaĹanie algorytmu mapowania. +JeĹli znamy juĹź caĹÄ konwencjÄ tworzenia i nazewnictwa ukĹadĂłw wspĂłĹrzÄdnych, moĹźemy przejĹÄ do nawigacji zliczeniowej. +Zwykle pozycja w nawigacji zliczeniowej robotĂłw mobilnych jest okreĹlana na podstawie enkoderĂłw umieszczonych na koĹach. WiedzÄ c jak obrĂłciĹy siÄ koĹa moĹźemy obliczyÄ pozycjÄ robota na podstawie poniĹźszych wzorĂłw: - + -Na potrzeby Äwiczenia uĹźyjemy symulacji robota turtlebot3 waffle [(opis)](https://emanual.robotis.com/docs/en/platform/turtlebot3/overview/) w symulatorze [Gazebo](http://gazebosim.org/), ktĂłry jest domyĹlnym symulatorem dla Ĺrodowiska ROS. -Do przeprowadzenia symulacji robota potrzebujemy nastÄpujÄ cych pakietĂłw: -- https://github.com/ROBOTIS-GIT/turtlebot3_simulations -- https://github.com/ROBOTIS-GIT/turtlebot3 +W systemie ROS obliczaniem odometri zakmuje siÄ program obsĹugujÄ cy fizyczne enkodery, natomiast juĹź w systemie posĹugujemy siÄ wadomoĹciÄ Odometry ([dokumnetacja](http://docs.ros.org/en/melodic/api/nav_msgs/html/msg/Odometry.html)). Zawiera ona zarĂłwno aktualnÄ pozycjÄ jak i prÄdkoĹÄ. Dodatkowo oba parametry sÄ opatrzone macierzÄ kowariancji, ktĂłra reprezentuje niepewnoĹÄ kaĹźdego z pomiarĂłw. -Pakiety zostaĹy ĂłwczeĹnie zainstalowane na komputerze zdalnym. -Uruchom symulacjÄ: +Uruchom symulacjÄ robota turtlebot: ```bash export TURTLEBOT3_MODEL=waffle roslaunch turtlebot3_gazebo turtlebot3_world.launch ``` - -**Zadanie 7:** Po uruchomieniu symulacji sprawdĹş jakie topici pojawiĹy siÄ w Rosie i jak wyglÄ da rqt_graph. - -Uruchom program Rviz z odpowiedniÄ konfiguracjÄ +Uruchom RVIZ ```bash export TURTLEBOT3_MODEL=waffle roslaunch turtlebot3_gazebo turtlebot3_gazebo_rviz.launch ``` -**Zadanie 8:** Uruchom program do sterowania robotem i przemieĹÄ robota z jednego koĹca mapy na drugi. Obserwuj, jak wyglÄ da symulacja oraz dane w programie RVIZ. Po uruchomieniu programu w konsoli pojawi siÄ opis jak sterowaÄ robotem. +Uruchom program sterujÄ cy robotem ```bash export TURTLEBOT3_MODEL=waffle roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch ``` ---------- -Do stworzenia mapy pomieszczenia potrzebny jest nam algorytm SLAM. Tym razem wykoĹźystamy bardzo popularny i prosty w uĹźyciu [Gmapping](http://wiki.ros.org/gmapping) - -Do dziaĹania tego algorytmu potrzebne sÄ trzy elementy: -- Dane z Lidaru (scan 2d) -- Odometria (przemieszczenie) -- tf (przeksztaĹcenie ukĹadu wspĂłĹrzÄdnych pomiÄdzy startem odometrii, robotem, a lidarem) - -Zagadnienia zwiÄ zane z odometriÄ oraz tf zostanÄ omĂłwione w kolejnym Äwiczeniu laboratoryjnym. +**Zadanie 4:** Uruchom program rqt i zobacz, jak wyglÄ dajÄ zaleĹźnoĹci pomiÄdzy ukĹadami wspĂłĹrzÄdnych w tym robocie. -Wszystkie powyĹźsze elementy dostarcza nam symulacja, dziÄki czemu moĹźemy skupiÄ siÄ na samym mapowaniu. +PrzejdĹş do programu RVIZ, zmieĹ ustawienie widoku na **ThirdPersonFollower**, zbliĹź kamerÄ do robota. WĹÄ cz wizualizacjÄ TF i wĹÄ cz widocznoĹÄ tylko nastÄpujÄ cych ukĹadĂłw **base_link**, **base_scan**, **wheel_right_link**, **wheel_left_link**, **odom**. Zmniejsz rozmiar zwizualizowanych ukĹadĂłw wspĂłĹrzÄdnych "Marker scale", tak aby nie przysĹaniaĹy modelu robota. -Zamknij wszystkie aplikacje zwiÄ zane z ROSem (Gazebo, RVIZ itd.) + -Uruchom nowÄ symulacjÄ robota w innym Ĺrodowisku. -```bash -export TURTLEBOT3_MODEL=waffle -roslaunch turtlebot3_gazebo turtlebot3_house.launch -``` - -Uruchom Rviz -```bash -export TURTLEBOT3_MODEL=waffle -roslaunch turtlebot3_gazebo turtlebot3_gazebo_rviz.launch -``` +**Zadanie 5:** Podejrzyj co dzieje siÄ na topicu **/odom**. ObserwujÄ c robota jak i topic **/odom** przejedĹş okoĹo 1 m do przodu symulowanym robotem. -NajproĹciej, bez ustawiania parametrĂłw uruchomiÄ gmapping nastÄpujÄ co: -```bash -rosrun gmapping slam_gmapping -``` -PrzejdĹş do RVIZa i dodaj nowy element wizualizacji z zakĹadki "by topic" z topicu /map +**Zadanie 6:** ZmieĹ staĹy ukĹad wspĂłĹrzÄdnych "Fixed Frame" z **odom** na **base_scan**. PrzejedĹş ponownie robotem jakÄ Ĺ odlegĹoĹÄ w dowolnym kierunku. Jak teraz prezentowane sÄ dane w programie RVIZ? - +Podczas tworzenia mapy 3d na laboratorium nr 3 mogĹeĹ doĹwiadczyÄ dopasowywania ukĹadu wspĂłĹrzÄdnych **odom** do **map**. MoĹźesz poniĹźej zobaczyÄ odpowiadajÄ cy temu fragment mapowania. W poczÄ tkowej fazie widzimy jak jedna ze Ĺcian korytarza zbiega siÄ do drugiej, tak jakby korytarz siÄ zwÄĹźaĹ. Na kamerze moĹźemy zobaczyÄ, Ĺźe algorytm widzi tylko jednÄ ĹcianÄ. W momencie, gdy na obrazie pojawiajÄ siÄ obie, algorytm uznaje, Ĺźe znajduje siÄ w poczÄ tkowej pozycji i naprawia mapÄ. Tym samym zmieniajÄ c transformacjÄ pomiÄdzy mapÄ , a odometriÄ . Później kamery caĹy czas widzÄ znajomÄ przestrzeĹ, dlatego caĹy czas prĂłbujÄ dopasowaÄ swojÄ pozycjÄ i mapÄ, co skutkuje skakaniem ukĹadu wspĂłĹrzÄdnych **t265_odom_frame** w stosunku do ukĹadu **map** -<!-- WĹÄ czyÄ tf - zobaczyÄ map-odom --> + -**Zadanie 9:** Uruchom sterowanie robotem i przemieszczajÄ c siÄ po Ĺrodowisku, obserwuj jak w programie RVIZ tworzy siÄ mapa danego Ĺrodowiska. Zmapuj co najmniej jedno pomieszczenie. -```bash -export TURTLEBOT3_MODEL=waffle -roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch -``` +------ -JeĹli uznamy, Ĺźe stworzona mapa jest juĹź kompletna albo wystarczajÄ ca to moĹźemy jÄ zapisaÄ poleceniem (mapa musi zostaÄ zapisana przed zamkniÄciem terminalu z aplikacjÄ gmapping. JeĹli zamkniemy jÄ wczeĹniej to mapa bÄdzie dalej wyĹwietlana w RVIZ jednak nie bÄdzie juĹź moĹźliwoĹci jej zapisu): +# Orientacja -```bash -rosrun map_server map_saver -f <ĹcieĹźka zapisu i nazwa mapy> -``` - + -**Zadanie 10:** Zobacz jakie pliki zostaĹy stworzone w podanym katalogu i co zawiera kaĹźdy z plikĂłw. +OprĂłcz pozycji czÄsto potrzebujemy rĂłwnieĹź orientacji robota. OrientacjÄ w trzech osiach moĹźemy uzyskaÄ dziÄki Ĺźyroskopowi, akcelerometrowi i magnetometrowi. Magnetometr jest bardzo podatny na zakĹĂłcenia, szczegĂłlnie w pomieszczeniach i wymaga dobrej kalibracji, aby dziaĹaĹ poprawnie. Z tego powodu zwykle uĹźywa siÄ jedynie Ĺźyroskopu i akcelerometru. Akcelerometr pozwala nam wyliczyÄ dokĹadny kÄ t Pitch i Roll na podstawie wektora grawitacji jednak tylko przy wolniejszych zmianach. DziÄki Ĺźyroskopowi jesteĹmy w stanie natomiast nadÄ ĹźaÄ, za szybkimi zmianami jednak wyliczanie orientacji na jego podstawie polega na caĹkowaniu prÄdkoĹci kÄ towych w kaĹźdej osi, co skutkuje ciÄ gle narastajÄ cym bĹÄdem. ĹÄ czÄ c dane z akcelerometru i Ĺźyroskopu moĹźemy ĹledziÄ szybkie zmiany orientacji, a zarazem zniwelowaÄ narastajÄ ce bĹÄdy dziÄki wektorowi grawitacji, ale niestety odnosi siÄ to tylko do kÄ tĂłw Roll i Pitch, poniewaĹź obrĂłt w osi Z (kÄ t Yaw) nie wpĹywa na odczyt wektora grawitacji. Z tego powodu kÄ t Yaw uzyskuje siÄ jedynie z Ĺźyroskopu i jest on obarczony narastajÄ cym bĹÄdem. Aby zniwelowaÄ ten bĹÄ d uĹźywa siÄ magnetometru, ktĂłry wskazuje biegun magnetyczny ziemi. MoĹźna rĂłwnieĹź wykorzystaÄ inne metody okreĹlania kÄ ta Yaw, jak np. uĹźycie dwĂłch odbiornikĂłw GPS zamontowanych na dwĂłch kraĹcach pojazdu. +W nastÄpnym Äwiczeniu posĹuĹźymy siÄ sterownikiem pixhawk, ktĂłry zostaĹ podĹÄ czony do komputera przewodem USB. -Jak widaÄ uruchomienie algorytmu SLAM byĹo bardzo proste. JeĹli chcemy uruchomiÄ gmapping z innymi parametrami niĹź domyĹlne, to najlepiej stworzyÄ plik launch np.: -```xml -<launch> - <arg name="scan_topic" default="scan" /> - - <node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen"> - <param name="base_frame" value="base_footprint"/> - <param name="odom_frame" value="odom"/> - <param name="map_update_interval" value="5.0"/> - <param name="maxUrange" value="6.0"/> - <param name="maxRange" value="8.0"/> - <param name="sigma" value="0.05"/> - <param name="kernelSize" value="1"/> - <param name="lstep" value="0.05"/> - <param name="astep" value="0.05"/> - <param name="iterations" value="5"/> - <param name="lsigma" value="0.075"/> - <param name="ogain" value="3.0"/> - <param name="lskip" value="0"/> - <param name="minimumScore" value="100"/> - <param name="srr" value="0.01"/> - <param name="srt" value="0.02"/> - <param name="str" value="0.01"/> - <param name="stt" value="0.02"/> - <param name="linearUpdate" value="0.1"/> - <param name="angularUpdate" value="0.5"/> - <param name="temporalUpdate" value="-1.0"/> - <param name="resampleThreshold" value="0.5"/> - <param name="particles" value="30"/> - <param name="xmin" value="-5.0"/> - <param name="ymin" value="-5.0"/> - <param name="xmax" value="5.0"/> - <param name="ymax" value="5.0"/> - - <param name="delta" value="0.05"/> - <param name="llsamplerange" value="0.01"/> - <param name="llsamplestep" value="0.01"/> - <param name="lasamplerange" value="0.005"/> - <param name="lasamplestep" value="0.005"/> - <remap from="scan" to="$(arg scan_topic)"/> - </node> -</launch> -``` -WyjaĹnienie wszystkich parametrĂłw moĹźna znaleĹşÄ w dokumnetacji [Gmapping](http://wiki.ros.org/gmapping). + -JeĹli chcielibyĹmy uĹźyÄ tego algorytmu na wĹasnym robocie to musielibyĹmy zadbaÄ o trzy elementy, ktĂłre byĹy wymienione wczeĹniej. Parametry, ktĂłre za te elementy odpowiadajÄ to -- scan (topic na ktĂłrym pojawiajÄ siÄ scany 2d z lidaru) -- odom_frame (nazwa ukĹadu wspĂłĹrzÄdnych odometrii) -- base_frame (nazwa ukĹadu wspĂłĹrzÄdnych robota) +Na kontrolerze pixhawk zainstalowane jest oprogramowanie Ardupilot, pozwalajÄ ce na sterowanie pojazdami autonomicznymi ([dokumentacja](https://ardupilot.org/ardupilot/)). -JeĹli robot jest stworzony w sposĂłb standardowy to ukĹady wspĂłĹrzÄdnych powinny mieÄ domyĹlne nazwy, jednak nie zawsze tak jest. +Istnieje wiele akcesoriĂłw do ukĹadu pixhawk, ktĂłre zwiÄkszajÄ jego moĹźliwoĹci jak: +- odbiornik RC +- GPS +- ZewnÄtrzny magnetometr +- Radiokomunikacja +- ... -Z parametrĂłw, ktĂłre warto wymieniÄ to np. -- maxUrange i maxRange - maksymalny uĹźyteczny i maksymalny rzeczywisty zasiÄg Lidaru. W przypadku RPLidar S1 maksymalny zasiÄg wynosi 40 m, natomiast wartoĹÄ uĹźytecznÄ dla tego lidaru moĹźna ustawiÄ np. na 20 m. -- delta - rozdzielczoĹÄ mapy (domyĹlnie 1 pixel to kwadrat 5x5 cm) -- linearUpdate i angularUpdate - odlegĹoĹÄ liniowa i kÄ towa po przejechaniu, ktĂłrej zaktualizowana zostanie mapa. +Na pokĹadzie pixhawka mamy do dyspozycji Ĺźyroskop, akcelerometr, magnetometr oraz barometr. Na potrzeby tego Äwiczenia wykorzystamy akcelerometr i Ĺźyroskop, aby okreĹliÄ orientacjÄ kontrolera. -**Zadanie 11:** StwĂłrz plik launch w swoim pakiecie zawierajÄ cy ustawienia przedstawione powyĹźej, zmieĹ parametry delta, linearUpdate i map_update_interval. Zaobserwuj zmiany w dziaĹaniu algorytmu. +Aby odczytaÄ dane z kontrolera moĹźemy wykorzystaÄ dwie metody: +- program stacji bazowej np. [QGroundControl](http://qgroundcontrol.com/) czy [Mission Planner](https://ardupilot.org/planner/). W przypadku systemu Windows zalecam uĹźywanie programu Mission Planner, poniewaĹź posiada on duĹźo uĹźytecznych funkcjonalnoĹci. Niestety jest on dostÄpny jedynie na systemy Windows, dlatego na potrzeby laboratorium uĹźyjemy QGroundControl. Nie mniej jednak program QGroundControl jest rĂłwnieĹź bardzo uĹźytecznym programem, a zainstalowaÄ moĹźemy go nawet na telefonie z systemem Android. +- bezpoĹrednio przy pomocy protokoĹu mavlink. TÄ metodÄ stosuje siÄ, gdy do sterownika podĹÄ czamy komputer, ktĂłry ma nadzorowaÄ jego pracÄ i wydawaÄ mu komendy, tak jak w naszym przypadku. -Zamknij wszystkie aplikacje +Najpierw rozpoczniemy pracÄ od programu QGroundControl. Zwykle uĹźywa siÄ go przy poczÄ tkowej konfiguracji pojazdu, a nastÄpnie do zdalnego monitorowania autonomicznej misji misji. -------- +Uruchom program QGroundControl ZnajdujÄ cy siÄ na pulpicie komputera zdalnego. -# Kamery Realsense + - - -Przedmiotem kolejnej czÄĹci Äwiczenia bÄdzie tworzenie map 3d z wykorzystaniem kamery gĹÄbi. Do realizacji celu posĹuĹźÄ nam dwie kamery: -- realsense t265 - kamera stereowizyjna z ukĹadem logicznym realizujÄ ca slam wizyjny pozwalajÄ ca na uzyskanie pozycji i orientacji kamery. Test kamery [link](https://www.youtube.com/watch?v=mrdegXnG_no). +Najpierw program ĹÄ czy siÄ z kontrolerem Pixhawk i ĹciÄ ga jego aktualnÄ konfiguracjÄ. W naszym przypadku uzyskamy komunikat, iĹź pojazd jest nie zdolny do dziaĹania, poniewaĹź nie zostaĹy podĹÄ czone kluczowe komponenty. Do prawidĹowego dziaĹania potrzebne jest zdalne poĹÄ czenie przez Radio RC oraz GPS. -- realsense d435 - Kamera stereowizyjna z projektorem ĹwiatĹa podczerwonego. Pozwala na uzyskanie informacji o gĹÄbi w obrazie. Test kamery [link](https://www.youtube.com/watch?v=UgwHXH-jT0U). +PrzejdĹş do widoku mapy. + +JeĹli mielibyĹmy podĹÄ czony GPS, wiedzielibyĹmy aktualnÄ pozycjÄ naszego pojazdu. W prawym gĂłrnym rogu moĹźna zauwaĹźyÄ kilka podstawowych parametrĂłw jak orientacja w trzech osiach, wysokoĹÄ, prÄdkoĹÄ czy czas lotu. -W odróşnieniu od peryferiĂłw, ktĂłre byĹy wykorzystywane wczeĹniej (Lidar, arduino) komunikacja z kamerami nie jest realizowana przez serial port tylko przez sterownik usb. Do obsĹugi kamer potrzebujemy nastÄpujÄ cego oprogramowania i sterownikĂłw: -- https://github.com/IntelRealSense/realsense-ros +MoĹźemy teĹź dodaÄ szybki podglÄ d dowolnego parametru klikajÄ c na koĹo zÄbate koĹo napisu **Valuse** -Oprogramowanie jest juĹź zainstalowane, dziÄki czemu moĹźemy od razu uruchomiÄ program testowy dostarczony przez producenta. Uruchom go w terminalu: -```bash -realsense-viewer -``` - +**Zadanie 7:** Dodaj do podglÄ du trzy parametry Roll, Pitch i Heading. -**Zadanie 12:** WĹÄ cz obie kamery i zaobserwuj dane w widoku 2d i 3d. -SprawdĹş i zapisz numer seryjny obu kamer, ktĂłre bÄdÄ potrzebne za chwilÄ przy uruchamianiu ich w Ĺrodowisku ros (odczytywanie numeru seryjnego przedstawiono rĂłwnieĹź na powyĹźszym gifie). +Parametry moĹźemy rĂłwnieĹź wyĹwietlaÄ w formie wykresĂłw, przechodzÄ c do zakĹadki Analyze -Aby uruchomiÄ obie kamery w Ĺrodowisku ROS potrzebujemy pliku launch, takiego jak poniĹźej: -```xml -<launch> - <arg name="device_type_camera1" default="t265"/> - <arg name="device_type_camera2" default="d4.5"/> - <arg name="serial_no_camera1" default=""/> <!-- Note: Replace with actual serial number --> - <arg name="serial_no_camera2" default=""/> <!-- Note: Replace with actual serial number --> - <arg name="camera1" default="t265"/> - <arg name="camera2" default="d400"/> - <arg name="tf_prefix_camera1" default="$(arg camera1)"/> - <arg name="tf_prefix_camera2" default="$(arg camera2)"/> - <arg name="initial_reset" default="false"/> - <arg name="enable_fisheye" default="true"/> - <arg name="color_width" default="640"/> - <arg name="color_height" default="480"/> - <arg name="depth_width" default="640"/> - <arg name="depth_height" default="480"/> - <arg name="clip_distance" default="-2"/> - <arg name="topic_odom_in" default="odom_in"/> - <arg name="calib_odom_file" default=""/> + - - - <group ns="$(arg camera1)"> - <include file="$(find realsense2_camera)/launch/includes/nodelet.launch.xml"> - <arg name="serial_no" value="$(arg serial_no_camera1)"/> - <arg name="device_type" value="$(arg device_type_camera1)"/> - <arg name="tf_prefix" value="$(arg tf_prefix_camera1)"/> - <arg name="initial_reset" value="$(arg initial_reset)"/> - <arg name="enable_fisheye1" value="$(arg enable_fisheye)"/> - <arg name="enable_fisheye2" value="$(arg enable_fisheye)"/> - <arg name="topic_odom_in" value="$(arg topic_odom_in)"/> - <arg name="calib_odom_file" value="$(arg calib_odom_file)"/> - <arg name="fisheye_fps" default="30"/> - <arg name="gyro_fps" default="200"/> - <arg name="accel_fps" default="62"/> - <arg name="enable_gyro" default="true"/> - <arg name="enable_accel" default="true"/> - <arg name="enable_pose" default="true"/> - - <arg name="enable_sync" default="false"/> - - <arg name="linear_accel_cov" default="0.01"/> - <arg name="unite_imu_method" default=""/> - - <arg name="publish_odom_tf" default="true"/> - - </include> - </group> - - <group ns="$(arg camera2)"> - <include file="$(find realsense2_camera)/launch/includes/nodelet.launch.xml"> - <arg name="serial_no" value="$(arg serial_no_camera2)"/> - <arg name="device_type" value="$(arg device_type_camera2)"/> - <arg name="tf_prefix" value="$(arg tf_prefix_camera2)"/> - <arg name="initial_reset" value="$(arg initial_reset)"/> - <arg name="align_depth" value="true"/> - <arg name="filters" value="pointcloud"/> - <arg name="color_width" value="$(arg color_width)"/> - <arg name="color_height" value="$(arg color_height)"/> - <arg name="depth_width" value="$(arg depth_width)"/> - <arg name="depth_height" value="$(arg depth_height)"/> - <arg name="clip_distance" value="$(arg clip_distance)"/> - </include> - </group> - <node pkg="tf" type="static_transform_publisher" name="t265_to_d400" args="0 0.0168 0.03 0 0 0 /$(arg tf_prefix_camera1)_link /$(arg tf_prefix_camera2)_link 100"/> - - <node pkg="depthimage_to_laserscan" type="depthimage_to_laserscan" name="depthimage_to_laserscan"> - <remap from="image" to="/$(arg camera2)/aligned_depth_to_color/image_raw"/> - <remap from="camera_info" to="/$(arg camera2)/depth/camera_info"/> - <remap from="scan" to="/scan"/> - <param name="output_frame_id" value="$(arg camera2)_depth_frame"/> - <param name="range_max" type="double" value="4"/> - <param name="range_min" type="double" value="0.2"/> - <param name="scan_time" type="double" value="0.033"/> - <param name="scan_height" type="double" value="100"/> - </node> +Po dodaniu Parametru do wykresu moĹźemy zauwaĹźyÄ, Ĺźe jego zmiany sÄ bardzo skokowe. Jest to spowodowane maĹÄ czÄstotliwoĹciÄ wysyĹania tego parametry przez kontroler. AktualnÄ czÄstotliwoĹÄ odĹwieĹźania moĹźemy zobaczyÄ po lewej stronie przy nazwie grupy parametrĂłw. -</launch> -``` -W powyĹźszym pliku moĹźemy zauwaĹźyÄ nowy znacznik "group". Pozwala on odseparowaÄ parametry jednej kamery od drugiej. Jest to konieczne, poniewaĹź w plikach launch uruchamianych w znacznikach "include" argumenty majÄ takÄ samÄ nazwÄ np. "serial_no". Gdyby nie grupowanie to po uruchomieniu drugiej kamery parametry pierwszej zostaĹyby zmienione. + -Wszystkie parametry moĹźliwe do ustawienia moĹźemy znaleĹşÄ tu [link](https://github.com/IntelRealSense/realsense-ros), w podpunkcie "Launch parameters". +CzÄstotliwoĹÄ odĹwieĹźania moĹźemy zmieniÄ w ustawieniach w zakĹadce MAVLink: -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". +(JeĹli jest wyĹÄ czony to uruchom wiatrak na stronie zarzÄ dzania niniejszym laboratorium [link](http://153.19.49.102:5000) (ZakĹadka sterowanie. Po wĹÄ czeniu wiatraka sprawdĹş na kamerze), aby moduĹy zaczÄĹy siÄ poruszaÄ. WyĹÄ cz go po zakoĹczeniu Äwiczenia) + +**Zadanie 8:** WyĹwietl na wykresie trzy prÄdkoĹci kÄ towe (xgyro, ygyro, zgyro) i zaobserwuj, jak wyglÄ dajÄ wskazania przed zmianÄ i po zmianie czÄstotliwoĹci odĹwieĹźania. -**Zadanie 13:** StwĂłrz plik launch uruchamiajÄ cy obie kamery w swoim pakiecie. UzupeĹnij powyĹźszy plik o odpowiednie numery seryjne kamer (w czwartej i piÄ tej linii, gdzie kamera1 to kamera t265, a kamera2 to kamera d400). -Uruchom stworzony plik oraz Rviz. W programie Rviz otwĂłrz konfiguracjÄ "test_kamer.rviz" z pakietu "laboratorium_pliki_dodatkowe" w folderze "catkin_ws/src". - +Ostatnim waĹźnym aspektem moĹźliwoĹÄ programu QGroundControl jest moĹźliwoĹÄ konfiguracji ustawieĹ pojazdu. PoniĹźej zaprezentowano zmianÄ parametru opisujÄ cego typ uĹźywanych sterownikĂłw silnikĂłw **MOT_PWM_TYPE**. **UmiejÄtnoĹÄ konfiguracji pojazdu bÄdzie prawdopodobnie niezbÄdna przy realizacji zadaĹ projektowych.** - -W konfiguracji zostaĹy przedstawione obrazy z dwĂłch kamer. Jak widaÄ kamera t265 jest wyposaĹźona w obiektyw rybie oko, dziÄki czemu ma duĹźo wiÄksze pole widzenia. W Ĺrodkowej czÄĹci programu widoczna jest chmura punktĂłw uzyskana z kamery gĹÄbi, ktĂłrÄ moĹźna obejrzeÄ z róşnych stron zmieniajÄ c widok kamery przy pomocy myszki. + -**Zadanie 14:** Uruchom program na arduino do sterowania serwem. Ustaw flagÄ w pozycji pionowej i zobacz czy flaga pojawiĹa siÄ w chmurze punktĂłw. -W programie Rviz znajduje siÄ narzÄdzie measure dziÄki ktĂłremu moĹźemy zmierzyÄ odlegĹoĹci w scenie. Przy dokonywaniu pomiaru najlepiej zmieniÄ styl wyĹwietlania chmury punktĂłw. Po zmianie stylu na punkty, krawÄdĹş obiektu jest lepiej widoczna i moĹźna dokonaÄ lepszego pomiaru. +Zamknij program QGroundControl +---------- - +Po doĹwiadczeniach z programem QGroundControl teraz poĹÄ czymy siÄ z kontrolerem Pixhawk przy pomocy Ĺrodowiska ROS i protokoĹu MavLink. -**Zadanie 15:** UĹźywajÄ c narzÄdzia measure, zmierz szerokoĹÄ uniesionej flagi. +Aby byĹo to moĹźliwe potrzebujemy pakietu mavros ([dokumntacja](http://wiki.ros.org/mavros)), ktĂłry zostaĹ juĹź zainstalowwany na komputerach zdalnych. ---------- +PrzykĹadowy plik launch pozwalajÄ cy uruchomiÄ poĹÄ czenie z pixhawkiem wyglÄ da nastÄpujÄ co: -# Tworzenie mapy 3d +```xml +<launch> + <arg name="fcu_url" default="/dev/ttyACM0:921600" /> + <arg name="gcs_url" default="" /> + <arg name="tgt_system" default="1" /> + <arg name="tgt_component" default="1" /> + <arg name="log_output" default="screen" /> + <arg name="fcu_protocol" default="v2.0" /> + <arg name="respawn_mavros" default="false" /> + + <include file="$(find mavros)/launch/node.launch"> + <arg name="pluginlists_yaml" value="$(find mavros)/launch/apm_pluginlists.yaml" /> + <arg name="config_yaml" value="$(find mavros)/launch/apm_config.yaml" /> + <arg name="fcu_url" value="$(arg fcu_url)" /> + <arg name="gcs_url" value="$(arg gcs_url)" /> + <arg name="tgt_system" value="$(arg tgt_system)" /> + <arg name="tgt_component" value="$(arg tgt_component)" /> + <arg name="log_output" value="$(arg log_output)" /> + <arg name="fcu_protocol" value="$(arg fcu_protocol)" /> + <arg name="respawn_mavros" value="$(arg respawn_mavros)" /> + </include> +</launch> +``` -Do przygotowania mapy 3d tak samo jak w przypadku mapy 2d potrzebowaliĹmy algorytmu slam. Tym razem uĹźyjemy rtabmap: -- http://introlab.github.io/rtabmap/ -- http://wiki.ros.org/rtabmap_ros +To co pojawia siÄ przy kaĹźdym podĹÄ czeniu nowego urzÄ dzenia do komputera to koniecznoĹÄ sprawdzenia portu, do ktĂłrego zostaĹo ono przypisane. SprawdĹş port do ktĂłrego zostaĹ podpiÄty pixhawk. Nazwa powinna rozpoczynaÄ siÄ od **usb-ArduPilot_fmuv3**. -Jest to slam przeznaczony typowo dla kamer gĹÄbi (RGB-D). Ze wzglÄdu zdalnej natury przeprowadzanego laboratorium nie ma moĹźliwoĹci na swobodnÄ manipulacjÄ kamerami i stworzenia mapy dowolnej przestrzeni, dlatego prezentowane sÄ metody pracy z danym nie pobieranymi z czujnikĂłw w czasie rzeczywistym. W przypadku lidaru 2d i mapy 2d zaprezentowane byĹo podejĹcie symulacyjne. Tym razem przedstawione zostanie uĹźycie prawdziwych danych z rzeczywistych czujnikĂłw, ktĂłre zostaĹy zapisane wczeĹniej. To podejĹcie pozwala wielokrotnie pracowaÄ na tych samych rzeczywistych pomiarach i testowaÄ róşnego typu algorytmy. + -W systemie ROS do zapisu danych uĹźywa siÄ plikĂłw bag [link](http://wiki.ros.org/rosbag). Rosbag pozwala na nagrywanie i późniejsze odtwarzanie wybranych topicĂłw oraz wiadomoĹci, ktĂłre siÄ na nich pojawiajÄ . Jak juĹź wczeĹniej byĹo wspomniane jest to Ĺwietne narzÄdzie do testowania algorytmĂłw oraz analizy dziaĹania robota (wyszukiwania bĹÄdĂłw itp.). -Z plikami bag moĹźna pracowaÄ przy pomocy dwĂłch narzÄdzi do odtwarzania, analizy i nagrywania danych: -- rqt_bag - narzÄdzie graficzne -- rosbag - narzÄdzie konsolowe +**Zadanie 9:** StwĂłrz plik launch we wĹasnym pakiecie zmieniajÄ c jedynie parametr **fcu_url** zgodnie ze znalezionym portem przy pomocy komendy **ls** (zostaw liczbÄ 921600 po znaku ":", jest to prÄdkoĹÄ przesyĹania danych). -Uruchom roscore oraz rqt_bag. -Stworzony plik bag znajduje siÄ w pakiecie "laboratorium_pliki_dodatkowe" w folderze bagfiles. +Po uruchomieniu stworzonego pliku powinno pojawiÄ siÄ wiele topicĂłw udostÄpnionych przez mavros z danymi z naszego kontrolera. Wszystkie sÄ opisane w [dokumntacji](http://wiki.ros.org/mavros). - + -Po zaĹadowaniu pliku pokazaĹy siÄ wszystkie topici, ktĂłre zostaĹy zapisane w pliku. Po prawej stronie znajdujÄ siÄ osie czasu po zbliĹźeniu ktĂłrych widzimy poszczegĂłlne wiadomoĹci. MoĹźemy podejrzeÄ dane na topicu klikajÄ c na nim prawym przyciskiem myszki i wybierajÄ c opcjÄ view. W zaleĹźnoĹci od danych jest kilka moĹźliwych wariantĂłw podglÄ du. -- raw - podglÄ d poszczegĂłlnych wiadomoĹci, podobnie jak rostopic echo -- plot - wykreĹlenie caĹego przebiegu wybranych wartoĹci z wiadomoĹci -- image - w przypadku obrazu z kamery moĹźliwe jest podejrzenie poszczegĂłlnych klatek +PosiadajÄ c dostÄp do danych moĹźemy zajÄ Ä siÄ przedmiotem tego Äwiczenia, czyli obliczeniem orientacji naszego kontrolera, a potencjalnie robota/pojazdu. Po pierwsze potrzebne sÄ nam dane z Ĺźyroskopu i akcelerometru. SÄ one dostÄpne na topicu **/mavros/imu/data_raw**. WiadomoĹci na tym topicu sÄ typu [sensor_msgs/Imu](http://docs.ros.org/en/melodic/api/sensor_msgs/html/msg/Imu.html) i standardowo zawierajÄ orientacjÄ (w tym przypadku jej nie ma, poniewaĹź sÄ wysyĹane na tym topicu tylko dane z Ĺźyroskopu i akcelerowmetru), przyspieszenia liniowe w trzech osiach oraz prÄdkoĹci kÄ towe w trzech osiach. -**Zadanie 16:** Podejrzyj dane na topicu d400/color/image_raw oraz t265/odom/sample. Pierwszy topic podejrzyj w trybie image (view -> image), natomiast drugi w trybie plot. Zmaksymalizuj okno rqt_bag, powiÄksz okno wykresu plot przeciÄ gajÄ c jego krawÄdĹş w lewÄ stronÄ. W oknie plot po prawej stronie jest wyĹwietlana struktura wiadomoĹci odom. WyĹwietl pozycjÄ x i y (pose -> pose -> position -> x/y). Lewym przyciskiem myszki moĹźesz zmieniaÄ pozycjÄ czasu na osi. Zaobserwuj, jak zmieniajÄ siÄ klatki filmu z kamery oraz jak zmienia siÄ pozycja pionowej czerwonej osi na wykresie plot. Dodatkowo moĹźesz uruchomiÄ odtwarzanie wiadomoĹci w czasie ciÄ gĹym klikajÄ c zielonÄ strzaĹkÄ bÄdÄ cÄ 7 opcjÄ na panelu w lewym gĂłrnym rogu ekranu + -Niestety odtwarzanie plikĂłw bag z programu rqt_bag tak aby wiadomoĹci byĹy widziane w systemie ROS nie jest efektywne, dlatego zamknij program rqt_bag. Do odtworzenia posĹuĹźymy siÄ narzÄdziem konsolowym rosbag. +Przy przetwarzaniu tego typu danych waĹźna jest czÄstotliwoĹÄ publikowania danych. MoĹźemy jÄ sprawdziÄ przy pomocy komendy: -OtwĂłrz terminal i przejdĹş do katalogu zawierajÄ cego plik bag, ktĂłry otwieraĹeĹ przed chwilÄ . Tak samo jak przy pomocy rqt_bag i przy uĹźyciu rosbag moĹźemy dowiedzieÄ siÄ podstawowych informacji o pliku. -UĹźyj komendy: ```bash -rosbag info <nazwa pliku> +rostopic hz <nazwa topicu> ``` + - +SprawdĹş jak czÄsto pojawiajÄ siÄ wiadomoĹci na tym topicu. DomyĹlnie dane wysyĹane sÄ z czÄstotliwoĹciÄ 2 Hz. Aby algorytm okreĹlajÄ cy dziaĹaĹ poprawnie potrzebujemy danych znacznie czÄĹciej. IdeaĹem byĹyby informacje dostarczane z czÄstotliwoĹciÄ 200 Hz lub wyĹźszÄ . Wtedy Ĺledzenie orientacji byĹoby bardzo pĹynne i pojawiaĹyby siÄ mniejsze bĹÄdy. Pixhawk, z domyĹlnym firmwarem ardupilot rover jest w stanie wysyĹaÄ dane z sensorĂłw z maksymalnÄ czÄstotliwoĹciÄ ok 40 Hz. Nie jest to wartoĹÄ idealna jednak juĹź wystarczajÄ ca, aby wyznacza orientacja byĹa uĹźyteczna. -Jak widzimy otrzymaliĹmy informacje o czasie trwania pliku, kiedy byĹ nagrywany, wielkoĹci pliku, ale co najwaĹźniejsze widzimy jakie topici zostaĹy nagrane oraz jakiego typu wiadomoĹci siÄ na nich znajdujÄ . +Aby zmieniÄ czÄstotliwoĹÄ wysyĹanych danych musimy uĹźyÄ komendy: -JeĹli chcemy otworzyÄ plik bag ze wszystkimi topicami to musimy uĹźyÄ komendy: ```bash -rosbag play <nazwa pliku> +rosrun mavros mavsys rate <nazwa grupy danych> <czÄstotliwoĹÄ> ``` - -UĹźywajÄ c przycisku **spacja** moĹźemy zatrzymywaÄ odtwarzanie pliku. +Aby zmieniÄ czÄstotliwoĹÄ wysyĹania surowych danych z sensorĂłw musimy uĹźyÄ komendy: -W przypadku kiedy chcemy aby odtwarzaĹy siÄ jedynie wybrane topici wtedy komenda powinna wyglÄ daÄ nastÄpujÄ co ```bash -rosbag play <nazwa pliku> --topics <topic 1> <topic 2 ...> +rosrun mavros mavsys rate --raw-sensors 40 ``` -rosbag posiada jeszcze wiele róşnych moĹźliwoĹci jak przyspieszanie i opóźnianie odtwarzania plikĂłw. Wszystkie dostÄpne moĹźliwoĹci moĹźna sprawdziÄ w dokumnetacji [link](http://wiki.ros.org/rosbag/Commandline) - -**Zadanie 17:** OdtwĂłrz plik bag, ktĂłry otwieraĹeĹ w rqt_bag, przy pomocy rosbag. Podczas odtwarzania, otwĂłrz program RVIZ i podejrzyj obraz z kamery (topic - /t265/fisheye1/image_raw) i zmieniajÄ cÄ siÄ pozycjÄ kamery (topic - /t265/odom/sample). Oba elementy moĹźesz dodaÄ do widoku RVIZa przez Add -> by topic -> nazwa topica - ------ - -PosiadajÄ c juĹź dane na ktĂłrych moĹźemy uĹźyÄ algorytmu slam, moĹźemy zajÄ Ä siÄ przygotowaniem pliku launch do jego uruchomienia. Plik launch do uruchamiania samego algorytmu wyglÄ da nastÄpujÄ co: - -```xml -<launch> - <arg name="camera1" default="t265"/> - <arg name="camera2" default="d400"/> - <node name="rtabmap" pkg="rtabmap_ros" type="rtabmap" output="screen" args="--delete_db_on_start"> - <param name="frame_id" type="string" value="/$(arg camera2)_link"/> - - <param name="subscribe_depth" type="bool" value="true"/> - <param name="subscribe_scan" type="bool" value="true"/> - - <remap from="odom" to="/$(arg camera1)/odom/sample"/> - <remap from="scan" to="/scan"/> - - <remap from="rgb/image" to="/$(arg camera2)/color/image_raw"/> - <remap from="depth/image" to="/$(arg camera2)/aligned_depth_to_color/image_raw"/> - <remap from="rgb/camera_info" to="/$(arg camera2)/color/camera_info"/> - - <param name="queue_size" type="int" value="200"/> - - <!-- RTAB-Map's parameters --> - <param name="RGBD/ProximityBySpace" type="string" value="false"/> - <param name="RGBD/AngularUpdate" type="string" value="0.01"/> - <param name="RGBD/LinearUpdate" type="string" value="0.01"/> - <param name="RGBD/OptimizeFromGraphEnd" type="string" value="false"/> - <param name="Reg/Force3DoF" type="string" value="true"/> - <param name="Vis/MinInliers" type="string" value="12"/> - <param name="RGBD/OptimizeMaxError" type="string" value="0.1"/> - </node> - -</launch> -``` -DziÄki tak stworzonemu plikowi moglibyĹmy uruchomiÄ algorytm rtabmap przy uĹźyciu rzeczywistych sensorĂłw. JeĹli uĹźywamy plik bag musimy zadbaÄ o jeszcze jednÄ rzecz. JeĹli uruchomilibyĹmy powyĹźszy plik z danymi odtwarzanymi z pliku bag to algorytm zwrĂłciĹby bĹÄ d o braku aktualnych danych. Jest to spowodowane róşnicÄ pomiÄdzy aktualnym czasem, a czasem zawartym w wiadomoĹciach. WiÄkszoĹÄ wiadomoĹci w systemie ROS posiada nagĹĂłwek, w ktĂłrym zawarta jest informacja w jakiej chwili dany pomiar/wiadomoĹÄ zostaĹ wysĹany/stworzony/zmierzony tzw. timestamp. Skoro odtwarzamy nasze wiadomoĹci to ich timestamp moĹźe byÄ nawet z przed kilku dni. Natomiast algorytm wymaga, aby dane byĹy nie starsze niĹź 5s. Aby rozwiÄ zaÄ ten problem uĹźyjemy czasu symulowanego. Podczas symulacji oraz odtwarzania danych symulacja czasu pozwala nie tylko przyspieszaÄ czy zwalniaÄ czas, ale rĂłwnieĹź rozpoczynaÄ wielokrotnie danÄ sekwencjÄ od staĹego punktu w czasie. +**Zadanie 10:** ZmieĹ czÄstotliwoĹÄ wysyĹania danych z sensorĂłw i sprawdĹş komendÄ ```rostopic hz```, czy dane rzeczywiĹcie przychodzÄ czÄĹciej. -W systemie ROS, gdy chcemy uĹźywaÄ czasu symulowanego potrzebujemy dwĂłch rzeczy: -- ustawiÄ parametr "use_sim_time" na true -- oraz zapewniÄ program, ktĂłry bÄdzie publikowaĹ symulowany czas na topic /clock +Do obliczenia orientacji robota posĹuĹźymy siÄ filtrem madgwica, ktĂłry byĹ omawiany podczas wykĹadĂłw [wiÄcej_informacji](https://x-io.co.uk/open-source-imu-and-ahrs-algorithms/). Zwykle wiÄkszoĹÄ popularnych filtrĂłw/algorytmĂłw jest juĹź dostÄpna w formie pakietĂłw w systemie ROS i nie inaczej jest w tym przypadku. Filtr madwicka znajdziemy w pakiecie imu_tools->imu_filter_madgwick [dokumentacja](http://wiki.ros.org/imu_filter_madgwick?distro=melodic). -DziÄki parametrowi "use_sim_time" ROS wie, Ĺźe kaĹźdy node powinien uĹźywaÄ czasu z topicu /clock, a nie czasu systemowego (rzeczywistego). W naszym przypadku programem publikujÄ cym czas, bÄdzie rosbag. Wystarczy przy jego uruchamianiu dodaÄ flagÄ ```--clock``` + -JeĹli uruchamiali byĹmy wszystko po kolei w terminalu, komendy wyglÄ daĹby nastÄpujÄ co (kaĹźda kolejna komenda w osobnym terminalu): -```bash -roscore -rosparam set /use_sim_time true -rosbag play <nazwa pliku> --clock -``` - +Po przeczytaniu dokumentacji moĹźemy zauwaĹźyÄ, iĹź algorytm do dziaĹania oczekuje danych na topicu **imu/data_raw** oraz **imu/mag**. W naszym przypadku nie bÄdziemy uĹźywaÄ magnetometru, dlatego bÄdziemy uĹźywaÄ tylko topicu **imu/data_raw**. -Jaki widaÄ po ustawieniu parametru /use_sim_time oraz argumentu --clock, pojawiĹ siÄ topic /clock. Dodatkowo w programie Rviz w dolnej czÄĹci okna moĹźna zauwaĹźyÄ, Ĺźe czas ROS Time oraz Wall Time róşniÄ siÄ od siebie. -- ROS Time - Czas uĹźywany przez system ROS (w tym przypadku symulowany) -- Wall Time - Czas rzeczywisty pobrany z systemu operacyjnego +Plik launch uruchamiajÄ cy filtr madgwicka zostaĹ stworzony w pakiecie **laboratorium_pliki_dodatkowe** i przedstawia siÄ nastÄpujÄ co: -Do realizacji mapy 3d posĹuĹźymy siÄ jednak plikiem launch, Ĺźeby uproĹciÄ proces uruchamiania caĹoĹci -```xml <launch> - <arg name="bag_file_dir" default="$(find laboratorium_pliki_dodatkowe)/bagfiles/lab_kor.bag"/> - <param name="use_sim_time" type="bool" value="true"/> - <node name="bag_file" pkg="rosbag" type="play" output="screen" args="--clock $(arg bag_file_dir)"/> + <node pkg="imu_filter_madgwick" name="imu_filter_node" type="imu_filter_node" > + <rosparam> + use_mag: false + fixed_frame: base_link + publish_tf: false + </rosparam> + <remap from="/imu/data_raw" to="/mavros/imu/data_raw"/> + </node> </launch> -``` -Najpierw jako argument definiujemy ĹcieĹźkÄ do naszego pliku bag. NastÄpnie ustawiamy parametr "use_sim_time" aby ROS uĹźywaĹ czasu symulowanego. Na koĹcu uruchamiamy nasz plik bag dodajÄ c argumenty zawierajÄ ce parametr **--clock** powodujÄ cy publikowanie czasu symulacji oraz ĹcieĹźkÄ do pliku bag. - - -**Zadanie 18:** StwĂłrz plik lauch uruchamiajÄ cy odtwarzanie pliku bag oraz algorytm rtabmap. -Po uruchomieniu stworzonego pliku, zatrzymaj go klawiszem **spacja**. W konsoli powinien pojawiÄ siÄ komunikat **[PAUSED]**. NastÄpnie otwĂłrz program RVIZ i zaĹaduj konfiguracjÄ **mapowanie_wizualizacja.rviz** z pakietu **laboratorium_pliki_dodatkowe**. +W powyĹźszym pliku pojawiajÄ siÄ dwie nowe informacje. Po pierwsze moĹźliwy jest inny sposĂłb definiowania parametrĂłw w znaczniku **rosparam**. Druga dotyczy znacznika **remap**. Tak jak byĹo wspomniane wczeĹniej filtr oczekuje danych na topicu **/imu/data_raw** natomiast nasz kontroler wystawia je na topicu **/mavros/imu/data_raw**. DziÄki znacznikowi **remap** moĹźemy zmieniÄ nazwÄ wszystkich topicĂłw z jakich korzysta dany node. Jest to bardzo przydatne w takiej sytuacji jaka zaszĹa teraz. Nie musimy zmieniaÄ nic w kodzie jednego czy drugiego programu, tylko wystarczy dodaÄ jednÄ linijkÄ w pliku launch. -Konfiguracja RVIZ przedstawia: -- MapCloud - wizualizacja chmur punktĂłw skĹadajÄ cych siÄ na mapÄ 3d -- Tf - wizualizacja ukĹadĂłw wspĂłĹrzÄdnych -- Widok kameru ustawiony w taki sposĂłb, aby podÄ ĹźaĹ za jednym z ukĹadĂłw wspĂłĹrzÄdnych. +Po uruchomieniu pliku launch na topicu **/imu/data** powinny pojawiÄ siÄ dane tym razem wzbogacone o orientacje. Pakiet imu_tools dostarcza rĂłwnieĹź plugin rozszerzajÄ cy moĹźliwoĹÄ programu RVIZ o wyĹwietlanie orientacji obiektu. -W konsoli z uruchomionym plikiem launch uĹźyj ponownie klawisza **spacja** aby dane znĂłw byĹy odtwarzane. Przy pomocy myszki moĹźesz zmieniaÄ orientacjÄ kamery i odlegĹoĹÄ od ukĹadu wspĂłĹrzÄdnych. - - - - -Plik zawiera dwa przejazdy po korytarzu. Poczekaj, aĹź stworzy siÄ caĹa mapa. Podczas drugiego przejazdu zaobserwujesz mocne skoki kamery. Skoki te zostanÄ wyjaĹnione w laboratorium nr 4. Gdy pojawi siÄ skakanie kamery przeĹÄ cz "Target Frame" na map lub Fixed frame. Opcje zmiany widoku znajdujÄ siÄ po prawej stronie okna. - -**Zadanie 19:** ZrĂłb zrzut ekranu, na ktĂłrym bÄdzie widoczna caĹa stworzona mapa. - -Po zatrzymaniu mapowania (Ctrl+c w terminalu z uruchomionym plikiem launch), mapa zapisuje siÄ w **/home/robot/.ros/rtabmap.db**. MoĹźemy jÄ otworzyÄ i przeglÄ daÄ dziÄki programowi -```bash -rtabmap -``` - + -Niestety przy poĹÄ czeniu zdalnym program **rtabmap** nie radzi sobie z poprawnym wyĹwietlaniem danych. +**Zadanie 11:** Uruchom filtr madgwicka plikiem launch z pakietu **laboratorium_pliki_dodatkowe** i uruchom wizualizacje w programie RVIZ. + (JeĹli jest wyĹÄ czony to uruchom wiatrak na stronie zarzÄ dzania niniejszym laboratorium [link](http://153.19.49.102:5000) (ZakĹadka sterowanie. Po wĹÄ czeniu wiatraka sprawdĹş na kamerze), aby moduĹy zaczÄĹy siÄ poruszaÄ. WyĹÄ cz go po zakoĹczeniu Äwiczenia) -StworzonÄ mapÄ moĹźna rĂłwnieĹź wygenerowaÄ w standardowym formacie .ply czy .pcd do dalszej analizy czy obrĂłbki. - \ No newline at end of file diff --git a/lab04/img/imu_mes.png b/lab03/img/imu_mes.png similarity index 100% rename from lab04/img/imu_mes.png rename to lab03/img/imu_mes.png diff --git a/lab04/img/ls_pixhawk.png b/lab03/img/ls_pixhawk.png similarity index 100% rename from lab04/img/ls_pixhawk.png rename to lab03/img/ls_pixhawk.png diff --git a/lab04/img/madgwick.png b/lab03/img/madgwick.png similarity index 100% rename from lab04/img/madgwick.png rename to lab03/img/madgwick.png diff --git a/lab04/img/mavros_hz.gif b/lab03/img/mavros_hz.gif similarity index 100% rename from lab04/img/mavros_hz.gif rename to lab03/img/mavros_hz.gif diff --git a/lab04/img/mavros_list.gif b/lab03/img/mavros_list.gif similarity index 100% rename from lab04/img/mavros_list.gif rename to lab03/img/mavros_list.gif diff --git a/lab04/img/mavros_mad_wiz.gif b/lab03/img/mavros_mad_wiz.gif similarity index 100% rename from lab04/img/mavros_mad_wiz.gif rename to lab03/img/mavros_mad_wiz.gif diff --git a/lab04/img/mobile_robot_standard_tf.png b/lab03/img/mobile_robot_standard_tf.png similarity index 100% rename from lab04/img/mobile_robot_standard_tf.png rename to lab03/img/mobile_robot_standard_tf.png diff --git a/lab04/img/model_katana.png b/lab03/img/model_katana.png similarity index 100% rename from lab04/img/model_katana.png rename to lab03/img/model_katana.png diff --git a/lab04/img/model_tf.png b/lab03/img/model_tf.png similarity index 100% rename from lab04/img/model_tf.png rename to lab03/img/model_tf.png diff --git a/lab04/img/odom_wzor.png b/lab03/img/odom_wzor.png similarity index 100% rename from lab04/img/odom_wzor.png rename to lab03/img/odom_wzor.png diff --git a/lab04/img/orientation.png b/lab03/img/orientation.png similarity index 100% rename from lab04/img/orientation.png rename to lab03/img/orientation.png diff --git a/lab04/img/pixhawk.png b/lab03/img/pixhawk.png similarity index 100% rename from lab04/img/pixhawk.png rename to lab03/img/pixhawk.png diff --git a/lab04/img/qgroundcontrol.gif b/lab03/img/qgroundcontrol.gif similarity index 100% rename from lab04/img/qgroundcontrol.gif rename to lab03/img/qgroundcontrol.gif diff --git a/lab04/img/qgroundcontrol_hz.gif b/lab03/img/qgroundcontrol_hz.gif similarity index 100% rename from lab04/img/qgroundcontrol_hz.gif rename to lab03/img/qgroundcontrol_hz.gif diff --git a/lab04/img/qgroundcontrol_map.gif b/lab03/img/qgroundcontrol_map.gif similarity index 100% rename from lab04/img/qgroundcontrol_map.gif rename to lab03/img/qgroundcontrol_map.gif diff --git a/lab04/img/qgroundcontrol_param.gif b/lab03/img/qgroundcontrol_param.gif similarity index 100% rename from lab04/img/qgroundcontrol_param.gif rename to lab03/img/qgroundcontrol_param.gif diff --git a/lab04/img/qgroundcontrol_plot.gif b/lab03/img/qgroundcontrol_plot.gif similarity index 100% rename from lab04/img/qgroundcontrol_plot.gif rename to lab03/img/qgroundcontrol_plot.gif diff --git a/lab04/img/qgroundcontrol_plot.png b/lab03/img/qgroundcontrol_plot.png similarity index 100% rename from lab04/img/qgroundcontrol_plot.png rename to lab03/img/qgroundcontrol_plot.png diff --git a/lab04/img/sim_rviz_setup.gif b/lab03/img/sim_rviz_setup.gif similarity index 100% rename from lab04/img/sim_rviz_setup.gif rename to lab03/img/sim_rviz_setup.gif diff --git a/lab04/img/tf_echo.gif b/lab03/img/tf_echo.gif similarity index 100% rename from lab04/img/tf_echo.gif rename to lab03/img/tf_echo.gif diff --git a/lab04/img/tf_echo.png b/lab03/img/tf_echo.png similarity index 100% rename from lab04/img/tf_echo.png rename to lab03/img/tf_echo.png diff --git a/lab04/img/tf_jumping.gif b/lab03/img/tf_jumping.gif similarity index 100% rename from lab04/img/tf_jumping.gif rename to lab03/img/tf_jumping.gif diff --git a/lab04/img/tf_tree.png b/lab03/img/tf_tree.png similarity index 100% rename from lab04/img/tf_tree.png rename to lab03/img/tf_tree.png diff --git a/lab04/img/urdf_rviz.gif b/lab03/img/urdf_rviz.gif similarity index 100% rename from lab04/img/urdf_rviz.gif rename to lab03/img/urdf_rviz.gif diff --git a/lab04/README.md b/lab04/README.md deleted file mode 100644 index af7b581e8869b4765450fbad7b2d0829a02bf533..0000000000000000000000000000000000000000 --- a/lab04/README.md +++ /dev/null @@ -1,303 +0,0 @@ -# Przygotowanie przestrzeni roboczej -PoĹÄ cz siÄ ze zdalnym Ĺrodowiskiem i ĹciÄ gnij swoje repozytorium do przestrzeni roboczej catkin_ws. - - -# Transformacje pomiÄdzy ukĹadami wspĂłĹrzÄdnych -Przed przystÄ pieniem do omawiania nawigacji waĹźnym jest, aby rozumieÄ jak wiele ukĹadĂłw wspĂłĹrzÄdnych znajduje siÄ w platformie robotycznej, jak sÄ one ze sobÄ poĹÄ czone oraz jak okreĹlaÄ poĹoĹźenie i orientacjÄ wzglÄdem poszczegĂłlnych ukĹadĂłw wspĂłĹrzÄdnych. - -DziaĹanie zaleĹźnoĹci pomiÄdzy ukĹadami wspĂłĹrzÄdnych zostanie zwizualizowane na przykĹadzie manipulatora o 5 stopniach swobody. - - - -W systemie ROS moĹźemy wizualizowaÄ roboty i elementy Ĺrodowiska przy pomocy opisu URDF. Na niniejszym laboratorium jednak nie zostanie on wyjaĹniony. JeĹli chcesz dowiedzieÄ jak tworzy siÄ pliki URDF i jak stworzyÄ model wĹasnego robota, to tu znajdziesz wiÄcej informacji [link](http://wiki.ros.org/urdf/Tutorials) (tutorial opisuje, jak stworzyÄ prosty model robota R2D2). - -W skrĂłcie pliki URDF pozwalajÄ opisaÄ jak zĹoĹźony jest robot. Z jakich skĹada siÄ elementĂłw i jak sÄ one poĹÄ czone ze sobÄ . - -Aby uruchomiÄ naszÄ wizualizacjÄ potrzebujemy pliku launch. - -```xml -<launch> - <param name="robot_description" command="$(find xacro)/xacro.py '$(find katana_description)/urdf/katana_300_6m180.urdf.xacro'" /> - <node pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher"> - </node> - - <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher"> - <param name="ignore_timestamp" value="false"/> - </node> - - <node pkg="tf" type="static_transform_publisher" name="katana_base_link_to_box" args="0 0.5 0 0 0 0 /katana_base_link /box 100"/> -</launch> -``` -ZostaĹ on juĹź stworzony w pakiecie "laboratorium_pliki_dodatkowe". - -Po pierwsze musimy zaĹadowaÄ opis naszego robota jako parametr pod nazwÄ **robot_description**. - -NastÄpnie uruchamiamy trzy node'y. Pierwszy odpowiada za publikowanie stanu poszczegĂłlnych przegubĂłw robota. Po uruchomieniu zobaczysz okno z interfejsem, ktĂłry pozwoli na zmianÄ pozycji poszczegĂłlnych przegubĂłw robota. JeĹli posiadalibyĹmy prawdziwego robota, ktĂłrego chcielibyĹmy wizualizowaÄ, wtedy jego sterownik publikowaĹby aktualne stany poszczegĂłlnych przegubĂłw. - -Kolejny node na podstawie pliku urdf oraz danych publikowanych przez **joint_state_publisher** uaktualnia pozycje wizualizowanych elementĂłw robota. - -Ostatni node **static_transform_publisher** publikuje staĹe przeksztaĹcenie (odsuniÄcie o 0.5 m w osi y) pomiÄdzy ukĹadem wspĂłĹrzÄdnych **katana_base_link**, a **box**. Ma on symulowaÄ poĹoĹźenie przykĹadowego elementu i posĹuĹźy do lepszego wyjaĹnienia omawianego zagadnienia. - -Uruchom plik launch **wizualizacja_urdf** z paketu **laboratorium_pliki_dodatkowe**. NastÄpnie uruchom program RVIZ i dodaj wizualizacje modelu robota, tf oraz zmieĹ staĹy ukĹad wspĂłĹrzÄdnych na **katana_base_link**. - - - - -**Zadanie 1:** Przy pomocy **joint_state_publisher** obrĂłÄ poszczegĂłlne przeguby robota i zobacz, jak zmienia siÄ wizualizacja. ZmieĹ staĹy ukĹad wspĂłĹrzÄdnych (Fixed frame) na wybrany ukĹad zaczynajÄ cy siÄ od nazwy **katana_motor**. SprawdĹş jak teraz zmienia siÄ wizualizacja przy ruchach przegubĂłw. - - - - -Jak widaÄ robot zĹoĹźony jest z wielu ukĹadĂłw wspĂłĹrzÄdnych poĹÄ czonych ze sobÄ . KaĹźdy kolejny ukĹad wspĂłĹrzÄdnych jest zaczepiony w poprzednim i wzglÄdem niego jest okreĹlana jego pozycja. Taki sposĂłb organizacji wszystkich ukĹadĂłw wspĂłĹrzÄdnych pozwala nam w Ĺatwy sposĂłb wyliczyÄ, gdzie np. znajduje siÄ koĹcĂłwka robota wzglÄdem podstawy lub dowolnego innego obiektu np. pudeĹka o ukĹadzie wspĂłĹrzÄdnych **box**. Wszystkie poĹÄ czenia pomiÄdzy ukĹadami wspĂłĹrzÄdnych sÄ zorganizowane w postaci struktury drzewa. AktualnÄ strukturÄ moĹźemy zobaczyÄ przy pomocy narzÄdzia rqt i TF Tree. - -**Zadanie 2:** Uruchom program rqt przy pomocy komendy ``` rqt ``` w terminalu. NastÄpnie wĹÄ cz wizualizacje TF Tree (Plugins -> Visualization -> TF Tree). - -Po uruchomieniu TF Tree moĹźesz zobaczyÄ jak caĹa struktura jest zorganizowana. Dodatkowo, dziÄki temu narzÄdziu moĹźemy sprawdziÄ czy na pewno wszystko jest ze sobÄ poĹÄ czone. JeĹli ktĂłryĹ z elementĂłw nie bÄdzie poĹÄ czony z resztÄ to dane z takiego elementu nie mogÄ byÄ odniesione do innych np. jeĹli nie wprowadzimy jak zamontowany jest lidar na robocie to bÄdziemy wiedzieÄ jak daleko znajduje siÄ przeszkoda od lidaru, ale nie bÄdziemy wiedzieÄ jak blisko znajduje siÄ od np. przedniego zderzaka robota. - - - -W dowolnej chwili moĹźemy sprawdziÄ aktualne przesuniÄcie (transformacje) pomiÄdzy dwoma dowolnymi ukĹadami wspĂłĹrzÄdnych. MoĹźemy to zrobiÄ przy pomocy komendy: -```bash -rosrun tf tf_echo <nazwa ukĹadu wspĂłĹrzÄdnych> <nazwa ukĹadu wspĂłĹrzÄdnych> -``` - - - - - -Program tf co sekundÄ pokazuje nam odlegĹoĹÄ i zmianÄ orientacji pomiÄdzy dwoma ukĹadami wspĂłĹrzÄdnych. PrzesuniÄcie okreĹlone jest kolejno w osiach X,Y,Z. Natomiast zmiana orientacji podana jest w trzech róşnych jednostkach. - - -**Zadanie 3:** Uruchom tf_echo pomiÄdzy ukĹadami wspĂłĹrzÄdnych **katana_gripper_tool_frame** i **box**, a nastÄpnie ustaw koĹcĂłwkÄ robota na tyle blisko ukĹadu wspĂłĹrzÄdnych **box**, aby odlegĹoĹÄ w Ĺźadnej osi nie przekraczaĹa 0.2 m. - ------------ - -# Odometria - -PrzechodzÄ c do pojazdĂłw, standardowa struktura ukĹadĂłw wspĂłĹrzÄdnych i ich nazewnictwo przedstawia siÄ nastÄpujÄ co: - - - -Standardowo wszystkie elementy umieszczone na robocie sÄ ostatecznie poĹÄ czone z ukĹadem **base_link**. NastÄpnie ukĹad **base_link** jest poĹÄ czony z ukĹadem **base_footprint**, ktĂłry jest rzutem na pĹaszczyznÄ ukĹadu **base_stabilized**, ale zwykle pomija siÄ ukĹad **base_stabilized** i zwykle siÄ go nie tworzy. - -Kolejne poĹÄ czenie jest tworzone pomiÄdzy **base_footprint**, a **odom**. Tym razem jest to juĹź poĹÄ czenie odpowiedzialne za lokalizacjÄ. Tak jak poprzednie ukĹady wspĂłĹrzÄdnych byĹy raczej statyczne wzglÄdem siebie, tak **base_footprint** i **odom** juĹź nie. Transformacja ta obrazuje przesuniÄcie robota wzglÄdem punktu poczÄ tkowego (poczÄ tkiem ukĹadu wspĂłĹrzÄdnych odom) i zwykle wykorzystywane sÄ do tego metody przyrostowe. Co waĹźne w systemie ROS przyjÄte jest, Ĺźe w tej transformacji nie mogÄ wystÄpowaÄ przeskoki w pozycji (pozycja musi zmieniaÄ siÄ w sposĂłb ciÄ gĹy). - -Ostatnim zaprezentowanym poĹÄ czeniem jest pomiÄdzy **odom** i **map**. To poĹÄ czenie pozwala pokazaÄ, gdzie robot znajduje siÄ na mapie. Tu mogÄ juĹź wystÄpowaÄ przeskoki w pozycji tzn. transformacja pomiÄdzy **map** i **odom** jest tak dobierana, aby koĹcowa pozycja robota wzglÄdem mapy byĹa zgodna z rzeczywistoĹciÄ (dokonuje tego zwykle algorytm SLAM). - -Czasami stosuje siÄ jeszcze ukĹad wspĂłĹrzÄdnych **earth**, ktĂłra jest juĹź ostatecznym ukĹadem wspĂłĹrzÄdnych i zwykle odnosi siÄ do koordynatĂłw GPS. Ten ukĹad wspĂłĹrzÄdnych pozwala nam na odniesienie wzglÄdem siebie kilku map i przypisaÄ im rzeczywistÄ pozycjÄ na "Ĺwiecie" - ------- - -JeĹli znamy juĹź caĹÄ konwencjÄ tworzenia i nazewnictwa ukĹadĂłw wspĂłĹrzÄdnych, moĹźemy przejĹÄ do nawigacji zliczeniowej. -Zwykle pozycja w nawigacji zliczeniowej robotĂłw mobilnych jest okreĹlana na podstawie enkoderĂłw umieszczonych na koĹach. WiedzÄ c jak obrĂłciĹy siÄ koĹa moĹźemy obliczyÄ pozycjÄ robota na podstawie poniĹźszych wzorĂłw: - - - - -W systemie ROS obliczaniem odometri zakmuje siÄ program obsĹugujÄ cy fizyczne enkodery, natomiast juĹź w systemie posĹugujemy siÄ wadomoĹciÄ Odometry ([dokumnetacja](http://docs.ros.org/en/melodic/api/nav_msgs/html/msg/Odometry.html)). Zawiera ona zarĂłwno aktualnÄ pozycjÄ jak i prÄdkoĹÄ. Dodatkowo oba parametry sÄ opatrzone macierzÄ kowariancji, ktĂłra reprezentuje niepewnoĹÄ kaĹźdego z pomiarĂłw. - -Uruchom symulacjÄ robota turtlebot: -```bash -export TURTLEBOT3_MODEL=waffle -roslaunch turtlebot3_gazebo turtlebot3_world.launch -``` - -Uruchom RVIZ -```bash -export TURTLEBOT3_MODEL=waffle -roslaunch turtlebot3_gazebo turtlebot3_gazebo_rviz.launch -``` - -Uruchom program sterujÄ cy robotem -```bash -export TURTLEBOT3_MODEL=waffle -roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch -``` - -**Zadanie 4:** Uruchom program rqt i zobacz, jak wyglÄ dajÄ zaleĹźnoĹci pomiÄdzy ukĹadami wspĂłĹrzÄdnych w tym robocie. - -PrzejdĹş do programu RVIZ, zmieĹ ustawienie widoku na **ThirdPersonFollower**, zbliĹź kamerÄ do robota. WĹÄ cz wizualizacjÄ TF i wĹÄ cz widocznoĹÄ tylko nastÄpujÄ cych ukĹadĂłw **base_link**, **base_scan**, **wheel_right_link**, **wheel_left_link**, **odom**. Zmniejsz rozmiar zwizualizowanych ukĹadĂłw wspĂłĹrzÄdnych "Marker scale", tak aby nie przysĹaniaĹy modelu robota. - - - -**Zadanie 5:** Podejrzyj co dzieje siÄ na topicu **/odom**. ObserwujÄ c robota jak i topic **/odom** przejedĹş okoĹo 1 m do przodu symulowanym robotem. - -**Zadanie 6:** ZmieĹ staĹy ukĹad wspĂłĹrzÄdnych "Fixed Frame" z **odom** na **base_scan**. PrzejedĹş ponownie robotem jakÄ Ĺ odlegĹoĹÄ w dowolnym kierunku. Jak teraz prezentowane sÄ dane w programie RVIZ? - -Podczas tworzenia mapy 3d na laboratorium nr 3 mogĹeĹ doĹwiadczyÄ dopasowywania ukĹadu wspĂłĹrzÄdnych **odom** do **map**. MoĹźesz poniĹźej zobaczyÄ odpowiadajÄ cy temu fragment mapowania. W poczÄ tkowej fazie widzimy jak jedna ze Ĺcian korytarza zbiega siÄ do drugiej, tak jakby korytarz siÄ zwÄĹźaĹ. Na kamerze moĹźemy zobaczyÄ, Ĺźe algorytm widzi tylko jednÄ ĹcianÄ. W momencie, gdy na obrazie pojawiajÄ siÄ obie, algorytm uznaje, Ĺźe znajduje siÄ w poczÄ tkowej pozycji i naprawia mapÄ. Tym samym zmieniajÄ c transformacjÄ pomiÄdzy mapÄ , a odometriÄ . Później kamery caĹy czas widzÄ znajomÄ przestrzeĹ, dlatego caĹy czas prĂłbujÄ dopasowaÄ swojÄ pozycjÄ i mapÄ, co skutkuje skakaniem ukĹadu wspĂłĹrzÄdnych **t265_odom_frame** w stosunku do ukĹadu **map** - - - ------- - -# Orientacja - - - -OprĂłcz pozycji czÄsto potrzebujemy rĂłwnieĹź orientacji robota. OrientacjÄ w trzech osiach moĹźemy uzyskaÄ dziÄki Ĺźyroskopowi, akcelerometrowi i magnetometrowi. Magnetometr jest bardzo podatny na zakĹĂłcenia, szczegĂłlnie w pomieszczeniach i wymaga dobrej kalibracji, aby dziaĹaĹ poprawnie. Z tego powodu zwykle uĹźywa siÄ jedynie Ĺźyroskopu i akcelerometru. Akcelerometr pozwala nam wyliczyÄ dokĹadny kÄ t Pitch i Roll na podstawie wektora grawitacji jednak tylko przy wolniejszych zmianach. DziÄki Ĺźyroskopowi jesteĹmy w stanie natomiast nadÄ ĹźaÄ, za szybkimi zmianami jednak wyliczanie orientacji na jego podstawie polega na caĹkowaniu prÄdkoĹci kÄ towych w kaĹźdej osi, co skutkuje ciÄ gle narastajÄ cym bĹÄdem. ĹÄ czÄ c dane z akcelerometru i Ĺźyroskopu moĹźemy ĹledziÄ szybkie zmiany orientacji, a zarazem zniwelowaÄ narastajÄ ce bĹÄdy dziÄki wektorowi grawitacji, ale niestety odnosi siÄ to tylko do kÄ tĂłw Roll i Pitch, poniewaĹź obrĂłt w osi Z (kÄ t Yaw) nie wpĹywa na odczyt wektora grawitacji. Z tego powodu kÄ t Yaw uzyskuje siÄ jedynie z Ĺźyroskopu i jest on obarczony narastajÄ cym bĹÄdem. Aby zniwelowaÄ ten bĹÄ d uĹźywa siÄ magnetometru, ktĂłry wskazuje biegun magnetyczny ziemi. MoĹźna rĂłwnieĹź wykorzystaÄ inne metody okreĹlania kÄ ta Yaw, jak np. uĹźycie dwĂłch odbiornikĂłw GPS zamontowanych na dwĂłch kraĹcach pojazdu. - -W nastÄpnym Äwiczeniu posĹuĹźymy siÄ sterownikiem pixhawk, ktĂłry zostaĹ podĹÄ czony do komputera przewodem USB. - - - -Na kontrolerze pixhawk zainstalowane jest oprogramowanie Ardupilot, pozwalajÄ ce na sterowanie pojazdami autonomicznymi ([dokumentacja](https://ardupilot.org/ardupilot/)). - -Istnieje wiele akcesoriĂłw do ukĹadu pixhawk, ktĂłre zwiÄkszajÄ jego moĹźliwoĹci jak: -- odbiornik RC -- GPS -- ZewnÄtrzny magnetometr -- Radiokomunikacja -- ... - -Na pokĹadzie pixhawka mamy do dyspozycji Ĺźyroskop, akcelerometr, magnetometr oraz barometr. Na potrzeby tego Äwiczenia wykorzystamy akcelerometr i Ĺźyroskop, aby okreĹliÄ orientacjÄ kontrolera. - -Aby odczytaÄ dane z kontrolera moĹźemy wykorzystaÄ dwie metody: -- program stacji bazowej np. [QGroundControl](http://qgroundcontrol.com/) czy [Mission Planner](https://ardupilot.org/planner/). W przypadku systemu Windows zalecam uĹźywanie programu Mission Planner, poniewaĹź posiada on duĹźo uĹźytecznych funkcjonalnoĹci. Niestety jest on dostÄpny jedynie na systemy Windows, dlatego na potrzeby laboratorium uĹźyjemy QGroundControl. Nie mniej jednak program QGroundControl jest rĂłwnieĹź bardzo uĹźytecznym programem, a zainstalowaÄ moĹźemy go nawet na telefonie z systemem Android. -- bezpoĹrednio przy pomocy protokoĹu mavlink. TÄ metodÄ stosuje siÄ, gdy do sterownika podĹÄ czamy komputer, ktĂłry ma nadzorowaÄ jego pracÄ i wydawaÄ mu komendy, tak jak w naszym przypadku. - - -Najpierw rozpoczniemy pracÄ od programu QGroundControl. Zwykle uĹźywa siÄ go przy poczÄ tkowej konfiguracji pojazdu, a nastÄpnie do zdalnego monitorowania autonomicznej misji misji. - -Uruchom program QGroundControl ZnajdujÄ cy siÄ na pulpicie komputera zdalnego. - - - -Najpierw program ĹÄ czy siÄ z kontrolerem Pixhawk i ĹciÄ ga jego aktualnÄ konfiguracjÄ. W naszym przypadku uzyskamy komunikat, iĹź pojazd jest nie zdolny do dziaĹania, poniewaĹź nie zostaĹy podĹÄ czone kluczowe komponenty. Do prawidĹowego dziaĹania potrzebne jest zdalne poĹÄ czenie przez Radio RC oraz GPS. - -PrzejdĹş do widoku mapy. - - -JeĹli mielibyĹmy podĹÄ czony GPS, wiedzielibyĹmy aktualnÄ pozycjÄ naszego pojazdu. W prawym gĂłrnym rogu moĹźna zauwaĹźyÄ kilka podstawowych parametrĂłw jak orientacja w trzech osiach, wysokoĹÄ, prÄdkoĹÄ czy czas lotu. - -MoĹźemy teĹź dodaÄ szybki podglÄ d dowolnego parametru klikajÄ c na koĹo zÄbate koĹo napisu **Valuse** - -**Zadanie 7:** Dodaj do podglÄ du trzy parametry Roll, Pitch i Heading. - - -Parametry moĹźemy rĂłwnieĹź wyĹwietlaÄ w formie wykresĂłw, przechodzÄ c do zakĹadki Analyze - - - -Po dodaniu Parametru do wykresu moĹźemy zauwaĹźyÄ, Ĺźe jego zmiany sÄ bardzo skokowe. Jest to spowodowane maĹÄ czÄstotliwoĹciÄ wysyĹania tego parametry przez kontroler. AktualnÄ czÄstotliwoĹÄ odĹwieĹźania moĹźemy zobaczyÄ po lewej stronie przy nazwie grupy parametrĂłw. - - - - -CzÄstotliwoĹÄ odĹwieĹźania moĹźemy zmieniÄ w ustawieniach w zakĹadce MAVLink: - - - -(JeĹli jest wyĹÄ czony to uruchom wiatrak na stronie zarzÄ dzania niniejszym laboratorium [link](http://153.19.49.102:5000) (ZakĹadka sterowanie. Po wĹÄ czeniu wiatraka sprawdĹş na kamerze), aby moduĹy zaczÄĹy siÄ poruszaÄ. WyĹÄ cz go po zakoĹczeniu Äwiczenia) - -**Zadanie 8:** WyĹwietl na wykresie trzy prÄdkoĹci kÄ towe (xgyro, ygyro, zgyro) i zaobserwuj, jak wyglÄ dajÄ wskazania przed zmianÄ i po zmianie czÄstotliwoĹci odĹwieĹźania. - - - -Ostatnim waĹźnym aspektem moĹźliwoĹÄ programu QGroundControl jest moĹźliwoĹÄ konfiguracji ustawieĹ pojazdu. PoniĹźej zaprezentowano zmianÄ parametru opisujÄ cego typ uĹźywanych sterownikĂłw silnikĂłw **MOT_PWM_TYPE**. **UmiejÄtnoĹÄ konfiguracji pojazdu bÄdzie prawdopodobnie niezbÄdna przy realizacji zadaĹ projektowych.** - - - - - -Zamknij program QGroundControl - ----------- - -Po doĹwiadczeniach z programem QGroundControl teraz poĹÄ czymy siÄ z kontrolerem Pixhawk przy pomocy Ĺrodowiska ROS i protokoĹu MavLink. - -Aby byĹo to moĹźliwe potrzebujemy pakietu mavros ([dokumntacja](http://wiki.ros.org/mavros)), ktĂłry zostaĹ juĹź zainstalowwany na komputerach zdalnych. - -PrzykĹadowy plik launch pozwalajÄ cy uruchomiÄ poĹÄ czenie z pixhawkiem wyglÄ da nastÄpujÄ co: - -```xml -<launch> - <arg name="fcu_url" default="/dev/ttyACM0:921600" /> - <arg name="gcs_url" default="" /> - <arg name="tgt_system" default="1" /> - <arg name="tgt_component" default="1" /> - <arg name="log_output" default="screen" /> - <arg name="fcu_protocol" default="v2.0" /> - <arg name="respawn_mavros" default="false" /> - - <include file="$(find mavros)/launch/node.launch"> - <arg name="pluginlists_yaml" value="$(find mavros)/launch/apm_pluginlists.yaml" /> - <arg name="config_yaml" value="$(find mavros)/launch/apm_config.yaml" /> - <arg name="fcu_url" value="$(arg fcu_url)" /> - <arg name="gcs_url" value="$(arg gcs_url)" /> - <arg name="tgt_system" value="$(arg tgt_system)" /> - <arg name="tgt_component" value="$(arg tgt_component)" /> - <arg name="log_output" value="$(arg log_output)" /> - <arg name="fcu_protocol" value="$(arg fcu_protocol)" /> - <arg name="respawn_mavros" value="$(arg respawn_mavros)" /> - </include> -</launch> -``` - -To co pojawia siÄ przy kaĹźdym podĹÄ czeniu nowego urzÄ dzenia do komputera to koniecznoĹÄ sprawdzenia portu, do ktĂłrego zostaĹo ono przypisane. SprawdĹş port do ktĂłrego zostaĹ podpiÄty pixhawk. Nazwa powinna rozpoczynaÄ siÄ od **usb-ArduPilot_fmuv3**. - - - - -**Zadanie 9:** StwĂłrz plik launch we wĹasnym pakiecie zmieniajÄ c jedynie parametr **fcu_url** zgodnie ze znalezionym portem przy pomocy komendy **ls** (zostaw liczbÄ 921600 po znaku ":", jest to prÄdkoĹÄ przesyĹania danych). - - -Po uruchomieniu stworzonego pliku powinno pojawiÄ siÄ wiele topicĂłw udostÄpnionych przez mavros z danymi z naszego kontrolera. Wszystkie sÄ opisane w [dokumntacji](http://wiki.ros.org/mavros). - - - -PosiadajÄ c dostÄp do danych moĹźemy zajÄ Ä siÄ przedmiotem tego Äwiczenia, czyli obliczeniem orientacji naszego kontrolera, a potencjalnie robota/pojazdu. Po pierwsze potrzebne sÄ nam dane z Ĺźyroskopu i akcelerometru. SÄ one dostÄpne na topicu **/mavros/imu/data_raw**. WiadomoĹci na tym topicu sÄ typu [sensor_msgs/Imu](http://docs.ros.org/en/melodic/api/sensor_msgs/html/msg/Imu.html) i standardowo zawierajÄ orientacjÄ (w tym przypadku jej nie ma, poniewaĹź sÄ wysyĹane na tym topicu tylko dane z Ĺźyroskopu i akcelerowmetru), przyspieszenia liniowe w trzech osiach oraz prÄdkoĹci kÄ towe w trzech osiach. - - - -Przy przetwarzaniu tego typu danych waĹźna jest czÄstotliwoĹÄ publikowania danych. MoĹźemy jÄ sprawdziÄ przy pomocy komendy: - -```bash -rostopic hz <nazwa topicu> -``` - - -SprawdĹş jak czÄsto pojawiajÄ siÄ wiadomoĹci na tym topicu. DomyĹlnie dane wysyĹane sÄ z czÄstotliwoĹciÄ 2 Hz. Aby algorytm okreĹlajÄ cy dziaĹaĹ poprawnie potrzebujemy danych znacznie czÄĹciej. IdeaĹem byĹyby informacje dostarczane z czÄstotliwoĹciÄ 200 Hz lub wyĹźszÄ . Wtedy Ĺledzenie orientacji byĹoby bardzo pĹynne i pojawiaĹyby siÄ mniejsze bĹÄdy. Pixhawk, z domyĹlnym firmwarem ardupilot rover jest w stanie wysyĹaÄ dane z sensorĂłw z maksymalnÄ czÄstotliwoĹciÄ ok 40 Hz. Nie jest to wartoĹÄ idealna jednak juĹź wystarczajÄ ca, aby wyznacza orientacja byĹa uĹźyteczna. - -Aby zmieniÄ czÄstotliwoĹÄ wysyĹanych danych musimy uĹźyÄ komendy: - -```bash -rosrun mavros mavsys rate <nazwa grupy danych> <czÄstotliwoĹÄ> -``` - -Aby zmieniÄ czÄstotliwoĹÄ wysyĹania surowych danych z sensorĂłw musimy uĹźyÄ komendy: - -```bash -rosrun mavros mavsys rate --raw-sensors 40 -``` - -**Zadanie 10:** ZmieĹ czÄstotliwoĹÄ wysyĹania danych z sensorĂłw i sprawdĹş komendÄ ```rostopic hz```, czy dane rzeczywiĹcie przychodzÄ czÄĹciej. - -Do obliczenia orientacji robota posĹuĹźymy siÄ filtrem madgwica, ktĂłry byĹ omawiany podczas wykĹadĂłw [wiÄcej_informacji](https://x-io.co.uk/open-source-imu-and-ahrs-algorithms/). Zwykle wiÄkszoĹÄ popularnych filtrĂłw/algorytmĂłw jest juĹź dostÄpna w formie pakietĂłw w systemie ROS i nie inaczej jest w tym przypadku. Filtr madwicka znajdziemy w pakiecie imu_tools->imu_filter_madgwick [dokumentacja](http://wiki.ros.org/imu_filter_madgwick?distro=melodic). - - - -Po przeczytaniu dokumentacji moĹźemy zauwaĹźyÄ, iĹź algorytm do dziaĹania oczekuje danych na topicu **imu/data_raw** oraz **imu/mag**. W naszym przypadku nie bÄdziemy uĹźywaÄ magnetometru, dlatego bÄdziemy uĹźywaÄ tylko topicu **imu/data_raw**. - -Plik launch uruchamiajÄ cy filtr madgwicka zostaĹ stworzony w pakiecie **laboratorium_pliki_dodatkowe** i przedstawia siÄ nastÄpujÄ co: - -<launch> - <node pkg="imu_filter_madgwick" name="imu_filter_node" type="imu_filter_node" > - <rosparam> - use_mag: false - fixed_frame: base_link - publish_tf: false - </rosparam> - <remap from="/imu/data_raw" to="/mavros/imu/data_raw"/> - </node> -</launch> - -W powyĹźszym pliku pojawiajÄ siÄ dwie nowe informacje. Po pierwsze moĹźliwy jest inny sposĂłb definiowania parametrĂłw w znaczniku **rosparam**. Druga dotyczy znacznika **remap**. Tak jak byĹo wspomniane wczeĹniej filtr oczekuje danych na topicu **/imu/data_raw** natomiast nasz kontroler wystawia je na topicu **/mavros/imu/data_raw**. DziÄki znacznikowi **remap** moĹźemy zmieniÄ nazwÄ wszystkich topicĂłw z jakich korzysta dany node. Jest to bardzo przydatne w takiej sytuacji jaka zaszĹa teraz. Nie musimy zmieniaÄ nic w kodzie jednego czy drugiego programu, tylko wystarczy dodaÄ jednÄ linijkÄ w pliku launch. - -Po uruchomieniu pliku launch na topicu **/imu/data** powinny pojawiÄ siÄ dane tym razem wzbogacone o orientacje. Pakiet imu_tools dostarcza rĂłwnieĹź plugin rozszerzajÄ cy moĹźliwoĹÄ programu RVIZ o wyĹwietlanie orientacji obiektu. - - - -**Zadanie 11:** Uruchom filtr madgwicka plikiem launch z pakietu **laboratorium_pliki_dodatkowe** i uruchom wizualizacje w programie RVIZ. - (JeĹli jest wyĹÄ czony to uruchom wiatrak na stronie zarzÄ dzania niniejszym laboratorium [link](http://153.19.49.102:5000) (ZakĹadka sterowanie. Po wĹÄ czeniu wiatraka sprawdĹş na kamerze), aby moduĹy zaczÄĹy siÄ poruszaÄ. WyĹÄ cz go po zakoĹczeniu Äwiczenia) - -