Raspberry pi ile İbeacon (BLE) Matplotlib kullanarak animasyon oluşturma

merhaba arkadaşlar konumlandırma üzerine çalışmaktayim. raspberry pi ile ibeaconları mesafesini buluyorum şimdiki yapacağım şey ise bu bulduğum mesafeleri matplotlib ekraninda göstermesini istiyorm kendim matplotlib kütüphanesini kullanarak kod yazdım ama ibeaconların göstermiyor gösterdiği tek şey benim kod içerisine yazdiğim konumlara göre yerini değiştirebiliyorum. Bu yazmış olduğum animasyon kodu hiçbir şekilde beaconların mesafesini göstermiyor. Bu konuda bana yardımcı olursaniz minnettar olurum.

    def calculate_accuracy(txpower, rssi):
    if rssi == 0 or txpower == 0:
        return -1
    else:
        ratio = rssi/txpower
        if ratio < 1:
            return ratio**10
        else:
            return 0.89976 * ratio**7.7095 + 0.111
            return result 
 
def scan_sock(sock):
    blescan.hci_le_set_scan_parameters(sock)
    blescan.hci_enable_le_scan(sock)
    sample_count = 0
     
    while True:
        returnedList = blescan.parse_events(sock, 10)
        print "----------"
        for beacon in returnedList:
            print beacon
            beacon = beacon.split(',')
            beaconid = beacon[0]
            txpower = float(beacon[4])
            rssi = float(beacon[5])
            if 0<= calculate_accuracy(txpower, rssi) < 2:
                print beaconid
            sample_count = 0
	    oran = float(rssi)*1.0/(txpower)
            #print "Oran = ",oran
	    if(oran < 1.0):
                Distance = math.pow(oran, 10)
		print "Mesafe = ", Distance
	    else:
		dogruluk =  (0.89976)*math.pow(oran,7.7095) + 0.111
                print "Dogruluk = ", dogruluk
                
               
#if __name__ == '__main__': #dongu burada bitiyor
dev_id = 0
try:
    sock = bluez.hci_open_dev(dev_id)
    print "Beacon Aktif"
    scan_sock(sock)
except:
    print "Beacon Aygit Bulunamadi..."

###############################################
matplotlib kütüphanesi kullanarak sorun yaşadığım animasyon kodu.

#######
fig = plt.figure()
#fig.set_dpi(100)
#fig.set_size_inches(7, 6.5)

ax = plt.axes(xlim=(0, 100), ylim=(0, 100))
patch = plt.Circle((5, -5), 0.75, color='r',fill=False,clip_on=False)
c1 = plt.Circle((5, -5), 0.75, fc='y')
c2 = plt.Circle((5, -5), 0.75, fc='b')
c3 = plt.Circle((5, -5), 0.75, fc='r')
def init():
    patch.center = (50, 50)
    c1.center = (100,5)
    c2.center= (10,10)
    ax.add_patch(c1);
    ax.add_patch(c2);
    ax.add_patch(patch)
    return patch,

def animate(i):
    
    raw_cell = main(i)
    print raw_cell
    cell = raw_cell[0]
    distance = cell["Distance"]
    print distance
    patch.set_radius(float(distance));
    return patch,
    
    


anim = animation.FuncAnimation(fig, animate, 
                               init_func=init, 
                               interval=5000,
                               blit=True)

plt.show()

Aldığınız bir hata var mı?

1 Beğeni

ismail bey şuanda atmiş olduğum SS de figure 1 ekranında gözüken 2 circle bulunmakta bu daireler kod içerisinde oluşturmuş olduğum daireler ben bu daireleri;
Distance = math.pow(oran, 10)
print "Mesafe = ", Distance
bu kodda ki ekrana yazdırmış olduğum mesafe bilgisine göre göstermesini istiyorum.

Komut satırında aldığım hata:

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/backends/backend_gtk3.py", line 75, in _on_timer
    TimerBase._on_timer(self)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/backend_bases.py", line 1373, in _on_timer
    ret = func(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/animation.py", line 1481, in _step
    still_going = Animation._step(self, *args)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/animation.py", line 1217, in _step
    self._draw_next_frame(framedata, self._blit)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/animation.py", line 1236, in _draw_next_frame
    self._draw_frame(framedata)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/animation.py", line 1772, in _draw_frame
    self._drawn_artists = self._func(framedata, *self._args)
  File "lahana.py", line 82, in animate
    raw_cell = main()
NameError: global name 'main' is not defined

Bu ne demek?

lahana.py’yi gostermeniz lazim

ibeacon bluetooth sinyali yayan bir device 3v bir beslemesi var biraz araştırmanızda görüceksinizdir. ayrica lahana.py paylaştım. kodların tamamı burada zaten

def calculate_accuracy(txpower, rssi):
    if rssi == 0 or txpower == 0:
        return -1
    else:
        ratio = rssi/txpower
        if ratio < 1:
            return ratio**10
        else:
            return 0.89976 * ratio**7.7095 + 0.111
            return result 
 
def scan_sock(sock):
    blescan.hci_le_set_scan_parameters(sock)
    blescan.hci_enable_le_scan(sock)
    sample_count = 0
     
    while True:
        returnedList = blescan.parse_events(sock, 10)
        print "----------"
        for beacon in returnedList:
            print beacon
            beacon = beacon.split(',')
            beaconid = beacon[0]
            txpower = float(beacon[4])
            rssi = float(beacon[5])
            if 0<= calculate_accuracy(txpower, rssi) < 2:
                print beaconid
            sample_count = 0
	    oran = float(rssi)*1.0/(txpower)
            #print "Oran = ",oran
	    if(oran < 1.0):
                Distance = math.pow(oran, 10)
		print "Mesafe = ", Distance
	    else:
		dogruluk =  (0.89976)*math.pow(oran,7.7095) + 0.111
                print "Dogruluk = ", dogruluk
                
               
#if __name__ == '__main__': #dongu burada bitiyor
dev_id = 0
try:
    sock = bluez.hci_open_dev(dev_id)
    print "Beacon Aktif"
    scan_sock(sock)
except:
    print "Beacon Aygit Bulunamadi..."

iBeacon’in ne oldugunu biliyorum da su cumleyi parse edemedim:

ibeaconların göstermiyor gösterdiği tek şey benim kod içerisine yazdiğim konumlara göre yerini değiştirebiliyorum

“lahana.py” derken, hatanin alindigi dosyayi kast etmistim:

  File "lahana.py", line 82, in animate
    raw_cell = main()
NameError: global name 'main' is not defined

Benim istedigim dosyanin 82. satirinda raw_cell = main() kodu var. Senin yolladigin dosya 46 satir.

Problemi anlayabilmis degilim. Problemi cikartan dosyalardan sadece eser var. Bir tane hata mesaji var, nereye ait oldugu belli degil. Animasyona dair 3-5 satir kod var, onun da import’lari olmadigi icin muneccimcilik oynuyoruz.

Paylasilan kodlarin cogu da BT HCI uzerinden data okumaya yonelik.

Tam olarak kimden yardim bekleniyor? Ayni RPi+iBeacon kurulumuna sahip bir gelistiriciden mi?


Tam olarak ne yapmaya calisiyorsun?
iBeacon’larin mesafesini alabiliyor musun?
Mesafe gibi herhangi bir sayiyi cizdirebiliyor musun?

Kusura bakmayin özür dilerim. Ben kendim araştırarak öğrenerek yazdığım için kodların kütüphanelerini paylaşmadım sadece kodların diğer kısmı tamamen doğrudur yalnızca kütüphaneler eksik. ben tam olarak hata almıyorum aslında bu matplotlib kütüphanesini yükledikten sonra ve

    #######
fig = plt.figure()
#fig.set_dpi(100)
#fig.set_size_inches(7, 6.5)

ax = plt.axes(xlim=(0, 100), ylim=(0, 100))
patch = plt.Circle((5, -5), 0.75, color='r',fill=False,clip_on=False)
c1 = plt.Circle((5, -5), 0.75, fc='y')
c2 = plt.Circle((5, -5), 0.75, fc='b')
c3 = plt.Circle((5, -5), 0.75, fc='r')
def init():
    patch.center = (50, 50)
    c1.center = (100,5)
    c2.center= (10,10)
    ax.add_patch(c1);
    ax.add_patch(c2);
    ax.add_patch(patch)
    return patch,

def animate(i):
    
    raw_cell = main(i)
    print raw_cell
    cell = raw_cell[0]
    distance = cell["Distance"]
    print distance
    patch.set_radius(float(distance));
    return patch,
    
    


anim = animation.FuncAnimation(fig, animate, 
                               init_func=init, 
                               interval=5000,
                               blit=True)

plt.show()

Bu kodu lahana.py içerisine aktardığımda yukarıdaki Ekran Görüntülerinde gördüğünüz gibi Figur 1 ve komut satırında hata ile karşılaşıyorum. kütüphaneler math, matplotlib, process blez,

Hah cok guzel!
Bastaki iki satiri muneccimlemem gerekti:

import matplotlib.pyplot as plt
import matplotlib.animation as animation

ama calistirabildim.

Grafik cizme calisiyor, animasyon da calisiyor. Buradaki sikinti scan kodu ile animasyon kodu arasinda veri alisverisi. main(i) ile main()'i cagirmak mantiksiz, datanin ortak (global olabilir) bir objede durmasi, scan’in yazarken animate’in okumasi lazim.