SonariProbleem
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:
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: [#Väljundite võrdlus tühjas ruumis | -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:
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: [#Väljundite võrdlus tühjas ruumis | -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:
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: [#Väljundite võrdlus tühjas ruumis | -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:
Tulemused: Graafik ei erine oluliselt sonareid ümbritseva plastikribata saadud tulemustest ning võib järeldada, et selle olemasolu ei mõjuta oluliselt väljundit.