SonariProbleem

From Intelligent Materials and Systems Lab

Revision as of 17:39, 27 March 2011 by Siimsundla (talk | contribs)

Filtreeritud väärtused

Tarkvara versioon: 1.8.11

Endless walk programmi töö ei olnud testimisel ootuspärane, kui robot oleks pidanud kõndima seni kuni sonariga tuvastatakse takistus, siis tulemus oli rohkem paigal tammumine, robot astus väikeseid samme suvalistes suundades. Choregraphe ploki tööd jälgides võis näha kuidas pidevalt tekitati sündmusi "SonarRightDetected" või "SonarLeftDetected" olenemata, sellest kas roboti ees oli objekt. Sellest tuli välja ka üks Choregraphega seotud viga, signaalide liikumisi skeemil näidati ainult siis kui programm käivitati olles sonari alamprogrammi ploki lahti võtnud, kõndimise programmi peaskeemilt alustades ja siis sonarit valides signaalide liikumist ekraanil ei kuvatud.

Samalaadse tulemuse andis ka Pythoni skript. Kui käivitasin näiteskripti ja suunasin sonarid lakke olid loetud väärtused:

>>> print memory.getData("SonarMiddleDetected")
0.264999985695
>>> print memory.getData("SonarMiddleDetected")
0.264999985695
>>> print memory.getData("SonarRightDetected")
0.239999994636
>>> print memory.getData("SonarRightDetected")
0.239999994636

Tagastatud ujukoma arv märgib suurima tõenäosusega tuvastatud kaugust, kuid see püsib stabiilselt vahemaal vastavalt 26, 24 cm (?). Kui suunasin sonarid takistusele, siis olid tulemused:

>>> print memory.getData("SonarRightDetected")
0.569999992847
>>> print memory.getData("SonarRightDetected")
0.680000007153
>>> print memory.getData("SonarRightDetected")
0.680000007153
>>> print memory.getData("SonarRightDetected")
0.579999983311

Ehk tegelikult suudetakse midagi ikka tuvastada. Kui lugeda näiteks 30 cm alapiiriks ja seda koodis arvestada võib kasutamine isegi võimalik olla (signaali stabiilsust eriti ei testinud), kuid kuna tarkvaraga kaasa tulnud programm seda ei tee ning spetsifikatsioon nii ei märgi võib olla tegemist riistvaralise probleemiga. Võimalik, et sonarite kasutamine on kuidagi sünkroonist väljas ja nad segavad üksteist.

Ülaltoodud "SonarRightDetected" väärtused on eelnevalt läbinud filtri (töötluse) ning ei kajasta otseselt seda, mida sonar mõõtis.

Tegelike sonari väärtuste ning filtreeritud väärtuste võrdlus

Tarkvara versioon: 1.8.11

Järgnevas katses liigutati NAOd mööda tuba ringi viies teda seintest lähemale/kaugemale kokku võeti 100 lugemit igale sonari loetud väärtusele järgneb filtri läbinud väärtus.

Väljundi stabiilsuse ning filtreerimise testprogramm:

 #!/usr/bin/python

 import sys
 import time
 import numpy
 from naoqi import ALProxy

 IP = sys.argv[1] // Käsurea argumendid
 SAMPLES = sys.argv[2]
 PORT = 9559

 sonar=ALProxy("ALSonar", IP, PORT)
 mem=ALProxy("ALMemory", IP, PORT)

 sonar.subscribe("SonariTest", 500, 1.0) // Uuenda 500ms tagant, täpsus 1.0

 leftValues=[]
 rightValues=[]

 for i in range(0, int(SAMPLES)):
	time.sleep(1) // Oota 1 sekund
	left = mem.getData("Device/SubDeviceList/US/Left/Sensor/Value", 0) // 0 tähendab uusima väärtuse lugemist, otse sonarist saadud väärtus 
	leftD = mem.getData("SonarLeftDetected") // Läbinud filtri
	right = mem.getData("Device/SubDeviceList/US/Right/Sensor/Value", 0)
	rightD = mem.getData("SonarRightDetected")
	leftValues.append(float(left))
	rightValues.append(float(right))
	print "left:",left,"right:",right
	print "filter left:",leftD,"right:",rightD

 print "Mean left:",numpy.mean(leftValues)
 print "Mean right:",numpy.mean(rightValues)
 print "Standard deviation left:", numpy.std(leftValues)
 print "Standard deviation right:", numpy.std(rightValues)

 sonar.unsubscribe("SonariTest")

Väljundifail: File:NAO sonarTest output.txt

Väljundis:

left: 1.66999995708 right: 1.39999997616
filter left: 0.389999985695 right: 0.699999988079
...
left: 1.87999999523 right: 1.40999996662
filter left: 0.439999997616 right: 0.649999976158
...
left: 0.310000002384 right: 0.299999982119
filter left: 0.34999999404 right: 0.340000003576
...
left: 0.289999991655 right: 0.299999982119
filter left: 0.34999999404 right: 0.340000003576

Väljundist on väga suur erinevus filtreermata ning filtreeritud väärtuste vahel, samuti eksisteerib väljund alati, isegi siis kui lähemalasetsevad objektid on kaugemal kui 1,5m nagu on dokumentatsiooni järgi suurim tuvastuskaugus. Katse lõpus arvutatud keskmine ning standardhälve ei oma selle katse kontekstis erilist tähendust kuna sonarid oli liikumises.

Stabiilsustestid

Tarkvara versioon: 1.8.11

Suunatud väga lähedalt vastu seina. 30 mõõtmist.

kasutaja@Huginn:~/Desktop$ python NAO_sonarTest.py 172.19.3.202 30
INF: Registering module : ALFileManager
INF: Registering module : ALNetwork
INF: Connection established between 172.19.3.102:54010 and 172.19.3.202:9559
left: 0.239999994636 right: 0.229999989271
left: 0.239999994636 right: 0.239999994636
left: 0.239999994636 right: 0.239999994636
...
left: 0.239999994636 right: 0.239999994636
left: 0.239999994636 right: 0.229999989271
left: 0.239999994636 right: 0.239999994636
Mean left: 0.239333327611
Mean right: 0.239333327611
Standard deviation left: 0.00249443959597
Standard deviation right: 0.00359011179731

Väljund näitab, et jõutud on minimaalse tuvastuskauguseni, kus kauguse täpne mõõtmine pole enam võimalik, kui takistuse olemasolu võib järeldada. Väljund väga stabiilne.

Suunatud ~30cm kauguselt vastu seina. 30 mõõtmist.

kasutaja@Huginn:~/Desktop$ python NAO_sonarTest.py 172.19.3.202 30
INF: Registering module : ALFileManager
INF: Registering module : ALNetwork
INF: Connection established between 172.19.3.102:54010 and 172.19.3.202:9559
left: 0.439999997616 right: 0.439999997616
left: 0.42999997735 right: 0.439999997616
left: 0.42999997735 right: 0.439999997616
left: 0.42999997735 right: 0.439999997616
...
left: 0.439999997616 right: 0.42999997735
left: 0.439999997616 right: 0.439999997616
left: 0.439999997616 right: 0.42999997735
left: 0.449999988079 right: 0.439999997616
left: 0.449999988079 right: 0.439999997616
Mean left: 0.438333324591
Mean right: 0.436999990543
Standard deviation left: 0.00582142222363
Standard deviation right: 0.00525991948363

Keskmistel mõõtmiskaugustel taaskord küllaltki stabiilne.

Suunatud vabasse ruumi. Takistused üle kahe meetri kaugusel. 30 mõõtmist.

kasutaja@Huginn:~/Desktop$ python NAO_sonarTest.py 172.19.3.202 30
INF: Registering module : ALFileManager
INF: Registering module : ALNetwork
INF: Connection established between 172.19.3.102:54010 and 172.19.3.202:9559
left: 1.63999998569 right: 1.62000000477
left: 1.63999998569 right: 1.62000000477
left: 1.63999998569 right: 1.62999999523
left: 1.62999999523 right: 1.40999996662
left: 1.64999997616 right: 1.26999998093
left: 1.64999997616 right: 1.78999996185
left: 1.64999997616 right: 1.55999994278
left: 1.64999997616 right: 1.63999998569
left: 1.65999996662 right: 1.65999996662
...
left: 1.64999997616 right: 1.81999993324
left: 1.64999997616 right: 1.83999991417
left: 1.65999996662 right: 1.86000001431
left: 1.84999990463 right: 1.87999999523
left: 1.66999995708 right: 1.84999990463
left: 1.65999996662 right: 1.87000000477
Mean left: 1.65466664235
Mean right: 1.67933330536
Standard deviation left: 0.0387928804152
Standard deviation right: 0.149620252664

Ei tohiks sellistel kaugustel takistusi tuvastada, kuid testi läbiviimiseks valitud ruumis võib olla tegimist kajaprobleemidega. Rahuldav väljundi stabiilsus.

Tarkvara versioon: 1.10.11 Keskkond: Vaba ruum, seinad vähenalt 2.5m kaugusel Asend: Sonarid suunatud lakke (selili)

Testprogramm:

#!/usr/bin/python

import sys
import time
import numpy
import matplotlib.pyplot as plt
from naoqi import ALProxy

def joonis(timestep, list1,list2,list3,list4):
    #joonise loomine
    fig = plt.figure()
    ax1 = fig.add_subplot(111)
    
    ax1.plot(timestep,list1, 'b',label="L",marker='+')
    ax1.plot(timestep,list2,'r',label="R",marker='+')

    ax1.plot(timestep,list3,'c', label="LF",marker='o')
    ax1.plot(timestep,list4,'m',label="RF",marker='o')
    
    ax1.set_xlabel('time (s)')
    ax1.set_ylabel('distance (cm)', color='g')
    for tl in ax1.get_yticklabels():
        tl.set_color('g')
    
    plt.legend()
    plt.show()

IP = sys.argv[1]
SAMPLES = sys.argv[2]
PORT = 9559

sonar=ALProxy("ALSonar", IP, PORT)
mem=ALProxy("ALMemory", IP, PORT)

sonar.subscribe("SonariTest", 500, 1.0)

leftValues=[]
rightValues=[]
leftValuesF=[]
rightValuesF=[]
timestep=[]

for i in range(0, int(SAMPLES)):
	time.sleep(1)
	left = mem.getData("Device/SubDeviceList/US/Left/Sensor/Value", 0)
	leftD = mem.getData("SonarLeftDetected")
	right = mem.getData("Device/SubDeviceList/US/Right/Sensor/Value", 0)
	rightD = mem.getData("SonarRightDetected")

	print "left:",left,"right:",right
	print "filter left:",leftD,"right:",rightD

	leftValues.append(float(left)*100)
	rightValues.append(float(right)*100)
	if(leftD == None):
		leftD=0
	if(rightD == None):
		rightD=0
	leftValuesF.append(float(leftD)*100)
	rightValuesF.append(float(rightD)*100)
	timestep.append(i)

print "Mean left:",numpy.mean(leftValues)
print "Mean right:",numpy.mean(rightValues)
print "Standard deviation left:", numpy.std(leftValues)
print "Standard deviation right:", numpy.std(rightValues)

joonis(timestep, leftValues,rightValues,leftValuesF,rightValuesF)

sonar.unsubscribe("SonariTest")

Väljund:

kasutaja@Huginn:~/Desktop$ python NAO_sonarTest_plot.py 172.19.2.79 50 left: 1.05999994278 right: 1.09000003338 filter left: 0.239999994636 right: 0.34999999404 left: 1.07999992371 right: 1.59999990463 filter left: 0.239999994636 right: 0.34999999404 left: 1.37000000477 right: 1.56999993324 filter left: 0.239999994636 right: 0.34999999404 left: 1.07999992371 right: 1.22000002861 filter left: 0.239999994636 right: 0.34999999404 left: 1.10000002384 right: 1.11000001431 filter left: 0.239999994636 right: 0.34999999404 ... left: 1.04999995232 right: 1.25999999046 filter left: 0.239999994636 right: 0.34999999404 Mean left: 126.299996376 Mean right: 125.379997134 Standard deviation left: 31.8472923989 Standard deviation right: 19.6243602903 INFO: Destroying broker 'ALProxyBroker'

Viimased arvutused on tehtud cm-tes.

Graafik: NAO sonar output.png

Mitmekordse kaja väärtused

NAO Sonar mõõdab kaugusi ka teistele kajadele peale esimese. Mällu salvestatakse 10 väärtust. Järgnev kood prindib ekraanile kõik kümme väärtust ning lisaks nenede põhjal arvutatud 'SonarLeftDetected' väärtuse.

Testprogramm:

import sys
import time
import numpy
from naoqi import ALProxy

IP = sys.argv[1]
SAMPLES = sys.argv[2]
PORT = 9559

sonar=ALProxy("ALSonar", IP, PORT)
mem=ALProxy("ALMemory", IP, PORT)

sonar.subscribe("SonariTest", 1000, 1.0)

time.sleep(10)

for i in range(0, int(SAMPLES)):
 	time.sleep(2)
	print "Iteration",i
	print mem.getData("Device/SubDeviceList/US/Left/Sensor/Value", 0)
	print mem.getData("Device/SubDeviceList/US/Left/Sensor/Value1", 0)
	print mem.getData("Device/SubDeviceList/US/Left/Sensor/Value2", 0)
	print mem.getData("Device/SubDeviceList/US/Left/Sensor/Value3", 0)
	print mem.getData("Device/SubDeviceList/US/Left/Sensor/Value4", 0)
	print mem.getData("Device/SubDeviceList/US/Left/Sensor/Value5", 0)
	print mem.getData("Device/SubDeviceList/US/Left/Sensor/Value6", 0)
	print mem.getData("Device/SubDeviceList/US/Left/Sensor/Value7", 0)
	print mem.getData("Device/SubDeviceList/US/Left/Sensor/Value8", 0)
	print mem.getData("Device/SubDeviceList/US/Left/Sensor/Value9", 0)
	print mem.getData("SonarLeftDetected")

sonar.unsubscribe("SonariTest")

Tarkvara versioon: 1.8.11

Iteration 0
0.909999966621
1.49000000954
1.7199999094
2.06999993324
2.54999995232
2.54999995232
2.54999995232
2.54999995232
2.54999995232
2.54999995232
0.239999994636
Iteration 1
0.899999976158
1.48000001907
2.0
2.54999995232
2.54999995232
2.54999995232
2.54999995232
2.54999995232
2.54999995232
2.54999995232
0.239999994636
...

Tarkvara versioon: 1.10.11

Versioonis 1.10.11 ei eksisteeri mälus enam väärtust "Device/SubDeviceList/US/Left/Sensor/Value", mida esindab väljundis nüüd "None".

Sonar suunatud vabasse ruumi:

Iteration 0
None
1.45999991894
1.87999999523
2.54999995232
2.54999995232
2.54999995232
2.54999995232
2.54999995232
2.54999995232
2.54999995232
0.269999980927
Iteration 1
None
1.44999992847
1.86000001431
2.22000002861
2.54999995232
2.54999995232
2.54999995232
2.54999995232
2.54999995232
2.54999995232
0.269999980927
...

Tulemustest järeldub, et kui takistused on liiga kaugel tagastab filtreeritud väärtus alati minimaalse mõõteväärtuse, kuigi mõõtetulemused on olemas. Väärtused suuremad kui 2.54 tähendavad suurima tõenäosusega, et niimitmendat kaja ei registreeritud piiratud aja vältel. Samas võib semantiliselt lugeda 'SonarLeftDetected' tulemuse korrektseks, sest nagu nimest järeldub peaks see väärtust esindama takistust, mille tuvastamine liiga kaugelt tekitab liigset andmemüra ning takistusega võib tegeleda kui see robotile reaalselt ette satub.

Sonar suunatud ligi poole meetri kauguselt vastu toa nurka:

Iteration 0
None
1.53999996185
2.03999996185
2.38999986649
2.54999995232
2.54999995232
2.54999995232
2.54999995232
2.54999995232
2.54999995232
0.5
Iteration 1
None
1.57999992371
2.54999995232
2.54999995232
2.54999995232
2.54999995232
2.54999995232
2.54999995232
2.54999995232
2.54999995232
0.5
...

Mingisugusel põhjusel on lähendalt mõõdetud väärtused filtris olemas, kuid ei ole sarnased erinevate kajade tulemustega, võimalik, et esimese väärtuse kadumine tähendab, et siin esitatakse andmed alates teisest saabunud kajast. Vajalik on testida "value0" olemasolu kui võimalikku asendust.