Saturday, December 19, 2009

pySLAM

Peter Mawhorter et al. tarafindan yazilmis "Mapping for All" adli makale Python ile SLAM kodlamasi hakkinda. Makale, robotik ogretiminde guzel, pedagojik bir yaklasim, Fastslam algoritmasinin Python ile kodlanmasi ele aliyor. Bu kodlar pySLAM olarak adlandirilmis, fakat referans verilen adresin calismadigini farkettik. Biz biraz "arkeolojik kazi" yaparak bu kodlari kurtardik, zip olarak buradan paylasiyoruz. Isletmek icin zip'i actiktan sonra slam/pySLAM/test.py programi isletilebilir. slam/pySLAM altinda farkli FastSlam kodlarini denemek icin test.py icindeki gerekli sys.path.append komutunu comment out edebiliriz. UDA harfleri 'unknown data association' kelimelerine tekabul ediyor.

English: You can try out different Fastslam implementations by commenting out the necessary sys.path.append line in test.py. This was not there in the original code, we added it during clean-up.

pySLAM Indir (Download)

Wednesday, December 16, 2009

Latex ile Prezentasyon

Powerpoint benzeri prezentasyonlari Latex uzerinden uretmek icin gerekli dosyalar. Script build.py cagrisi ornegi derlemek icin yeterli, derle.sh icine de bakilabilir.

Baglanti

Tuesday, December 15, 2009

Dinamik Resource Erisimi

Android'de referans bilgilerini bir dosya icinde tutabiliriz; bu dosyalara erismek icin onlari res/raw altinda tutuyoruz. Eger erisilecek dosya ismi dinamik bir sekilde uretiliyor ise, o zaman String tipinden bir sekilde R.java dosyasi icinde static olarak tanimli int ogelere esleme yapmamiz lazim. Bnnun icin Java Reflection kullanacagiz:
import java.lang.reflect.Field;
import java.io.InputStream;

Field id = R.raw.class.getDeclaredField([string tipinde dinamik oge ismi]);
R.raw rr = new R.raw();
int i = id.getInt(rr);
InputStream in = getResources().openRawResource(i);
...

Asagi Kaydirilabilen (Scroll) TextView

Cep telefonu uygulamizda bir TextView duz metin basabilmemizi saglar. Ekrana sigmayacak kadar buyuk metinleri gosterebilmek icin asagi dogru gitme destegi lazim. Bu destek soyle eklenir:
  public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ScrollView sv = new ScrollView(this);
TextView tv = new TextView(this);
sv.addView(tv);
..
}

Icon

Uygulamamiz icin icon kullanmak icin gelistirme dizininde res/drawable/ altinda 48x48 boyutlarinda bir PNG imaji koymamiz, ve bu imaja AndroidManifest.xml dosyasinda

<application android:label="@string/app_name" android:icon="@drawable/[dosya]">

olarak referans vermemiz yeterli.

Not: [dosya] ismi png soneki olmadanki dosya ismi olmali.

Aktiviteler Arasi Gecis

Android kodlamasinda bir ekran bir Activity objesine tekabul eder. Bir Activity'den otekine gecis su sekilde oluyor;

Intent myIntent = new Intent();
myIntent.setClassName("[paket]", "[tum paketle beraber gecis yapilan class]");
startActivity(myIntent);

Peki gecis yaparken bir yandan bilgi aktarmak istersek ne yapariz? En basit isleyecek cozum, ya kaynak Activity'ye ya da hedef Activity'ye bir "public static" oge eklemek ve gecis yapmadan once gereken veriyi bu ogeye statik olarak set etmek. Gecis sonrasi gidilen Activity ayni statik erisimi yaparak gereken bilgiyi alacaktir.

Static erisimin kullanilmasi cok kullanicili bir ortam olan Web kodlamasi icin uygun olmayabilirdi. Fakat unutmayalim, cep telefonu kodlamasinda tek kullanicili bir ortamdayiz, ve uygulamada donen her turlu islem, veri atamasi tek kullanici icin yapiliyor. Bu yuzden static kullanimin tehlikesi yok.

Sunday, December 13, 2009

Android ve Statik Dosyalari Okumak

Android uygulamamiz, pek cok diger program gibi, bazi referans verilerine erismek isteyebilir. Android isletim sistemi bir sqllite adinda SQL tabani iceriyor, bu taban uzerinde db, tablolar yaratip o tablolara statik veriler yuklemek mumkun. Fakat ihtiyaclarimiz o kadar sofistike SQL erisimi gerektirmiyorsa, o zaman verileri pur dosyalar olarak cep telefonunda saklayabiliriz.

Daha onceki yazida gelistirme dizininin iskeletini yaratabildigimizi gorduk. Bu dizin ile beraber res/ adli bir dizin yaratiliyor, bu dizin altinda ./raw/[dosya] olarak yaratacagimiz her dosyaya Java kodundan su sekilde erismek mumkun.

import android.content.res.Resources;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.InputStream;

InputStream in = getResources().openRawResource(R.raw.[dosya]);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line = "";
while((line=br.readLine())!=null){
 ...
}

Bu kod Activity class'indan miras alan bir class icinde olmali - getResources() oradan erisilebiliyor (ama getResources() ile alinan obje parametre olarak istenen yere set edilebilir tabii).

Ustteki ornekte res/raw/[dosya]'yi actik ve her satiri bir String icine atadik.

Uygulamamizi telefona gonderirken paketleme islemleri res/ altindaki kaynaklarin, dosyalarin paketlenip kod ile beraber gitmesini saglayacak. Yani "ant install" "ant reinstall" komutlari gerekli her seyi telefona gondermekte.

Friday, December 11, 2009

Android Gelistirme Ortami

Google'in cep telefonlari icin one surdugu Android etrafinda bayagi hareketlenme var. G1 telefonu bir suredir piyasada. Simdi de HTC Hero adli bir telefon cikti, telefon hakkindaki yorumlar iyi. Android gelistirme ortami kurmaya gelelim: Su adresi ziyaret edin.

http://developer.android.com/sdk/index.html

Isletim sisteminiz icin olani indirin (bizim icin Linux). Paketi acin, ve [DIZIN]/tools dizinine girin. Burada "android" adindaki programi calistirin. Available Packages secenegine bakin, listelenen sitenin sol ok tusuna basinca normalde indirme baslamali. Fakat bu site bizde https uzerinden baglanti problemi verdi, o yuzden Settings altinda "Force https .. " diye baslayan secenegi sectik, "Save and Apply" dugmesine basip programi kapatip tekrar baslattik. Ikinci sefer liste indirildi. Listede ne varsa secin ve "install" deyin. Is bittikten sonra UI programindan cikin ve tools dizini altinda komut satirindan

android list targets

komutunu isletin. Onceden liste bos gelecekti, simdi install ettiginiz seyleri goruyor olmaniz lazim. Artik Hello World ornegini yazabiliriz. Alttaki sayfaya bakalim:

http://developer.android.com/guide/tutorials/hello-world.html

Bir "cep telefon" hedefi yaratalim:

android create avd --target 2 --name my_avd

Eger Android grafik arayuzu uzerinden target yaratmak istiyorsak, o zaman tools/android komutu ile programi baslatiriz, "Available packages" seceneginden bir SDK seceriz ve kurariz. Sonra Settings altinda "Force https .." diye giden secenegi seceriz, ve "Virtual Devices" bolumune gideriz. Oradan artik "New" ile yeni bir avd ekleyebiliriz. Burada kullandigimiz isim ile "emulator -avd myavd" komutu isleyecektir.



Eclipse kullanicilari ustteki sayfadaki gerekli olanlari takip edebilir. Biz build.xml bazli calisiyoruz, o durumda iskelet dizin, build.xml yaratmak soyle:

android create project --package com.android.helloandroid --activity HelloAndroid --target 2 --path [GELISTIRME DIZINI]

Diger IDE'ler hakkinda daha fazla detay

http://developer.android.com/guide/developing/other-ide.html

Uretilen HelloWorld.java koduna gidip sunlari yazabilirsiniz:
package com.android.helloandroid;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class HelloAndroid extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
tv.setText("Hello, Android");
setContentView(tv);
}
}
Simdi emulatoru baslatialm: emulator -avd my_avd

Emulator arka planda isliyor iken, gelistirme dizinine gidip

ant install

ile uygulamayi derleyip emulasyon aletine install edelim. Eger kod degistirilirse, ant reinstall ile tekrar kod gonderilebilir. Kod isleyisi hakkinda problemleri gormek icin tools altinda "adb logcat" faydali.

Bu kadar. Simdi emulator'den menuyu acip HelloAndroid uygulamasina gidin ve uzerine tiklayin. Ustteki resim gibi bir cikti gelmesi lazim.

Wednesday, December 9, 2009

Matplotlib, Pylab ve hareketli plot, animasyonlar

Bir kordinat sistemi uzerinde canli olarak bir hesabin sonucunu seyretmek istersek, Pylab icin faydali bir ornek kod altta. Kod arka arkaya 10 tane x,y degeri uretiyor, sayilar 0..1 arasi, ve eksenlerin sabit kalmasi icin set_xlim, set_ylim cagrilarini yapmak lazim.
from pylab import *
from random import *
from time import *

ion()

fig = plt.figure()
ax = fig.add_subplot(111)

for i in xrange(10):
sleep(0.5)
ax.plot([random()], [random()], 'd')
ax.set_xlim(0, 1)
ax.set_ylim(0, 1)
hold(False)
draw()

Simulatorden Deger Toplamak

Simbad adli robot simulatorunden bahsetmistik. Bu simulatorde isleyen robotun aninda (online) Sci/Numpy hesaplarini yapacak kodlarla iletisiminde SrPy tavsiye etmistik. Fakat, aslinda test amacli olarak, Jython uzerinden simulatoru bir kez isletip, olcum verilerini bir dosyada toplamak, sonra ayri anlik olmayan (offline) bir sekilde o dosya uzerinde Python hesap kodlari isletmek te olabilir. Boylece SrPy'a gerek kalmaz.

Ustte ornek bir Simbad dunyasi (kodu altta). Sol ust kosedeki robot uzerinde 12 tane sonar algilayicisi var, bu algilayicilar 0'incisi en onde olmak uzere saat yonu tersine dogru artan sekilde esit araliklarla robotun uzerine takili ve verileri her '10 sayac degerinde bir' olmak uzere okunup dosyaya yaziliyor. Ayrica her 'ileri' ve 'sola don' komutlari ayni dosyaya tek bir satir olmak uzere yazilmakta. Ekte verilen cikti dosyasinda 'Inf' degerleri goruluyor, bu sonar algilayicisinin 'sonsuz (infinity)' degerini dondurdugu anlamina geliyor, yani onunde buyuk bir bosluk var, ve algilanabilecek bir engel varsa bile, cok uzakta. Bu durum gercek dunyadaki sonar verileriyle uyusuyor aslinda, cogunlukla Inf degerleri islenmeden gecilir (discard).

Bizim makinada her saniye basina 20 sayac degeri dusuyor, ona gore kinematik hesaplari yapabilirsiniz.

Jython ile dunyayi baslatip "Run" tusuna basinca, robot dunya cevresinde tam bir tur atacak, sonra ilk asagi gidisi bir daha tekrarlayacak, bu sirada verileri toplayacak. Ornek veri dosyasi da ekte bulunabilir.

Friday, December 4, 2009

OpenCV 2.0

Open CV 1.1 versiyonunda bazi problemler var; en son versiyona yukseltilmesi tavsiye edilir. Kurmak icin gerekli baz paketler:
sudo apt-get install libavformat-dev libgtk2.0-dev pkg-config cmake libswscale-dev bzip2
Sonra Open CV paketi indirilir:
wget http://downloads.sourceforge.net/project/opencvlibrary/opencv-unix/2.0/OpenCV-2.0.0.tar.bz2
Paketi acip dizine girilir ve su dizinler yaratilir:
mkdir release; cd release
Ve
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_PYTHON_SUPPORT=ON ..
sudo make install
.bashrc ya da cevre degiskenlerinin set edildigi yerde su ibareler eklenmeli:
export LD_LIBRARY_PATH=/usr/local/lib/:$LD_LIBRARY_PATH
Kaynak

Thursday, December 3, 2009

Piksel Takibi, OpenCV, cvCalcOpticalFlowPyrLK, optflow

Iki imaj arasinda, birinci imajda secilen piksellerin ikinci imajda nereye gitmis oldugu, yani piksel eslestirme problemi (image registration) genelde Lukas-Kanade adli matematiksel yontem, ve OpenCV ozelinde CalcOpticalFlowPyrLK cagrisi ile cozuluyor. Alttaki ornekte arka arkaya iki imaj gosteriliyor, ve bu imajlarin ilkinde eslestirilmesini istedigimiz 3 tane pikseli biz rasgele sectik. Bu piksel noktalari sonra bir sonraki imajda buluyoruz, ve onlari da isaretleyerek gosteriyoruz.
import cv

seq = [cv.LoadImage("flow%d.png" % (i+1), 0) for i in range(2)]
crit = (cv.CV_TERMCRIT_ITER, 100, 0.1)
crit = (cv.CV_TERMCRIT_EPS, 0, 0.001)

pts = [(142,190), (139,110), (160,60)]

color = (100,100,255)

r = cv.CalcOpticalFlowPyrLK(seq[0], seq[1], None, None,
                    pts, (100,100), 0, crit, 0)
for pt in pts:
cv.Circle(seq[0], pt, 5, color, 0, cv.CV_AA, 0)
a = cv.CreateImage((400,300), 8, 1)
cv.Resize(seq[0], a, cv.CV_INTER_NN)
cv.ShowImage('First', a)
cv.WaitKey()
cv.DestroyAllWindows()

for pt in r[0]:
cv.Circle(seq[1], (int(pt[0]), int(pt[1])), 5, color, 0, cv.CV_AA, 0)
b = cv.CreateImage((400,300), 8, 1)
cv.Resize(seq[1], b, cv.CV_INTER_NN)

cv.ShowImage('Second', b)
cv.WaitKey()
cv.DestroyAllWindows()

Alternatif bir paket optflow paketi. CImg kutuphanesi kullanilarak yazilmis, once Ubuntu uzerinde apt-get ile libboost-program-options-dev kurulmasi lazim. Sonra program indirilir, ana dizinde "cmake ." isletilir, ve make komutu verilir. Simdi bin altinda cikti gorulecek. Dizin examples altina gidin ve

../bin/extractmotion --image1 complex1.png --image2 complex2.png --algorithm lucaskanade --outprefix out

isletin.

Baglanti