====== 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í.]]