Visual navigation for Acrob or SBOT robot with Android with camera ( Marek Kádek, Jana Sucháneková)

From RoboWiki
Revision as of 11:18, 12 June 2013 by Robot (talk | contribs)
Jump to: navigation, search

Úvod

Cieľom projektu Editing Visual navigation for Acrob with Android with camera bolo vytvoriť robota, reagujúceho na vizuálne podnety v labyrinte pomocou snímania okolia kamerou mobilu s operačným systémom Android. Robot má byť spojený s telefónom pomocou protokolu bluetooth.

Postup riešenia

V prvej etape tvorby projektu bolo základom zložiť robota. (OBBBBBBBR)

V druhej etape sme vytvorili bluetooth spojenie medzi robotom a mobilným telefónom, pomocou knižnice Amarino - Android meets Andruino. Z rôznych zdrojov a diskusií na internete sme sa dozvedeli, že vytvorenie spojenia z android bluetooth na bluetooth modul robota je mnohokrát problémové a chyby sú ťažko odhaliteľné. Veľa rád práve smerovalo na použitie knižnice Amarino na riešenie tohoto problému.

Postup tvorby spojenia:

  1. Android zariadenie spárujeme s bluetooth modulom.
  2. Na android zariadenie nainštalujeme Amarino.
  3. Vytvoríme projekt v eclipse a do build path pridáme knižnicu.
  4. Vytvoríme a nacvičíme neurónovú sieť

Komunikácia

Ukážka nadviazania spojenia pomocou knižnice:

   private static final String DEVICE_ADDRESS =  "00:06:66:03:73:7B";
   private ArduinoReceiver arduinoReceiver = new ArduinoReceiver();
   
   @Override
   protected void onStart() {
       super.onStart();
       registerReceiver(arduinoReceiver, new IntentFilter(AmarinoIntent.ACTION_RECEIVED));
       Amarino.connect(this, DEVICE_ADDRESS);
   }
   @Override
   protected void onStop() {
       super.onStop();
       Amarino.disconnect(this, DEVICE_ADDRESS);
       unregisterReceiver(arduinoReceiver);
   }
   public class ArduinoReceiver extends BroadcastReceiver {
       @Override
       public void onReceive(Context context, Intent intent) {
       String data = null;
       final String address = intent.getStringExtra(AmarinoIntent.EXTRA_DEVICE_ADDRESS);
       final int dataType = intent.getIntExtra(AmarinoIntent.EXTRA_DATA_TYPE, -1);
       if (dataType == AmarinoIntent.STRING_EXTRA) {
           data = intent.getStringExtra(AmarinoIntent.EXTRA_DATA);			
           if (data != null){
               try {
                   // tu mozeme spracovat data, ktore robot posle na mobil
               } 
               catch (Exception e) { 
           }
       }
    }
  }

Na odosielanie dát smerom na Arduino využívame funkciu

   Amarino.sendDataToArduino(context, address, flag, data)

v našom prípade

   Amarino.sendDataToArduino(MainActivity.this, DEVICE_ADDRESS, 'd', 5);

Na strane arduina potom pripravíme funkciu nasledovne: 1. includujeme hlavičku - #include <MeetAndroid.h> 2. v setupe nabindujeme 'd' na funkciu zatoč

   MeetAndroid meetAndroid;
   void setup()  
   {
       ...
       meetAndroid.registerFunction(zatoc, 'd');
       ...
   }

3. pripravíme si funkciu zatoc

   void zatoc(byte flag, byte numOfValues)
   {
       ...
       // kod na zatocenie
       ...
   }

4. do loopu pridáme kód na príjmanie a spracovanie správ

   void loop()  
   {
       ...
       meetAndroid.receive(); 
       ...
   }


Otvorenie kamery

Neurónová sieť

Na tvorbu neurónovej siete sme použili knižnicu Neuroph. Tam sme natrénovali, aby rozoznávala požadované tvary. Stretli sme sa s nasledovnými problémami:

  1. Najnovšie Neuroph štúdio beží pod Java 1.7, a využíva novšie funkcie knižnice. Po natrénovaní sme sa snažili načítať natrénovanú sieť na Androide, avšak neúspešne.
  2. Staršia verzia Neuroph štúdia má problém s ukladaním siete. Tento problém sme dlho hľadali a zistili sme, že sa jedná o bug aplikácie, ukladanie funguje iba veľmi zriedka (spočiatku uloží nenatrénovanú sieť, no natrénovanú neukladá).
  3. Sieť sa v androide musí načítať vo zvláštnom vlákne, aby sme mohli využiť väčšiu stack size:


Zdroje

  1. Amarino toolkit
  2. Neuroph