5. Ratasroboti URDF kirjeldus

Selles harjutuses kasutame URDFi (ingl k. Unified Robot Description Format), et luua liikuva roboti kirjeldus.

Selleks, et näite järgi kaasa teha, on vaja ROSi ja catkini tööruumi.

Lisaks on vaja ROSi kimpe urdf_tutorial ning joint_state_publisher_gui. Kui kasutad kursuse korraldajate poolt pakutavat keskkonda, siis on need kimbud juba paigaldatud.

Samm-sammulise juhendi vaatamiseks klikka harjutuse vahepealkirjadele.

URDF on Unified Robot Description Format ehk formaat robotite kirjeldamiseks. See on XML kujul tekstifail, mis kirjeldab roboti mudelit.

Tüüpiline URDF mudel sisaldab lülisid ja liigendeid. Lülid on roboti komponendid ja liigendid on nendevahelised ühendused.

.

 

a. Avame terminali ja liigume catkini tööruumi src kaustas olevasse kausta fourwheeler_description, mille lõime eelnevalt.

cd ~/catkin_ws/src/fourwheeler_description

b. Loome seal uue kausta nimega urdf. Sinna paigutame roboti URDF mudeli.

mkdir urdf

c. Liigume urdf kausta.

cd urdf

d. Loome URDF mudeli jaoks dokumendi nimega fourwheeler.urdf.

gedit fourwheeler.urdf

Vaata alltoodud animatsioonist, kuidas kirjeldatud samme rakendada. Koodi leiad kopeeritaval kujul ka animatsiooni alt.

a. Lisame päise, et defineerida dokument kui XML.

b. Lisame roboti nime, kasutades XML märgendit <robot>. Antud näites on selleks nimeks fourwheeler. Lisame ka kohe avatud faili kõige viimasele reale roboti kirjeldust sulgeva märgendi </robot>.

c. Lisame esimese komponendi, milleks võiks olla meie roboti keskne kere. Selleks loome lüli nimega base_link, kasutades XML märgendit link.

d. Olgu meie roboti keskse kere kujuks risttahukas. Et seda nüüd URDF-i abil kirjeldada, lisame base_link lülile parameetrid, et määratleda kere täpne kuju ja suurus. Selleks kasutame XML märgendit <visual> ning selle alamärgendit <geometry>, mis võimaldab meil antud lülile anda lihtsa geomeetrilise kuju, antud juhul siis <box> ehk risttahukas.

e. Salvestame ja sulgeme dokumendi.

Kood selle saavutamiseks:

<?xml version="1.0"?>
<robot name="fourwheeler">

  <link name="base_link">
    <visual>
      <geometry>
        <box size="0.430 0.320 0.140" />
      </geometry>
    </visual>
  </link>

</robot>

Siit näed, kuhu kood paigutada:

Olles kaustas catkin_ws/src/fourwheeler_description/urdf/, saame urdf_tutorial kimbus sisalduva käivitusfaili abil oma roboti hõlpsasti visualiseerida.

roslaunch urdf_tutorial display.launch model:=fourwheeler.urdf

Seejärel avaneb järgnev RViz-i aken.

.

Algselt on terve robot punane. Muudame roboti värvi siniseks.

Sulge RViz ja ava URDF fail (fourwheeler.urdf). RVizi sulgemiseks vajuta Terminali aknas klahvikombinatsiooni CTRL+C.

Värvi lisamiseks kasutame XML märgendit material. Alltoodud animatsioonis on näha, kuidas lisada robotile värv. Värv on toodud RGBA värviruumis, kus on neli kanalit: punane (R – red), roheline (G – green), sinine (B – blue), alfa ehk läbipaistvus (A – alpha). Neid väärtusi saab seada vahemikus 0–1, et määrata iga komponendi intensiivsus.

Näites toodud RGBA väärtused 0  0  0.8  1 annavad tumedama sinise, millel puudub läbipaistvus.

Proovi julgelt erinevaid värvikombinatsioone.

Uus koodilõik:

      <material name="blue">
        <color rgba="0 0 0.8 1" />
      </material>

Kuhu kood paigutada:

Uue värviga mudeli nägemiseks salvestame ja sulgeme fourwheeler.urdf faili ning käivitame uuesti display.launch faili.

Tulemus peaks sarnanema alltooduga.

.

Nagu meie loodud kimbu nimigi viitab, tahame lõpuks valmis saada nelja rattaga roboti mudeli. Alustame ühe ratta lisamisest.

Lisame lüli nimega front_right_wheel. Ratta mudeli kujuks valime silindri (cylinder), mille kõrgus (length) on 0,05 m ja raadius (radius) 0,1 m. Rattad on tihti musta värvi; RGB värviruumis saavutame musta, kui määrame iga kanali väärtuseks 0. Määrame alfa-kanali väärtuseks 1, et ratas ei oleks läbipaistev.

Näpunäide

Uue lüli saamiseks tee koopia eelnevalt loodud lüli koodilõigust ja muuda ära vajalikud väärtused!

Selleks, et kinnitada ratas roboti kere külge, on meil vaja omavahel siduda base_link ja front_right_wheel ning defineerida, kas üks saab teise suhtes ka liikuda. Seda kõik teeme liigendiga (joint). Lisame uue koodilõigu (kopeeritaval kujul saadaval ka allpool.)

a. Lisame liigendi nimega front_right_wheel_to_base. Liigendite nimed võiksid alati näidata, milliste lülide ühendamiseks on liigend loodud. See teeb mahukates mudelites orienteerumise märgatavalt kergemaks.

b. Valime liigendi tüübiks continuous, sest ratas saab kere suhtes pidevalt (ingl continuously) pöörelda.

c. Ülemlüliks (parent link) määrame esimese lüli base_link, kuhu peaaegu kõik roboti komponendid lõpuks kinnituvad. Alamlüliks (child link) määrame ratta lüli front_right_wheel, sest see peab olema seotud roboti kerega.

d. Määrame liigendi algkoordinaadid xyz süsteemis. Märgendiga origin näidatud koordinaadid määravad, kui kaugel ja mis pidi asub ratas ülemlüli (antud juhul roboti kere) algkoordinaatide suhtes.

  1. Roboti kere koordinaatide alguspunkt (origin) asub kere keskel. Ratta koordinaatide alguspunkt asub ratta keskel.
  2. Koordinaadid xyz ehk positsioon on meetrites ja rpy (roll, pitch, yaw) ehk orientatsioon on toodud radiaanides.
  3. Pöörame ratast 90 kraadi ümber x-telje, et silindrikujuline ratas paikneks silindri külje, mitte põhja peal. Selleks määrame roll väärtuseks π/2 ehk 1.57 radiaani.

e. Määrame ratta pöörlemistelje. Kuna kasutame liigenditüüpi continuous, peab pöörlemistelg olema määratletud. Selleks kasutame XML märgendit axis. Määrame, et ratas saab pöörelda ümber oma z-telje.

f. Salvestame ja sulgeme URDF mudeli faili.

Uus koodilõik:

  <joint name="front_right_wheel_to_base" type="continuous">
    <parent link="base_link" />
    <child link="front_right_wheel" />
    <origin xyz="0.1075 -0.1851 -0.05" rpy="1.57 0 0" />
    <axis xyz="0 0 1" />
  </joint>

Kuhu kood paigutada:

Käivitame nüüd uuesti display.launch faili meie fourwheeler.urdf mudeliga ja uurime, milline näeb robot välja peale ratta lisamist.

Näeme ühe rattaga robotit, mis on aga läbipaistev, kuigi määrasime alfa-kanali väärtuseks 1. See tuleneb RVizi enda seadetest. Saame muuta roboti läbipaistmatuks, muutes RVizi vasakpoolses menüüs Alpha väärtust, mis algselt on 0.5. Määrame selle väärtuseks 1. Robot peaks muutuma läbipaistmatuks.

Avame uuesti URDF mudeli XML faili ja lisame veel kolm ratast ja nende liigendid. Kopeerime ja kleebime juba loodud ratta ja liigendi, muutes nimed ja asukohad.

Meil on olemas ratas front_right_wheel. Liigend selle ja roboti kere vahel paigutab selle roboti kere suhtes koordinaatidele 0.1075 -0.1851 -0.05.

Kasutame sisuliselt sama koodi, et lisada veel kolm ratast, ning paigutame need sobivate liigenditega järgmistele asukohtadele.

front_left_wheel 0.1075 0.1851 -0.05
rear_right_wheel: -0.1075 -0.1851 -0.05
rear_left_wheel: -0.1075 0.1851 -0.05

Salvestame faili ja käivitame uuesti RVizi. Peaksime nägema nelja rattaga roboti mudelit.

Lisame roboti kere peale plaadi (hood), et robot näeks kenam välja.

Loome õhukese kollase plaadi, mis on veidi laiem ja pikem kui roboti kere. Kollase värvi saavutame RGB värviruumis punase ja rohelise kanali seguna. Plaadi pikkus võiks olla 0.530, laius 0.420 ja kõrgus 0.005.

Katuseplaadi kinnitame roboti kere külge analoogselt ratastega, kasutades liigendit. Ent kuna katus kere suhtes ei liigu, siis on liigendi tüüp liikumatu (ingl fixed) ning ühtlasi pole vaja defineerida pöörlemistelge (axis). Liigendi asukoht kere suhtes on 0.0725 meetrit z-telje suunas (ehk ülespoole).

Roboti mudeli viimistlemiseks lisame sellele viimase komponendina ka ühe anduri. Üks tuntumaid andureid isejuhtivate robotite peal on LiDAR ehk laserkaugusmõõtja.

a. Loome anduri jaoks lüli nimega lidar. Määrame selle suuruse ja värvi. Olgu tema kõrgus (length) 0.08 m ja raadius (radius) 0.05 m.

b. Loome liigendi. Peamine erinevus selle ja eelnevate liigendite vahel on see, et sensor peaks kinnituma roboti pealmise plaadi, mitte kere külge. See tähendab, et sensori lüli algkoordinaadid (origin) tuleb arvutada plaadi (hood) algkoordinaadist, mitte kere (base_link) algkoordinaadist! Asetame ta plaadi suhtes 0.150 meetri võrra x-telje suunas ja 0.04 meetri võrra z-telje suunas.

c. Määrame rpy väärtuseks 0 0 0, sest me ei taha loodud silindrit plaadi suhtes pöörata.

d. Et lisada paindlikkust, loome liigendi selliselt, et meie sensor saab z-telje ümber pöörelda. Selleks määrame pöörlemistelje axis väärtuse z-komponendiks 1 (ja teised komponendid nullid, kuna nende ümber me pöörelda ei taha).

Selleks, et veenduda, et kõik liigendid liiguvad soovitud viisil, saab kasutada joint_state_publisher_gui tööriista.