UNIVERSITÀ DEGLI STUDI DI PADOVA DIPARTIMENTO DI INGEGNERIA DELL’INFORMAZIONE CORSO DI LAUREA IN INGEGNERIA DELL’ AUTOMAZIONE ANNO ACCADEMICO 2007/2008 Calibrazione di sensori distribuiti tramite algoritmi di consensus Relatore: Ch.mo prof. LUCA SCHENATO Laureando: Simone Cieno Padova, 14 Dicembre 2007 “Credo fermamente che l’ora piú bella per ogni uomo... la completa realizzazione di tutto quello che gli sta piú a cuore... sia quel momento in cui, avendo dato l’anima per una buona causa, egli giace esausto sul campo di battaglia... vittorioso.” Vince Lombardi (1913, 1970) Alla mia famiglia Indice Abstract 1 Introduzione 3 1 Reti di sensori wireless 1.1 Le reti di sensori . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Architettura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 ZigBee e lo standard IEEE 802.15.4 . . . . . . . . . . . . . . . . . 7 7 7 9 2 Analisi apparato 2.1 TMOTE SKY . . . . . . . 2.1.1 Energia . . . . . . 2.1.2 Microprocessore . . 2.1.3 Radio . . . . . . . 2.1.4 Antenna . . . . . . 2.1.5 Sensori . . . . . . . 2.1.6 Memoria Flash . . 2.1.7 Connettori . . . . . 2.2 Software . . . . . . . . . . 2.2.1 TinyOS . . . . . . 2.2.2 Il linguaggio NesC . . . . . . . . . . . 11 11 11 11 13 13 14 14 15 15 16 17 . . . . . . 19 19 20 21 21 24 28 4 Algoritmo sviluppato 4.1 Algoritmi di consensus . . . . . . . . . . . . . . . . . . . . . . . . 4.2 Il consenso nel dettaglio . . . . . . . . . . . . . . . . . . . . . . . 4.3 Sviluppo del software . . . . . . . . . . . . . . . . . . . . . . . . . 29 29 29 32 . . . . . . . . . . . 3 Studio del problema 3.1 RSSI & RSS . . . . . . . . . 3.2 Scopo del progetto . . . . . 3.3 Analisi preventiva della rete 3.3.1 Esperimento I . . . . 3.3.2 Esperimento II . . . 3.3.3 Brevi cosiderazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ii INDICE 5 Analisi dei dati 5.1 Risultati ottenuti . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2 Il problema dei cicli . . . . . . . . . . . . . . . . . . . . . . . . . 33 34 40 6 Conclusioni e studi futuri 43 A Algoritmo di analisi della connessione A.1 Config.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A.2 BaseStationC.nc . . . . . . . . . . . . . . . . . . . . . . . . . . . . A.3 PeerC.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 45 47 50 B Algoritmo di consenso B.1 consenso.m . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 59 Bibliografia 65 Elenco delle figure 67 Elenco delle tabelle 68 Ringraziamenti 71 Abstract Nella tesi verrà discusso ed analizzato il problema della calibrazione di un parametro molto importante di ciascun nodo di una wireless sensors network (WSN). Tale parametro, che corrisponde al nome di RSSI (Received Signal Strength Indicator), non è altro che un indice di bontà del segnale radio spedito dal singolo sensore e ricevuto dai suoi vicini, ossia dagli altri con cui esso comunica. Da cosa dipenda e come esso venga elaborato verrà esposto più avanti nella tesi, per ora ci si limita a soffermarsi sulla sua estrema importanza in quanto viene spesso utilizzato nella costruzione di algoritmi complessi per reti di sensori wireless quali localizzazione e tracking in real time. Il problema che si andrà a sottolineare riguarderà la presenza di un certo offset di misura dell’RSSI che viene ad istaurarsi tra due sensori che comunicano reciprocamente. Inoltre verrà esposto un software da implementare sulla rete di sensori in grado di ottenere miglioramenti alquanto significativi nelle trasmissioni del parametro in questione, software ottenuto attraverso l’utilizzo di un semplice schema iterativo distribuito basato su una speciale classe di algoritmi per WSN chiamata algoritmi di consensus. Nell’elaborazione dei dati si noterà come questo tipo di algoritmo, nonostante sia per nulla complesso, risulterà ridurre nettamente il problema esposto senza alterare alcuna variabile interna propria dell’hardware, ma solo costruendone una nuova indipendente che potrà essere utilizzata dall’operatore (o comunque da un programma più globale) per compensare l’offset dell’RSSI istante per istante. Introduzione Le Wireless Sensor Network sono, letteralmente, reti di sensori senza fili: in realtà il sensore è solo una parte dell’intero sistema che costituisce la WSN, mentre c’è tutto un insieme di hardware e software dedicato affinchè le misure rilevate dal sensore siano scambiate tramite comunicazione radio e messe a disposizione dell’utente. L’idea di avere un qualcosa che possa monitorare dei parametri ambientali e che sia capace di integrarsi nell’ambiente in cui si trova nasce nei laboratori della NASA verso la fine del XXI secolo: l’ambiziosa intuizione iniziale prevedeva addirittura di realizzare della smart dust, polvere intelligente, per l’appunto, ossia un insieme di piccolissimi elementi in grado di configurarsi e comunicare fra loro costruendo una rete di comunicazione. Nella realtà non si è poi dato seguito a questo progetto, ma è nato un nuovo filone di ricerca, quale quello delle reti di sensori wireless. Dopo anni di studi, oggi abbiamo sul mercato numerosi tipi di hardware su cui è alloggiata una parte di controllo, una di comunicazione e una di sensori che permettono di costruire una rete di sensori, capaci di essere dislocati su aree abbastanza vaste e in grado di comunicare tra loro tramite dei protocolli di comunicazione sviluppati ad hoc per tali sistemi. In questi ultimi tempi le reti di sensori wireless di tipo distribuito, ovvero il processo dei segnali avviene distribuito tra i sensori stessi, stanno sempre più incrementando la loro popolarità per il grandissimo numero di applicazioni possibili nelle discipline scientifiche più diverse. Tali applicazioni possono essere raggruppate come prima analisi in tre grandi categorie: • Monitoring: tipo di rete utilizzato per tener traccia con continuità di grandezze relative ad una particolare area geografica (monitoraggio ambientale dell’acqua, dell’aria, chimica del suolo, monitoraggio di possibili incendi in zone boschive e rischio ecc...) • Tracking & Localization: vengono sfruttate le capacità di riorganizzazione della topologia della rete di sensori per identificare gli spostamenti di un oggetto in una determinata area geografica (ad esempio in campo militare, in quello edile nelle zone di cantiere a rischio, negli ospedali per migliorare il controllo sulla degenza dei pazienti, ecc...) • Controlling: tipo di rete finalizzato a riconoscere determinati eventi relativi alle misure rilevate da sensori o gruppi di sensori (nei campi dell’agri- 4 INDICE coltura di precisione, strumentazioni di fabbrica, videosorveglianza wireless, ecc..) Figura 1: Esempio di WSN per monitorare possibili incendi Le capacità e le qualità delle trasmissioni tra i sensori di una rete wireless sono però fortemente vincolate alle condizioni degli ambienti in cui sono costruite. Infatti tali ambienti nella maggior parte dei casi non possono essere considerati statici in quanto in essi sono presenti ad esempio ostacoli (muri, mobili, persone...) e campi magnetici variabili (cellulari, apparacchiature hi-fi, dispositivi bluetooth...) che interferiscono con i segnali trasmessi dai singoli nodi. In particolare i fattori che condizionano in modo significativo la qualità delle trasmissioni sono: • distanza tra un nodo e l’altro • ostacoli presenti • potenza di trasmissione • disturbi elettromagnetici • alimentazione fornita • diversità costruttive dell’hardware • variazioni climatiche • ... Le radio dei sensori in questione possono fornire alcuni parametri quali ad esempio l’LQI (Link Quality Indicator) e l’RSSI (Received Signal Strength Indicator) che acquistano una notevole importanza qual’ora vengano utilizzati come indici di INDICE 5 grandezze in algoritmi complessi per WSN. L’RSSI ad esempio varia in funzione della distanza e quindi può diventare un ottimo alleato nei campi del tracking e della localizzazione, dove sono proprio le distanze, fisse o variabili, fra i nodi a farla da padrone. Tali parametri, purtroppo, essendo direttamente correlati alla qualità della trasmissione, sono soggetti, per i motivi sopracitati, a variazioni e codizionamenti esterni indesiderati che in molte occasioni li rendono inaffidabili. E’ evidente quindi la necessità di studiare un modo per calibrare questi indici istante per istante, fra un nodo e l’altro di una SWN, cercando di escludere le variazioni a cui sono soggetti per interazioni esterne ed avvicinarsi sempre più ad un valore esatto privo di disturbi che possa essere utilizzato senza restrizioni da algoritmi più globali. Nella tesi sviluppata si prospetta per l’appunto di identificare e studiare le alterazioni indesiderate del parametro RSSI in una rete di sensori e creare quindi un algoritmo di calibrazione dei singoli nodi in modo tale da minimizzarne gli errori e migliorarne la stima del valore reale. A tal proposito si propone l’utilizzo di un semplice schema iterativo distribuito basato su un algoritmo di consensus la cui esaustiva descrizione è rimandata al capitolo n◦ 4. Capitolo 1 Reti di sensori wireless 1.1 Le reti di sensori Una Wireless Sensor Network è costituita da un insieme di elementi, definiti nodi (o mote), che rispettano certe caratteristiche, come quelle di energy saving, auto configurabilità, data processing, comunicazione wireless, che hanno per lo più il compito di monitorare determinati parametri ambientali, tramite dei sensori appositi alloggiati su di essi. Ogni nodo può interagire con gli altri nodi, secondo il protocollo di comunicazione adottato, in modalità flat o gerarchica. L’uso del wireless è soprattutto una necessità, molto spesso infatti la zona da monitorare non possiede infrastrutture per l’energia o per le comunicazioni, dunque risulta necessario l’uso di nodi senza cavi con sorgente di energia piccola e finita. Proprio la limitata disponibilità di energia costituirà il principale limite col quale ci si deve scontrare, ed è questo il limite che porta alla scelta di realizzare una rete il più possibile distribuita anzichè centralizzata. La potenza del segnale radio diminuisce con la distanza alla quarta potenza a causa delle riflessioni sul terreno di un’antenna di piccole dimensioni; risulta quindi conveniente processare i segnali direttamente nei nodi per ridurre il più possibile la quantità di bit trasmessi. 1.2 Architettura In generale, per le reti è possibile fare una grossolana distinzione che si basa tanto sulla distanza coperta quanto sulla topologia. Nel primo caso si distinguono BAN (Body Area Network), PAN (personal Area Network), LAN (Local AN), MAN (Metropolitan AN) e WAN (Wide AN), secondo quanto schematizzato in Figura 1.1. Particolarmente significative per le applicazioni sensoristiche sono proprio le prime due. Per quanto riguarda la topologia di rete, invece, si possono grosso modo individuare tre soluzioni differenti. La prima, più semplice dal punto di vista implementativo, è denominata topologia a stella: un nodo assume un ruolo particolare, 8 Cap. 1. Reti di sensori wireless Figura 1.1: Classificazione delle reti in funzione dell’area coperta tipicamente viene denominato coordinatore della rete, e tutti i rimanenti nodi fanno riferimento ad esso. In altre parole si implementa una struttura master-slave nella quale il coordinatore è l’unico dispositivo ad effettuare più di un collegamento verso gli altri nodi; inoltre, in genere funge anche da bridge verso altri sistemi di connessione. Figura 1.2: Classificazione delle topologie di rete Tale soluzione è superata dalla topologia Peer to Peer, detta anche topologia Mesh, nella quale il ruolo del coordinatore non è strettamente necessario, in quanto ogni dispositivo è in grado di connettersi a tutti gli altri: in questo modo è possibile realizzare percorsi ridondanti, che aumentano l’affidabilità complessiva a discapito di un protocollo di gestione più complesso. Le reti mesh sono particolar- 1.3 ZigBee e lo standard IEEE 802.15.4 9 mente adatte per comunicazioni casuali tra gli interlocutori, mentre la topologia a stella rappresenta la soluzione più efficiente per le comunicazioni organizzate secondo una scansione ciclica. Infine, è possibile immaginare una struttura di tipo gerarchico o ad albero, ottenuta interconnettendo ammassi (clusters) differenti di nodi come i rami e le foglie di un albero. Ciascun cluster ha un nodo privilegiato che costituisce il punto d’accesso alla sottorete. Il vantaggio di questo approccio è di ridurre il numero di collegamenti possibili (e quindi semplificare la loro gestione) rispetto ad una rete Peer to Peer completamente connessa. Una schematizzazione di questi concetti è mostrata in Figura 1.2. 1.3 ZigBee e lo standard IEEE 802.15.4 ZigBee è un protocollo per reti wireless specificatamente progettato per reti di controllo e sensori a bassa velocità di dati. Ci sono un gran numero di applicazioni che possono beneficiare del protocollo ZigBee: reti di automazione industriale, sistemi di sicurezza per casa, misurazione remota e periferiche per PC. Confrontato con gli altri protocolli wireless (WiFi, BlueThooth,...) lo ZigBee offre bassa complessità, richiede risorse ridotte e, più importante, ha un set standard di specificazioni. Inoltre offre tre bande di frequenza di lavoro assieme ad un certo numero di configurazioni di rete e opzioni di sicurezza. Lo ZigBee è basato sulle specifiche definite dallo standard IEEE 802.15.4 che fornisce una metodologia standard per funzioni, incluse la formazione della rete, i formati dei messaggi e la ricerca dei dispositivi nella rete. Lo ZigBee utilizza il MAC (Medium Access Layer) e il PHY (Physical Layer) del IEEE 802.15.4. Lo IEEE 802.15.4 definisce tre bande di frequenze operative ognuna con un numero fissato di canali. Le bande di frequenza sono: 2.4 GHz con 16 canali (11-26), 915 MHz con 10 canali (1- 10) e 868 MHz con un solo un canale (canale 0). La velocità di trasmissione dati (bit rate) dipende dalla frequenza in cui si opera. La banda sui 2,4GHz ha un bit rate di 250kbps, la banda sui 915MHz di 40kbps mentre la 868MHz di 20kbps. Il valore reale del bit rate utilizzato sarà minore di quello specificato per il sovraccarico dei pacchetti e i ritardi di elaborazione. La lunghezza massima di un pacchetto IEEE 802.15.4 MAC è di 127 byte comprensivo di un CRC a 16 bit che controlla la integrità del frame. In più, il protocollo IEEE 802.15.4 usa opzionalmente un meccanismo di Acknowledge per il trasferimento dei dati. Con questo metodo, tutti i frames con un speciale flag ACK settato sono Acknowledged dal loro ricevitore. Questo assicura che un frame è realmente arrivato. Se il frame è trasmesso con il flag ACK settato e l’Acknowledgement non è ricevuto all’interno di un certo tempo, il trasmettitore riproverà a trasmettere per un numero di volte fissato prima di dichiarare un errore. E’ importante notare che la ricezione di un ACK semplicemente indica che un frame è stato ricevuto dal MAC del ricevitore, ma non indica che il frame è stato processato correttamente. E’ possibile che il MAC del nodo ricevitore riceva e dia 10 Cap. 1. Reti di sensori wireless l’ ACK correttamente ma data la scarsezza di risorse un frame potrebbe essere scartato da altre patri del nodo che possono richiedere un ulteriore frame. Capitolo 2 Analisi apparato 2.1 TMOTE SKY I mote utilizzati nell’elaborato, a cui si farà riferimento nel testo, sono i Telos revision B, detti anche Tmote Sky, prodotti dalla MoteIv Corporation [4]. Sono nodi wireless a bassissima potenza, in grado di fornire un’ampia copertura delle applicazioni tipiche delle reti di sensori wireless, dal momento che usano standard industriali ed integrano sensori di umidità, temperatura e luce. Di seguito vengono elencate le caratteristiche principali che fanno del Tmote Sky una delle più moderne piattaforme wireless. 2.1.1 Energia Il Tmote Sky è alimentato con due batterie del tipo AA. Le celle di tipo AA possono essere usate in un range operativo da 2,1 a 3,6 V DC, comunque la tensione deve essere di almeno 2,7 V quando si programmano le memorie flash esterne o del microprocessore. Se il nodo è connesso tramite la porta USB per essere programmato o per trasmettere, le batterie non sono necessarie perchè riceverà energia dal computer stesso operando ad una tensione di 3 V. 2.1.2 Microprocessore Le operazioni a bassa energia del telos sono dovute alla peculiarità di bassissima energia richiesta dal microcontrollore MSP430 della Texas Instruments [6], caratterizzato da 10kB di RAM, 48kB di memoria flash e 128B di memoria per le informazioni. Il processore RISC a 16 bit ha un consumo di corrente attivo e a riposo che permette al telos di lavorare per anni con una coppia di batterie AA. Il MSP430 ha un oscillatore interno digitalmente controllato (DCO) che può operare fino a 8MHz. Il DCO può essere acceso dallo stato di sleep in 6 µs. Oltre al DCO, l’MSP430 ha 8 porte esterne ADC (analog to digital converter) e 8 porte interne ADC. Queste ultime possono essere usate per la temperatura interna o per monitorare la tensione delle batterie. Sono inoltre disponibili una 12 Cap. 2. Analisi apparato Figura 2.1: le due faccie del Tmote-Sky 2.1 TMOTE SKY 13 varietà di periferiche incluso l’SPI (Serial Peripheral Interface), lo UART (Universal Asynchronous Receiver Transmitter), digital I/O ports, Watchdog timer, e altri che catturano e comparano le funzionalità. Il microcontrollore include anche un modulo DAC (digital to analog converter) a due porte a 12bit, un Supply Voltage Supervisor e un controllore DMA (Direct Memory Access) a tre porte. 2.1.3 Radio Il Tmote Sky è equipaggiato con il chip radio Chipcon CC2420 [5] per le comunicazioni wireless. Il CC2420 rispetta lo standard radio IEEE 802.15.4 e fornisce il PHY (Phisical Layer) e alcune funzioni MAC (Medium Access Control). Fornisce una comunicazione wireless affidabile grazie alla sua sensibilità e alla sua possibilità di operare a bassa energia. Il CC2420 è altamente configurabile per molte applicazioni poichè è provvisto di default di settaggi conformi allo standard sopracitato. Il chip radio è controllato dalla cpu attraverso la porta SPI e si possono impostare vari parametri per la trasmissione, come il canale radio e la potenza del segnale in uscita. Per quanto riguarda la potenza di trasmissione sono disponibili otto livelli come riportato in Tabella 2.1. Il dispositivo inoltre Livello di potenza 31 27 23 19 15 11 7 3 Potenza in uscita (dBm) 0 -1 -3 -5 -7 -10 -15 -25 Consumo corrente (mA) 17.4 16.5 15.2 13.9 12.5 11.2 9.9 8.5 Tabella 2.1: Potenza della radio fornisce i due valori di RSSI e LQI per ogni pacchetto ricevuto. E’ importante tenere in considerazione i livelli minimi di tensione e temperatura che permettono il funzionamento della radio: la radio funziona con una tensione di alimentazione minima di 2,1 V e a temperature ambientali comprese tra i -40 e +85 ◦ C. 2.1.4 Antenna Il Tmote Sky ha un’antenna a microstriscia a forma di F-invertita al margine della scheda di supporto, lontano dall’alloggiamento delle batterie (Figura 2.2). L’antenna è un dipolo dove la parte alta è piegata per essere parallela al piano della terra. Anche se non ha un pattern di radiazione omnidirezionale può raggiungere un copertura di circa 25 metri in ambiente indoor e di oltre 125 metri all’aperto. 14 Cap. 2. Analisi apparato Figura 2.2: Antenna a microstriscia E’ comunque prevista la possibilità di montare un’antenna esterna. 2.1.5 Sensori Il Telos è dotato di un sensore di temperatura e umidità prodotto dalla Sensirion AG [7].Il sensore è calibrato e produce un’uscita digitale; i dati poi vengono immagazzinati nella EEPROM del sensore.Quest’ultimo è realizzato con tecnologia CMOS ed è dotato di un convertitore A/D a 14bit. Il Tmote Sky ha inoltre integrati due fotodiodi per il rilevamento dell’intensità luminosa prodotti dalla Hamamatsu Corporation [8]. L’S1087 misura il PAR (Photosynthetically Active Radiation), mentre l’S1087-01 cattura dati relativi al TSR (Toltal Solar Radiation) per monitorare l’intero spettro del visibile e in più l’infrarosso. 2.1.6 Memoria Flash La memoria flash è un chip (M25P80) che fornisce 1MB di memoria per memorizzare i dati. Lo spazio è suddiviso in 16 segmenti da 64 KB ciascuno ed è connessa alla cpu mediante bus SPI. Radio e flash usano lo stesso bus per comunicare con il microprocessore e questo crea la necessità di dover gestire la condivisione della risorsa. Anche per la memoria flash è importante considerare che il livello minimo di alimentazione che ne consente la lettura, la scrittura e la cancellazione è di 2,7 V. 2.2 Software 2.1.7 15 Connettori Il Tmote Sky è provvisto di due connettori per l’espansione (6 e 10 pin) e di alcuni jumper che possono essere configurati per collegare dispositivi esterni come sensori analogici, display LCD e altre periferiche digitali. Per le comunicazioni mote-pc, per caricare il software o per un’eventuale alimentazione di rete, il mote è provvisto di un controller usb 2.0. Basta collegare il dispositivo al pc ed esso viene immediatamente identificato da qualunque sistema operativo. Figura 2.3: Schema a blocchi del Tmote Sky 2.2 Software Oltre all’hardware, i nodi wireless devono ospitare il software necessario a gestire le comunicazione tra di loro e a realizzare i servizi più avanzati. Sfortunatamente le peculiarità delle reti di sesnsori e le caratteristiche dei mote stessi rendono difficilmente riutilizzabile il software disponibile in commercio e richiedono lo sviluppo di soluzioni progettate appositamente per la piattaforma utilizzata e 16 Cap. 2. Analisi apparato per la specifica applicazione. Questa argomentazione vale anche per il sistema operativo, a cui è richiesto di soddisfare i seguenti requisiti: • ridottissima occupazione di memoria • basso consumo di energia durante l’esecuzione dei processi • consumo quasi nullo durante lo stato di inattività (sleep mode) • gestione della concorrenza (accesso simultaneo di più thread alla stessa risorsa) • supporto efficiente (in termini di consumo energetico) ai protocolli di rete • facile accesso alle funzionalità di basso livello della piattaforma per mezzo di interfacce esterne. Sulla base di queste considerazioni generali, nell’Università della California di Berkeley, è stato sviluppato il TinyOS [9], un sistema operativo appositamente progettato per reti di sensori wireless e caratterizzato da: 1. un kernel ridotto che permette l’accesso all’hardware 2. meccanismi di gestione del processore che non prevedono cambi di contesto 3. una memoria considerata come un unico e lineare spazio fisico. 2.2.1 TinyOS La caratteristica fondamentale della visione del sistema in chiave TinyOS è la possibilità di gestire ogni elemento del programma (file, moduli di gestione hardware, etc.) come un modulo a sè stante, e collegabile con tutti gli altri tramite delle connessioni, del tutto simili a delle ipotetiche linee elettriche. In questo modo un programma che gestisca un nodo wireless, per quanto complesso e articolato, è facilmente gestibile come insieme di tanti sotto/file che possono interagire tra loro con estrema semplicità. Oltre a rendere molto più leggibile un programma, questa tecnica ha l’enorme vantaggio di consentire il riutilizzo di una parte di esso in un qualsiasi altro programma, una volta introdotto il modulo corrispondente. In TinyOS per modulo si intende una unità fondamentale, che rappresenta una parte di codice, in grado di interfacciarsi con altri moduli, di diversi livelli: -un moduloA si definisce di livello superiore rispetto ad un moduloB se il moduloA comanda o usa il moduloB; -un moduloB si definisce di livello inferiore rispetto ad un moduloA se il moduloB è usato dal moduloA e fornisce delle interfacce per ricevere i comandi. Sostanzialmente un modulo è un file, preposto alla implementazione di una singola parte dell’algoritmo di gestione se il modulo è di alto livello, o dell’hardware se il modulo è di basso livello. TinyOS è totalmente implementato in un nuovo linguaggio di programmazione, il NesC, per meglio soddisfare i requisiti stringenti che caratterizzano questo sistema operativo. 2.2 Software 2.2.2 17 Il linguaggio NesC NesC [10] è un’estensione del linguaggio di programmazione C, progettato per incorporare i concetti strutturali e i modelli di esecuzione di TinyOS. I concetti base su cui erige NesC sono i seguenti: • Separazione della costruzione e della composozione: i programmi sono fatti di componenti, che insieme formano (tramite il wiring) l’intero programma. I componenti definiscono due campi, il primo per la loro specificazione (contengono i nomi delle loro istanze di interfacce) e il secondo per la loro implementazione. I componenti sono soggetti a concorrenza interne sotto forma di tasks. • Specifica del comportamento dei componenti in termini di set di interfacce. Le interfacce possono essere fornite o usate da un componente. • Le interfacce sono bidirezionali: individuano un set di funzioni che devono essere implementate da chi fornisce l’interfaccia (comandi ), e un’altro set di funzioni che deve essere implementato da chi usa le interfacce (eventi ). • I componenti sono staticamente connessi tra di loro attraverso le loro interfacce. Questo aumenta l’efficienza del tempo di esecuzione, incoraggia una progettazione più robusta e permette un’analisi statica migliore dei programmi. • Il modello di concorrenza del NesC è basato su run-to-completation tasks (esecuzione fino al completamento) e su una gestione degli interrupts che può interrompere i tasks e viceversa. Capitolo 3 Studio del problema Prima di proseguire nella spiegazione del tipo di algoritmo a cui fa riferimento il titolo della tesi è d’obbligo analizzare ed esporre in modo dettagliato il problema principale che ha richiesto la realizzazione del presente elaborato. Del resto è risaputo che per risolvere un quesito, qualunque esso sia, è necessario innanzitutto capire in modo preciso ciò che viene richiesto, e solo a quel punto si può passare alla risoluzione dello stesso. Ciò che ci si propone in questo capitolo è proprio l’esposizione chiara e minuziosa del problema in questione, attraverso l’illustrazione di concetti teorici e l’analisi di vari esperimenti eseguiti su una semplicissima WSN. 3.1 RSSI & RSS Il chip radio CC2420 [5] presente sul Tmote Sky, come già accennato nel capitolo 2, è in grado di fornire, fra diversi indici, anche il valore di RSSI, Received Signal Strength Indicator, che significa letteralmente Indicatore di Forza del Segnale Ricevuto. L’RSSI è un numero che la radio ci fornisce in un registro di 8 bit in complemento a 2 (RSSI.RSSI VAL) che è legato alla potenza del campo elettromagnetico (RF level) ossia alla forza del segnale ascoltato, da cui il nome RSS. L’RSS può essere ricavato direttamente dal valore del registro RSSI.RSSI VAL mediante l’utilizzo della seguente equazione: PRF = RSS = RSSI V AL + RSSI OF F SET [dBm] (3.1) dove RSSI OFFSET è un valore, trovato empiricamente durante lo sviluppo del sistema radio e dato quindi dal costruttore, di circa -45 dBm. L’andamento generale dell’RSSI VAL in funzione della potenza del segnale ricevuto è riportato in figura 3.1. Il valore di RSSI nel registro RSSI.RSSI VAL viene continuamente calcolato ed aggiornato dal chip radio ad ogni arrivo di un nuovo pacchetto di dati. 20 Cap. 3. Studio del problema Figura 3.1: Andamento RSSI rispetto alla potenza del campo elettromegnetico 3.2 Scopo del progetto Il valore di RSSI, come già accennato nelle sezioni precedenti, diventa molto importante negli algoritmi di localizzazione [11] qualora venga utilizzato per stimare la distanza di due nodi di una WSN. Tale distanza è infatti calcolabile, a partire dal valore della potenza ricevuta (RSS), attraverso la seguente formula: γ d = e 2 10 A−PT X 10np ; γ=( σ ln 10 2 ) 10np (3.2) dove PT X è la potenza di trasmissione del segnale ricevuto (RSS per l’appunto), σ è le deviazione media standard dell’errore della potenza del campo elettromagnetico, A e np due parametri che dipendono rispettivamente solo dai nodi e dall’ambiente in cui avviene la localizzazione. Risolvendo l’equazione rispetto a PT X , ossia rispetto al valore di RSS, si può facilmente ricavare la seguente: PT X = RSS = A − 10np log( d γ ) e2 (3.3) da cui si evince che: RSSI = f (d) (3.4) ossia che il valore di RSSI di un nodo ricevente rispetto ad un altro nodo mittente dovrebbe essere una certa funzione (logaritmica) della distanza fra i due. Da questo presupposto è logico dedurre che due mote in posizione statica, all’interno di un ambiente omogeneo, in grado di comunicare tra loro scambiandosi reciprocamente informazioni, e che trasmettono con uguale livello di potenza nominale (in poche parole due mote fisicamente identici nelle stesse condizioni), in linea puramente teorica dovrebbero misurare lo stesso valore di RSSI. 3.3 Analisi preventiva della rete 21 In realtà dagli esperimenti svolti durante il periodo di tesi, presso il Laboratorio Visione Computazionale e Navigazione Autonoma 2 nella sede DEI/A del Dipartimento di Ing. dell’Informazione dell’Università degli Studi di Padova, e riportati in sezione 3.3, si può affermare che presi due nodi i, j, il valore di RSSI fornito dal nodo i in ricezione del segnale proveniente da j (RSSIi←j ) si discosta di una certa quantità da quello misurato da j in ricezione del segnale proveniente da i (RSSIj←i ), ossia che: RSSIi←j 6= RSSIj←i (3.5) poichè RSSIi←j = RSSIj←i + oi,j e RSSIj←i = RSSIi←j + oj,i (3.6) dove ovviamente oi,j = −oj,i . Quanto detto finora implica che l’RSSI misurato da ciascun nodo di una rete wireless rispetto al segnale speditogli da un suo nodo vicino è sı̀ una certa funzione della distanza fra i due, ma a cui va a sommarsi un determinato offset e quindi: RSSIi←j = f (di,j ) + oi,j (3.7) Il fine ultimo di questo elaborato è l’implementazione di un algoritmo in grado di stimare istante per istante l’offset in questione e di compensarlo con un determinato schema di calibrazione in modo tale da avere un valore pulito di RSS da utilizzare ad esempio nella localizzazione per raffinare la stima delle distanze. 3.3 Analisi preventiva della rete In questa sezione vengono illustrati due tipi di esperimento finalizzati alla pura analisi che sono stati eseguiti su una rete di sensori minima, ossia una WSN formata da due soli nodi comunicanti fra loro. In realtà i motes utilizzati sono stati tre, ma uno di essi ha avuto solo la funzione di base-station ed è servito da supervisore per scandire i tempi di trasmissione e ricezione degli altri due. Per la spiegazione dettagliata del programma utilizzato e del rispettivo codice si rimanda a [2]. Per adesso basti sapere che i due nodi in questione si sono scambiati a rotazione, ed hanno memorizzato in flash, un certo numero di pacchetti contenenti dei dati, tra cui il valore di RSSI fornito dal chip radio. Lo scambio di informazioni tra i sensori in entrambe le esperienze è stato svolto in tempi abbastanza ristretti, entro i 10 minuti, in modo tale da poter ritenere statiche le condizioni ambientali del laboratorio, almeno con un margine di errore accettabile. 3.3.1 Esperimento I Il primo degli esperimenti svolti ha avuto come scopo l’analisi dell’offset relativo al valore di RSSI che si instaura fra due nodi comunicanti di una WSN dovuto solo all’hardware utilizzato. 22 Cap. 3. Studio del problema Due motes i e j sono stati posti ad una distanza fissa pari a 7 m e dopo un certo periodo di tempo (circa 7 minuti) durante il quale hanno potuto comunicare fra loro e memorizzare i dati nelle rispettive memorie, attraverso un programma di lettura appositamente progettato (preso da [2], modificato ed adattato) si sono recuperati dalle flash i valori di RSSI di entrambi i sensori, ossia RSSIi←j e RSSIj←i . Successivamente si è ripetuta la procedura mantenendo il nodo i sempre uguale in termini di hardware, ma cambiando fisicamente il nodo j, questo per 40 volte consecutive. In laboratorio sono disponibili più di un centinaio di motes, ma esegurire l’esperimento con tutti sarebbe stato troppo dispendioso in termine di tempo e comunque ripetitivo nei dati. Figura 3.2: Raffigurazione stilizzata esperimento I In ogni prova sono stati trasmessi pacchetti con tutti gli otto livelli di potenza diponibili. Per ogni livello di potenza si sono graficati in seguito i valori medi e le rispettive varianze (in valore assoluto) dei valori di offset di RSSI misurati dai nodi variabili rispetto al valore medio di RSSI del nodo fisso che nel nostro caso era il NAV00000. Nelle figure 3.3 e 3.4 vengono riportati i valori di ∆RSSI (dBm) rispettivamente della prima e seconda metà dei motes in esame con potenza di trasmissione PA LEVEL pari a 23, mentre nelle due figure successive si leggono i risultati con PA LEVEL 11. Di seguito si riportano alcune osservazioni che si possono formulare dall’analisi dei dati. 1. In linea teorica, dovendo essere i motes tutti identici , i segmenti riportati nei vari grafici dovrebbero essere tutti sovrapposti fra loro, o almeno molto vicini, ma in realtà svariano all’interno di un range di circa 10dBm. Comunque questo fatto può essere imputabile alle variazioni ambientali avvenute durante le varie prove e, infatti, da un’analisi satellite non riportata, risulta che i valori medi di RSSI del nodo fisso risultano più simili fra loro nelle prove eseguite in successione. 3.3 Analisi preventiva della rete 23 Figura 3.3: Offset di RSSI dei nodi variabili rispetto l’RSSI del nodo fisso con PA LEVEL 23 (prime 20 prove) Figura 3.4: Offset di RSSI dei nodi variabili rispetto l’RSSI del nodo fisso con PA LEVEL 23 (seconde 20 prove) 24 Cap. 3. Studio del problema 2. Le medie delle differenze di RSSI tra il nodo fisso e quelli variabili si aggira su valori compresi all’incirca tra 1 e 5 dBm. 3. Nelle prove che hanno dato valori molto prossimi di RSSI in lettura anche le medie dell’offset sono risultate abbastanza vicine. Questa è un dato di fondamentale importanza poichè indica che a parità di RSSI misurato anche l’errore rimane all’incirca costante (si vedano i nodi 03, 49, 50 in figura 3.3). 4. Man mano che si riduce la potenza in trasmissione e quindi conseguentemente anche il valore di RSSI misurato, le medie e le varianze degli offset aumentano sensibilmente (infatti media ∆RSSIP A23 = 2.4dBm mentre ∆RSSIP A11 = 3.2dBm). Inoltre, con potenze basse, quanto detto al punto 3 non è sempre verificato. Questo fatto risulta del resto abbastanza logico: più il segnale è potente, più le prestazioni sono elevate, ma cosı̀ facendo aumenta anche il consumo di energia. 5. Nonostante i costruttori reputino normale misurare differenze di RSSI tra un nodo i e un nodo j in una WSN nell’ordine di 6/7dBm, durante le prove si sono rilevati, in alcuni casi, valori di tale offset molto maggiori, addirittura il doppio per qualche pacchetto. Molto probabilmente questi casi sono da imputare ad interferenze di tipo ambientale, ma se cosı̀ fosse sarebbe utile interrogarsi sull’affidabilità di questo tipo di reti in ambienti di vita odierni, dove campi elettromagnetici di ogni genere sono presenti in tutte le ore del giorno. 3.3.2 Esperimento II Nel secondo esperimento i motes utilizzati sono stati solo due, sempre uguali, ovvero il mote contrassegnato con ID NAV00003 (nodo1) e quello con ID NAV00050 (nodo2). Anche in questo caso si sono eseguite all’incirca una quarantina di prove, ma questa volta si è deciso di cambiare solo la distanza fra i due nodi. Poichè le misure sono state efettuate all’interno del piano terra dell’edificio DEI/A, oltre alla distanza in ogni prova sono variate anche tante altre condizioni ambientali circostanti: muri, oggetti mobili, interferenze elettromagnetiche, persone in movimento, ecc. Per questo motivo i vari ∆RSSI tra nodo2 e nodo1 sono stati graficati rispetto al valore presente nel ragistro RSSI.RSSI VAL del nodo1, e non rispetto alle distanze effettive. Le prime venti misure sono state eseguite ponendo i due motes sempre all’interno del Laboratorio NAVLAB, mentre le altre venti con uno dei due posizionato in diverse zone di tutto il piano. Analizzando i risultati nelle figure 3.7, 3.8, 3.9 e 3.10 relative rispettivamente a potenze di trasmissione con PA LEVEL 23 le prime due e con PA LEVEL 11 le altre, si possono fare le seguenti considerazioni: 3.3 Analisi preventiva della rete 25 Figura 3.5: Offset di RSSI dei nodi variabili rispetto l’RSSI del nodo fisso con PA LEVEL 11 (prime 20 prove) Figura 3.6: Offset di RSSI dei nodi variabili rispetto l’RSSI del nodo fisso con PA LEVEL 11 (seconde 20 prove) 26 Cap. 3. Studio del problema Figura 3.7: Offset di RSSI del nodo2 rispetto l’RSSI del nodo1 con PA LEVEL 23 (prime 20 misure) Figura 3.8: Offset di RSSI del nodo2 rispetto l’RSSI del nodo1 con PA LEVEL 23 (seconde 20 misure) 3.3 Analisi preventiva della rete 27 1. le medie delle differenze di RSSI assumo valori in un range che va da circa 1 dBm a massimo 5 dBm in valori assoluti; 2. tali medie si mantengono molto vicine nel caso di prove che danno valori di RSSI abbastanza simili (si vedano le misure 01 e 09 oppure 14 e 02 in fig.3.7) e ciò è una nota alquanto positiva; Figura 3.9: Offset di RSSI del nodo2 rispetto l’RSSI del nodo1 con PA LEVEL 11 (prime 20 misure) 3. sia le medie di ∆RSSI, ma soprattutto le varianze in valore assoluto delle stesse, subiscono, in generale, peggioramenti notevoli man mano che la potenza del campo elettromagnetico diminuisce (si notino nei garfici i valori con RSSI al nodo1 inferiore ai -20 dBm); 4. in alcuni casi (ad esempio misure 02, 12, 33) si sono riscontrati valori di ∆RSSI molto maggiori di quelli ritenuti accettabili dai costruttori, addirittura di 20 dBm in valore assoluto. Ciò sarebbe estremamente preoccupante se le medie fossero notevolmente alterate, ma dato che ciò non avviene si può ipotizzare che la colpa sia di qualche sporadico pacchetto i cui dati sono stati alterati da forti ma momentanee interferenze esterne; 5. infine è da notare come riducendo la potenza di trasmissione, più che le medie degli offset che si creano tra i valori di RSSI dei due nodi, sia la varianza degli stessi a farne le spese più gravi. 28 Cap. 3. Studio del problema Figura 3.10: Offset di RSSI del nodo2 rispetto l’RSSI del nodo1 con PA LEVEL 11 (seconde 20 misure) 3.3.3 Brevi cosiderazioni Da quanto osservato nelle due sezioni precedenti si evince che in una rete di sensori wireless, se pur di dimensioni ridottissime, i valori di RSSI forniti dai chip radio dei singoli nodi non sono da ritenere cosı̀ affidabili come dovrebbero. Infatti non soddisfano in media alla condizione che dispositivi posti alla stessa distanza devono restituire la stessa misura dell’intensità del campo elettrico. Le cause di questo mal funzionamento sono da ricercare fra due argomentazioni fondamentali: • l’alta variabilità del tipo di ambiente in cui si opera • le diversità costruttive a livello di hardware tra un nodo e l’altro. Inoltre, nel caso di trasmissioni di dati di una certa importanza, è consigliabile l’utilizzo di livelli di potenza notevoli per ridurre i margini di errore. Purtroppo, però, potenze maggiori richiedono consumi energetici elevati. Capitolo 4 Algoritmo sviluppato Da quanto riportato nei capitoli precedenti, si può ora intuire la fondamentale importanza dello sviluppo di un algoritmo, in grado di agire su ogni coppia di sensori di una WSN, che riesca a minimizzare istante per istante la differenza del valore di RSSI che si riscontra tra ogni nodo i e il suo vicino j. E’ da tener ben presente, però, che ciascun mote della rete ha, nella maggior parte dei casi, un numero di vicini superiore a 1, poichè per vicino in uno schema ditribuito si intende ogni altro sensore con cui quello soggetto comuninica. Quindi l’algoritmo in questione dovrà cercare di compensare tutti gli offset presenti tra l’RSSI misurato da i e quello misurato dagli altri nodi che scambiano informazioni con esso. Ecco perciò motivata la scelta del metodo del consensus. 4.1 Algoritmi di consensus Con il termine consenso (dal latino consensus) si intende la convergenza ad un parametro comune di più agenti tramite scambio di informazioni o interazione locale. In una rete di sensori distribuiti, l’obiettivo principale è quello di ottenere, per ogni nodo, una buona stima di tale parametro sconosciuto, ossia eseguire una calibrazione. Lo schema che si propone aggiorna, per ciascun sensore, il dato in questione attraverso una media pesata di quello dei suoi vicini. 4.2 Il consenso nel dettaglio Si hanno N sensori che raccolgono misure di un parametro affetto da offset yi←j = Θ + oi,j (4.1) e si vuole che tutti i sensori restituiscano misure coerenti, ovvero che ŷi←j −→ yglob . (4.2) 30 Cap. 4. Algoritmo sviluppato Per fare ciò è necessario aggiungere un certo valore a yi←j in modo tale da compensare l’offset presente e quindi ŷi←j = yi←j + ôi (4.3) Lo scopo è scegliere ôi in modo tale che la somma degli offset in un ciclo di nodi comunicanti sia il più possibile prossima a zero, ossia trovare X ôi | (∆ŷi,j ) = 0 (4.4) ciclo Da notare che la scelta di ôi non è univoca. Basti pensare ad una rete composta da due soli nodi i, j, dove ad esempio yi←j = A e yj←i = B, con A e B costanti. Ora ŷi = A + ôi e ŷj = B + ôj e considerando che l’obiettivo si riduce all’avere ŷi = ŷj , con pochi banali passaggi si ha ôi = (B − A) + ôj da cui si evince che un’infinità di coppie di valori (ôi , ôj ) risolvono il problema. In realtà, nell’algoritmo sviluppato, ci si propone di soddisfare alla 4.4 cercando il valore fra tutti gli ôi possibili che minimizza la somma dei quadrati ossia X ô2i sia minima. (4.5) ôi | ciclo Poichè il valore di Θ in 4.1 non interessa ai fini della calibrazione, si ipotizza per adesso che yi←j = yi = oi (4.6) e quindi si vuole trovare ŷi = oi + ôi (t) | ŷi − ŷj = 0 ∀ i, j. (4.7) L’algoritmo di consenso opera sugli N sensori comunicanti cercando una stima di ŷi (t) che tenda ad una media pesata dei valori letti da ciascun nodo. Per raggiungere tale stima si rende necessario lo schema iterativo ŷi (t + 1) = pi,j ∗ ŷi (t) (4.8) con condizione iniziale ŷi (0) = yi , che in forma matriciale espansa agli N nodi diventa ŷ1 ŷ1 .. . . = P .. ŷN t+1 ŷN t La matrice P ∈ RN ×N , ovvero la matrice dei pesi, è una matrice doppiamente stocastica , vale a dire che ha tutti gli elementi positivi e tali che la somma di ogni riga e di ogni colonna sia uguale a 1. Essa infatti è costruita in modo tale da soddisfare a 4.2 Il consenso nel dettaglio 31 P1 = 1 1T P = 1T e i valori di pi,j vengono calcolati con la tecnica del Metropolis Weights [13] la quale assegna, per ogni coppia di nodi comunicanti i, j il valore: pi,j = αj = 1 max(degreei , degreej ) + 1 (4.9) dove degreei non è altro che il numero di vicini con cui il nodo i riesce a scambiare informazioni. Tornando ora al caso scalare si ha che l’equazione di aggiornamento del valore stimato risulta X X ŷi+ = αj ŷj + (1 − αj )ŷi (4.10) j∈G j∈G dove G è l’insieme dei nodi comunicanti con i, escluso i stesso, e da cui con banali passaggi si ha subito che: X ŷi+ = ŷi + αj (ŷj − ŷi ). (4.11) j∈G Sostituendo ora in questa la 4.3 si giunge all’equazione X ô+ αj (yj + ôj − yi − ôi ) i = ôi + (4.12) j∈G la quale non è altro che l’equazione di aggiornamento dell’offset cercato. E’ da notare che la 4.12 dipende soltanto dalle differenze tra le misure del parametro y di due nodi vicini, e non dal valore reale di ciascuno di essi, e quindi si evince che l’ipotesi 4.6 non era in realtà necessaria, ma solo utile alla comprensione dell’algoritmo. Inoltre è dimostrabile che con l’utilizzo di pesi ottenuti attraverso Metropolis Weights si ha che ŷi (t) −→ 1 X yi N e ôi (t) −→ 1 X oi N (4.13) ossia che sia la stima del parametro che quella dell’offset di compensazione convergono in un punto che sarà la media rispettiva dei valori del parametro raccolti dai motes e delle differenze degli stessi tra un nodo e l’altro. Nel caso discusso in questa tesi il parametro yi←j diventa il valore di RSSI fornito dal nodo i tramite ricezione del segnale dal nodo j ossia RSSIi←j = f (di,j ) + oi (4.14) dove f (di,j ) è una certa funzione della distanza fra i due motes e oi l’offset che si vuole minimizzare. Quindi se 32 Cap. 4. Algoritmo sviluppato \ i←j = RSSIi←j + ôi RSSI è il valore stimato di RSSI da cui poi estrapolare la potenza del campo elettromagnetico da usare nella localizzazione, il fine ultimo dell’algoritmo descritto è proprio il calcolo della quantità ôi da sommare all’RSSI di ciascun nodo i, istante per istante, per ottimizzare tale stima. 4.3 Sviluppo del software L’algoritmo precedentemente illustrato viene implementato nell’elaborato mediante l’utilizzo del software MATLAB [14], e costruito ad hoc per una rete di quattro sensori tutti comunicanti fra loro. Ciò implica che il valore di αj definito in 4.9 risulti sempre costante e pari a 41 . Si costruisce una matrice y ∈ R4×4 di ingressi aggiornata istante per istante dove il numero di riga corrisponde al nodo ricevente il messaggio, e il numero di colonna indica il nodo mittente. In questo modo in ogni casella si ha il valore di RSSIi←j ; ad esempio nella posizione (1,3) si ha RSSI1←3 ossia l’RSSI letto dal mote n◦ 1 sul segnale inviatogli dal mote n◦ 3. Si pongono quindi a zero (condizioni iniziali nulle) quattro nuove variabili ocapi con i = 1 . . . 4 le quali altro non sono che i vari ôi , uno per ciascun nodo della rete, e si esegue l’algoritmo. Quest’ultimo, istante dopo istante, aggiorna queste quattro variabili come da equazione 4.12 e le memorizza riga per riga su una matrice ocap ∈ R(k+1)×4 , dove k è il numero degli istanti in esame. Preso un solo vettore-riga di tale matrice, si leggono da sinistra verso destra i valori di ô1 . . . ô4 da sommare in quel preciso istante al valore di RSSI letto nei rispettivi motes per minimizzare l’offset sul ciclo attenendosi alla condizione 4.5. Si anticipa già da ora che i valori ottenuti attraverso l’algoritmo in esame di ŷi (t) e di ôi (t) si attengono perfettamente alle condizioni di convergenza di 4.13. Capitolo 5 Analisi dei dati Come anticipato nel capitolo precedente, l’algoritmo descritto in questa tesi è stato costruito ad hoc per una rete composta da quattro Tmote Sky tutti in grado di comunicare fra loro scambiandosi informazioni. Sui quattro sensori è stato caricato un software sviluppato in ambiente TinyOS-2 progettato in origine per eseguire un semplice test di connettività [2]. Tale software è stato modificato ed adattato in modo da imporre ai nodi uno scambio reciproco di pacchetti dati molto ridotti contenenti alcune informazioni su diversi parametri tra cui, molto importante, l’ID del nodo trasmittente. I sensori sono stati distribuiti come da figura 5.1 all’interno del piano terra dell’edificio DEI/A nel Dipartimento di Ingegneria Dell’Informazione dell’Università di Padova. Dopo un breve periodo di tempo (ca. 9 minuti) in cui Figura 5.1: Distribuzione dei sensori sul piano terra dell’edificio DEI/A i motes si sono scambiati tutti i pacchetti previsti dal codice, si è eseguita la lettura delle loro rispettive flash, prestando particolare attenzione ai valori di RSSI memorizzati. 34 Cap. 5. Analisi dei dati A questo punto si è applicato ai dati ricavati l’algoritmo di calibrazione esplicato nella sezione precedente. Tale algoritmo, infatti, dato che come variabili di ingresso richiede solo i valori di RSSI letti dai nodi e non prevede alcuna alterazione di parametri interni agli stessi, ha il vantaggio di poter essere eseguito in modalità offline. Un’ultima osservazione prima di analizzare se l’algoritmo sia stato efficace o meno è la seguente: come si può notare in sezione 4.1.1, la potenza con cui viene trasmesso un segnale non compare in nessuna delle equazioni descritte; ciò significa che la bontà dell’algoritmo non dipende in alcun modo da essa. Per questo motivo si è scelto di utilizzare un solo livello di potenza in trasmissione per le prove efettuate sulla rete di quattro sensori. E’ comunque logico supporre che diminuendo tale potenza, come osservato nel capitolo 3, gli offset di RSSI da compensare aumentino anche in modo sensibile, ma ciò non metterà certo in crisi il metodo del consensus che si adeguerà semplicemente con compensazioni maggiori. 5.1 Risultati ottenuti In questa sezione vengono riportati in grafici e tabelle i risultati ottenuti dall’esperimento sia prima che dopo l’applicazione dell’algoritmo di consenso, in modo tale valutare il buon funzionamento dello stesso. Si ricorda che l’esperimento è stato svolto utilizzando una potenza di trasmissione intermedia della radio, per la precisione P A LEV EL = 23. Inoltre si è impostato uguale a 900 il numero di pacchetti dati inviati da ciascun nodo verso ogni altro suo vicino. I grafici riportati nelle figure da 5.2 a 5.7 illustrano gli offset del valore di RSSI tra le coppie di nodi della rete in funzione del tempo trascorso inteso però come numero di pacchetti scambiati (ad esempio se il tempo di invio di un pacchetto è di 64 ms, uno step dell’algoritmo richiede 64 × 4 ms per essere eseguito; quindi ogni unità sull’asse delle ascisse equivale a circa 300 ms tenendo in considerazione anche i tempi di attesa e di scrittura dei singoli nodi). I possibili link di due nodi i, j, che dialogano fra loro sono naturalmente 12 in una rete di quattro sensori, ma è chiaro che essendo differenze di valori comunque statici quelle che si vanno a graficare, una metà di questi link misurano quantità uguali ma opposte in segno all’altra. Ecco spiegato il motivo per cui vengono illustrati solo gli andamenti degli offset per sei link e non per tutti quelli possibili. In ciascun grafico vengono riportati, istante per istante, i valori dell’offset prima dell’applicazione dell’algoritmo di consensus (colore blu, marker ×) ossia ∆RSSIi←j = RSSI V ALi − RSSI V ALj e dopo l’esecuzione dello stesso (colore rosso, marker •), cioè i valori di offset corretti dai vari ôi calcolati \ i←j = RSSI V ALi + ôi − (RSSI V ALj + ôj ). ∆RSSI 5.1 Risultati ottenuti 35 In tabella 5.1, giusto per avere un’idea, si riportano i valori dei vari ôi definiti dall’algoritmo per i primi dieci istanti. E’ facile notare come la risoluzione massima di tali offset di compensazione sia pari a 0.25 dBm, ma ciò è logico dato che il coefficiente αj descritto nel capitolo precedente è uguale proprio a 1/4. ô1 2.25 1.75 2.25 2.75 2.50 3.00 2.75 3.25 2.75 2.75 ô2 0.75 0.75 1.00 1.25 1.25 0.75 1.00 0.75 1.25 0.75 ô3 -4.25 -3.50 -4.50 -4.25 -4.25 -4.00 -4.25 -4.25 -4.50 -3.75 ô4 1.25 1.00 1.25 0.25 0.50 0.25 0.50 0.25 0.50 0.25 Tabella 5.1: Valori di ôi calcolati dall’algoritmo nei primi dieci istanti Esaminando i sei grafici delle figure da 5.2 a 5.7 si possono formulare le considerazioni che seguono. \ ossia quelli ottenuti dopo 1. Le costellazioni dei valori di ∆RSSI, l’esecuzione dell’algoritmo di consenso, si sviluppano nel tempo con quantità molto più prossime allo zero rispetto a quelle misurate prima della correzione. Questo è un grande punto a favore. Infatti, come si può \ risultano essere notare dalla tabella 5.2, le medie nel tempo dei ∆RSSI molto minori in valore assoluto rispetto a quelle dei ∆RSSI misurati dai motes (ad esempio nel link 3 ← 4 si passa da media∆RSSI = 4.489 a \ = −0.046) e ciò è uno degli scopi principali che si propone media∆RSSI l’algoritmo in questione. Link 1←2 1←3 1←4 2←3 2←4 3←4 Prima del consenso −1.926 −6.696 −2.278 −5.651 −0.907 4.489 Dopo il consenso −0.358 0.237 0.121 −0.284 −0.075 −0.046 Tabella 5.2: Medie degli offset di RSSI prima e dopo l’applicazione dell’algoritmo 2. Anche il range in dBm delle costellazione si riduce sensibilmente dopo la correzione dei dati efettuata con gli offset di compensazione ôi calcolati dall’algoritmo. 36 Cap. 5. Analisi dei dati Figura 5.2: Offset RSSI link 1—2 Figura 5.3: Offset RSSI link 1—3 5.1 Risultati ottenuti 37 Figura 5.4: Offset RSSI link 1—4 Figura 5.5: Offset RSSI link 2—3 38 Cap. 5. Analisi dei dati Figura 5.6: Offset RSSI link 2—4 Figura 5.7: Offset RSSI link 3—4 5.1 Risultati ottenuti 39 Ad esempio in figura 5.5 si nota come si passa da un range di ∆RSSI di \ di circa 4 dBm, oppure in figura 5.6 da circa 8 dBm a quello di ∆RSSI \ ' 5. Approssimativamente si range∆RSSI ' 10 dBm a range∆RSSI può dire che il range delle differenze di RSSI tra due nodi i, j si dimezza con l’utilizzo dei dati proposti dal consenso. 3. L’unico punto a sfavore dell’algoritmo è che i valori corretti, ossia quelli di \ non risultano avere una buona continuità nel tempo. Cercando ∆RSSI, \ calcolati in istanti successivi di spiegarsi meglio, valori di ∆RSSI differiscono con maggior fraquenza rispetto a quelli di ∆RSSI. Si prenda ad esempio la figura 5.7 (link 3 ← 4); si nota subito come l’offset non corretto rimanga per molti istanti fisso a 4 dBm, mentre quello corretto dall’algoritmo non si fissi mai su un certo valore, pur migliorando nettamente media e range della costellazione. La causa principale di questa nota sta nel fatto che l’algoritmo di consenso lavora mediando i dati che un nodo i scambia con tutti i suoi vicini e non con uno solo di essi. Bisogna sempre ricordare infatti che è stato studiato in modo tale da azzerare la somma degli offset che si creano tra un nodo e i suoi vicini. Dalla figura 5.8 si può intuire meglio questa realtà oggettiva. Se un nodo i comunica con tre nodi A, B, C, si riscontrano valori di offset Figura 5.8: Nodo i che comunica con i vicini di RSSI pari a ∆RSSIi,j = RSSIi − RSSIj con j = A, B, C. Dopo l’esecuzione dell’algoritmo del consenso si trovano tre valori di \ i,j = RSSI \ i − RSSI \j ∆RSSI 40 Cap. 5. Analisi dei dati \ i = RSSIi + ôi . dove, come già spiegato in precedenza, RSSI L’algoritmo è studiato in modo da far sı̀ che: X \ i,j = 0 ∆RSSI (5.1) j=A,B,C istante per istante, ed a ciò esso si attiene con precisione. Dopo queste osservazioni si può infine ritenere che l’algoritmo sviluppato risolva in modo più che sufficiente il problema dell’offset del valore di RSSI tra i nodi di una WSN, almeno per quel che riguarda la connessione tra coppie i, j di sensori. 5.2 Il problema dei cicli Arrivati a questo punto della tesi si passa ad esaminare il buon funzionamento dell’algoritmo sviluppato mediante la verifica dei risultati che si ottengono sui cicli chiusi della rete di sensori. Figura 5.9: Schema stilizzato ciclo n◦ 1 Per ciclo si intende una qualsiasi sequenza chiusa di nodi in grado di comunicare fra loro. E’ chiaro che in una rete di quattro sensori tutti fra di loro connessi, tali sequenze, percorse in un verso solo, sono in numero pari a 7, tre formate da tutti i motes e quattro formate solo da tre motes (si escludono dall’analisi i cicli di due nodi perchè degenerano a semplici links di cui si è già discusso nella sezione precedente). In figura 5.9 si riporta in modo stilizzato per 5.2 Il problema dei cicli 41 facilitarne la comprensione uno di questi cicli composto dalla sequenza di nodi 1 → 2 → 3 → 4 → 1. Nel capitolo 4, l’equazione 4.4 proponeve come scopo dell’algoritmo studiato che la somma delle differenze di RSSI in un ciclo di nodi comunicanti fosse il più possibile prossima allo zero. Ebbene in tabella 5.3 sono riportate le medie nel tempo delle somme dei quadrati di tali differenze, ossia P 2 media temporale di ciclo (∆RSSI) eseguite per tutti i sette possibili cicli sia prima che dopo l’applicazione dell’algoritmo. Si è scelto di utilizzare l’elevazione al quadrato per ottenere tutti valori positivi che valgono quindi come indice di bontà dell’algoritmo. N◦ ciclo 1 2 3 4 5 6 7 Sequenza dei nodi 1→2→3→4→1 1→2→4→3→1 1→3→2→4→1 1→2→3→1 1→2→4→1 1→3→4→1 2→3→4→2 2 ciclo (∆RSSI) P 68.29 74.00 91.02 83.88 15.95 76.70 56.78 \ 2 ciclo (∆RSSI) P 3.89 3.31 3.69 2.44 2.88 3.20 2.37 Tabella 5.3: Medie delle somme dei quadrati delle differenze di RSSI eseguite sui cicli Dalla tabella e dal grafico in figura 5.10, dove sono semplicemente illustrati i dati della stessa (prima dell’applicazione del consenso in blu, dopo l’applicazione in rosso), si possono notare gli enormi miglioramenti che apporta la tecnica del consensus agli offset di RSSI su tutti i cicli della WSN. E’ chiaro che essendo progettato come spiegato nella sezione precedente, l’algoritmo non \ sui cicli, ma ne consente garantisce l’annullamento della somma dei ∆RSSI senza dubbio una drastica diminuzione. Detto ciò si può concludere che il metodo del consenso si rende oggettivamente valido sia per quanto rigurada il singolo link di due nodi, sia per il comportamento globale che assume su tutta la rete. 42 Cap. 5. Analisi dei dati Figura 5.10: Medie delle somme dei quadrati delle differenze di RSSI eseguite sui cicli Capitolo 6 Conclusioni e studi futuri Alla luce di quanto esposto in questa tesi emerge con chiarezza la notevole importanza che acquisisce il valore di Received Signal Strength Indicator in una rete di sensori wireless. Tale valore, più conosciuto con la sigla RSSI, è un indice fornito dalla radio di ciascun nodo di una WSN che permette, mediante la semplice aggiunta di un certo offset, il calcolo dellla potenza del campo elettrico del segnale. Quest’ultimo, detto RSS, viene utilizzato da diversi algoritmi di localizzazione i quali sfruttano il fatto che esso sia direttamente legato alla distanza tra il nodo che trasmette e quello che riceve. Purtroppo, però, si è verificato che il valore di RSSI non è molto affidabile, specie in ambiente indoor, poichè affetto da disturbi di varia natura che ne falsano la precisa acquisizione. Si è quindi reso necessario lo sviluppo di un software in grado di eseguire la calibrazione di tale valore in una rete di sensori distribuiti. A questo scopo si è proposto un algoritmo di consensus capace di apprendere una visione di insieme della rete in questione e calcolare in pochi semplici passi un valore di offset da aggiungere istante per istante all’RSSI fornito da ciascun nodo e renderlo cosı̀ molto più robusto alle alterazioni indotte dall’ambiente in cui si sviluppa la WSN. Partendo dal presupposto che due motes, posti alla stessa distanza, devono fornire lo stesso valore di RSSI, e verificato che ciò non è sempre corretto, si è dimostrato che l’algoritmo in questione apporta notevoli miglioramenti se applicato alla rete, riducendo drasticamente l’offset che si crea appunto tra l’RSSI di un nodo e quello di un suo vicino. Inoltre si è constatata la funzionalità globale del software sviluppato con l’analisi dei cicli di nodi, ed anche in questo caso esso si è rivelato una scelta vincente. Si può quindi concludere che lo schema del consensus soddisfa in modo più che buono le specifiche del progetto proposto, e si può quindi ritenere un ottimo mezzo per eseguire la calibrazione di un certo parametro, quale l’RSSI, affetto da offset in una wireless sensors network. E’ chiaro che l’algoritmo finora descritto in questo elaborato è da ritenersi 44 Cap. 6. Conclusioni e studi futuri tuttora in fase sperimentale. Esso, infatti, come già spiegato in precedenza, è stato progettato ad hoc per una rete di soli quattro Tmote Sky. In primo luogo si propone quindi come lavoro futuro un ampliamento del software per renderlo più general purpose, cioè adattabile ad ogni tipo di rete, ed autoconfigurante, ossia in grado di modificare da solo i propri parametri di calcolo qualora nella rete accadano eventi non programmati quali malfunzionamenti o aggiunte di nodi. Inoltre è da sviluppare ancora tutto il codice in TinyOS per l’implementazione dell’algoritmo sui sensori. Tale lavoro renderebbe possibile, almeno in linea teorica, l’esecuzione di una calibrazione dell’RSSI in real time, sfruttando le capacità di calcolo del chip MSP430. A quel punto non resterebbe che applicare lo schema del consensus ad algoritmi complessi di localizzazione per verificare gli effettivi miglioramenti che si verrebbero ad apportare alle stime delle distanze. Quest’ultima affermazione, purtroppo, non è accertabile con il lavoro svolto fino ad ora, ma è possibile almeno intuirne la veridicità... del resto anche Einstein era sicuro che la teoria della relatività fosse esatta molto tempo prima di riuscire a dimostrarla. Appendice A Algoritmo di analisi della connessione Per l’analisi della connessione e la raccolta dei dati di interesse si è utilizzato un algoritmo proposto in [2] modificato e d adattato ai scopi della tesi. Il file Config.h è il file di configurazione della rete. In esso vengono settati tutti i tempi di trasmissione, il numero dei nodi della rete, quello dei pacchetti da scambiare ed alto. Il file BaseStation.nc è il corpo principale del software in TinyOS da caricare sul mote che funge da base-station per l’appunto e quindi scandisce i tempi di trasmissione e ricezione dei nodi. Nel file PeerC.nc è contenuto il codice centrale del software da caricare sui nodi veri e propri della rete. Quando i nodi terminano i cicli di scambio di pacchetti è necessario collegarli al PC tramite porta USB e caricare il programma Lettura in [2]. Quindi attraverso una stringa di comando si legge la flash dei sensori e si traducono i dati in ciò che interessa lanciando il file letture.java anch’esso presente in [2]. A.1 Config.h #ifndef CONFIG_H /************************************************************** * Application: Config.h * * Description: Configurazione per il test della connettivit~ A * * Date: 14/12/2007 * * Autore: Simone Cieno * ***************************************************************/ #define CONFIG_H enum{ channelRadio = 15, numNodi = 2,//numero di nodi, eclusa la BaseStation numPkg = 160,//numero di pacchetti che ogni nodo spedisce 46 App. A. Algoritmo di analisi della connessione numCicli = 20,//numero di cicli di rilevazione AM_SERIAL = 9, AM_RADIO = 6, TIMER_SEND = 64,//tempo tra l’invio di due pacchetti TIMER_GLOBALE = 26000,//22800, //TIMER_INVIO*numeNodi // tempo di durata di un ciclo TIMER_INVIO = 13000,//TIMER_SEND*numPkg minimo tempo per //l’invio dei pacchetti da parte di un nodo code_chiamata = 1, code_stop = 2, code_pacchetto = 3, code_erase = 4, }; typedef struct pacchetto{//pacchetto che effettivamente si invia nx_uint8_t code;//codice identidicatico del pacchetto nx_uint16_t nCiclo;//numero del ciclo di raccolta dati nx_uint8_t wtx;//identificatico del nodo che trasmette //nx_uint8_t battery;//livello di tensione del nodo che trasmette nx_uint8_t ptx;//potenza di trasmissione } pacchetto; typedef struct asignal{ nx_uint8_t code;//codice identidicatico del pacchetto nx_uint16_t nCiclo;//numero del ciclo di raccolta dati nx_uint8_t wtx;//identificatico del nodo che deve trasmettere } asignal; typedef struct store{ nx_uint8_t nCiclo;//numero del ciclo di raccolta dati nx_uint8_t ptx;//potenza di trasmissione //nx_uint8_t Mybattery;//livello di tensione del nodo che trasmette //nx_uint8_t Mytemp;//livello di temperatura del nodo che trasmette //nx_uint8_t battery;//livello di tensione del nodo che trasmette uint8_t lqi; int8_t rssi; nx_uint8_t wtx;//identificatico del nodo che trasmette (Who Transmitt) } store; #endif A.2 BaseStationC.nc A.2 47 BaseStationC.nc /************************************************************ * Application: BaseStationC.nc * ~ * Description: Applicazione per il test della connettivitA * * Date: 08/10/2007 * * Autore: Simone Cieno * *************************************************************/ /** Funzionamento del protocollo:La basestation scandisce i tempi verso gli altri nodi (peers).Il numero dei nodi ~ A¨ definito nel file di configurazione, come i tempi dei timer, il canale radio... All’avvio della basestation, questa invia per prima cosa un messaggio in broadcast che segnala ad ogni nodo che ~ A¨ il momento di cancellare la memoria flash;Inolte viene fatto partire il timer globale.Quando il timerGlobale segnale lo scatto, ciclo numero 1, viene spedito il primo pacchetto che segnala al nodo n^ A◦ 1 che deve trasmettere e si avvia anche il timerInvio. Allo scadere del timer invio, il nodo 2 dovr~ A trasmettere e cosi via. Quando l’ultimo nodo ha trasmesso, viene fermato il timerInvio e si resta in attesa dello scoccare del timer globale.Quando sono stati eseguiti tutti i cicli, allora anche il TimerGlobale viene fermato. **/ #include <Timer.h> #include "Config.h" module uses uses uses uses uses uses uses uses } BaseStationC { interface Boot; interface Leds; interface Timer<TMilli> as TimerInvio; interface Timer<TMilli> as TimerGlobale; interface Packet; interface AMSend; interface SplitControl as AMControl; interface CC2420Config; implementation { enum { CONFIG_ADDR = 0 }; bool busy;//stato della radio 48 App. A. Algoritmo di analisi della connessione message_t pkg; uint8_t whotx;//id del nodo che deve trasmettere uint16_t ciclo;//numero di ciclo event void Boot.booted() { busy= FALSE; whotx=0; ciclo=0; call CC2420Config.setChannel(channelRadio); call CC2420Config.sync(); } /**Task che manda un pacchetto di avviso, con l’intento di segnalare ad ogni nodo che devono cancellare la flash**/ task void eraser() { if(!busy){ asignal* sig=(asignal*)(call Packet.getPayload(&pkg,NULL)); sig->code=code_erase; //call Leds.set(1); sig->nCiclo=ciclo; sig->wtx=whotx; call TimerGlobale.startPeriodic(TIMER_GLOBALE); if(call AMSend.send(AM_BROADCAST_ADDR,&pkg, sizeof(asignal))==SUCCESS) { busy=TRUE; //call Leds.led0On();//segnalo l’invio con il led rosso } } } task void primoInvio(){ call TimerInvio.startPeriodic(TIMER_INVIO); if(!busy){ asignal* sig=(asignal*)(call Packet.getPayload(&pkg,NULL)); sig->code=code_chiamata; sig->nCiclo=ciclo; sig->wtx=whotx; if(call AMSend.send(AM_BROADCAST_ADDR,&pkg, sizeof(asignal))==SUCCESS) { busy=TRUE; //call Leds.set(3); //call Leds.led2On(); } whotx++; } A.2 BaseStationC.nc 49 } task void trasmissione(){ if(!busy){ asignal* sig=(asignal*)(call Packet.getPayload(&pkg,NULL)); sig->code=code_chiamata; sig->nCiclo=ciclo; sig->wtx=whotx; //call Leds.set(whotx); if(call AMSend.send(AM_BROADCAST_ADDR,&pkg, sizeof(asignal))==SUCCESS) { busy=TRUE; //call Leds.set(3); //call Leds.led2On(); } whotx++; if(whotx > numNodi){call TimerInvio.stop();}//se ~ A¨ l’ultimo nodo, fermo il timer } } event void CC2420Config.syncDone( error_t error ) { call AMControl.start(); } event void AMControl.startDone(error_t err) { // componentistica Mote accesa if(err != SUCCESS) call AMControl.start(); else{ //call Leds.set(101); //call TimerGlobale.startPeriodic(TIMER_GLOBALE);//faccio partire il timer globale post eraser();//posto il task che permette di cancellare le flash } } event void TimerGlobale.fired() { //call Leds.set(0); whotx=1; call Leds.set(whotx); ciclo++;//incremento il numero di ciclo di raccolta dati if(ciclo > numCicli){ call TimerGlobale.stop(); call AMControl.stop(); 50 App. A. Algoritmo di analisi della connessione //call Leds.set(111); } post primoInvio();//posto il task per il primo invio } event void TimerInvio.fired() { call Leds.set(whotx); if((whotx <= numNodi) && (!busy)){//se chi deve trasmettere "esiste" post trasmissione(); } } event void AMControl.stopDone(error_t err) { } event void AMSend.sendDone(message_t* msg, error_t error) { busy= FALSE;//segno che la radio ~ A¨ libera //call Leds.led2Off(); //call Leds.set(0);//azzero le segnalazioni //call Leds.set(ciclo);//segno il numero di ciclo } } A.3 PeerC.h /************************************************************ * Application: PeerC.nc * ~ * Description: Applicazione per il test della connettivitA * * Date: 14/12/2007 * * Autore: Simone Cieno * *************************************************************/ /** Funzionamento:All’avvio i peers sono in solo ascolto.All’arrivo di un pacchetto fanno distinzione del tipo, cio~ A¨ se ~ A¨ un pacchetto di segnala zione, che puo significare una richiesta di cancellazione, di inizio trasmissione o di fine trasmissione, oppure un pacchetto dati. In base al pacchetto arrivato vengono svolti i vari task.Una volta ricevuto un pacchetto di segnalazione, questo viene anche mandato in A.3 PeerC.h 51 flooding, e "segnando" il pacchetto ricevuto.In questo modo non vengono mandati pacchetti duplicati e si lascia il canale il piu possibile libe ro. Funzionamento del flooding:Quando ricevo un pacchetto (di tipo aSignal) controllo se ~ A¨ il pacchetto piu recente ricevuto(di quel tipo).In tal caso memorizzo l’informazione e mando in broadcast il pacchetto.Se il pacchetto ricevuto non ~ A¨ "piu recente" dell’ultimo ricevuto, allora scarto il pacchetto. Quando un nodo deve trasmettere la sua serie di pacchetti, viene man datoun burst di pacchetti, uno ogni TIMER_SEND. **/ #include <Timer.h> #include "Config.h" #include "StorageVolumes.h" #include "message.h" module PeerC { uses { interface Boot; interface Leds; interface SplitControl as AMControl; interface Timer<TMilli> as TimerSend; // Timer per inoltro pkt dati quando scatta spedisco un pacchetto interface BlockWrite as Write; // scrive in flash interface Packet; interface AMSend as AMSendPacchetti; // Send per inoltro sequenza dati interface AMSend as AMSendFlooding; // Send per flooding interface Receive; interface CC2420Packet as SetRadio; // per avere LQI e RSSI della trasmissione interface AMPacket; interface Packet as PacketSpedisco; interface CC2420Config; // modifica canale radio } } implementation { enum { CONFIG_ADDR = 0,// indirizzo di partenza per scrittura in flash }; bool busy;//stato della radio bool erased; 52 App. A. Algoritmo di analisi della connessione bool flood;//per sapere se ho effettuato il flooding della /*fine */ trasmissione message_t pacchet; message_t segnalazione; asignal sig; pacchetto dati; store ricevuti[numPkg];//salvo i pacchetti ricevuti prima di fare store uint8_t i;//conta i pacchetti ricevuti uint32_t j; //uint8_t valBat; //uint8_t valTemperature; uint16_t tmpCiclo; uint8_t lftx =0;//ultimo flooding trasmesso (last flooding transmitt) uint8_t potenza; uint8_t powerstate=1;//contatore x segnare quanti pkg per livello di potenza ho inviato event void Boot.booted() { call CC2420Config.setChannel((uint8_t)channelRadio); // setto il canale della radio call CC2420Config.sync(); // applico la modifica al canale radio busy = FALSE; erased=FALSE; flood=FALSE; tmpCiclo=0; i=0; j=0; potenza=23; //call ReadVoltage.read(); // lettura livello batteria //call ReadTemperature.read(); // lettura temperatura } event void CC2420Config.syncDone( error_t error ) { //call Leds.set(111); call AMControl.start(); } event void AMControl.startDone(error_t error) { //call Leds.set(0); } /**task per formattare la flash del mote **/ task void cancellazione(){ asignal* era=(asignal*)(call Packet.getPayload(&segnalazione,NULL)); //call Leds.set(sig.code); A.3 PeerC.h 53 if(!erased){ call Write.erase(); atomic{erased=TRUE;} era->code=sig.code; era->nCiclo=sig.nCiclo; era->wtx=sig.wtx; //call Leds.set(era->code); if(call AMSendFlooding.send(AM_BROADCAST_ADDR,&segnalazione, sizeof(asignal))==SUCCESS) atomic{busy=TRUE;} } } /** alla ricezione di un pacchetto si segnalazione che indica che nodo deve trasmettere, controllo il numero di ciclo.se il numero di ciclo ~ A¨ piu recente di quello precedentemente memorizzato, lo aggiorno;Ora controllo se tocca a me spedire la mia serie di pacchetti(in tal caso avvio il timer), altrimenti faccio flooding di quella chiamata, stando attento ad inoltrare una sola volta il pacchetto di flooding**/ task void chiamata(){ asignal* tel=(asignal*)(call Packet.getPayload(&segnalazione,NULL)); if(tmpCiclo <= sig.nCiclo){ tmpCiclo=sig.nCiclo; if((sig.wtx==TOS_NODE_ID)&&(!(call TimerSend.isRunning()))){ //se tocca a me spedisco i miei pacchetti powerstate=1; potenza=23; call TimerSend.startPeriodic(TIMER_SEND);} else if(sig.wtx!=TOS_NODE_ID){//altrimenti mando in flooding il pacchetto if((!busy)&&(sig.wtx!=lftx)){//se la radio ~ A¨ libera e se non ho ancora trasmesso quel flooding tel->code=sig.code; tel->nCiclo=sig.nCiclo; tel->wtx=sig.wtx; if(call AMSendFlooding.send(AM_BROADCAST_ADDR, &segnalazione,sizeof(asignal))==SUCCESS) atomic{busy=TRUE;lftx=sig.wtx;} } } } } /** ricevuto l’avviso di fine trasmissione, salvo i dati sulla flash**/ task void finetrasmissione(){ 54 App. A. Algoritmo di analisi della connessione if(!flood){ asignal* fine=(asignal*)(call Packet.getPayload (&segnalazione,NULL)); fine->code=sig.code; fine->nCiclo=sig.nCiclo; fine->wtx=sig.wtx; if(call AMSendFlooding.send(AM_BROADCAST_ADDR,&segnalazione, sizeof(asignal))==SUCCESS) atomic{busy=TRUE;flood=TRUE;} } call Write.write(CONFIG_ADDR+(j)*sizeof(store),&(ricevuti[0]), (i)*sizeof(store)); j+=i; call Leds.led0On(); potenza=23; powerstate=1; i=0; } /** RICEZIONE : il mote, in standby, ascolta la radio. Quando arriva un messaggio lo selezione prima in base alla dimensione, poi controlla il codice che lo contraddistingue */ event message_t* Receive.receive(message_t* msg, void* payload, uint8_t len) { call Leds.led2Off(); call Leds.led1Toggle();//se ricevo lampeggia il led verde if(len == sizeof(asignal)){ asignal* ss=(asignal*)payload; sig.code=ss->code; sig.nCiclo=ss->nCiclo; sig.wtx=ss->wtx; //call Leds.set(sig.code); if(ss->code==code_erase){//se ~ A¨ il pacchetto che segnala la cancellazione della flash post cancellazione(); } else if(ss->code==code_chiamata){ post chiamata(); atomic{flood=FALSE;i=0;}//pongo i=0 per sicurezza } else if(ss->code==code_stop){ if((ss->wtx!=TOS_NODE_ID)&&(!flood)) post finetrasmissione();//se non avevoo mandato io il code_stop else if(!flood){ A.3 PeerC.h 55 asignal* fine=(asignal*)(call Packet.getPayload (&segnalazione,NULL)); fine->code=sig.code; fine->nCiclo=sig.nCiclo; fine->wtx=sig.wtx; if(call AMSendFlooding.send(AM_BROADCAST_ADDR, &segnalazione,sizeof(asignal))==SUCCESS) atomic{busy=TRUE;flood=TRUE;} } } } else if(len == sizeof(pacchetto)){ dati=*((pacchetto*)payload); ricevuti[i].nCiclo=(uint8_t)(dati.nCiclo); /** attenzione 16 -> 8 byte**/ ricevuti[i].ptx=dati.ptx; //ricevuti[i].Mybattery=valBat; //ricevuti[i].Mytemp=valTemperature; //ricevuti[i].battery=dati.battery; ricevuti[i].lqi=call SetRadio.getLqi(msg); ricevuti[i].rssi=call SetRadio.getRssi(msg); ricevuti[i].wtx=dati.wtx; i++; } return msg; } event void Write.writeDone(storage_addr_t addr, void* buf, storage_len_t len, error_t error) { call Write.sync(); // assicuro la permanenza della scrittura in flash } event void TimerSend.fired() { // invio un pkt dato ogni TIMER_PERIOD_MILLI millisecondi call Leds.led1Off(); call Leds.led2Toggle();//quando invio lampeggia il led blu if(powerstate>=numPkg) { asignal* ftx=(asignal*)(call Packet.getPayload(&segnalazione,NULL)); ftx->code=code_stop; ftx->nCiclo=sig.nCiclo; ftx->wtx=TOS_NODE_ID; call TimerSend.stop(); 56 App. A. Algoritmo di analisi della connessione if(!busy){ if(call AMSendFlooding.send(AM_BROADCAST_ADDR,&segnalazione, sizeof(asignal))==SUCCESS) atomic{busy=TRUE;} } } else if(!busy){ pacchetto* pkg=(pacchetto*)(call Packet.getPayload(&pacchet,NULL)); pkg->code=code_pacchetto; pkg->nCiclo=tmpCiclo; pkg->wtx=TOS_NODE_ID;; //pkg->battery=valBat; //pkg->ptx=potenza; switch (powerstate){//seleziono la potenza di trasmissione case 20:potenza=27;break; case 40:potenza=23;break; case 60:potenza=19;break; case 80:potenza=15;break; case 100:potenza=11;break; case 120:potenza=7;break; case 140:potenza=3;break; case 160:potenza=31;break; default: break; } call SetRadio.setPower((message_t*)&pacchet,potenza);//setto la potenza della radio pkg->ptx=(uint8_t)(call SetRadio.getPower((message_t*)&pacchet)); if(call AMSendPacchetti.send(AM_BROADCAST_ADDR,&pacchet, sizeof(pacchetto))==SUCCESS){//spedisco atomic{busy=TRUE;} } powerstate++;//segno che ho inviato un altro pacchetto } } event void AMSendFlooding.sendDone(message_t* msg, error_t error) { //call Leds.set(0); busy=FALSE; } A.3 PeerC.h 57 event void AMSendPacchetti.sendDone(message_t* msg, error_t error) { busy=FALSE; } event void AMControl.stopDone(error_t error) { } event void Write.eraseDone(error_t error) { //call Leds.led0Off(); //call Leds.led2Off(); //call Leds.set(0); } event void Write.syncDone(error_t error) { call Leds.led0Off(); } /******************************* Seriale **************************/ /* Task per l’invio dei messaggi alla porta seriale */ task void sendSerialMsg() { if(lockedSerial){} else { serial_msg toSend = call QueuePing.dequeue(); serial_msg* rsm = (serial_msg*)call Packet.getPayload(&packet, NULL); atomic { rsm->wtx = toSend.wtx; rsm->nCiclo = toSend.nCiclo; rsm->rssi = toSend.rssi; // rsm->rss = toSend.rss; rsm->lqi = toSend.lqi; // rsm->channel = toSend.channel; rsm->ptx = toSend.ptx; } 58 App. A. Algoritmo di analisi della connessione if (call AMSendToSerial.send(AM_BROADCAST_ADDR, &packet, sizeof(serial_msg)) == SUCCESS) { lockedSerial = TRUE; } } if(!(call QueuePing.empty())) post sendSerialMsg(); else call Leds.set(ZERO); } /* Evento che segnala l’invio corretto di un mess alla seriale */ event void AMSendToSerial.sendDone(message_t* msg, error_t error) { if (&packet == msg) { lockedSerial = FALSE; call Leds.led0Toggle(); } } } Appendice B Algoritmo di consenso I files di lettura .txt dove sono memorizzati i valori di RSSI dei nodi devono essere rinomimati in questo modo: S n◦ nodo sorgentemoten◦ nodo in esame Ad esempio il file S1 mote2.txt è il file contenete i valori forniti dal nodo2 calcolati sul segnale ricevuto dal nodo1. Poi questi file devono essere importati come variabili nel workspace di MATLAB. In questa tesi basta importare il file variabiliIn.mat. A questo punto si può lanciare dal command window di Matlab l’applicazione consenso.m dove è sviluppapo l’algoritmo di consenso. B.1 consenso.m %%% Algoritmo di sincronizzazione dell’RSSI dei nodi di una WSN %%% %**************************************** % APPLICATION: consenso.m * % DATE: 14/11/2007 * % AUTHOR : Simone Cieno * % E-MAIL: [email protected] * %**************************************** % L’applicazione serve per sincronizzare il valore dell’RSSI in ogni % istante da ciascun nodo di una qualsiasi rete di sensori wireless. % L’applicazione è realizzata ad hoc per una rete formata da 4 sensori. % Nel caso si voglia applicare l’algoritmo ad una rete con un numero di % nodi superiori è necessario aggiornare la variabile "degree" che è il % numero di vicini con cui ogni nodo comunica ed aggiungere per ogni %matrice costruita all’interno del programma una riga ed una colonna. % L’applicazione carica in una matrice di input "y" i valori dell’RSSI 60 App. B. Algoritmo di consenso % di ciascun nodo.La matrice è cosı̀ costruita: % riga i-esima: RSSI ricevuto da nodo i-esimo relativo a nodo j-esimo % dove j è il numero della colonna associata. % % % % L’applicazione esegue quindi il calcolo di un offset (ocap) da sommare in ogni istante k al nodo contrassegnato per compensare l’erro re di misura esistente tra ogni coppia i-j. Il calcolo di tale offset viene eseguito tramite l’utilizzo dell’algoritmo "Metropolis weigth" % La matrice "ocap" è la mia matrice di uscita ossia quella con su ogni % riga i valori di offset da sommare ai 4 nodi per ogni istante (riga1-> % istante1 ecc...) %************************************************************************ degree = 3; % n◦ nodi vicini %%% Inizializzo a zero le variabili ocap e le pongo sulla prima riga del%%% la matrice ocap ocap(1,1)=0; ocap(1,2)=0; ocap(1,3)=0; ocap(1,4)=0; alfaj=1/(1+degree); % parametro derivato da Metropolis Weigth %%% Variabili usate per eseguire delle medie alla fine sumocap1=0; sumocap2=0; sumocap3=0; sumocap4=0; for k=1:900 % k= numero dei pkg su cui lavoro y1from2 = S2_mote1(k,1); y1from3 = S3_mote1(k,1); y1from4 = S4_mote1(k,1); % rssi ricevuti dal nodo 1 % Sx_mote1 nome del file in cui ho i pkg % del nodo1 ricevuti dal nodo x y2from1 = S1_mote2(k,1); y2from3 = S3_mote2(k,1); y2from4 = S4_mote2(k,1); % rssi ricevuti dal nodo 2 y3from1 = S1_mote3(k,1); y3from2 = S2_mote3(k,1); y3from4 = S4_mote3(k,1); % rssi ricevuti dal nodo 3 y4from1 = S1_mote4(k,1); B.1 consenso.m 61 y4from2 = S2_mote4(k,1); y4from3 = S3_mote4(k,1); % rssi ricevuti dal nodo 4 %%%%%% MATRICE INGRESSI %%%%%%%%% y=[0 y1from2 y1from3 y1from4; y2from1 0 y2from3 y2from4; y3from1 y3from2 0 y3from4; y4from1 y4from2 y4from3 0]; o12=y1from2-y2from1; o13=y1from3-y3from1; o14=y1from4-y4from1; % offset rssi relativo al nodo1 % serve solo a fini di controllo o21=y2from1-y1from2; o23=y2from3-y3from2; o24=y2from4-y4from2; % offset rssi relativo al nodo2 o31=y3from1-y1from3; o32=y3from2-y2from3; o34=y3from4-y4from3; % offset rssi relativo al nodo3 o41=y4from1-y1from4; o42=y4from2-y2from4; % offset rssi relativo al nodo4 o43=y4from3-y3from4; %%%%%% MATRICE OFFSET Oi %%%%%%%%% o=[o12 o13 o14; o21 o23 o24; o31 o32 o34; o41 o42 o43]; %%% Calcolo degli offset da sommare ad ogni nodo ---> ALGORITMO %%% DI CONSENSUS %******************************************************************* ocap1= ocap(k,1)+ alfaj*[(y(2,1)+ocap(k,2)- y(1,2)-ocap(k,1)) + (y(3,1)+ ocap(k,3)- y(1,3)-ocap(k,1)) + (y(4,1)+ocap(k,4)- y(1,4)-ocap(k,1))]; ocap2= ocap(k,2)+ alfaj*[(y(1,2)+ocap(k,1)- y(2,1)-ocap(k,2)) + (y(3,2)+ ocap(k,3)- y(2,3)-ocap(k,2)) + (y(4,2)+ocap(k,4)- y(2,4)-ocap(k,2))]; ocap3= ocap(k,3)+ alfaj*[(y(1,3)+ocap(k,1)- y(3,1)-ocap(k,3)) + (y(2,3)+ ocap(k,2)- y(3,2)-ocap(k,3)) + (y(4,3)+ocap(k,4)- y(3,4)-ocap(k,3))]; ocap4= ocap(k,4)+ alfaj*[(y(1,4)+ocap(k,1)- y(4,1)-ocap(k,4)) + (y(2,4)+ ocap(k,2)- y(4,2)-ocap(k,4)) + (y(3,4)+ocap(k,3)- y(4,3)-ocap(k,4))]; %******************************************************************* %%% pongo gli ocap calcolati su una nuova riga della matrice ocap ocap(k+1,1)=ocap1; 62 App. B. Algoritmo di consenso ocap(k+1,2)=ocap2; ocap(k+1,3)=ocap3; ocap(k+1,4)=ocap4; %%% aggiorno la somma (per poter eseguire una media alla fine) sumocap1=sumocap1+ocap1; sumocap2=sumocap2+ocap2; sumocap3=sumocap3+ocap3; sumocap4=sumocap4+ocap4; %******************************************************************* %%% calcolo i nuovi valori di RSSI stimati, ossia quello corretti y1from2Stim = y1from2 + ocap1; y1from3Stim = y1from3 + ocap1; %rssi ricevuti dal nodo 1 corretti y1from4Stim = y1from4 + ocap1; y2from1Stim = y2from1 + ocap2; y2from3Stim = y2from3 + ocap2; y2from4Stim = y2from4 + ocap2; %rssi ricevuti dal nodo 2 corretti y3from1Stim = y3from1 + ocap3; y3from2Stim = y3from2 + ocap3; y3from4Stim = y3from4 + ocap3; %rssi ricevuti dal nodo 3 corretti y4from1Stim = y4from1 + ocap4; y4from2Stim = y4from2 + ocap4; %rssi ricevuti dal nodo 4 corretti y4from3Stim = y4from3 + ocap4; %******************************************************************* %%% PROVE SUI CICLI DI NODI prima e dopo la correzione dell’algori%%% tmo ciclo n◦ 1 sumBef1234(k,1)=(y1from2-y2from1)^2+(y2from3-y3from2)^2+ (y3from4-y4from3)^2+(y4from1-y1from4)^2; sumAft1234(k,1)=(y1from2Stim-y2from1Stim)^2+(y2from3Stim-y3from2 Stim)^2+(y3from4Stim-y4from3Stim)^2+(y4from1Stim-y1from4Stim)^2; %%% ciclo n◦ 2 sumBef1243(k,1)=(y1from2-y2from1)^2+(y2from4-y4from2)^2+ (y4from3-y3from4)^2+(y3from1-y1from3)^2; sumAft1243(k,1)=(y1from2Stim-y2from1Stim)^2+(y2from4Stim-y4from2 Stim)^2+(y4from3Stim-y3from4Stim)^2+(y3from1Stim-y1from3Stim)^2; %%% ciclo n◦ 3 sumBef1324(k,1)=(y1from3-y3from1)^2+(y3from2-y2from3)^2+ (y2from4-y4from2)^2+(y4from1-y1from4)^2; sumAft1324(k,1)=(y1from3Stim-y3from1Stim)^2+(y3from2Stim-y2from3 Stim)^2+(y2from4Stim-y4from2Stim)^2+(y4from1Stim-y1from4Stim)^2; %%% ciclo n◦ 4 B.1 consenso.m 63 sumBef123(k,1)=(y1from2-y2from1)^2+(y2from3-y3from2)^2+ (y3from1-y1from3)^2; sumAft123(k,1)=(y1from2Stim-y2from1Stim)^2+ (y2from3Stim-y3from2Stim)^2+(y3from1Stim-y1from3Stim)^2; %%% ciclo n◦ 5 sumBef124(k,1)=(y1from2-y2from1)^2+(y2from4-y4from2)^2+ (y4from1-y1from4)^2; sumAft124(k,1)=(y1from2Stim-y2from1Stim)^2+ (y2from4Stim-y4from2Stim)^2+(y4from1Stim-y1from4Stim)^2; %%% ciclo n◦ 6 sumBef134(k,1)=(y1from3-y3from1)^2+(y3from4-y4from3)^2+ (y4from1-y1from4)^2; sumAft134(k,1)=(y1from3Stim-y3from1Stim)^2+ (y3from4Stim-y4from3Stim)^2+(y4from1Stim-y1from4Stim)^2; %%% ciclo n◦ 7 sumBef234(k,1)=(y2from3-y3from2)^2+(y3from4-y4from3)^2+ (y4from2-y2from4)^2; sumAft234(k,1)=(y2from3Stim-y3from2Stim)^2+ (y3from4Stim-y4from3Stim)^2+(y4from2Stim-y2from4Stim)^2; %***************************************************************** end % % % % % % % % Calcolo medie dell’ offset calcolato da aggungere a ciascun nodo per compensare l’errore. NB: è chiaro che i 4 ocap-i variano per ogni serie di valori di rssi di ingresso (in pratica per ogni ciclo, ossia per ogni riga della matrice y di input) e quindi la media è solo un valore indicativo ai fini della lettura, ma non possiamo usarla da aggiungere al singolo nodo perchè sarebbe troppo limitativo nella compensazione dello offset. mediaocap1=sumocap1/k; mediaocap2=sumocap2/k; mediaocap3=sumocap3/k; mediaocap4=sumocap4/k; Bibliografia [1] Ing. Davide Di Palma, Wireless Sensor Network (WSN), appunti di lezione , Università degli Studi di Firenze. [2] Luca Boscato, Tesi di laurea Analisi sperimentale di connettività e qualità del segnale per reti di sensori wireless, Università degli Studi di Padova, 2006/2007. [3] Ferrari, Flammini, Marioli, Sisinni, Taroni Sensori wireless: da wi-fi e bluetooth verso ZigBee e i nuovi standard emergenti, Dip. Elettronica per l’Automazione e INFM, Università di Brescia. [4] MoteIv Corporation, Tmote Sky Datasheet, www.moteiv.com. [5] Chipcon AS Products, CC2420 Datasheet, www.chipcon.com. [6] Texas Instruments, MSP430 Datasheet, www.ti.com. [7] Sensirion AG, SHTxx Datasheet, www.sensirion.com. [8] Hamamatsu Corporation, S1087 Datasheet, www.hamamatsu.com. [9] TinyOS operating system, www.tinyos.net. [10] Gay, Levis, Culler, Brewer, NesC 1.1 Language Reference Manual, Maggio 2003. [11] Prof. Ruggero Frezza, Stefano Dazzo, Luca Parolini, Riccardo Sala, Il problema della Localizzazione e dell’Autolocalizzazione in una Rete di Sensori Wireless, Dip. di Ingegneria dell’Informazione, Università degli Studi di Padova, 26 Settembre 2006. [12] Ing. Luca Schenato, appunti di lezione dal corso Progettazione di sistemi di controllo, Maggio 2007, Università degli Studi di Padova. [13] Lin Xiao, Stephen Boyd, Sanjay Lall A Scheme for Robust Distribuited Sensor Fusion Based on Average Consensus. [14] The MathWorks Inc. , www.mathworks.com. Elenco delle figure 1 Esempio di WSN per monitorare possibili incendi . . . . . . . . . 4 1.1 1.2 Classificazione delle reti in funzione dell’area coperta . . . . . . . Classificazione delle topologie di rete . . . . . . . . . . . . . . . . 8 8 2.1 2.2 2.3 le due faccie del Tmote-Sky . . . . . . . . . . . . . . . . . . . . . Antenna a microstriscia . . . . . . . . . . . . . . . . . . . . . . . Schema a blocchi del Tmote Sky . . . . . . . . . . . . . . . . . . . 12 14 15 3.1 3.2 3.3 Andamento RSSI rispetto alla potenza del campo elettromegnetico Raffigurazione stilizzata esperimento I . . . . . . . . . . . . . . . Offset di RSSI dei nodi variabili rispetto l’RSSI del nodo fisso con PA LEVEL 23 (prime 20 prove) . . . . . . . . . . . . . . . . . . . Offset di RSSI dei nodi variabili rispetto l’RSSI del nodo fisso con PA LEVEL 23 (seconde 20 prove) . . . . . . . . . . . . . . . . . . Offset di RSSI dei nodi variabili rispetto l’RSSI del nodo fisso con PA LEVEL 11 (prime 20 prove) . . . . . . . . . . . . . . . . . . . Offset di RSSI dei nodi variabili rispetto l’RSSI del nodo fisso con PA LEVEL 11 (seconde 20 prove) . . . . . . . . . . . . . . . . . . Offset di RSSI del nodo2 rispetto l’RSSI del nodo1 con PA LEVEL 23 (prime 20 misure) . . . . . . . . . . . . . . . . . . . . . . . . . Offset di RSSI del nodo2 rispetto l’RSSI del nodo1 con PA LEVEL 23 (seconde 20 misure) . . . . . . . . . . . . . . . . . . . . . . . . Offset di RSSI del nodo2 rispetto l’RSSI del nodo1 con PA LEVEL 11 (prime 20 misure) . . . . . . . . . . . . . . . . . . . . . . . . . Offset di RSSI del nodo2 rispetto l’RSSI del nodo1 con PA LEVEL 11 (seconde 20 misure) . . . . . . . . . . . . . . . . . . . . . . . . 20 22 Distribuzione dei sensori sul piano Offset RSSI link 1—2 . . . . . . . Offset RSSI link 1—3 . . . . . . . Offset RSSI link 1—4 . . . . . . . Offset RSSI link 2—3 . . . . . . . Offset RSSI link 2—4 . . . . . . . Offset RSSI link 3—4 . . . . . . . Nodo i che comunica con i vicini . 33 36 36 37 37 38 38 39 3.4 3.5 3.6 3.7 3.8 3.9 3.10 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 terra dell’edificio DEI/A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 23 25 25 26 26 27 28 68 ELENCO DELLE FIGURE 5.9 Schema stilizzato ciclo n◦ 1 . . . . . . . . . . . . . . . . . . . . . . 5.10 Medie delle somme dei quadrati delle differenze di RSSI eseguite sui cicli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 42 Elenco delle tabelle 2.1 Potenza della radio . . . . . . . . . . . . . . . . . . . . . . . . . . 13 5.1 5.2 5.3 Valori di ôi calcolati dall’algoritmo nei primi dieci istanti . . . . . 35 Medie degli offset di RSSI prima e dopo l’applicazione dell’algoritmo 35 Medie delle somme dei quadrati delle differenze di RSSI eseguite sui cicli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41