Obr. 20 Zobrazenie transformácií tf jednotlivých kĺbov robota
Charakteristika a využitie balíka tf
Okrem bežných komunikačných rozhraní, ktoré ROS ponúka, je k dispozícii aj balík tf. Najčastejšie sa využíva pri vytváraní simulácií alebo získavaní údajov zo snímačov v časových intervaloch. Na obr. 20 je vidieť rozloženie súradnicových systémov robotického zariadenia, ktoré sú spolu prepojené od základového súradnicového systému až po koncový. Vyjadrujú tak vzájomnú polohu významných bodov robota, napr. kolies a kĺbov, v priestore a v čase. Na základe nich možno určiť polohu samotného robota alebo presné natočenie jednotlivých kĺbov [1].
Väčšina robotických systémov má často veľké množstvo súradníc (stupňov voľnosti), ktoré sa menia v čase. Ako príklad možno uviesť base_frame (súradnicový systém, ktorý hovorí o umiestnení základne robota v priestore). Jeho pozícia môže byť fixná. V tomto prípade tf opisuje len vzťah ďalších obrazov k obrazu základne a ďalej sa rozrastá do štruktúry robotického zariadenia.
Ak je základňa mobilná, tf prijíma údaje, ktoré hovoria o pozícii základne vzhľadom na mapu, a zároveň údaje z odometrie, ktoré vyjadrujú pohyb základne v čase. Príklad štruktúry takéhoto zariadenia je na obr. 21. Na serveri tf je publikovaná statická mapa, ďalej sa tam nachádza odometria robota, ktorá sa časom mení vzhľadom na mapu, a zároveň statická poloha základne, ktorá sa zase mení vzhľadom na odometriu.
Podpora balíka tf
Keďže sa balík tf používa veľmi často, vytvorilo sa na prácu s ním veľké množstvo návodov. Presné postupy, ako vytvoriť prijímač (listener) alebo vysielač (broadcaster) transformácií v čase, možno nájsť na stránke http://wiki.ros.org/tf/Tutorials. Návody sú vytvorené pre programovacie jazyky Python a C++. Tiež tu možno nájsť informácie o nastavení a publikovaní vlastného robota pomocou tf alebo spôsobe spracovania údajov zo snímačov. V prípade vážnejšieho záujmu o ROS a s cieľom pochopiť problematiku sa odporúča tieto návody si prejsť.
Okrem vlastného programovania ROS ponúka aj množstvo už vopred vytvorených uzlov, ktoré vedia pracovať s balíkom tf. Príkladom takéhoto uzla je robot_state_publisher, ktorý dokáže z parametrového servera načítať opisný formát robota a automaticky vytvoriť transformácie v čase. Tejto problematike sa bude podrobnejšie venovať ďalší článok.
V prípade reálneho robotického zariadenia tf poskytuje aj podporu množstva konzolových príkazov, ktoré umožňujú kontrolovať priebeh jednotlivých transformácií na serveri tf.
Napríklad:
$ rosrun tf view_frames
$ evince frames.pdf
View_frames umožňuje vytvoriť pdf graf aktuálneho stromu transformácií tf. Tento príkaz bol použitý aj na vygenerovanie obr. 21.
Ďalšou možnosťou je použiť príkaz, ktorý napíše informácie o strome tf priamo v konzole:
$ rosrun tf tf_monitor alebo $ rosrun tf tf_echo /map /odom
Takýto príkaz vypíše do konzoly informácie o konkrétnej prebiehajúcej transformácii medzi dvoma súradnicovými systémami, v tomto prípade medzi súradnicovým systémom mapy a odometriou. Často sa používa aj zásuvný modul roswtf, ktorého úlohou je analýza aktuálnej konfigurácie tf. Tento modul vyhľadáva bežné chyby a problémy v nastaveniach. Spúšťa sa príkazom $ roswtf [1].
Snímače v ROS
Dôležitou a často nevyhnutnou súčasťou robotiky sú práve snímače. V tomto článku postupne opíšeme, aké správy moduly snímačov využívajú, ako k nim pristupovať a ako sú zobrazované namerané údaje v RVIZ. Väčšina správ obsahuje tzv. hlavičku (header). Hlavička je správa, ktorá pozostáva z údajov o čase merania a o geometrickej transformácii opisujúcej umiestnenie snímača. Príkladom je laserový diaľkomer, ktorý má definovanú presnú polohu na mobilnom zariadení. Aby bolo možné v RVIZ zobrazovať merané údaje zo snímačov, treba:
- zabezpečiť vysielanie transformácie (minimálne vo vzťahu mapa -> snímač),
- zabezpečiť publikovanie údajov zo snímačov prostredníctvom tém s preddefinovanou správou,
- zjednotiť názov transformácie v hlavičke správy frame_id s názvom vysielanej transformácie a nastaviť transformáciu, kde sa snímač nachádza,
- spustiť RVIZ príkazom rviz a po spustení v ľavom bočnom paneli pridať vybranú správu (pomocou tlačidla add), následne sa typ správy zobrazí v ľavom bočnom paneli, kde treba nastaviť konkrétnu tému v kolónke topic.
Diaľkomerné snímače a laserové skenery
Diaľkomerné snímače sú dôležité pre navigáciu mobilného robota v priestore. Využitie nachádzajú pri detekcii rôznych prekážok alebo v aplikáciách algoritmov SLAM-u. Existuje už množstvo vytvorených balíkov pre rôzne snímače. Jedným z nich je 2D 360-stupňový laserový skener RPLidar. Inštalácia je jednoduchá, spočíva len v nakopírovaní balíka rplidar_ros do pracovného priečinku (workspace). Balík je dostupný na https://github.com/robopeak/rplidar_ros/tree/master. Po kopírovaní treba ešte spustiť príkaz catkin_make, na čo je k dispozícii spúšťací súbor roslaunch rplidar_rosview rplidar.launch. Po spustení možno v RVIZ vidieť, ako RPLidar sníma priestor. Obr. 22 ukazuje, ako sa sníma priestor a vytvára mapa pomocou balíka gmapping. Po spustení samotného skenera mapu hneď nie je vidieť, nato treba spustiť ďalšie balíky. Keďže sa tento článok nevenuje tvorbe mapy, tento obrázok je uvedený len na ukážku. Laserový skener publikuje pomocou správy sensor_msgs/LaserScan, ktorú tiež vidieť na obr. 22. Obsahuje hlavičku (header), začiatok a koniec uhla snímania v radiánoch (angle_min a angle_max), uhlovú vzdialenosť medzi jednotlivými meraniami v radiánoch (angle_increment), čas medzi meraniami v sekundách (time_increment), čas jedného skenovania v sekundách (scan_time), maximálny merací rozsah v metroch (range_min a range_max), vektor nameraných vzdialeností vo všetkých uhloch za jedno snímanie (ranges) a údaje o intenzite (intensities). Niektoré snímače však nevedia intenzitu merať. V takomto prípade je vektor údajov o intenzite prázdny [2], [3].
Joystick
Pri manuálnom ovládaní robota sa často používa joystick. Je to zariadenie, ktoré pozostáva z niekoľkých tlačidiel a potenciometra. V ROS-e je vytvorený balík Joy, ktorý možno nainštalovať pomocou príkazu sudo apt-get install ros-indigo-joy. Ak joystick nebude mať nastavené práva nato, aby k nemu mohol pristupovať uzol joy_node, treba ich nastaviť príkazom sudo chmod a+rw /dev/input/jsX
. Pred tým, ako sa spustí uzol, treba ešte nastaviť, aké zariadenie bude uzol používať: rosparam set joy_node/dev „/dev/input/jsX”
. Prednastavené zariadenie je /dev/input/js0. Ak je všetko nastavené, môže sa spustiť uzol (príkaz rosrun joy joy_node), ktorý, ako vidieť na obr. 23, publikuje tému /joy. Využíva sa správa sensor_msgs/Joy, ktorá obsahuje hlavičku (header), údaje o polohe joysticka (axes) a stlačených tlačidlách (buttons). Uzol publikuje túto správu vždy, keď dôjde k zmene polohy joysticka alebo k stlačeniu/uvoľneniu tlačidiel [4].
Jednotky IMU
Jednotky IMU sú zariadenia, ktoré obsahujú kombináciu gyroskopov a akcelerometrov, prípadne aj magnetometer. Prostredníctvom nich možno získavať údaje o uhloch vzhľadom na referenčné osi a takisto aj o zrýchlení alebo rýchlosti otáčania vzhľadom na tieto osi. ROS podporuje rôzne ovládače jednotiek IMU dostupných na http://wiki.ros.org/robot_pose_ekf. Napriek tomu stále existuje dosť zariadení, ktoré treba naprogramovať. Preto je pri tvorbe uzla veľmi vhodné implementovať tému so správou sensor_msgs/Imu, ktorú dokáže čítať množstvo balíkov. Jedným z príkladov môže byť hector_slam, ktorý dokáže z údajov jednotky IMU vyhodnocovať členitosť terénu a na základe toho upravovať mapu. Ako možno vidieť na obr. 24, správa sensor_msgs/Imu obsahuje hlavičku (header), uhle otočenia (orientation), uhlovej rýchlosti (angular_velocity) a zrýchlení (linear_acceleration). Okrem toho možno vyplniť aj údaj o kovariancii merania. Pokiaľ kovariančná matica obsahuje hodnotu 0, predpokladá sa, že údaje o kovariancii merania budú z iných zdrojov. Ak by jednotka IMU nedokázala merať všetky údaje tejto správy (napr. samostatný gyroskop nedokáže zmerať zrýchlenie), tak sa nemeraný vektor vyplní hodnotou 0 a kovariančná matica hodnotou –1 [5].
Odometria
Odometria slúži na určenie polohy robota v priestore vzhľadom na predchádzajúcu známu polohu a jej prechodu z nej. Pri tomto procese sa využívajú informácie o pohybe kolies získavané inkrementálnymi snímačmi, čo sú zariadenia snímajúce diskrétne polohy kolies. To sa realizuje pomocou impulzov, pričom koleso je rozdelené na presný počet impulzov a každému impulzu prislúcha rovnaký uhol pootočenia kolesa. Na správnu implementáciu odometrie je nevyhnutné poznať kinematický model robota. Z informácií poskytovanými inkrementálnymi snímačmi a zo znalosti kinematického modelu robota možno zrátať rýchlosť robota v smere osi x, y a rotáciu okolo osi z. Ak je táto rýchlosť počas krátkeho časového intervalu konštantná, tak možno určiť zmenu polohy a uhla natočenia robota počas tohto intervalu a následne ju pripočítať k predchádzajúcej známej polohe. Tieto informácie potom možno publikovať prostredníctvom témy a transformácie. Na to sú v ROS-e pripravené správy nav_msgs/Odometry pre odometriu publikovanú pomocou tém a geometry_msgs/TransformStamped pre transformáciu.
V správe geometry_msgs/TransformStamped treba v hlavičke správy vyplniť čas nameraných hodnôt (stamp) a názov bodu, vzhľadom na ktorý sa bude určovať poloha (frame_id). Okrem hlavičky správa obsahuje aj názov bodu, ktorého poloha sa bude meniť (child_frame_id), vektor polohy v osiach x, y, z (transform.translation) a vektor otočenia vzhľadom na osi x, y, z (transform.rotation), ktorý je definovaný správou typu geometry_msgs/Quaternion. Existuje viacero rôznych spôsobov, ako vygenerovať údaje o rotácii. Jedným zo spôsobov je napr. funkcia tf::createQuaternionMsgFromYaw(), ktorej argumentom je uhol otočenia v osi z. Správa nav_msgs/Odometry má podobnú štruktúru ako správa geometry_msgs/TransformStamped a navyše je rozšírená o správu geometry_msgs/TwistWithCovariance twist, ktorá obsahuje údaje o rýchlosti v smere osí x, y, z a o rýchlosti rotácie okolo osí x, y, z. Ukážkový zdrojový kód na publikovanie odometrie možno nájsť na stránke http://wiki.ros.org/navigation/Tutorials/RobotSetup/Odom [6], [7].
Užitočné tipy
Jednou z dobrých vlastností ROS-u je, že dokáže bežať na viacerých počítačoch, teda jednotlivé úlohy možno rozdeliť medzi viacero počítačov a dosiahnuť tak väčší výpočtový výkon. Tiež je možné jednoduché riadenie a vizualizácia zo vzdialeného počítača. Témy, služby aj parametrový server sú navrhnuté tak, aby dokázali komunikovať nielen medzi procesmi bežiacimi na jednom počítači, ale aj medzi procesmi na viacerých počítačoch.
Aby táto komunikácia fungovala správne, treba urobiť niekoľko krokov. Pri inštalácii ROS-u, ktorá bola opísaná v prvom článku o ROS-e, sa nastavovali systémové premenné. Jednou z týchto premenných je ROS_MASTER_URI. Pri nahliadnutí, či táto premenná obsahuje echo $ROS_MASTER_URI, bude odpoveďou http://localhost:11311/. Každý uzol pri spustení hľadá mastra a to je jeho adresa. Ak bude ROS master bežať na inom PC, treba zmeniť túto premennú na adresu, na ktorej beží master. Zmenu treba vykonať tak, že localhost sa zmení na IP adresu počítača, na ktorom beží master. Potom ju treba exportovať medzi systémové premenné, napr. export ROS_MASTER_URI=http://192.168.2.1:1131/. Na každom počítači treba tiež exportovať jeho IP adresu do premennej ROS_IP, napr. export ROS_IP=192.168.2.1. To treba urobiť pre každý spustený terminál zvlášť, čo je pomerne nepraktické. Riešením je zmena skriptu, ktorý sa vykonáva pri spustení terminálu. Pomocou textového editora treba otvoriť súbor. bashrc (nachádza sa v priečinku /home/<USER>), napr. nano. bashrc, a na jeho koniec pridať ROS_MASTER_URI=http://192.1682..1:11311 a export ROS_IP=192.168.2.1 (IP adresy zmeňte na požadované). Po takejto zmene treba zatvoriť a znovu otvoriť všetky terminály. Po týchto nastaveniach potom možno komunikovať medzi viacerými počítačmi, na ktorých beží ROS.
Na záver ešte jedna rada, keďže vaša IP adresa v sieti, nemusí byť statická, je praktické namiesto exportovania pevnej adresy do premennej ROS_IP použiť príkaz hostname -I, a to takto: export ROS_IP=`hostname -I`. To však nemusí fungovať vždy, napríklad ak ste pripojení do siete cez WiFi aj ethernetový adaptér, máte dve IP adresy. Príkaz hostname -I teda vráti dve adresy a premenná ROS_IP nebude korektne nastavená. Tu sa otvára možnosť tvorby príkazu, ktorý bude používateľovi vyhovovať. Ak sa bude neskôr master spúšťať na inom počítači, treba premennú ROS_MASTER_URI znovu vhodne zmeniť. Súčasné nastavenie možno overiť príkazom echo $ROS_IP alebo echo $ROS_MASTER_URI [8].
Záver
V tomto článku boli uvedené základné informácie o balíku tf a o jeho reálnom využití. Ďalej sa demonštrovalo reálne získavanie údajov zo snímačov a na záver sa uviedlo pár rád, ktoré môžu pri práci s ROS-om pomôcť. Ďalší článok sa bude zaoberať vytváraním modelov a simulácií v ROS-e, konkrétne detailnejšie opíšeme grafické prostredie RVIZ a Gazebo. Cieľom článku bude naučiť čitateľa definovať robot pomocou univerzálneho robotického opisného formátu (URDF) a zobraziť robotické zariadenie v ROS-e pomocou tf.
Poďakovanie
Tento článok vznikol vďaka podpore projektu Req-00347-0001.
Literatúra
[1] Autor neuvedený: Tf package. [online]. Citované 4. 2. 2016. Dostupné na: http://wiki.ros.org/tf
[2] Autor neuvedený: RPLIDAR ROS package. [online]. Citované 31. 1. 2016. Dostupné na: https://github.com/robopeak/rplidar_ros/tree/master
[3] Autor neuvedený: sensor_msgs/LaserScan Message. [online]. Citované 31. 1. 2016. Dostupné na: http://docs.ros.org/hydro/api/sensor_msgs/html/msg/LaserScan.html
[4] Autor neuvedený: Configuring and Using a Linux-Supported-Joystickwith ROS. [online]. Citované 31. 1. 2016. Dostupné na: http://wiki.ros.org/joy/Tutorials/ConfiguringALinuxJoystick
[5] Autor neuvedený: sensor_msgs/Imu Message. [online]. Citované 31. 1. 2016. Dostupné na: http://docs.ros.org/hydro/api/sensor_msgs/html/msg/Imu.html
[6] Autor neuvedený: navigation/Tutorials/RobotSetup/Odom. [online]. Citované 3. 2. 2016. Dostupné na: http://wiki.ros.org/navigation/Tutorials/RobotSetup/Odom
[7] Autor neuvedený: nav_msgs/Odometry Message. [online]. Citované 3. 2. 2016. Dostupné na: https://mirror.umd.edu/roswiki/doc/diamondback/api/nav_msgs/html/msg/Odometry.html
[8] Autor neuvedený: ROS/Tutorials/MultipleMachines. [online]. Citované 3. 2. 2016. Dostupné na: http://wiki.ros.org/ROS/Tutorials/MultipleMachines
Miroslav KohútMatej Bartošovič
Michal Dobiš
doc. Ing. František Duchoň, PhD.
Ing. Andrej Babinec, PhD.
STU Bratislava
Fakulta elektrotechniky a informatiku
Ústav robotiky a kybernetiky
Ilkovičova 3, 812 19 Bratislava
frantisek.duchon@stuba.sk
www.urk.fei.stuba.sk