SonariProbleem

From Intelligent Materials and Systems Lab

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.

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. Hiljem sooritatud testides ilmus esimene kaja väärtus tagasi ning pärast seda pole õnnestunud viga korrata, küllaga võib 'None' esineda filtreeritud väärtuste lugemisel ning kutsuv kood peaks selleks valmis olema ('None' on Pythonis ekvivalentne samaks otstarbeks kasutatava 'null' väärtusega).

Stabiilsustestid

Standardhälbe arvutamine

Tarkvara versioon: 1.8.11

Keskkond: Ruum, sein

Asend: Sonarid suunatud vastu seina (püstine, seisab)

Testprogramm: -link-

Tulemused on arvutatud meetrites.

Kirjeldus: 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

Tulemused: 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.


Kirjeldus: Suunatud väga lähedalt vastu seina. 30 mõõtmist.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

Tulemused: Keskmistel mõõtmiskaugustel taaskord küllaltki stabiilne.


Kirjeldus: 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

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

Väljundite võrdlus tühjas ruumis

Tarkvara versioon: 1.10.11

Keskkond: Vaba ruum, seinad vähemalt 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

Tulemused: Esineb väga tugev väljundi kõikumine (standardhälve 32 ja 20 cm) samas filtreeritud väärtused ei muutu. Graafik viitab, et vasaku ja parema sonari mõõdetud tulemused on omavahel teatavas korrellatsioonis.

Väljundite võrdlus erinevatel kaugustel (puitplaat)

Tarkvara versioon: 1.10.11

Keskkond: Tühi ruum, seinad vähemalt 2 m kaugusel

Asend: Sonarid suunatud lakke (selili)

Testprogramm: -link-

Kirjeldus: Puidust plaat mõõtmetega 55 cm x 77 cm liigutatud 30 cm kaupa sonaritele lähemale, numbrid graafiku ülemisel serval tähistavad plaadi kaugust (täpsus ligikaudu 10 cm). Esimesed mõõtmised > 150 cm tehtud ilma plaadita. Sonaritelt on eemaldatud nende avasid ümbritsev plastikriba.

Graafik:

NAO sonarTest plaat.png

Tulemused: Plaadi väikeste mõõtmete tõttu tuvastatakse see alles vahemaal alla 90 cm. Sellele eelnevatel kõrgustel püsivad vasaku sonari mõõtetulemused stabiiliselt 110 cm piirimail kui parem sonar annab võrdlemisi mürarikka väljundi, mida järgib teataval määral ka talle vastav filtri läbinud väärtus. Kuna mõõtetulemuste saamiseks liigutati plaati NAO ees, siis on võimalik, et lugemid tulevad ümbritsevast keskkonnast ehk antud juhul plaadi hoidja jalgadest. Lisakaja võib põhjustada ka 60 cm alas nähtava filtrite ja töötlemata tulemuste vahelise erinevuse kuna esimene kasutab arvutustes kuni üheksat mõõdetud kaja. Graafikust võib paremal juhul järeldada seda, et sonarid sobivad seinast väiksemate takistuste tuvastamiseks vahemaal alla 50 cm, kus väljund on väiksemas sõltuvuses muust ümbritsevast. Samuti on selles piirkonnas parema ja vasaku sonari tulemused omavahel küllaltki heas lähenduses.

Väljundite võrdlus erinevatel kaugustel (sein)

Tarkvara versioon: 1.10.11

Keskkond: Tühi ruum, sein

Asend: Sonarid suunatud seina poole (püstine, seisab)

Testprogramm: -link-

Kirjeldus: Liigutatud 30 cm kaupa seinale lähemale, numbrid graafiku ülemisel serval tähistavad seina kaugust (täpsus ligikaudu 5 cm). Sonaritelt on eemaldatud nende avasid ümbritsev plastikriba.

Graafik:

NAO sonarTest sein1.png

Tulemused: Taaskord annab vasak sonar vähem mürarikkaid tulemusi kui parem, kuigi võib öelda, et sein on tuvastatav kõikidel mõõdetud kaugustel. Filtrid LeftObstacleDetected ja RightObstacleDetected hakkavad reaalsuse lähedasi tulemusi andma alles 60 cm piirimail. Sellele eelnev võib aga tekitada probleeme kuna pole kindel, kas tulemus 60 cm tähendab objekti või tuvastuskaugusest väljumist, eelnevad katsed näitavad filtreeritud väärtuste küllaltki juhuslikku asetust suurematel kaugustel ning sellega tuleks kasutamisel arvesta. Viimane annab ka seletuse, miks 'Endless walk' demoprogrammis kasutatavad filtreeritud sonari mõõtetulemused polnud ootuspärased ning tekitasid vaatlusel olematute takistuste tuvastamise vigu. 10 cm on alla sonari kasutamise piiri ning seal saadud lugemid annavad minimaalse võimaliku väljundi.

Väljundite võrdlus erinevatel kaugustel (sein, sonaritel kattev plastikriba)

Tarkvara versioon: 1.10.11

Keskkond: Tühi ruum, sein

Asend: Sonarid suunatud seina poole (püstine, seisab)

Testprogramm: -link-

Kirjeldus: Liigutatud 30 cm kaupa seinale lähemale, numbrid graafiku ülemisel serval tähistavad seina kaugust (täpsus ligikaudu 5 cm). Koos sonari avasi ümbritseva ornamentaalse plastikribaga.

Graafik:

NAO sonarTest sein2.png

Tulemused: Graafik ei erine oluliselt sonareid ümbritseva plastikribata saadud tulemustest ning võib järeldada, et selle olemasolu ei mõjuta oluliselt väljundit.