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