====== ROS ve stavebnici MLAB ====== [[http://www.ros.org/|ROS (The Robot Operating System)]] je open-source balík knihoven a nástrojů, které pomáhají při stavbě a vývoji robotických systémů. Software obsahuje ovladače určitých zařízení, nástroje pro snadnou vizualizaci dat, posílání zpráv a další užitečné věci. Software používající ROS může být v jazycích [[https://www.python.org/|Python]], [[https://cs.wikipedia.org/wiki/C%2B%2B|C++]], [[https://cs.wikipedia.org/wiki/Lisp|Lisp]] a experimentálně v Javě nebo v jazyce Lua. Instalace aktuální verze ROS Kinetic (10) je popsána [[cs:ros#ros_kinetic_10|níže]]. ===== Struktura ROSu ===== Software používající ROS je rozčleněn do tzv. nodů. === Nod (node) === Nod je základní prvek celého ROS systému, je to jeden program, který je připojen k master-nodu. Každý node může komunikovat navzájem s ostatními pomocí připraveného messaging systému. Zprávy můžou existovat dvojího typu. == Zprávy (msg) == Zprávy můžou obsahovat typy dat, které jsou nadefinované v souboru (.msg). Zpráva může obsahovat jednu nebo více hodnot. .msg soubor může vypadat například takto string name float32 hodnota Takováto zpráva pak předává dvě hodnoty. První jako řetězec znaků a druhou jako číslo s desetinou tečkou. Každá zpráva má své téma (topic) nastavené při odeslání z nodu - (publisher). Zprávu přijme nod - (subscriber), který má pro dané téma nastavený příjem. == Servis (srv) == Servise je typ zprávy, který je definován obdobně jako zpráva (msg) pomocí souboru .srv. Navíc má tu vlastnost, že zpráva míří k určitému nodu, který na zprávu odpoví způsobem předepsaným v souboru .srv. Servis se není vhodný pro dlouhotrvající funkce, protože klient čeká na odpověď. Jen například pro čtení senzorů, získání dat atd... příklad .srv souboru string name float32 hodnota --- bool stav == Action (act) == Akce jsou typy zpráv určené pro dlouhotrvající akce. Je to obdoba servisu popsaného výše. Při jejich spuštění se nečeká na dokončení akce jako je tomu u servisů a spouštěcí klient muze mezitím provádět jinou činnost. Dlouhotrvající proces může během svého průběhu posílat informace o sobě (například procento dokončení, rychlost průběhu a další...) a při dokončení pošle další zprávu. Toto je vhodné například, když se robot má někam pohybovat a je třeba mezitím kontrolovat ostatní součásti robota jako senzory atd... Akce se definuje obdobně jako předchozí dva typy zpráv souborem .action: string name # parametry předané při startu akce float32 hodnota --- int32 hodnota # informace o stavu průběhu --- bool stav # informace o dokončení celé akce int32 hodnota == Master node == Master node je nod, který se spouští příkazem ''roscore''. Slouží k snazšímu nalezení nodů navzájem, nod tedy musí být vždy spuštěn. Do tohoto nodu lze ukládat konfigurační data, které si může kterýkoliv nod získat podle jména. Oficiální dokumentace, příklady a tutoriály jsou k dispozici zde: [[http://wiki.ros.org/| wiki.ros.org]]. ===== Sdílení dat po síti ===== Sdílení dat mezi nody (zprávy, servisy, master-node, ...) po síti není pro ROS žádný problém a je to vyřešeno velmi jednoduše a funkčně. Jeden počítač, na kterém běží master-node ''roscore'' je ten, na který se ostatní počítači připojují. Na vzdáleném počítači (bez master-node) spustím tento příkaz: export ROS_MASTER_URI='http://telescopeC.local:11311' Kde nastavím jméno počítače (nebo jeho IP adresu) (v tomto případě //telescopeC.local//) a port master-nodu. Ten zjistíme z jeho výpisu při spuštění, jako výchozí je port 11311. [[http://wiki.ros.org/ROS/Tutorials/MultipleMachines|Podrobnější popis]] [[http://answers.ros.org/question/38694/running-ros-across-multiple-machines/?answer=38971#post-id-38971|Podrobnější popis 2]] ====== Instalace ====== ===== ROS jade (9) ===== Přidání repozitářů do systému (funguje pouze pro ubuntu Trusty (14.04), Utopic (14.10) a Vivid (15.04)) sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' Instalace klíčů: sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 0xB01FA116 Následně zaktualizovat seznam repozitářů: sudo apt-get update Nyní je možné nainstalovat i jen části ROSu podle účelu použití. Na pracovní desktop s monitorem se hodí celá verze, která obsahuje nástroje i snadný debugging nebo vizualizaci dat. Na Odroid bych doporučil buď desktop nebo základní verzi. * Celá verze: ROS, rqt, rviz, knihovna pro roboty, 2D/3D simulace, navigace and 2D/3D precepce sudo apt-get install ros-jade-desktop-full * Desktopová verze: ROS, rqt, rviz, a knihovny pro roboty sudo apt-get install ros-jade-desktop * Základní verze: ROS a základní komunikační balíčky. Bez grafických nástrojů. sudo apt-get install ros-jade-ros-base Jednotlivé balíčky lze kdykoliv doinstalovat. Po nainstalování je potřeba inicializovat a aktualizovat program rosdep sudo rosdep init rosdep update Ještě je potřeba nastavit prostředí terminálu. To lze udělat na stálo takto: echo "source /opt/ros/jade/setup.bash" >> ~/.bashrc source ~/.bashrc nebo pro aktuální session terminálu spuštěním . /devel/setup.bash v pracovním repozitáři Zde napsaný postup (02_2016) odpovídá verzi Jade 9. Vždy aktuální postup najdete v oficiální příručce [[http://wiki.ros.org/ROS/Installation|wiki.ros.org]], ze které je zde přejatý. Instalaci jsem testoval na PC s Ubuntu 14.04.3 LTS a na [[cs:odroid-c1|Odroidu-C1]] se stejným operačním systémem. V případě problémů se obraťte opět na oficiální příručku [[http://wiki.ros.org/ROS/|ROS]] ===== ROS Kinetic (10) ===== Postup instalace je převzat z oficiálního postupu dostupného [[http://wiki.ros.org/ROS/Installation|online]]. Popisovaný postup je pro OS Ubuntu (Wily 15.10 a Xenial 16.04) 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://ha.pool.sks-keyservers.net:80 --recv-key 0xB01FA116 sudo apt update * Celá verze: ROS, rqt, rviz, knihovna pro roboty, 2D/3D simulace, navigace and 2D/3D precepce sudo apt install ros-kinetic-desktop-full * Desktopová verze: ROS, rqt, rviz, a knihovny pro roboty sudo apt install ros-kinetic-desktop * Základní verze: ROS a základní komunikační balíčky. Bez grafických nástrojů. sudo apt install ros-kinetic-ros-base Po instalace je potřeba nastavit závislosti uvnitř ROSu. sudo rosdep init rosdep update export CMAKE_PREFIX_PATH=/opt/ros/kinetic/ Pro snadné spouštění je vhodné nastavit prostředí terminálu nastálo. echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc source ~/.bashrc Tím je instalace ROSu dokončena... Můžete pokračovat na nastavení systému [[cs:robozor:arom#instalace|AROM]]. ==== Testované sestavy ==== * Desktop Ubuntu amd64 16.04.1 LTS - ROS Kinematic Kame - OK * Desktop Ubuntu amd64 14.04 LTS - ROS Kinematic Kame - OK * Desktop Ubuntu amd64 14.04 LTS - ROS Jade - OK * Odroid C1 Ubuntu 14.04 - ROS Jade - OK * Odroid C1 Ubuntu 14.04 - ROS Kinetic Kame - OK * Odroid C1+ Ubuntu 16.04.02 - ROS Kinetic Kame - OK 03/2017 * Odroid C2 Debian Jessie - ROS Kinetic Kame - OK * Odroid C2 Ubuntu 16.04 LTS - ROS Kinetic Kame - OK 03/2017 ====== Sensor-UI s ROS ====== [[https://github.com/MLAB-project/sensor-ui/tree/ROS_sensor-ui|ROS_sensor-UI]] je software pro vizualizaci dat ze senzorů připojených pomocí knihovny [[cs:pymlab|pymlabu]]. ==== Instalace ==== Pro rozfungování [[https://github.com/MLAB-project/sensor-ui/tree/ROS_sensor-ui|ROS_sensor-UI]] je potřeba mít nainstalovaný ROS v základní (nebo vyšší) verzi a [[cs:pymlab|pymlab]]. Nejdříve stáhneme repozitář a vybereme vývojovou větev s ROS implementací git clone git@github.com:MLAB-project/sensor-ui.git ROS_sensor-ui cd ROS_sensor-ui && git checkout ROS_sensor-ui Nyní si ROS_sensor-UI přeložíme pomocí: Překládají se například soubory popisující zprávy catkin_make Nyní můžeme spustit master-node roscore Aby ''rosrun'' fungoval s naším projektem, musíme ho přidat do proměnných prostředí terminálu pomocí příkazu. Tento krok musíme provést při každém spuštění sezení terminálu, ve kterém budeme chtít pracovat s naším projektem. cd ROS_sensor-ui/ && . devel/setup.bash Nyní bude ''rosrun'' s naším projektem fungovat z jakékoliv složky. V dalším terminálu si spustíme ROSpymlabServer.py rosrun sensor_server ROSpymlabServer.py nyní jsme si spustili server, který ovládá pymlab zařízení. Server se sám nepřípojí. Čeká na zprávu od klienta, která mu řekne jaké [[cs:pymlab|pymlab]] schéma sítě má použít. ==== Příklad klienta ==== Klienta z repozitáře spustíme následovně: rosrun sensor_server example_client_lts_sht.py Ke správné funkci tohoto příkladu je potřeba připojených senzorů vlhkoměru [[cs:sht25v|SHT25]] a teploměru [[cs:lts|LTS]] Nyní by jste v terminálu serveru měli vidět jednotlivé senzory a data z nich. Takový řádek vypadá nějak takto: sht25 get_hum 43.5987 || sht25 get_temp 24.9653 || lts01 get_temp 50.2070 || ==== Výstup ze ROSpymlabServeru ==== Jako výstup jsou zprávy vlastní struktury, které obsahují informace o senzoru, jménu hodnoty (funkce, kterou se v pymlabu získá) a její hodnotu. Zprávy mají nastavené téma ''pymlab_data'' Struktura zpráv je definována takto: string name float32 value ==== Vizualizace dat ==== === rqt_plot === Jako jeden z užitečných nástrojů balíku ROS je ''rqt_plot'', což je grafický program, který přijímá zpávy s určitým tématem a ty zobrazuje na monitoru. Zobrazení je provedeno pomocí knihovny Matplotlib, QwtPlot nebo PyQtGraph. Aby bylo možné data zobrazit pomocí ''rqt_plot'' je třeba mít data z jednotlivých rozdělena tak, aby každá měla vlastní téma. To zajišťuje příkladový kód ''example_plotter.py'', který spustíme takto. rosrun sensor_server example_plotter.py a pak samotný ''rqt_plot'' příkazem: rqt_plot V otevřeném okně si pak můžete nastavit zobrazovaná data. V použití s příkladovým kódem nás zajímají data s tématem ''/pymlab/sht25/get_temp'', ''/pymlab/sht25/get_temp'' a ''/pymlab/lts01/get_temp'' Výstup pak vypadá takto: {{ :cs:sw:ros_sensor-ui01.png?600 |}} ''rqt_plot'' je možné spustit na jiném počítači než jsou připojeny senzory a to při zprovoznění sdílení zpráv popsaném výše //"Sdílení dat po síťi"// === Web a Highcharts === Pro zprovoznění zobrazení ve webovém prohlížeči je potřeba doinstalovat software ''[[http://wiki.ros.org/rosbridge_suite/Tutorials/RunningRosbridge|ros_bridge]]''. sudo apt-get install ros-jade-rosbridge-suite source /opt/ros/jade/setup.bash rosbridge se pak spustí tímto příkazem. roslaunch rosbridge_server rosbridge_websocket.launch Pro zobrazení stránky stáhněte soubor [[https://raw.githubusercontent.com/MLAB-project/sensor-ui/ROS_sensor-ui/real_time_graph.html|real_time_graph.html]]. V něm je nejdříve potřeba na [[https://github.com/MLAB-project/sensor-ui/blob/ROS_sensor-ui/real_time_graph.html#L76|řádku 76]] upravit adresa k zařízení s ''rosbridge''. Je možné zde napsat i IP adresa (pro systém windows). ros.connect('ws://telescopeC.local:9090'); Tato metoda není vhodná pro dlouhodobé prohlížení dat, protože JS knihovna highcharts špatně hospodaří s daty a při velkém množství dochází k zaplnění paměti a následném zaseknutí/pádu prohlížeče. Proto je dobré buď nastavit menší obnovovací frekvenci ve spouštěcím klientovi ROS_sensor-ui nebo stránku často obnovovat. ==== Návody ==== Dobrý návod pro začátky s ROSem je oficiální wiki stránka nebo tutoriál [[https://www.clearpathrobotics.com/assets/guides/ros/index.html|ROS 101: Intro to ROS]] ====== Aplikace ROSu v MLABu ====== * [[cs:robozor:arom|AROM - Autonomous robotic observatory manager]] * [[cs:designs:windowsblind| Inteligentní ovladač žaluzií.]]