Difference between revisions of "Projects AI Robotics"

From RoboWiki
Jump to: navigation, search
m (2015)
m
Line 1: Line 1:
This page contains student projects from the course Algoritms for AI Robotics
+
[[Projects_AI_Robotics|Nazad na projekty ...]]
  
Please create a separate page for each project:
+
GolfBot spis projektu (pripravuje sa) ...
  
== 2015 ==
+
== Program ==
[[GolfBot|GolfBot - Andrej Jursa a Michal Moravčík]]
 
  
== 2014 ==
+
=== Prepojenie s kamerou a určovanie orientačných bodov ===
[[Lego Mindstorms Ev3 Project - Ondrej Slovak]]
 
  
[[robot performs movements, detects trajectory using gyroscope/accellerometer, sends data to Java application that visualizes the trajectory (Mário Raček, Roman Moravec)]]
+
Obraz sme získavali pomocou Kinectu pre XBox 360. Máme dve triedy, <code>Kinect</code> (odvodená od <code>edu.ufl.digitalworlds.j4k.J4KSDK</code>) a <code>Camera</code> (implementuje <code>Runnable</code>).
  
[[LEGO NXT project (Martin Marko, Martin Šalka)]]
+
Hlavný program spúšťa vlákno kamery, ktoré následne pri inicializácii spustí vlákno kinectu v móde <code>J4KSDK.COLOR</code>. Inštancii tredy <code>Kinect</code> je potom poslaná referencia na kameru. Trieda <code>Kinect</code> prekrýva metódu udalosti <code>onColorFrameEvent</code>, ktorá nastáva po zosnímaní farebného obrazu kinectom, pričom tento obraz posiela inštancii kamery cez referenciu volaním jej verejnej metódy <code>setImageFromKinect</code>.
  
[[GAZEBO simulator (Ľubomír Chriašteľ)]]
+
Hlavné vlákno kamery vykonáva cyklicky tieto akcie:
  
[[ASUS Xtion pre robota SmelyZajko (Marek Jelen, Miroslav Garai)]]
+
Najprv sa otestuje, či existuje snímka z kamery.
 +
* Ak nie, ukončí iteráciu cyklu a pokračuje ďalšou iteráciou.
 +
* Ak áno:
 +
*# Vytvorí si novú kópiu obrázku (pre účely spracovania).
 +
*# Aplikuje gaussovo rozmazanie pracovného obrázka z polomerom 3px.
 +
*# Skonvertuje obrázok z farebného formátu BGR do LAB.
 +
*# Pomocou prahovania, nájdeniu najväčšieho spojitého komponentu a priemerovania x, y pozícií pixelov najväčšieho spoločného komponentu nájde stredy kruhových značiek a lopty.
 +
*# Určia sa polohy cieľa (stred obrázka), lopty (oranžová značka na obrázku), polomer lopty a pozicia robota.
 +
*# Spočíta sa uhol natočenia robota (podľa zelenej a modrej značky).
 +
*# Vykreslia sa získané body do náhľadového obrázka.
 +
*# Hlavné vlákno programu je notifikované o dokončení cyklu kamery (teda sú spočítané potrebné body pre ďalšiu fázu programu hlavného vlákna).
  
[[Robot Following using Camera (Marian Vysluzil)]]
+
==== Gaussovo rozmazanie obrázku ====
  
== 2013 ==
+
Na rozmazanie obrázka (blur) je použítá aproximácia gaussovho rozmazávacieho algoritmu, ktorý dokáže pracovať v lineárnom čase. Použili sme port algoritmu z JavaScriptu z blogu Ivana Kuckira, nájsť ho je možné na stránke [http://blog.ivank.net/fastest-gaussian-blur.html Fastest Gaussian Blur (in linear time)] (jedná sa o algoritmus 4 na tejto stránke).
  
[[Robot_constructs_a_map_of_a_maze_-_Adam_Bilisics]]
+
Keďže algoritmus počíta s tým, že obrázok je tvorený polom bajtov, kde jeden bajt reprezentuje jeden pixel, bolo nutné obrázok rozdeliť na tri obrázky, ktoré reprezentovali jeho červenú, zelenú a modrú farebnú zložku samostatne. Potom, ako algoritmus rozmazania dokončil svoju prácu na každom z týchto rozdelených obrázkov, bolo treba ich opätovne spojiť do jedného obrázka. Na toto nám slúžia metódy <code>separateColor</code> a <code>putColor</code>.
  
[[Šifrovačka s robotnačkou pre Euroveu, EV3 Puppy (Martina Chraščová, Lucia Budinská, Lucia Ďurikovičová )]]
+
==== Prevod z RGB do LAB ====
  
[[E-Puck Bludisko]]
+
Keďže zosnímaný obrázok z kamery je vo formáte, kde jeden pixel je určený štyrmi bajtmi s významom: Blue, Green, Red a posledný je vždy nulový (hodnota 0), pričom tieto hodnoty sú v rozsahu od 0 do 255, je treba najprv každý pixel preformátovať do tvaru RGB, kde každá hodnota je <code>float</code> s hodnotou od 0 do 1. Na to máme metódu <code>getPixel</code> s následným predelením každej zložky hodnotou 255.
  
[[Visual navigation for Acrob or SBOT robot with Android with camera ( Marek Kádek, Jana Sucháneková)]]
+
Každý pixel je potom vložený do statickej metódy triedy <code>CIELab</code> s názvom <code>fromRGB</code>, ktorá vráti hodnotu pixelu vo formáte farieb LAB. Trieda <code>CIELab</code> na prevod z RGB do LAB ešte používa medzikrok, kde každý RGB pixel prevedie do formátu XYZ, z ktorého následne vytvorí LAB formát.
  
[[Acrob robot constructs a map of a maze (Péter Dobsa, Gergely Labanc)]]
+
==== Prahovanie ====
  
[[Acrob robot constructs a map of a maze - obstacles around the robot (Jozef Belko)]]
+
Prahovanie používame na získanie masky informácií o prítomnosti farebnej informácie v LAB formáte v spracovávanom obrázku. Tento algoritmus (metóda <code>prahuj(float[] from, float[] to)</code>) dostáva minimálnu a maximálnu hodnotu prahu farby v LAB formáte a v obrázku zisťuje, pre každý pixel, či je v rozsahu tejto hodnoty alebo nie je. Ak pixel v rozsahu je, dostane výstupná maska na pozícii pixelu hodnotu 1, v opačnom prípade je použitá hodnota 0.
  
[[Trajectory from gyro/accellerometer/compas]]
+
'''int[]''' ''o'' = '''new int['''potrebná veľkosť''']'''
 +
'''for''' každé ''x''
 +
    '''for''' každé ''y''
 +
      '''if''' pixel na ''x'' a ''y'' je medzi ''from'' a ''to''
 +
          zapíš do ''o'' 1
 +
      '''else'''
 +
          zapíš do ''o'' 0
 +
'''return''' ''o''
 +
 +
==== Najväčší spojitý komponent ====
  
[[Parking of robots in Remotely-operated laboratory]]
+
Výstupom z prahovania je maska obsahujúca nuly a jednotky, na pozíciách, kde bola zistená vhodná farba. Algoritmus nájdenia najväčšieho spojitého komponentu prehľadáva pôvodnú masku, v prípade nájdenia hodnoty jedna spustí prehľadávanie do šírky, pričom každý susedný pixel (v každom z 8 smerov) označí hodnotou N. N začína na hodnote 2 a je zvyšovaný po dokončení označenia komponentu, tento číselný údaj je vpisovaný do vstupnej masky. Tento komponent sa hľadá metódou <code>int flood(int px, int py, int[] in, int n)</code>, ktorá dostáva súradnice prvého bodu komponentu, masku a číselné označenie komponentu, označí komponent a spočíta počet pixelov v tomto komponente, ktorý následne vráti.
  
[[Pohyb robota po čiare a zaznamenávanie vzdialenosti okolitých objektov (Dudík, Kemény)]]
+
Každý komponent je zapísaný do <code>HashMap</code>, kde kľúč je číslo komponentu a hodnota je počet pixelov v komponente. Po nájdení všetkých komponentov sa určí najväčší z nich a maska sa opäť preznačí na hodnoty 0 a jednoa takto:
  
[[Agent Space on Raspberry Pi and Acrob with line-following and obstacle avoiding behavior-based robot.(Anton Blahunka, Martin Reiberger)]]
+
* Ak pixel má hodnotu čísla najväčšieho komponentu, bude nastavený na hodnotu 1.
 +
* Ak pixel má inú hodnotu, bude nastavený na 0.
  
[[Evolution with Open Dynamics Engine (Bečvarová Ľuboslava)]]
+
Metóda hľadajúca najväčší spojitý komponent má názov <code>najSpoj</code>.
  
[[Acrob navigation in maze using neural network (Kundlová, Jurenka)]]
+
==== Určenie stredu a AABB ohraničenia komponentu ====
  
[[ Acrob in maze (line sensor, distance sensor, robot navigates towards the maze exit) (Martin Hrivnák, Tomáš Matúš)]]
+
Na získanie stredu a AABB ohraničenia komponentu sa používa metóda <code>drawX</code>. Metóda dostáva masku s určeným najväčším spojitým komponentom, pričom pre každý pixel, ktorého hodnota je rovná 1, je pozícia pixelu x a y pripočítaná k ceľkovému súčtu. Rovnako sú pre každé x a y upravené hodnoty premenných <code>maxX</code>, <code>minX</code>, <code>maxY</code> a <code>minY</code>. Výsledný stred je vypočítaný ako pomer súčtu x ku počtu pixlov a súctu y k počtu pixlov.
  
[[Acrob robot prejde bludisko, a program ďalej vizualizuje mapu bludiska na obrazovke (Michal Borčin & Barbora Zaťková)]]
+
'''int[]''' ''stred'' = '''new int['''6''']'''
 
+
'''long''' ''sx'' = 0, ''sy'' = 0
[[NXT/LeJOs bot navigates maze consisting of black tape on white paper, object in front of robot is the maze exit (Pavol Lescinsky)]]
+
'''int''' ''maxX'' = 0, ''maxY'' = 0, ''minX'' = ''width'', ''minY'' = ''height'', ''pocet'' = 0
 
+
'''for''' každý ''x''
[[Omnibot(Krajči,Dluhý)]]
+
    '''for''' každý ''y''
 
+
      '''if''' pixel ''x'',''y'' patrí komponentu
[[Navigation of the robot arm with ANN(Karin Vališová)]]
+
          ''sx'' += ''x'', ''sy'' += ''y'', ''pocet''++
 
+
          ''maxX'' = max(''maxX'', ''x'')
[[Evolving obstacle avoidance in Microsoft Robotics Studio (autori: Miroslav Matušťák & Pavol Kunovský)]]
+
          ''maxY'' = max(''maxY'', ''y'')
 
+
          ''minX'' = min(''minX'', ''x'')
[[Trajectory from gyro/accellerometer/compas with 9DOF IMU (Michal Zemko, Peter Svitok)]]
+
          ''minY'' = min(''minY'', ''y'')
 
+
'''if''' ''pocet'' je 0
== 2012 ==
+
    '''return''' ''stred''
 
+
''stred''[0] = round(''sx'' / ''pocet'')
[[Avoiding in a corridor]]
+
''stred''[1] = round(''sy'' / ''pocet'')
 
+
''stred''[2] = ''minX''
[[Ketchup Robot]]
+
''stred''[3] = ''minY''
 
+
''stred''[4] = ''maxX''
[[Identification of beer bottle using OpenCV]]
+
''stred''[5] = ''maxY''
 
+
'''return''' ''stred''
[[Mapping with SBOT]]
 
 
 
[[Light Avoiding SBOT]]
 
 
 
[[V-REP]]
 
 
 
[[Webots]]
 
 
 
[[Feedforward Backpropagation Neural Networks]]
 
 
 
[[AnyKode Marilou]]
 
 
 
== 2011 ==
 
 
 
[[Braitenberg 2]]
 
 
 
[[Tetrix robot with localisation using a neural network]]
 
 
 
[[Robot nasleduje čiaru a vykreslí svoju dráhu do programu]]
 
 
 
[[Mouse in Maze with robot E-Puck]]
 
 
 
[[Natural language interface for SBOT]]
 
 
 
[[SBOT following the line]]
 
 
 
[[Lego RCX following the line and obstacle avoiding ]]
 
 
 
[[Implement a simple LCS for the SBOT robot]]
 
 
 
[[Micromouse with Mindstorms]]
 
 
 
[[Mail delivery robot]]
 
 
 
[[Pohyb podla moznych krokov]]
 
 
 
[[New applet control interface for the lab control page ]]
 
 
 
[[Reproducing a learned geometrical object using drawing pen of Robotnacka robot]]
 
 
 
[[Obstacle avoidance training in Khepera 2 simulator via neural network]]
 
 
 
[[Highlander]]
 
 
 
== 2010 ==
 
 
 
[[Line Following Sbot Using Reinforcement Learning]]
 
 
 
[[Controlling robots in remotely-operated laboratory using Objection language]]
 
 
 
[[Robot Parking using NEAT - Neuroevolution of augmenting topologies]]
 
 
 
[[Gripper Functionality for Remotely-Operated Robotics Laboratory]]
 
 
 
[[Visualization of Robotnacka Trajectories in Robotics Laboratory]]
 
 
 
[[Robot whitch follow a line and stop back up of barrier]]
 
 
 
[[Robot with ultrasonic distance sensors]]
 
 
 
[[Braitenberg vehicles implemented using SBOT robot]]
 
 
 
[[Simple reactive Sbot agent]]
 
 
 
[[Simple python GUI for SBOT without packets]]
 
 
 
[[Controlling robot with webcam]]
 
 
 
[[SBOT pushing a vehicle]]
 

Revision as of 17:06, 27 May 2015

Nazad na projekty ...

GolfBot spis projektu (pripravuje sa) ...

Program

Prepojenie s kamerou a určovanie orientačných bodov

Obraz sme získavali pomocou Kinectu pre XBox 360. Máme dve triedy, Kinect (odvodená od edu.ufl.digitalworlds.j4k.J4KSDK) a Camera (implementuje Runnable).

Hlavný program spúšťa vlákno kamery, ktoré následne pri inicializácii spustí vlákno kinectu v móde J4KSDK.COLOR. Inštancii tredy Kinect je potom poslaná referencia na kameru. Trieda Kinect prekrýva metódu udalosti onColorFrameEvent, ktorá nastáva po zosnímaní farebného obrazu kinectom, pričom tento obraz posiela inštancii kamery cez referenciu volaním jej verejnej metódy setImageFromKinect.

Hlavné vlákno kamery vykonáva cyklicky tieto akcie:

Najprv sa otestuje, či existuje snímka z kamery.

  • Ak nie, ukončí iteráciu cyklu a pokračuje ďalšou iteráciou.
  • Ak áno:
    1. Vytvorí si novú kópiu obrázku (pre účely spracovania).
    2. Aplikuje gaussovo rozmazanie pracovného obrázka z polomerom 3px.
    3. Skonvertuje obrázok z farebného formátu BGR do LAB.
    4. Pomocou prahovania, nájdeniu najväčšieho spojitého komponentu a priemerovania x, y pozícií pixelov najväčšieho spoločného komponentu nájde stredy kruhových značiek a lopty.
    5. Určia sa polohy cieľa (stred obrázka), lopty (oranžová značka na obrázku), polomer lopty a pozicia robota.
    6. Spočíta sa uhol natočenia robota (podľa zelenej a modrej značky).
    7. Vykreslia sa získané body do náhľadového obrázka.
    8. Hlavné vlákno programu je notifikované o dokončení cyklu kamery (teda sú spočítané potrebné body pre ďalšiu fázu programu hlavného vlákna).

Gaussovo rozmazanie obrázku

Na rozmazanie obrázka (blur) je použítá aproximácia gaussovho rozmazávacieho algoritmu, ktorý dokáže pracovať v lineárnom čase. Použili sme port algoritmu z JavaScriptu z blogu Ivana Kuckira, nájsť ho je možné na stránke Fastest Gaussian Blur (in linear time) (jedná sa o algoritmus 4 na tejto stránke).

Keďže algoritmus počíta s tým, že obrázok je tvorený polom bajtov, kde jeden bajt reprezentuje jeden pixel, bolo nutné obrázok rozdeliť na tri obrázky, ktoré reprezentovali jeho červenú, zelenú a modrú farebnú zložku samostatne. Potom, ako algoritmus rozmazania dokončil svoju prácu na každom z týchto rozdelených obrázkov, bolo treba ich opätovne spojiť do jedného obrázka. Na toto nám slúžia metódy separateColor a putColor.

Prevod z RGB do LAB

Keďže zosnímaný obrázok z kamery je vo formáte, kde jeden pixel je určený štyrmi bajtmi s významom: Blue, Green, Red a posledný je vždy nulový (hodnota 0), pričom tieto hodnoty sú v rozsahu od 0 do 255, je treba najprv každý pixel preformátovať do tvaru RGB, kde každá hodnota je float s hodnotou od 0 do 1. Na to máme metódu getPixel s následným predelením každej zložky hodnotou 255.

Každý pixel je potom vložený do statickej metódy triedy CIELab s názvom fromRGB, ktorá vráti hodnotu pixelu vo formáte farieb LAB. Trieda CIELab na prevod z RGB do LAB ešte používa medzikrok, kde každý RGB pixel prevedie do formátu XYZ, z ktorého následne vytvorí LAB formát.

Prahovanie

Prahovanie používame na získanie masky informácií o prítomnosti farebnej informácie v LAB formáte v spracovávanom obrázku. Tento algoritmus (metóda prahuj(float[] from, float[] to)) dostáva minimálnu a maximálnu hodnotu prahu farby v LAB formáte a v obrázku zisťuje, pre každý pixel, či je v rozsahu tejto hodnoty alebo nie je. Ak pixel v rozsahu je, dostane výstupná maska na pozícii pixelu hodnotu 1, v opačnom prípade je použitá hodnota 0.

int[] o = new int[potrebná veľkosť]
for každé x
   for každé y
      if pixel na x a y je medzi from a to
         zapíš do o 1
      else
         zapíš do o 0
return o

Najväčší spojitý komponent

Výstupom z prahovania je maska obsahujúca nuly a jednotky, na pozíciách, kde bola zistená vhodná farba. Algoritmus nájdenia najväčšieho spojitého komponentu prehľadáva pôvodnú masku, v prípade nájdenia hodnoty jedna spustí prehľadávanie do šírky, pričom každý susedný pixel (v každom z 8 smerov) označí hodnotou N. N začína na hodnote 2 a je zvyšovaný po dokončení označenia komponentu, tento číselný údaj je vpisovaný do vstupnej masky. Tento komponent sa hľadá metódou int flood(int px, int py, int[] in, int n), ktorá dostáva súradnice prvého bodu komponentu, masku a číselné označenie komponentu, označí komponent a spočíta počet pixelov v tomto komponente, ktorý následne vráti.

Každý komponent je zapísaný do HashMap, kde kľúč je číslo komponentu a hodnota je počet pixelov v komponente. Po nájdení všetkých komponentov sa určí najväčší z nich a maska sa opäť preznačí na hodnoty 0 a jednoa takto:

  • Ak pixel má hodnotu čísla najväčšieho komponentu, bude nastavený na hodnotu 1.
  • Ak pixel má inú hodnotu, bude nastavený na 0.

Metóda hľadajúca najväčší spojitý komponent má názov najSpoj.

Určenie stredu a AABB ohraničenia komponentu

Na získanie stredu a AABB ohraničenia komponentu sa používa metóda drawX. Metóda dostáva masku s určeným najväčším spojitým komponentom, pričom pre každý pixel, ktorého hodnota je rovná 1, je pozícia pixelu x a y pripočítaná k ceľkovému súčtu. Rovnako sú pre každé x a y upravené hodnoty premenných maxX, minX, maxY a minY. Výsledný stred je vypočítaný ako pomer súčtu x ku počtu pixlov a súctu y k počtu pixlov.

int[] stred = new int[6]
long sx = 0, sy = 0
int maxX = 0, maxY = 0, minX = width, minY = height, pocet = 0
for každý x
   for každý y
      if pixel x,y patrí komponentu
         sx += x, sy += y, pocet++
         maxX = max(maxX, x)
         maxY = max(maxY, y)
         minX = min(minX, x)
         minY = min(minY, y)
if pocet je 0
   return stred
stred[0] = round(sx / pocet)
stred[1] = round(sy / pocet)
stred[2] = minX
stred[3] = minY
stred[4] = maxX
stred[5] = maxY
return stred