Obr. Mobilný robotický systém MRVK s robotickým ramenom
Predstavenie a základná štruktúra
V súčasnosti sú v našej spoločnosti roboty veľmi populárne a akceptované. Síce niektorí s ich pomocou stále nesúhlasia, treba si však uvedomiť, že v dnešnej konzumnej spoločnosti je ich postavenie veľmi významné. Majú široké využitie v priemysle alebo zdravotníctve, no objavujú sa aj projekty, ktoré súvisia so zavádzaním robotov do domácností, školstva a iných inštitúcií. Po hardvérovej stránke možno dosiahnuť obrovskú presnosť a rýchlosť, no stále existuje problém v jednotnom softvéri, ktorý by bol schopný pokryť veľké množstvo zariadení a pritom si stále zachovať efektívnosť a funkčnosť. Práve preto vznikol návrh vytvoriť robotický operačný systém, ktorý toto všetko bez problémov zvládne.
Prostredie ROS bude postupne opísané na základe implementácií do konkrétnych robotických systémov. Jedným z takto rozvíjaných robotov je robot MRVK (obr. 1), ktorý pozostáva z diferenciálne riadeného podvozku s riadiacim systémom na báze Linux Debian. Pohyb robota v prostredí je zabezpečený pomocou podvozku s dvoma motormi (každý s dvojstupňovou prevodovkou) a štyrmi kolesami. Jednou z úloh podvozku je tvorba mapy a lokalizácia v priestore (SLAM) s využitím údajov z laserového diaľkomera Hokuyo URG-04LX, odometrie a z IMU jednotky. Súčasťou robota je aj rameno riadené pomocou mikropočítača Raspberry PI 2, pozostávajúce z piatich motorov a kĺbov. Motory sú ovládané pomocou meničov Faulhaber.
V rámci série týchto článkov ukážeme, ako riadiť polohovanie ramena prostredníctvom ovládacieho zariadenia (konkrétne joysticka). Tento úvodný článok sa však nezaoberá priamou implementáciou do robota, ale všeobecným úvodom do problematiky ROS. Predstavíme ROS z historického pohľadu, neskôr samotnú inštaláciu na platformu Linux Ubuntu, súborový systém a základné prvky práce v ROS.
Pôvod a charakteristika distribúcie
ROS predstavuje otvorený (open source) systém, ktorý zahŕňa množstvo nástrojov a balíčkov. Je štrukturalizovaný tak, aby čo najviac zefektívnil programovanie a výslednú činnosť daného robota, prípadne nejakého motorického alebo senzorického subsystému. Bol vyvinutý v roku 2007 v Stanfordskom laboratóriu umelej inteligencie a v priebehu nasledujúcich rokov sa rozrástol do obrovských rozmerov. Vzniklo mnoho jeho distribúcií a nasledovateľov, ktorí sa neustále pripájajú a vytvárajú nové balíčky zjednodušujúce implementovanie tohto systému do nových zariadení.
Ako už bolo spomenuté, od roku 2008 až doteraz vzniklo obrovské množstvo distribúcií. No väčšina pre nás už nie je zaujímavá, keďže ďalšie distribúcie predstavovali hlavne nadstavby tých pôvodných. Jedno z oficiálnejších vydaní ROS-u bolo v roku 2010, keď prvýkrát vznikol ROS Box Turtle.
Dnes sú najaktuálnejšie verzie ROS Jade a ROS Indigo. ROS Jade patrí k najnovšie vydaným distribúciám (vydané 23. 5. 2015) a bol určený hlave k Ubuntu 15.04. Z vlastných skúseností by bolo vhodné odporučiť ROS Indigo (obr. 2), ktorý je trošku starší (vydaný 22. 7. 2014) a určený hlavne k Ubuntu 14.04. Využíva sa hlavne z hľadiska stability, keďže patrí medzi tzv. long term support release a má oficiálnu podporu až do apríla roku 2019. ROS Jade má podporu len do mája 2017 [1], [2].
Využitie
Vytvoriť stabilný a odolný všeobecný softvér na programovanie a riadenie robotov je skutočne ťažké. ROS toto všetko poskytuje. Využívajú ho školy, vedecké inštitúcie, no postupne sa začína uplatňovať aj v priemysle. Bola vydaná tzv. verzia ROS Industrial, ktorá poskytuje široké využitie pre všetky priemyselné roboty. Najznámejšie roboty, ktoré majú už vytvorenú podporu ROS Industrial, sú napríklad roboty ABB (obr. 3) alebo Fanuc.
Keďže ROS predstavuje otvorený systém, všetky v ňom vytvorené knižnice a balíčky sú priamo dostupné na webe ROS-u (http://wiki.ros.org/Robots). Vytvorené balíčky stačí len stiahnuť a použiť. Úplný začiatočník v ROS-e, ktorý si prešiel základným kurzom a je trochu zdatný v robotike, by mal bez problémov zvládnuť takúto konfiguráciu robota. V niektorých balíčkoch, konkrétne pre ABB, možno nájsť aj ďalší návod, ktorý obsahuje presný postup, ako aktivovať ROS server a sfunkčniť ovládače pre konkrétny typ robota. Navyše stále sa vytvárajú nové balíčky, ktoré sú voľne dostupné a ľahko využiteľne pre všetky nové robotické zariadenia.
ROS poskytuje dve hlavné grafické prostredia, Rviz a Gadzebo, kde možno ľahko simulovať pohyby robotov, správanie senzorov alebo ovládať jednotlivé, používateľom naprogramované motorické alebo senzorické subsystémy. V ROS-e možno mapovať prostredie alebo zahrnúť do riešení fyzikálne výpočty. Možnosti sú prakticky neobmedzené, pričom možno stále nadväzovať na už vytvorené balíčky, takže programátor robotov nikdy nezačína od nuly. Postupne budú predstavené najpoužívanejšie balíčky v ROS-e a poskytnuté základné informácie o práci s týmito balíčkami [1].
Platformy a programovacie jazyky
ROS je prvotne určený pre linuxové systémy a predstavuje akúsi nadstavbu Linuxu. Pokiaľ je programátor zarytý „linuxák“, tak si tento systém určite obľúbi. Možno ho používať na všetkých architektúrach, či už je to x_86 x_64, alebo sú to procesory typu ARM. Preto sa s veľkou obľubou používa ROS v kombinácii s Raspberry Pi. Po inštalácii pribudne do konzoly nová hŕstka príkazov, pomocou ktorých sa s ROS-om pracuje. Možno spúšťať jednotlivé nástroje a pohybovať sa v pracovnom prostredí. Pri programovaní aplikácií ROS možno zvoliť medzi dvoma programovacími jazykmi, ktorými sú Python alebo C++. Pokiaľ je zvolený Python, programovanie robota sa podstatne uľahčí a urýchli. V štandardnom režime sa však volí C++, pri ktorom sa síce programátor viac narobí, no efektivita a rýchlosť samotného programu je v niektorých prípadoch oveľa vyššia. Najvýhodnejšie riešenie je poväčšine kombinácia týchto dvoch jazykov, ale to skôr používajú už skúsenejší programátori. Pri vysvetľovaní problematiky v tomto článku je zvolený jazyk C++ [4].
Inštalácia ROS
Podporovaná platforma pre ROS je Ubuntu. Možno ho však nainštalovať aj na rôzne iné distribúcie Linuxu, napríklad Raspbian. Inštalácia na iné platformy býva zložitejšia, zdĺhavá a často treba niektoré závislosti (dependencies) doinštalovať ručne. Najnovšia verzia je ROS Jade. Avšak pre stabilitu sa odporúča distribúcia Indigo, ktorý bol v nasledujúcich príkladoch nainštalovaný na Ubuntu 14.04.
V prvom rade treba v systémových nastaveniach pre softvér a aktualizácie povoliť sťahovanie softvéru zo všetkých zdrojov, t. j. universe, restricted, multiverse. V ďalšom kroku treba otvoriť terminál a vykonať nasledujúce príkazy:
sudo sh -c ‚echo „deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main” > /etc/apt/sources.list.d/ros-latest.list’
sudo apt-key adv --keyserver hkp://pool.sks-keyservers.net --recv-key 0xB01FA116
Tieto príkazy povolia sťahovať softvér z packages.ros.org a jeho správne dekódovanie. Teraz možno pristúpiť k samotnej inštalácii. Najprv sa však treba uistiť, že všetky balíčky sú aktuálne: sudo apt-get update.
Ak treba používať vizualizáciu, simulácie, Rviz (obr. 4) alebo Rqtgraph, je vhodné nainštalovať verziu desktop-full, ktorá všetky tieto balíčky obsahuje: sudo apt-get install ros-indigo-desktop-full.
Ak sú tieto balíčky zbytočné na využitie v konkrétnom robote, je vhodné nainštalovať ROS-Base: sudo apt-get install ros-indigo-ros-base. V ďalšom kroku treba inicializovať závislosti sudo rosdep init, rosdep update a nastaviť systémové premenné: echo „source /opt/ros/indigo/setup.bash” >> ~/.bashrc source ~/.bashrc. Následne treba vytvoriť pracovný priestor (workspace), kde sa bude po inštalácii pracovať:
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
cd ~/catkin_ws
catkin_make
Ak otvoríte prehliadač súborov (file explorer), uvidíte priečinok catkin_ws, ktorý ste vytvorili, a v ňom priečinky build, devel a src (obr. 5).
Toto je váš pracovný priestor (workspace) a všetky nové vytvorené balíčky sa nachádzajú v ~/catkin_ws/src. Keďže novo vytvorené balíčky sa nachádzajú v tomto priečinku, treba ho pridať do ROS_PACKAGE_PATH, a to vždy pri spustení nového terminálu:
cd ~/catkin_ws/src
source devel/setup.bash
Alebo treba do. bashrc pridať na koniec source ~/catkin_ws/devel/setup.bash, a to buď ručne pomocou textového editora, alebo treba použiť príkaz echo „source ~/catkin_ws/devel/setup.bash” >> ~/.bashrc. Aby sme sa uistili o správnom nastavení, treba spustiť echo $ROS_PACKAGE_PATH. Odpoveď by mala byť: /home/user/catkin_ws/src:/opt/ros/indigo/share:/opt/ros/indigo/stacks. Teraz je inštalácia úspešne dokončená [4].
Inštalácia balíčka
Inštalácia balíčka je veľmi jednoduchá a vykonáva sa pomocou manažéra balíčkov (package mananger) apt-get instal ros-indigo-MenoBalíčka. Inou možnosťou je nakopírovať balíček do priečinka ~/catkin_ws/src a potom v priečinku ~/catkin_ws použiť príkaz catkin_make. Zoznam existujúcich balíčkov možno nájsť na stránke http://www.ros.org/browse/list.php [5].
Vytvorenie nového balíčka
Každý balíček by mal byť vytvorený v priečinku ~/catkin_ws/src. Balíček sa vytvára pomocou príkazu catkin_create_pkg meno_baíčka dep1 dep2 dep3 …, napr.: catkin_create_pkg my_first_package roscpp std_msgs rospy, kde my_first_package je meno balíčka a roscpp std_msgs rospy sú balíčky ROS, ktoré nový balíček potrebuje, aby správne fungoval. Balíčky, od ktorých novo vytvorený balíček závisí, možno spätne zistiť pomocou rospack depends1 my_first_package.
Pri vytvorení balíčka sa vytvorí priečinok ~/catkin_ws/src/my_first_package a v ňom dokument package.xml, kde možno napísať zopár informácií o balíčku; tiež sú tu zapísané závislosti (dependencies), ktoré sme zadali pri vytvorení. Ďalej tu možno pridať ďalšie závislosti už po vytvorení balíčka. Tiež sa tu nachádza priečinok src, kam sa ukladajú používateľom napísané kódy. Balíček možno skompilovať pomocou catkin_make [5].
Uzly, témy a správy
Základné prvky ROS sú:
- Uzol (Node) – ide o proces so svojím PID (process identification number), na ktorom prebiehajú výpočty programu; nato, aby uzly medzi sebou komunikovali, musia byť pripojené na sieť ROS-u, a to prostredníctvom základného node roscore.
- Téma (Topic) – jednotlivé uzly medzi sebou komunikujú pomocou tém, ktoré predstavujú komunikačný kanál. Z hľadiska tém sa uzly delia na publisher (odosiela na tému), subscriber (číta z témy), prípadne oboje.
- Správa (Message) – správy obsahujú údaje posielané medzi uzlami prostredníctvom tém. V správe sú definované údajové typy (napr. string, int, double) [8].
Jednoduchým príkladom na vysvetlenie základnej funkcionality je program, ktorý číta údaje z diaľkomera Rplidar (obr. 6) a odosiela ich na tému, z ktorej číta ďalší uzol a následne tieto údaje spracuje. Sieť tém a uzlov je zobrazený na obr. 7, kde /robot_tf_publisher, /odometry_publisher, /rplidarNode predstavujú uzly typu publisher a /slam_gmapping predstavuje uzol obojakého typu, t. j. aj publisher, aj subscriber. Témy predstavujú /tf, /tf_static, /scan a /map.
Spustenie uzla
Ako funguje spustenie uzla, možno ukázať na simulácii korytnačky z tutoriálu, ktorý možno nájsť na wiki.ros.org/ROS/Tutorials/. V prvom kroku treba nainštalovať balíček obsahujúci tutoriál: sudo apt-get install ros-indigo-ros-tutorials. Po úspešnej inštalácii treba spustiť roscore, ktorý musí byt vždy spustený. Tento krok sa vykoná jednoduchým zadaním príkazu roscore do terminálu. Ak sa roscore neinicializoval a v termináli sa objaví správa o nedostatku povolení, treba zmeniť práva zložky ~/.ros, a to zadaním príkazu sudochown -R <your_username> ~/.ros. Samotný uzol sa potom spúšťa pomocou príkazu rosrun [nazov_balika] [nazov_programu].
Keď už beží roscore, možno spustiť ROS program z tutoriálu. Do nového terminálu treba zadať rosrun turtlesim turtlesim_node. Spustí sa simulácia (obr. 8), na ktorej vidieť nehybnú korytnačku. Teraz treba zapnúť druhý uzol, pomocou ktorého možno ovládať korytnačku, a to vpísaním príkazu do ďalšieho terminálu: rosrun turtlesim turtle_teleop_key. Po spustení tohto príkazu možno pomocou šípok na klávesnici s korytnačkou hýbať (obr. 9).
Keď sú spustené oba programy, veľmi jednoducho sa dajú získať bližšie informácie o spustených uzloch. Do nového terminálu zadajte rosnode list. Mali by byť spustené tri uzly (obr. 10). Ak zadáte príkaz rosnode info /turtlesim, zistíte, že tento uzol odosiela na tri témy a na jednu tému prijíma. Ďalej možno vidieť zoznam služieb. Existujú aj ďalšie príkazy na prácu s uzlom, napr. help rosnode-h [6].
Získanie informácií o témach
Podobne sa dajú získať aj informácie o témach. Miesto rosnode treba použiť príkaz rostopic, napr. rostopic-h (vypíše existujúce príkazy na prácu s témami). Z hľadiska bližšieho oboznámenia sa s témou je dôležitý príkaz topic /turtle/cmd_vel, v konkrétnom znení rostopic echo /turtle/cmd_vel.
Ak pohnete korytnačkou, uvidíte správu, ktorá sa odosiela na tému. Každá téma môže mať rôzne typy správ. Zadaním príkazu rostopic type /turtle/cmd_vel sa zobrazí, že táto téma používa správu typu geometry_msgs/Twist. Príkazom rosmsg show geometry_msgs/Twist možno zistiť, aké údajové typy používa daná správa [7].
Využitie rqt_graph
Vynikajúcou pomôckou pri práci v ROS-e je rqt_graph (obr. 11). Zapína sa príkazom rqt_graph. Potom je vidieť grafický náhľad, v ktorom je zobrazené, ako komunikujú uzly prostredníctvom tém. V prípade simulácie korytnačky je vidieť, že /teleop_turtle posiela na tému /turtle/cmd_vel a z tejto témy číta /turtlesim.
Záver
Tento článok poskytol úvod do chápania funkcionality ROS. Takisto oboznámil čitateľa s dôvodmi jeho vzniku, takže po prečítaní tohto článku by mal každý čitateľ zvládnuť správne nainštalovať ROS do riadiaceho systému robota a mal by sa vedieť zorientovať v pracovnom prostredí ROS. Ďalšie články z tejto série sa budú zaoberať písaním jednoduchých tém a správ. Po obsahovej stránke sa budú zaoberať štandardnou problematikou zo sveta robotiky – kinematikou, lokalizáciou, navigáciou a pod. Ďalším obsahom článkov bude aj tvorba servisov a analýza a funkcionalita knižnice Tf, ktorá je veľmi dôležitá pre prácu s ROS-om.
Poďakovanie
Tento článok vznikol vďaka podpore projektu Req-00347-0001.
Literatúra
[1] Autor neuvedený: ROS-Industrial. [online]. Citované 11. 7. 2015. Dostupné na: <http://ros.org/wiki/Industrial >.
[2] Autor neuvedený: ROS Jade Turtle Release. [online]. Citované 11. 7. 2015. Dostupné na: <http://www.ros.org/news/2015/05/ros-jade-turtle-release.html>.
[3] Autor neuvedený: ROS Indigo Igloo. [online]. Citované 11. 7. 2015. Dostupné na: <http://wiki.ros.org/indigo>.
[4] Autor neuvedený: Ubuntu install of ROS Indigo. [online]. Citované 11. 7. 2015. Dostupné na: <http://wiki.ros.org/indigo/Installation/Ubuntu>.
[5] Autor neuvedený: Creating a ROS Package. [online]. Citované 11. 7. 2015. Dostupné na: <http://wiki.ros.org/ROS/Tutorials/CreatingPackage>.
[6] Autor neuvedený: Understanding ROS Nodes. [online]. Citované 11. 7. 2015. Dostupné na: <http://wiki.ros.org/ROS/Tutorials/UnderstandingNodes>.
[7] Autor neuvedený: Understanding ROS Topics. [online]. Citované 11. 7. 2015. Dostupné na: <http://wiki.ros.org/ROS/Tutorials/UnderstandingTopics>.
[8] Martinez, A. – Fernández, E.: Learning ROS for Robotics Programming. Birmingham: Puckt Publishing Ltd. 2013. 303 s. ISBN978-1-78216-144-8.
Miroslav Kohút
Matej Bartošovič
Michal Dobiš
doc. Ing. František Duchoň, PhD.
Ing. Andrej Babinec, PhD.
STU Bratislava
Fakulta elektrotechniky a informatiky
Ústav robotiky a kybernetiky
Ilkovičova 3, 812 19 Bratislava
frantisek.duchon@stuba.sk
www.urk.fei.stuba.sk