#03 Definície a pojmy ROS

ROS_03_titleV prvých dvoch článkoch o ROS a ROS-Industrial sme sa zaoberali pôvodom, motiváciou a stručným prehľadom možností, ktoré Robot Operating System v súčasnosti ponúka. V tomto príspevku sa bližšie pozrieme na ROS z pohľadu architektúry, objasníme si 3 základné koncepty systému a vysvetlíme si pojmy a definície s ktorými pri vývoji ROS aplikácie určite stretnete. Taktiež si povieme niečo o možnostiach programovania v ROS a o princípoch na ktorých funguje základný stavebný kameň celého ROS - komunikácia medzi jednotlivými procesmi.

Čo je ROS?

Podľa oficiálnej dokumentácie na ROS Wiki je ROS open-source meta-operating system, ktorý poskytuje štandardné služby (hadrware abstraction, low-level device control, package management) ako bežný operačný systém ale primárne je určený pre potreby robotiky.

Hlavnou motiváciou pri vývoji ROS bolo zjednodušiť "code reusability", čiže zdieľanie a opätovné využívanie už existujúceho kódu v rámci robotickej komunity. V praxi sa to vývojári snažili dosiahnuť predovšetkým dodržiavaním nasledujúcich 5 princípov:

1. Thin - Architektúra ROS bola navrhnutá tak, aby bolo možné kód vyvíjaný pre ROS použiť aj v iných frameworkoch. V súčasnosti je integrovaná podpora pre OpenRAVE, Ocoros a Player.

2. ROS Agnostic libraries - snaha udržať pri vývoji knižníc samotný kód úplne nezávislý od ROS a až následne ho doplniť jednoduchým interfacom pre komunikáciu v rámci ROS infraštruktúry.

3. Language independecne - podpora viacerých programovacích jazykov. V súčasnosti je možné vyvíjať ROS aplikácie v Pythone, C++, Lisp a taktiež existujú experimentálne knižnice v Jave a Lua jazyku.

4. Easy Testing - Podpora pre unit-testing kódu, v ROS je na tento účel integrovaný framework rostest

5. Scaling - Vývoj so zreteľom na možné použitie v rozsiahlych robotických systémoch (viď Darpa Robotics Challenge).

Výsledkom dodržiavania týchto 5 pravidiel je vysoko modulárny systém, v ktorom si užívateľ doslova vyskladá vlastnú aplikáciu ako peer-to-peer sieť samostatných procesov, ktoré medzi sebou komunikujú prostredníctvom ROS infraštruktúry (services, topics). Navyše štandardným usporiadaním kódu do packageov a open source repozitárov je dosiahnuté jednoduché zdieľanie kódu a umožnená priama spolupráca pri jeho vývoji. ROS v súčasnosti beží na systémoch s Linuxom, najčastejšie sa využíva v kombinácii s Ubuntu distribúciou, taktiež na embedded platformách typu Raspberry Pi, BeagleBone ako aj  na MAC OS X systémoch. Logo-ROS

Rozdelenie ROS 

Začínajúci vývojari, pre ktorých je ROS prvým kontaktom s open-source vývojom majú často problém vôbec sa zorientovať v štruktúre ROS. Pomôcť im v tom môže nasledovné rozdelenie systému na 3 na seba nadväzujúce koncepty:

1. ROS FileSystem Level

2. ROS Computation Graph Level

3. ROS Comunity Level


ROS FileSystem Level 

FileSystem level pokrýva všetky súbory súvisiace s ROS, ktoré má užívateľ fyzicky uložené na harddisku čiže:

1. Packages - Základná organizáčná jednotka v ROS. Môže obsahovať zdrojové kódy, knižnice, konfiguračné súbory, launch files, jednoducho všetko, čo je potrebné pre vykonávanie danej funkcionality. Typickým prikladom je driver na USB kameru - usb_cam , kde sa okrem samotných zdrojových súborov nachádza aj launch file, ktorý zabezpečuje základnú konfiguráciu  čiže cestu ku kamere (/dev/ttyUSB0), žiadané rozlíšenie a názov topicu, kde má byť obraz z kamery publikovaný.

2. Package Manifests - package.xml obsahuje metadáta o danom packagei vrátane názvu, verzie, stručného popisu, typu licencie, maintainera a ďalších packageoch, ktoré sú pre spustenie nevyhnutné (tzv. dependencies). Príkladom môže byť opäť package usb_cam a jeho package.xml

3. Message (msg) types - ROS ponúka veľké množstvo preddefinovaných typov messageov, no ak je potrebné/výhodné vyskladať si vlastný typ správy je nutné zadefinovať jeho štruktúru v súbore s príponou .msg. Ako príklad môže poslúžiť JoystickCommand.msg z kinova-ros package-u

4. Services (srv) types - Ak sa v rámci komunikácie medzi procesmi využívajú services - je nutné ich zadefinovať v súbore s príponou .srv. Príkladom môže byť opäť kinova-ros package a jeho SetForceControlParam.srv 

ROS Runtime Level (Computation Graph Level)

Do tejto kategórie patrí všetko to, s čím užívateľ prichádza do styku počas behu aplikácie.

1. Node - Node je proces, spustiteľný súbor ktorý vykonáva výpočtové operácie. V rámci štandardnej ROS aplikácie beží paralelne viacero nodov, ktoré medzi sebou komunikujú prostredníctvom messageov a serviceov. Typickým príkladom je SLAM, kde jeden node spracúva dáta z Lidaru, druhý vykonáva lokalizáciu, tretí path-planning, štrvtý zobrazuje výsledky do RVizu, ďalší ovláda motory robota a podobne. Je iba na užívateľovi koľko nodov a aký typ vzájomnej komunikácie zadefinuje. Package roscpp a rospy poskytujú API, ktoré umožňuje zo zdrojových súborov napísaných v C++ alebo Pythone vytvoriž ROS Node pomerne jednoducho.

2. Master - je základným procesom každej ROS aplikácie. Registruje všetky nody, publisherov, subscriberov a existujúce komunikačné kanály (messages, services). Alebo inak povedané ak chcú jednotlivé nody medzi sebou komunikovať, musia o sebe vedieť, byť schopné sa nájsť a navzájom identifikovať. A práve to je úlohou Mastra.

3. Messages - Nody medzi sebou komunikujú prostredníctvom messsageov. Message nie je nič iné ako štruktúra naplnená dátami. K dispozícii sú základné typy (int, float, boolean, string atď.), ich polia a ako už bolo spomenuté užívateľ si môže zadefinovať aj vlastný typ správ.

4. Topics - Messsage medzi nodmi putujú cez tzv. topicy. Topic je pomenovanie komunikačného kanála ktorý je publikovaný niektorým z nodov. Ak iný node potrebuje prijímať správy z daného topicu, prostredníctvom ROS API sa zaregistruje na odoberanie správ. Ide v podstate o tradičný publish/subscribe systém, ktorý zabezpečuje aby sa message po odoslaní publisherom dostal ku všetkým subscriberom

5. Services - publish-subscribe spôsob komunikácie je síce flexibilným nástrojom výmeny dát medzi procesmi, avšak v praxi je často potrebný aj iný, adresnejší spôsob - request/reply. V tomto prípade je jeden node "servrom" poskytujúcim službu, od ktorého ju prostredníctvom vopred zadefinovanovaného requestu vyžaduje klientský node. Z programátorsého hľadiska ide o klasický RPC - Remote Procedure Call.

6. Bags - podporu bagov si vyžiadala robotická prax. Pri ladení aplikácií je totiž často potrebné pracovať s reálnymi dátami zo senzorov. A keďže zapínať po každom aj malom zásahu do programu reálneho robota na odskúšanie algoritmu nie je vždy veľmi praktické, využívajú sa bagy, ktoré umožňujú uloženie reálnych dát zo systému spolu s časovými známkami do samostatného súboru a neskoršie testovanie algoritmov voči týmto dátam.

ROSbanner

ROS Community Level

Komunita vývojárov je najdôležitejšou súčasťou ROS. V Palo Alto síce sídli OSRF - organizácia  spravujúca kľúčové komponenty systému a jednotlivé distribúcie, no väčšinu packegov a obsahu systému vytvorila práve robotická komunita. Z hľadiska komunitného vývoja je ROS podobný iným väčším open-source projektom a využíva overené nástroje:

1. Distribúcie - OSRF vydáva nové distribúcie ROS každý rok vždy v máji. Distribúcia je podobne ako v prípade Linuxu akousi kolekciou softwéru ktorá zabezpečuje potrebnú funkcionalitu, stabilitu systému a vzájomná kompatiblitu verzií jednotlivých packageov. Poslednou vydanou distribúciou ROS je Kinetic Kane.

2. Repozitáre - ROS priamo závisí na systéme repozitárov, ktoré sú spravované konkrétnymi github organizáciami(Roscore, RosDrivers, RosInfrastructure,RosPlanning, RosPerception, RosVisualization etc.).

3. ROS Wiki - komunitná Wiki, ktorá je hlavným zdrojom dokumentácie k jednotlivým packageom.

4. ROS Answers - ROS verzia známeho StackOverflowu. Q&A fórum pre všetky otázky ohľadom ROS

5. ROS Blog - Zdroj zaujímavých informácií a noviniek o vývoji v ROS komunite.

 

SPOLUAUTOR VAŠICH VEDOMOSTÍ JE:

SRS_logo