Programmeerime ROS roboti sõitma¶
Sissejuhatus¶
Selles sektsioonis kirjutame programmi, mis paneb roboti sõitma. ROSis on enamasti kasutusel programmeerimiskeeled C++ ja Python. Meie valik on Python, sest see on lihtsam ja sobib paremini programmeerimisega alustamiseks. Pythoniga tutvumisel on abiks Tartu Ülikooli arvutiteaduste instituudi programmeerimisõpik.
ROS-rubriigid¶
ROSis töötavad samal ajal erinevad sõlmed. Sõlmed on programmid, mis täidavad ROSis mingit konkreetset ülesannet. Näiteks võib üks sõlm suhelda kaameraga ja saata sealt pilti, teine sõlm liigutada soovitud suunas roboti rattad, kolmanda sõlme abil juhtida robotit klaviatuuri abil jne.
Selleks, et kogu robot ühtsena töötaks, peavad sõlmed omavahel suhtlema. Näiteks sõlm, mis paneb rattad liikuma, peab teadma kuhu suunas rattad liikuma panna ning see informatsioon tuleb sõlmelt, kus saad klaviatuuriga robotit juhtida. Suhtlemiseks on ROSis kasutusel ROS-rubriigid. Rubriigil on oma nimi ning sõlmed saavad sinna sõnumeid kuulutada ning sealt tellida. Roboti kiiruse määramiseks on ROSis kujunenud standard rubriik nimega “cmd_vel” (velocity command). Sinna rubriiki saab kuulutada sõnumeid, mis määravad kuhu poole robot liikuma peaks. Samaaegselt tellib sellest rubriigist sõnumeid rattaid juhtiv sõlm, mis edastab saabunud kiirused juba rattaid kontrollivale juhtelektroonikale.
Rubriik cmd_vel¶
Selleks, et robot liikuma hakkaks, peame sellele edastama info, kui kiiresti ja mis suunas liikuda. Selleks on meile muutmiseks saadaval kolm argumenti: x-suunaline kiirus, y-suunaline kiirus ja z-telje ümber pöörlemiskiirus.
Positiivsed x’i väärtused panevad roboti edasi sõitma, negatiivsed tagurpidi. Positiivsed y’i väärtused panevad roboti vasakule sõitma, negatiivsed paremale. Positiivsed z’i väärtused panevad roboti vastupäeva pöörlema, negatiivsed päripäeva. x ja y väärtused on ühikutes m/s, seega hoia need alla ühe.
Etteantud näidiskoodis on võimalus muuta kõiki kolme argumenti. Esimene eesmärk on aru saada, kuidas need töötavad, et oskaks hiljem neid kasutada ka keerukamatel juhtudel. Leia koodis see koht ning muutes x, y ja z väärtusi, lahenda järgnevad ülesanded.
vel_msg.linear.x = 0
vel_msg.linear.y = 0
vel_msg.angular.z = 0
velocity_publisher.publish(vel_msg)
rospy.sleep(0.1)
Näiteülesanne¶
- Ava terminal ja sisesta käsk
nano catkin_ws/src/ros_koolitus/scripts/move.py
See avab Python’i faili, kus hakkame väärtusi muutma.
Failis on muudatuste tegemiseks eraldi ala, mis on ümbritsetud ridadega
YOUR CODE HERE START
jaYOUR CODE HERE END
.Määra vel_msg.linear.x väärtuseks 0.2.
Salvesta ning välju.
Programmi käitamine simulaatoris¶
Tarkvara arendamisel tekib tihtipeale vigu, mis näiteks suurte tööstusrobotite puhul võivad põhjustada pöördumatut kahju nii robotile endale, ümbritsevatele objektidele kui ka roboti operaatorile. Selle vältimiseks on enne programmi käivitamist päris robotil alati kasulik seda põhjalikult testida simulaatoris. ROSi simulatsioonikeskkonnaks on Gazebo. Gazebo võimaldab luua virtuaalse maailma, paigutada sinna robot, ja simuleerida toimuvat.
- Gazebo käitamiseks ava uus terminali aken ning sisesta käsk:
roslaunch robotont_description gazebo.launch
- Otsi uuesti üles eelmine terminal ja käivita seal oma muudatustega programm:
rosrun ros_koolitus move.py
Märkus
Peatamiseks vajuta samas terminalis korraga klahve Ctrl + C.
- Kontrolli, kas robot sõitis otse. Kui ei sõitnud, siis mõtle, mis võis minna valesti ja vajadusel küsi abi juhendajalt.
Ülesanded¶
Nüüd, kui tutvus on tehtud, proovi lahendada järgmised väljakutsed. Iga ülesande järel kirjuta üles kasutatud x, y ja z väärtused.
- Pane robot sõitma tagasi.
- Pane robot sõitma vasakule/paremale.
- Pane robot pöörama vasakule/paremale.
- Pane robot sõitma 45 kraadise nurga all.
- Pane robot kaares sõitma.
- Pane robot ringis sõitma.
Vahetame simulaatori roboti vastu¶
Kui simulaatoris sõidab robot nagu soovitud, on aeg proovida sõitmist päris roboti peal. Eelnevas näites töötas ROSi tuum sülearvutis. Selles näites kasutame ROS tuuma, mis käivitatakse robotis koos draiveriga. Nii saab ühendada arvuti ja roboti ühtsesse ROS süsteemi, mis võimaldab sõlmede omavahelist suhtlust hoolimata sellest, et sõlmed ise asuvad hoopis eri arvutite peal.
Kõigepealt käivitame robotis draiveri sõlme, mis ühtlasi paneb käima ka ROS tuuma.
- Sulge Gazebo, selleks leia terminal, kust Gazebo käivitasid ja vajuta CTRL + C
- Kasutades sama terminali, loo ssh-ühendus robotisse ja käivita seal
roslaunch robotont_teleop teleop_bare.launch
See paneb käima ROSi roboti draiveri sõlme, mis kontrollib rataste kiirusi vastavalt meie saadetud sõnumitele.
Kuna nüüd soovime kasutada ROSi tuuma robotil, siis on vaja sisestada sülearvuti terminalis käsk:
seadista_robot
Sisesta roboti number ja vajuta Enter.
Nõuanne
See käsk teeb mõned muudatused ROS keskkonnaparameetrites. Kõik ROS tööriistad ja programmid, mis edaspidi selles terminali aknas kasutatakse on nüüd seadistatud võtavad simulatsioonikeskkonna asemel ühendust robotiga.
- Nüüd tuleb välja ROS tõeline võimekus, sest oma muudetud
move.py
programmi saad käivitada täpselt nii nagu simulatsiooni puhul.
rosrun ros_koolitus move.py
Märkus
Peatamiseks töötab endiselt klahvikombinatsioon Ctrl + C.
Kopeerime juhtimisprogrammi sülearvutist robotisse¶
Kui roboti juhtimise eest vastutavad sõlmed on käivitatud mitte roboti vaid mõne muu arvuti peal, siis võib kehva ühenduse korral olla roboti töös tõrkeid ja robot ei reageeri piisavalt kiiresti. Seega on kasulik tagasiside põhjal juhtimissüsteemid hoida võimalikult riistvara lähedal ja vältida aeglase võrgu (näiteks WiFi) mõju.
scp
on programm, millega saab kopeerida faile ühest arvutitest teise kasutades ssh-ühendust.
- Ava sülearvutis uus terminal ja kopeeri
move.py
sülearvutist robotisse. Ära unusta asendadaclearbot-X
oma roboti nimega!
scp ~/catkin_ws/src/ros_koolitus/scripts/move.py kasutaja@clearbot-X:~/catkin_ws/src/ros_koolitus/scripts/
- Kontrolli, et eelmises peatükis käivitatud ROS draiver oleks endiselt töökorras.
- Ava uus terminal ja sisene ssh kaudu robotisse.
- Käivita kopeeritud
move.py
fail kimbusros_koolitus
.
Kärarohke WiFi võrgu korral võiksid märgata erinevusi võrreldes sülearvutist juhtimisega. Kas robot käitub teisiti või mitte?