Ročníkový projekt

Názov projektu: Robot Jupiter

Meno študenta: Emma Pásztorová

Email: pasztorova8@uniba.sk

Školiteľ: Mgr. Pavel Petrovič, PhD.

Email: pavel.petrovic@uniba.sk

Ciele:





Zdrojový kód
Ukážka
Report za zimný semester

Letný semester


Spracovanie obrazu z 3D kamery



Najprv som sa učila pracovať s 3d kamerou. Ako prvú som implementovala callback funkciu pre príjem farebného obrazu z kamery.
Táto funkcia sa zameriava na prevod dát z formátu ROS na formát OpenCV, čo nám umožnilo ďalšie spracovanie obrazu v prostredí OpenCV.
Následne som sa venovala skúmaniu reprezentácie obrazu a získaniu hĺbkovej mapy pomocou 3d kamery.

Obraz je reprezentovaný ako pole dvojíc hodnôt, pričom každá dvojica predstavuje jednu hodnotu hĺbky. Tieto hodnoty sme konvertovali
na správny formát a následne sme museli spraviť preškálovanie farieb, pri ktorom sa využíva bod s maximálnou hodnotou ako referenčný bod.
Týmto spôsobom sa dosiahne relatívne zobrazenie farieb v obraze, kde tmavšiu farbu budú mať objekty bližšie ku kamere.
Zároveň sme objavili a odfiltrovali body, pre ktoré to bolo potrebné.

Takéto zobrazenie farieb v obraze pomáha zlepšiť vnímanie hĺbky a umožňuje lepšiu vizuálnu interpretáciu vzdialeností medzi objektmi.
Hĺbková mapa aj RGB obraz sa obe zobrazia v okienkach ako vidno na obrázku.









Oprava komunikácie podvozku s riadiacim počítačom





- niektoré programy nefungovali správne
- firmware, ktorý je v podvozku bol vyvinutý pre staršiu verziu Linuxu, v ktorej boli inak nastavené komunikačné latencie na USB,
- preto bolo potrebné upraviť parametre USB komunikácie pri autodetekcii pripájaných zariadení v udev rules, tak ako sa píše na> https://github.com/yujinrobot/kobuki/issues/382#issuecomment-673739612
úprava je commitnutá v softvéri pre podvozok robota:
https://github.com/kobuki-base/kobuki_core/commit/2bc11a1bf0ff364b37eb812a404f124dae9c0699
avšak na našom robotovi sme museli nájsť vhodný súbor, v ktorom úpravu bolo potrebné urobiť:
/etc/udev/rules.d/57-kobuki.rules
pridať ATTR{device/latency_timer}="1", za ATTRS{serial}=="kobuki*",



Analýza komunikácie s podvozkom





pri príležitosti hľadania problému v komunikácii sme vykonali podrobnejšiu analýzu ROS nodeov a nodeletov (nodelety sú také nody, ktoré združuju viaceré nody v jednom procese bežiace ako samostatne vypočtové vlákna)
- v predchadzajúcich prikladoch hlavný riadiaci node, ktorý určoval pohyby robota publikoval správy typu Twist geometry na adresu /cmd_vel_mux/input/navi ako je zobrazené na obrázku:



Hoci aj v tomto prípade bol využitý multiplexer, ktorý slúži na spájanie požiadaviek na riadenie motorov z rôznych modulov, iné moduly sa na riadení nepodielali. To znamená jednoduchý node "to_obstacle" priamo posielal správy do tohto multiplexera, ktorý ich ďalej odovzdal radiču podvozku "/mobile_base", konkrétne na adrese "/mobile_base/commands/velocity"

V inom príklade, ktorý podrobnejšie vysvetlíme nižšie, prebiehalo riadenie motorov cez viaceré fázy



Pri využití hornej kamery je vhodné upraviť minimálnu y-ovu súradnicu detekovaného centroidu zhluku bodov v mračne bodov z 3D kamery, lebo inak ho program bude ignorovať - zmeniť hodnotu miny napr. na -0.5 m.
Najjednoduchšie to môžeme urobiť dynamicky počas behu programu konfiguračným nástrojom, ktorý spustíme takto:
rosrun rqt_reconfigure rqt_reconfigure

Sledovanie človeka/objektu pomocou 3D kamery





Original source code: turtlebot_follower

Tento program slúži na sledovanie objektu pomocou hĺbkovej kamery. Dá sa využiť aj na sledovanie človeka.
Metóda imagecb(), príjme obraz z kamery, spracuje ho a hľadá v ňom centroid objektu. Na základe jeho polohy sa generuje správa geometry_msgs/Twist, ktorá obsahuje príkazy pre pohyb robota. Správa sa potom publikuje na témou cmd_vel a robot sa pohybuje v snahe udržať sledovaný objekt v strede zorného poľa kamery.
goal_z_ predstavuje vzdialenosť, ktorú ma robot od objektu održovať. Napr. ak je goal_z_ nastavené na hodnotu 1 meter,
robot sa bude snažiť udržiavať vzdialenosť 1 meter od sledovaného objektu.

Nastavenie polohy robotického ramena a uchopovača na zadané súradnice v priestore


Funkcia findArmAngles (jupiter_arm_kinematics.cpp) dostane ako argumenty súradnice bodu (x, y, z), dĺžky segmentov ramena (l1, l2, l3) a uhol (gamma).
Posuvným meradlom sme zistili dĺžky l1 = 105 mm, l2 = 105 mm, l3 = 100 mm.
Funkcia vráti štyri uhly: uhol, pod akým sa má rameno natáčať k danému bodu, a tri uhly, pod ktorými majú byť segmenty ramena nastavené,
aby sa uchopovač ramena výslednej polohe nachádzal na súradniciach x, y, z a bol natočený pod uhlom gamma k tomuto bodu.
Program arm_to_xyz.cpp načíta vstupné argumenty zo štandardného vstupu, zavolá funkciu findArmAngles a následne nastaví body voľnosti ramena tak, aby uchopovač bol na
daných súradniciach. (Na obrázku sú znázornené uhly využité na výpočty a výsledné uhly,pomenované ako v kóde).



measuring camera field view

distance to wall: 77.8cm
width:  96.2
height:  71 cm

camera field view vertical rho = 2 * arctg 35.5/77.8   = 49,05 deg
camera field view horisontal nu = 2 * arctg 48.1/77.8  = 63,45 deg

datasheet values:

rho = 49.5 deg
nu = 60 deg

diagonal = 73 deg
	


Overovali sme aké hodnoty dáva 3D kamera v správe s hĺbkovou mapou. Robota sme umiestnili kolmo na stenu tak, že vzdialenosť dolnej kamery bola približne 59 cm. Hodnoty v hĺbkovej mape boli približne 590, čiže sú udané v mm. Druhá kamera na vrchnej strane robota snímala hodnoty okolo 620, takže je asi o 3 cm vzadu oproti dolneje kamere.

Za týmto účelom sme napísali samostatný program save_depth.cpp.

Namerané súbory: mapa_dolna.txt, mapa_horna.txt.

Testovali sme, aké skreslenie má obraz získaný z kamery, ale ROS už nášmu nodu posiela nakalibrovaný obraz, ktorý zachováva lineárnosť priamok:



Ball grabber



Nakoniec som pracovala na programe catch_ball.cpp, ktorý pomocou kamery nájde v obraze červenú loptu, ramenom
sa po ňu načiahne, uchopí ju a odhodí na bok (najprv sa však vždy nastaví do prípravnej polohy).
Ako prvé sme sa pokúsili využiť 3D kameru, no pri testovaní (a následnom googlení) sme zistili, že rozsah kamery je 0.6 m - 8 m.
To znamená, že ak bola lopta dostatočne blízko, aby na ňu rameno robota dosiahlo, bola príliš ďaleko na to, aby sme pomocou 3D kamery vedeli zistiť vzdialenosť.
Preto sme sa nakoniec rozhodli použiť riešiť problém pomocou RGB kamery. Ako prvý krok teda z nej získame obraz.
Následne ho zobrazíme na obrazovke a pomocou programu find_brick.cpp (ktorý vznikol úpravou už existujúceho programu od môjho školiteľa) v obraze nájdeme najväčší zhluk bodov
hľadanej farby a zvýrazníme ho modrou farbou a uložíme si niektoré jeho rozmery. Ostatné body hľadanej farby zvýrazníme zelenou.
Po stlačení klávesy medzera sa pomocou metódy calculate_position.cpp vypočítajú súradnice lopty v priestore. V tejto metóde sa najprv prepočítajú
pixelové súradnice tak, aby bod (0,0) predstavoval stred obrázka a získa sa relatívna vzdialenosť lopty od stredu.
Ďalej sa vypočíta polomer lopty na obraze a vykoná sa jeho úprava na základe dilatácie spôsobenej kamerou.
Potom sa vypočíta uhol ksi na základe horizontálneho zorného uhla kamery a relatívnej vzdialenosti od stredu.
Tento uhol ksi reprezentuje, akú časť zorného poľa kamery zaberá lopta. Keďže polomer lopty je vopred známy,
vypočítame presné súradnice lopty v priestore a pomocou programu camera_to_arm.cpp y nich získame súradnice pre rameno.
Ak je lopta dostatočne blízko, pošle sa správa ramenu, ktoré ju s využitím programu arm_to_xyz.cpp zoberie a odhodí na bok, ako je vidno na videu.



Ukážka