Praktikum 2 - Programmeerimise alused: for-tsükkel, funktsioonid

Giti üles seadmine

Git on versioonihaldustarkvara, mis aitab meil salvestada koodi internetti, et seda ka hiljem kasutada saaks, kui arvutist kood kustutatud on.

  1. Mine lehele https://github.com/ ning registreeri ennast kasutajaks.

  2. Logi sisse

  3. Mine lehele https://github.com/ut-ims-robotics/robotont_blank_scripts

  4. Vajuta paremal üleval nuppu “Fork”, see kopeerib selle repositooriumi sinu kasutajasse.

  5. Vajuta rohelist nuppu “Clone or download”

  6. Kopeeri sealt aadress

  7. Ava terminal ning trüki sinna

    cd catkin_ws/src

  8. Seejärel sisesta

    git clone -sinu-kopeeritud-link-

  9. Nüüd trüki terminali

    catkin build

  10. Kui see protsess on lõpetanud edukalt, sulge terminal ja oled valmis praktikumiga jätkama.

Sissejuhatus

Selles praktikumis kirjutame programmi, mis paneb roboti sõitma. Selleks kasutame programmeerimiskeelt Python. Selles praktikumis kasutame roboti liigutamiseks for-tsükleid ning funktsioone. Kui Pythoni kasutamine on meelest läinud või sa pole seda kunagi osanudki, siis tuleb abiks Tartu Ülikooli arvutiteaduste instituudi programmeerimisõpik.

ROS-rubriigid

ROSis ehk roboti operatsioonisüsteemis töötavad samal ajal erinevad sõlmed ehk konkreetsele ülesandele pühendatud programmid. Näiteks on sõlm, mis suhtleb kaameraga ja saab sealt pildi. Või on sõlm, mis paneb roboti rattad soovitud suunas liikuma. Samuti sõlm, kust saad robotit klaviatuuri abil juhtida. Selleks, et kogu robot ühtsena töötaks, peavad need 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. Selles praktikumis kasutame rubriiki nimega “cmd_vel” (velocity command), kuhu saame kuulutada, kuhu poole robot liikuma peaks, ning samaaegselt tellib see sõlm, mis rattaid liigutab, sealt käske ning vastavalt neile liigutab robotit.

Teema cmd_vel ja kuidas seda muuta?

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.

../_images/coord.png

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)

Ülesanne - cmd_vel

  1. Ava terminal
  1. Trüki terminali

    nano catkin_ws/src/robotont_blank_scripts/scripts/praktikum2_move.py

    See avab Python’i faili, kus hakkame väärtusi muutma.

  2. Koodis on ära märgitud ala, mida pead muutma. Muuta võid ainult ala, mis on “YOUR CODE HERE START” ja “YOUR CODE HERE END” vahel. Esialgu, muuda vel_msg.linear.x väärtus 0.2ks.

    ../_images/yourcodehere.png
  3. Salvesta ning välju. Kas mäletad kuidas seda teha? Kui ei, siis vaata esimese praktikumi juhendist järele.

  4. Nüüd ava uus terminal ning loo ssh-ühendus robotisse.

  1. Uues terminalis sisesta

    roslaunch robotont_teleop teleop_bare.launch

    See paneb käima ROSi draiveri, mis kontrollib rataste kiirusi vastavalt meie sõnumitele.

  2. Eelmises (arvuti)terminalis sisesta

    rosrun robotont_blank_scripts praktikum2_move.py

    See paneb roboti sõitma. Peatamiseks vajuta samas terminalis korraga klahve Ctrl + C.

  3. Kui robot sõitis otse, siis jätka, kui ei sõitnud, mõtle, mis võis valesti olla. Kui välja ei mõtle, siis kutsu juhendaja.

  4. Nüüd, kui tutvus on tehtud, proovime ise robotit liigutada. Iga ülesande järel kirjuta üles oma x, y ja z väärtused.

    1. Pane robot sõitma tagasi.
    2. Pane robot sõitma vasakule/paremale.
    3. Pane robot pöörama vasakule/paremale.
  5. Pane robot sõitma 45 kraadise nurga all.

  6. Pane robot kaares sõitma

  7. Pane robot ringis sõitma

For-tsükkel, sõidame nelinurka

Eelmiste ülesannete juures andsime robotile ainult ühe käsu, mille järgi ta siis sõitis. Aga mis siis, kui tahame näiteks alguses otse sõita ja siis paremale ning jälle otse ja paremale ja korrata neid erinevaid käske? Selleks on programmeerimises olemas tsüklid. while-tsüklit, ehk lõpmatut tsüklit kasutasid juba tegelikult eelmistes ülesannetes. Kiiruse muutmise käsku edastati robotile korduvalt, seni kuni kood käis. Robotile on turvalisuse eesmärgil sisse ehitatud nn failsafe, mis jätab roboti seisma, kui poole sekundi jooksul käsku ei tule. Nüüd tahame aga öelda talle ühte käsku kindel arv kordi ja siis teist käsku kindel arv kordi. Siinkohal tuleb appi for-tsükkel. for-tsükkel jooksutab käske täpselt nii palju, kui sellele öelda. Pythonis saame seda kasutada nii:

for i in range(0,30):
  vel_msg.linear.x = 0.2
  vel_msg.linear.y = 0
  vel_msg.angular.z = 0
  velocity_publisher.publish(vel_msg)
  rospy.sleep(0.1)

See kood ütleb iga 0.1 sekundi tagant robotile, et ta sõidaks edasi kiirusega 0.2 m/s ja seda täpselt 30 korda.

Kui me lisame teise for-tsükli sinna otsa, siis järgmised 30 korda öeldakse robotile, et ta sõidaks kiirusega 0.2 m/s tagasi.

for i in range(0,30):
  vel_msg.linear.x = 0.2
  vel_msg.linear.y = 0
  vel_msg.angular.z = 0
  velocity_publisher.publish(vel_msg)
  rospy.sleep(0.1)
for i in range(0,30):
  vel_msg.linear.x = -0.2
  vel_msg.linear.y = 0
  vel_msg.angular.z = 0
  velocity_publisher.publish(vel_msg)
  rospy.sleep(0.1)

Nii saab erinevaid käske üksteise otsa lisada. Muutes “range(0,30)” käsus numbrit 30, saame muuta kui pikalt ühte käsku täidetakse.

Ülesanne - for-tsükkel

  1. Ülesanne on panna robot ruutu sõitma

    1. Selleks pead tegema alguses ühe for-tsükli, mis sõidab otse mingi maa, millest saab ruudu külje pikkus.
    2. Selle tsükli järel peaks olema teine tsükkel, mis pöörab robotit 90 kraadi (pead leidma sobiva kiiruse ja tsükli pikkuse kombinatsiooni).
    3. Kuna need tsüklid on suuremas while-tsüklis, siis sellest peakski piisama ning robot sõidab igavesti ruutu.
  2. Ava terminal ning loo ssh-ühendus robotisse.

  3. Ava nano’ga fail praktikum2_forloop.py, kasutades analoogset käsku nagu eelmises ülesandes.

  4. Koodis on ära märgitud ala, mida pead muutma.

  5. Kui oled vahepeal draiveri terminali sulgenud, siis jätka punktiga a. Kui see eelmisest ülesandest veel käib, mine otse punkti juurde nr 6.

    1. Ava uus terminal ning loo ssh-ühendus robotisse.

    2. Uues terminalis sisesta

      roslaunch robotont_teleop teleop_bare.launch

      nagu ka eelmises ülesandes.

  6. Koodi jooksutamiseks kasuta analoogset rosrun käsku nagu eelmises ülesandes, kuid vaheta failinimi, mida jooksutad. Peatamiseks vajuta samas terminalis korraga klahve Ctrl + C.

Funktsioonid

Selleks, et meil oleks kergem koodi kirjutada ja et me ei peaks koodi kopeerima, on olemas funktsioonid. Korduva koodi saame kirjutada funktsioonide sisse ning funktsiooni ühe reaga välja kutsuda. See parandab koodi loetavust ning teeb edasise programmeerimise lihtsamaks. Funktsioonide kohta saab lugeda progeõpikust. Järgneva ülesande eesmärk on kirjutada funktsioonid erimoodi sõitmiseks, et hiljem oleks lihtne ühe käsuga panna robot soovitud suunas sõitma.

Ülesanne - funktsioonid

  1. Ava terminal ning loo ssh-ühendus robotisse.

  2. Ava nano’ga fail praktikum2_functions.py, kasutades analoogset käsku nagu eelmises ülesandes.

  3. Koodis on ära märgitud alad, mida pead muutma. PS: Funktsioon peab analoogselt eelmise ülesandega lõppema kuulutamisega (publish) ning ootamisega (sleep).

  4. Kui oled vahepeal draiveri terminali sulgenud, siis jätka punktiga a. Kui see eelmisest ülesandest veel käib, mine otse punkti juurde nr 5.

    1. Ava uus terminal ning loo ssh-ühendus robotisse.

    2. Uues terminalis sisesta

      roslaunch robotont_teleop teleop_bare.launch

  5. Koodi jooksutamiseks kasuta analoogset rosrun käsku nagu eelmises ülesandes, kuid vaheta failinimi, mida jooksutad. Peatamiseks vajuta samas terminalis korraga klahve Ctrl + C.

  6. Implementeeri funktsioon otse sõitmiseks.

    1. argumentideks peavad olema kestus (mitu korda for-tsüklit kordad) ja kiirus
    2. katseta oma funktsiooni
  7. Implementeeri funktsioon pööramiseks.

    1. argumentideks peavad olema kestus (mitu korda for-tsüklit kordad) ja kiirus
    2. katseta oma funktsiooni
  8. Implementeeri funktsioon küljele sõitmiseks.

    1. argumentideks peavad olema kestus (mitu korda for-tsüklit kordad) ja kiirus
    2. katseta oma funktsiooni
  9. Kasutades neid funktsioone, pane robot sõitma mööda oma valitud kujundit.

Enne praktikumi lõpetamist

  1. Ava uus terminal
  2. Sisesta sinna cd catkin_ws/src/robotont_blank_scripts
  3. Seejärel git add .
  4. Seejärel git config user.email „YOUR-EMAIL-HERE“
  5. Seejärel git config user.name „YOUR-NAME-HERE“
  6. Seejärel git commit -m „kommentaar mis praktikum oli“
  7. Seejärel git push
  8. Siin sisesta oma githubi kasutajanimi ja parool. Kontrolli, kas sinu github.com lehel uuenesid failid.
  9. Kui uuenesid, siis loo ssh-ühendus robotisse ning sisesta käsureale sudo poweroff.