Obsah
ROS ve stavebnici MLAB
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 Python, C++, Lisp a experimentálně v Javě nebo v jazyce Lua.
Instalace aktuální verze ROS Kinetic (10) je popsána 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: 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.
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 wiki.ros.org, ze které je zde přejatý. Instalaci jsem testoval na PC s Ubuntu 14.04.3 LTS a na 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 ROS
ROS Kinetic (10)
Postup instalace je převzat z oficiálního postupu dostupného 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 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
ROS_sensor-UI je software pro vizualizaci dat ze senzorů připojených pomocí knihovny pymlabu.
Instalace
Pro rozfungování ROS_sensor-UI je potřeba mít nainstalovaný ROS v základní (nebo vyšší) verzi a 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é 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 SHT25 a teploměru 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
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 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 real_time_graph.html. V něm je nejdříve potřeba na řá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 ROS 101: Intro to ROS