OPERAČNÍ SYSTÉM ROS PROJEKT Z PŘEDMĚTU MRBT AUTOŘI PRÁCE VEDOUCÍ PRÁCE Ing. Irina Trukhina Ing. Sergei Korchakov Ing. Tomáš Florián Brno, 2013
Zadání projektu Seznamte se s operačním systémem ROS [1]. Vyberte vhodnou HW platformu, na kterou ROS naistalujte a navrhněte řídicí software, kterým bude řídit vybraný (po konzultaci s vedoucím) podvozek robotu. Podle možností napište program pro řízení podvozku robotu. Úvod Při rozpracování robota je nutné vytvořit následující věci: - architekturu, - komunikační protokol, - převod množin dat do společného systému koordinát, - drivery řídícího zařízení, - navigační systém apod. Ačkoli můžeme použit různé hotové knihovny pro tyto účely, pak to musíme sloučit do jediného systému, co vyžaduje relativně mnoho času a práce. Abychom mohli rychle a snadno spojit různé moduly do systému potřebujeme nějaký operační systém. Pro roboty to může byt ROS robotic operatin sistem. ROS je v podstatě framework pro robotické platformy, který umožňuje sestavení řídícího SW z jednotlivých modulů. ROS se instaluje na operační systém Ubuntu Linux a používá jeho možnosti. Zdrojový kód ROS je volně přístupný pro používání, úpravy a studium. Pro ROS jsou realizovány drivery všelijakého zařízení, které používají stejné zásady komunikace: - joysticků, - GNSS, - kamer, - mikrokontrolérů apod. Kromě toho ROS obsahuje knihovny a aplikace pro roboty: - logovací systém, - aplikace pro vizualizaci dat, - převod koordinát, - rozpoznávání objektů apod. Při programování robota pomocí ROS je možné používat hotové moduly a knihovny a soustředit se pouze na vypracování řídicích funkcí. Heslo ROS je don't revinvent the wheel. ROS se snaží sebrat a dat do hromady hotové řešení pro různé roboty, aby každý uživatel mohl to použit a také se podělit o své aplikace. A proto ROS podporuje spoustu různých robotů, například: - PR2, - TurtleBot, - PR1, - HERB, - STAIR I и II, - irobot Create, - Lego Mindstorms NXT apod. Pomocí ROS se dá realizovat velkou úlohu pomocí sady malých programů uzlů (Node), které budou komunikovat prostřednictvím tzv. témat (Topic). Uzly si navzájem posílají zprávy. Celá aplikace vypadá jako graf (viz.obr.1). Obr.1. Grafová struktura ROS aplikace
Taková distribuovaná struktura aplikace umožňuje, aby nad programem nezávisle pracovalo několik lidí. V současné době ROS podporuje Python, C++, Lisp. Má experimentální knihovny v jazycích Java a Lua. 1. ROS (robotic operatin sistem) 1.1. Souborový systém ROS Souborový systém ROS obsahuje další entity: - Package (Balík) je hlavní entita ROS, může obsahovat knihovny, nástroje, spustitelné soubory apod. - Manifest (manifest.xml) je soubor, který popisuje balík. Hlavní cíl manifestu je určování závislostí mezi balíky. - Stack je sada balíků, která tvoří další úroveň knihovny. Je primárním mechanismem ROS pro šíření softwaru. - Stack manifest (stack.xml) je soubor, který obsahuje informace o stacku. 1.2. ROS, koncepce grafu Komunikační graf je P2P síť ROS uzlů. Graf obsahuje uzly (nodes), Master, Parameter server, zprávy (messages), servisy (servises), témata (topics) a bags. 1.2.1. Uzly ROS Uzly ROS jsou v podstatě spustitelné soubory. Uzly ROS používají klientské knihovny ROS, aby se navzájem komunikovaly. Uzly můžou publikovat zprávy do určitého tématu a také přijímat zprávy z určitých témat. Také můžou poskytovat nebo používat služby (Service). Klientské knihovny ROS umožňují realizaci uzlů ROS v různých jazycích: - Rospy - klientská knihovna pro Python, - Roscpp - klientská knihovna pro C++. Roscore je sada uzlů a programů, které definují ROS systém a umožňují vykonávání ROS aplikací. Aby si uzly ROS aplikací mohly navzájem komunikovat, nejdřív potřebujeme spustit roscore. $ roscore Rosnode vizualizuje informace o všech spouštěných uzlech. Příkaz rosnode list udává seznam spouštěných uzlu. $ rosnode list V ROS je vždycky spuštěn uzel rosout, který sbírá a zapisuje do logovacího souboru ladící informace uzlů. Příkaz rosnode info vrátí informaci o určitém uzlu. $ rosnode info /rosout Rosrun umožňuje spouštění ROS uzlu (bez ukázaní absolutní cesty): $ rosrun [package_name] [node_name] Kde package_name je jméno balíku (Packet), kterému patří uzel, a node_name je jméno uzlu. 1.2.2. Master Master umožňuje komunikace mezi jednotlivými uzly a poskytuje informace o jejich rozmístění. Jakmile se uzel dozví o rozmístění jiného uzlu, se kterým chce komunikovat, vytváří se P2P síť. Uzly používají primou komunikaci, Master pouze poskytuje nutné informace (jako DNS server). 1.2.3. Parameter server Parameter server se používá uzly pro ukládaní parametru. Je částí Masteru.
1.2.4. Zprávy Zpráva je jednoduchá struktura dat s určitými typy položek. Obyčejná zpráva se popisuje pomocí msg souboru. Je to jednoduchý textový soubor, který určuje strukturu zprávy, a nachází se v složce msg balíku. ROS Client Library realizuje generátory zprav, které spojují.msg soubory se spustitelnými soubory. Aby to udělaly je nutné definovat tento.msg soubor v CMakeLists.txt: add_message_files(files MsgFileName.msg) generate_messages(dependencies std_msgs) ## Generate added messages and services 1.2.5. Servisy Částo uzly používají zprávy typů požadavek a odpověď, které poskytuje ROS servisy. Zprávy požadavek/odpověď se definují pomocí.srv souboru, který se spojuje se spustitelným souborem pomocí ROS Client Library. Srv soubor má být definován v CMakeLists.txt: add_service_files(files SrvFileName.srv) Rosservice je servisní program, který poskytuje informace o servisech, které existují v systému: rosservice args print service arguments rosservice call call the service with the provided args rosservice find find services by service type rosservice info print information about service rosservice list list active services rosservice type print service type rosservice uri print service ROSRPC uri 1.2.6. Témata ROS Témata ROS jsou jako sběrnice, pomocí kterých se uzly vyměňují zprávami. Zprávy jsou anonymní. Témata využívají principu jednosměrné komunikace. Uzly, které chtějí vzdáleně volat procedury a čekat na jejich odpověď, mají používat místo témat servisy (Servises). Rqt_graph tvoří dynamický graf, který popisuje, co se děje v systému, respektive současně existující uzly a tématy (viz.obr.1). Je částí balíku rqt. $ rosrun rqt_graph rqt_graph Rostopic je servisní program, který poskytuje informace o tématech, které jsou vytvořeny v systému: rostopic bw display bandwidth used by topic rostopic echo print messages to screen rostopic find find topics by type rostopic hz display publishing rate of topic rostopic info print information about active topic rostopic list print information about active topics rostopic pub publish data to topic rostopic type print topic type 1.2.7. Bags Bag je typ souboru v ROS, který sbírá data od ROS zprav. S.bag souborem se dá pracovat pomocí aplikace rqt_bag. 1.3. Instalace ROS groovy Přidat vhodný repozitář do seznamu, například pro Ubuntu 12.10 (Quantal): $ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu quantal main" > /etc/apt/sources.list.d/ros-latest.list' Nainstalovat si ROS $ sudo apt-get install ros-groovy-desktop-full
1.4. Vytváření ROS workspase ROS workspase catkin_ws lze vytvořit za pomocí následujících příkazů: $ mkdir -p ~/catkin_ws/src $ cd ~/catkin_ws/src $ catkin_init_workspace $ cd ~/catkin_ws/ $ catkin_make $ source devel/setup.bash Samostatné aplikace mají být rozmístěny ve složce catkin_ws/src. 1.5. Vytváření ROS balíku Nový ROS balík se vytváří pomocí příkazu catkin_create_pkg ve složce catkin_ws/src: $ catkin_create_pkg pkg_name std_msgs rospy roscpp Zkompilovat balíky, které jsou v složce catkin_ws, lze pomocí příkazu $ catkin_make 1.6. Msg soubor Soubor.msg má být vytvořen ve složce catkin_ws/msg. Soubor obsahuje popis všech položek zprávy a s typy, například: string first_name string last_name uint8 age uint32 score Pak je nutné definovat.msg soubor v CMakeLists.txt: add_message_files(files MsgFileName.msg) generate_messages(dependencies std_msgs) ## Generate added messages and services Zkontrolovat, že ROS vidí.msg soubor lze pomocí příkazu $ rosmsg show <message type> 1.7. Srv soubor Soubor.srv má být vytvářen ve složce catkin_ws/srv. Soubor obsahuje popis všech položek zprávy a s typy pro požadavek a odpověď. Do řádku, který obsahuje ---, se definují položky požadavku, po tomto řádku se definují položky odpovědi. Například: int64 a int64 b --- int64 sum Pak je nutné definovat.srv soubor v CMakeLists.txt: add_service_files(files SrvFileName.srv) generate_messages(dependencies std_msgs) ##Generate added messages and services Zkontrolovat, že ROS vidí.srv soubor lze pomocí příkazu $ rossrv show <service type>
2. irobot Create Pro seznámení s ROS byl použit robot irobot Create (viz.obr.2) Obr.2. irobot Create Tento robot je podporován ROS a existuje hotové drivery pro řízení robota. Driver pro irobot Create patří do sbírky softwaru brown-ros-pkg a jmenuje se irobot_create_2_1 [2]. Driver je napsán v jazyce Python a spouští se následujícím příkazem: $ rosrun irobot_create_2_1 driver.py Robot je připojen do počítače přes USB kabel a převodník COM-USB, a je nutné to sdílet driveru. Dělá se to pomocí příkazu: $ rosparam set /brown/irobot_create_2_1/port /dev/ttyusb0 Je nutné přidat uživatele do skupiny, která vlastní port. Pro balík irobot_create_2_1 je definován SensorPacket.msg, který popisuje strukturu dat, jež se přijímají od robota. Také jsou definována sada servisů, které komunikují s robotem [3]. Driver irobot Create podporuje téma /cmd_vel. To znamená, že data zapsáná do tohoto tématu budou zpracovány robotem. Informace o tématu lze zjistit pomocí příkazu: $ rostopic info cmd_vel Tímto zjistíme, že pomocí tohoto tématu se předávají zprávy geometry_msgs/twist.msg. Twist.msg se skládá z šesti položek: - linear.x - translační rychlost po ose x - linear.y - translační rychlost po ose y - linear.z - translační rychlost po ose z - angular.x - rotační rychlost kolem osy x - angular.y - rotační rychlost kolem osy y - angular.z - rotační rychlost kolem osy z Pomocí parametrů linear.x a angular.z můžeme řídit irobot Create, co použijeme při vytváření serveru. Měli jsme špatnou první zkušenost při připojení irobot Create k počítači. Po přípojení robot začínal komunikovat s driverem, hrál hudbu a poslouchal příkazy, ale po několika sekundách se restartoval a komunikace se rušila. Při tom driver začínal posílat zprávy bad data. Pro přípojení byly použity USB port na straně počítače, a sériový port / Mini-DIN konektor na straně robota. Také irobot Create může komunikovat přes Cargo Bay konektor, ke kterému se připojuje Comand Modul (zelený na obr.2.). Comand modul se řídí pomocí Atmel AVR ATMega168 a umožňuje vykonávat programy bez přípojení k počítači. Ačkoliv Comand Modul byl vypnut, při nastartování robota nějak ovlivňoval komunikace a řízeni robota z PC. Když Comand Modul byl úplně odpojen, robot začal fungovat správně.
3. Návrh řídicího softwaru Řídící software se bude skládat z tří uzlů: - driver robota balík irobot_create_2_1 - server, který bude komunikovat s driverem - klient, který bude komunikovat se serverem pomoci servisu. Bude odesílat do serveru hodnoty parametrů, určené uživatelem. Klient bude komunikovat se serverem pomocí servisu. Zpráva požadavek/odpověď je definována v irobotmover.srv (obr.3). Klient bude posílat serveru translační a rotační rychlosti typů float32 a čas, během kterého se robot bude hýbat s těmito rychlostmi. float32 x float32 z int32 t --- string answer Obr.3. Obsah souboru irobotmover.srv Server bude komunikovat s driverem pomocí témat cmd_vel a sensorpacket (obr. 4). Do tématu cmd_vel server bude posílat data a z tématu sensorpacket bude číst současný stav robotu. Obr. 4. Graf témat a uzlů Zpráva, která se posílá přes téma sensorpacket, je v balíku irobot_create_2_1 ve složce msg (obr.5). Z teto zprávy budeme používat jen informace o stavu nárazníku: bumbleft a bumpright. Takže klient bude posílat serveru hodnoty dvou rychlostí a čas jízdy a čekat na stručnou odpověď ok. Server bude přesměrovat data z klientu do driveru a dostávat od driveru zprávu o současném stavu robota. Jestli server zjistí, že je aktivní bumbleft nebo bumpright, pošle ros zprávu do logovacího souboru pomocí rospy.loginfo a zastaví robota. Header header bool wheeldropcaster bool wheeldropleft bool wheeldropright bool bumpleft bool bumpright bool wall
bool cliffleft bool clifffronleft bool clifffrontright bool cliffright bool virtualwall uint8 infraredbyte bool advance bool play int16 distance int16 angle uint8 chargingstate uint16 voltage int16 current int8 batterytemperature uint16 batterycharge uint16 batterycapacity uint16 wallsignal uint16 cliffleftsignal uint16 clifffrontleftsignal uint16 clifffrontrightsignal uint16 cliffrightsignal bool homebase bool internalcharger uint8 songnumber uint8 songplaying Obr.5. Obsah souboru SensorPacket.msg Dále je uveden zdrojový kód klientu scripts/irobot_mover_bump_client.py: #!/usr/bin/env python import roslib; roslib.load_manifest('irobot_mover') import sys import rospy from irobot_mover.srv import irobotmover def irobot_mover_bump_client(x, z, t): rospy.wait_for_service('irobot_mover_bump') try: irobot_mover_bump = rospy.serviceproxy('irobot_mover_bump', irobotmover) resp1 = irobot_mover_bump(x, z, t) return resp1.answer except rospy.serviceexception, e: print "Service call failed: %s"%e def usage(): return "%s [x, z, t]"%sys.argv[0] if name == " main ": if len(sys.argv) == 4: x = float(sys.argv[1]) z = float(sys.argv[2]) t = float(sys.argv[3]) else: print usage() sys.exit(1) print "Translational speed: %f m/s, rotational speed %f m/s, time %s s"%(x, z, t) print "Result",(irobot_mover_bump_client(x, z, t)) Klient se volá se třemi parametry, které přeposílá do serveru. Po přijetí odpovědí o serveru program klientu se skončí. Spouštění klientu: $ rosrun irobot_mover irobot_mover_bump_client.py 0.0 0.4 3
Dále je uveden zdrojový kód serveru scripts/irobot_mover_bump_client.py: #!/usr/bin/env python import roslib; roslib.load_manifest('irobot_create_2_1') import rospy from irobot_create_2_1.msg import SensorPacket from geometry_msgs.msg import Twist from irobot_mover.srv import * def handle_irobot_mover_bump(req): global pub, twist, port pub = rospy.publisher('cmd_vel', Twist) twist = Twist() port = rospy.get_param('/brown/irobot_create_2_1/port', "/dev/ttyusb0") print "Send %f, %f, %s"%(req.x, req.z, req.t) if (req.x > 0): rospy.loginfo("moving the robot forward") x = min(req.x, 0.3) twist.linear.x = x # jet s rychlostí x m/s if (req.x < 0): rospy.loginfo("moving the robot backward") x = max(req.x, -0.3) twist.linear.x = x if (req.z > 0): rospy.loginfo("turning the robot left") y = min(req.z, 1) twist.angular.z = y # točit se rychlostí y m/s if (req.z < 0): rospy.loginfo("turning the robot right") y = max(req.z, -1) twist.angular.z = y if(req.z!= 0 or req.x!= 0): pub.publish(twist) rospy.sleep(req.t); rospy.loginfo("stopping!") twist = Twist() pub.publish(twist) return irobotmoverresponse("ok") def callback(data): global pub, twist, port if(data.bumpright or data.bumpleft): rospy.loginfo("bump!") twist = Twist() twist.linear.x = -0.1 pub.publish(twist) # jet opáčným směrem rospy.sleep(0.5); twist = Twist() pub.publish(twist) # zastávit se def irobot_mover_bump_server(): rospy.init_node('irobot_mover_bump_server') rospy.subscriber('sensorpacket', SensorPacket, callback) s = rospy.service('irobot_mover_bump', irobotmover, handle_irobot_mover_bump) print "Ready to send data" rospy.spin() if name == " main ": irobot_mover_bump_server() Server irobot_mover_bump_server.py publikuje zprávy do tématu cmd_vel (vlákno handle_irobot_mover_bump), které posléze zpracovává driver, a čte z tématu sensorpacket současný stav robotu a kontroluje signály bumpright a bumpleft (vlákno callback). Jestli se robot na něco narazil, potom pošle zprávu do logovacího systému ROS a odjede 10 centimetrů směrem zpátky. Aby uživatel nepokazil robota nastavením velkých rychlostí, program omezuje translační rychlosti na 0.3 m/s, a rotační rychlostí na 1m/s. Spouštění serveru: $ rosrun irobot_mover irobot_mover_server.py
4. Použití existujícího řídicího softwaru Pro řízení irobot Create existuje spousta softwaru. Zajímavé je řešení ze sbírky softwaru brown-ros-pkg, které se nazývá teleop_twist_keyboard: $ rosrun teleop_twist_keyboard teleop_twist_keyboard.py Toto řešení umožňuje řídit robota pomocí klávesnice a je dost jednoduché. S driverem komunikuje také přes téma cmd_vel (obr.5). Řídicí klávese se popisuje při spouštění aplikace. Zdrojový kód je na stránkách Brown University Repository for ROS Packages [4]. Závěr Obr. 5. Graf témat a uzlů pro aplikaci teleop_twist_keyboard Cílem tohoto projektu bylo seznámení s frameworkem ROS. Měli jsme nainstalovat ROS a pomocí něho naladit komunikace s robotem. Žádné problémy s instalaci ROS ani Ubuntu jsme neměli, dělá se to podle návodu z internetových stránek. Také si nebylo problémem najít driver irobot Create a stanovit, jak s tím komunikovat z uživatelského programu. ROS se instaluje na operační systém Ubuntu, a proto vhodnou HW platformou je libovolní notebook či počítač. Navržený program pro ovládání robotu se skládá z klientu a serveru. Zdá se, že pro ovládání robota by stačil jen jeden klient, jak je to v teleop_twist_keyboard, ale chtěli jsme zkusit komunikaci uzlů pomocí servisu. Ve svém programu jsme použili takové komunikační nástroje ROS jako témata a servisy. Testový program děla všechno: přijímá zprávy z témat, publikuje zprávy do témat, posílá zprávy přes servis a čeká na odpověď servisu. Řídící software je napsán v jazyce Python. Je to kvůli tomu, že jsme dobře prozkoumali driver irobot_create_2_1, který je také napsán v jazyce Python, a pomocí tohoto příkladu velmi rychle dokázali vytvořit vlastní program. Kromě toho Python je dynamicky interpretovaný jazyk, a aplikace psáné v jazyce Python nevyžadují pravidelného překompilování, co zkracuje dobu vývoje softwaru. Pomocí ROS se dá opravdu rychle a pohodlně vytvořit řídící program pro robota, zvlášť existují-li hotové drivery. Kódy driverů jsou volně přístupné, co umožňuje je upravovat podle svých požadavků. Velkou výhodou je komunikace uzlů přes témata a servisy, neboť lze programovat moduly v různých jazycích a pak je snadno dat dohromady. Literatura 1. Сommunity site for hosting ROS-related software. Ros.org [online]. [cit. 2013-05-03]. Dostupné z: http://www.ros.org/wiki 2. Brown University Repository for ROS Packages. Brown-ros-pkg [online]. [cit. 2013-05-03]. Dostupné z: http://brown-ros-pkg.googlecode.com/svn/trunk/distribution/brown_drivers 3. Irobot_create_2_1. Ros.org [online]. [cit. 2013-05-03]. Dostupné z: http://ros.org/wiki/irobot_create_2_1 4. Teleop_twist_keyboard.py. Brown-ros-pkg [online]. [cit. 2013-05-03]. Dostupné z: https://code.google.com/p/brown-rospkg/source/browse/trunk/experimental/teleop_twist_keyboard/bin/teleop_twist_keyboard.py?r =959