4.2 M´ ultiplos Fingerprint Maps
4.2.4 Algoritmo Direto e Ponderado
A vari´avel de orienta¸c˜ao que foi adicionada, no ˆambito deste projeto, `a t´ecnica de localiza¸c˜ao de an´alise de cena por fingerprinting permite que se possam criar diferentes ferramentas na procura de um posicionamento certeiro e de confian¸ca. Uma das tentativas de melhoramento destes indicadores foi a divis˜ao da utiliza¸c˜ao do Fingerprint Map orientado na fase online com a possibilidade do uso de dois algoritmos diferentes. Estes algoritmos tˆem como objectivo a escolha do mapa a utilizar isto ´e, fornecer aos algoritmos de estima¸c˜ao de posi¸c˜ao uma forma de avalia¸c˜ao e escolha sobre qual mapa constituinte do FM devem operar.
Foram desenvolvidos dois algoritmos distintos com diferentes metodologias, sendo estes o algoritmo direto e o algoritmo ponderado, para esta mesma finalidade. No primeiro pretende-se que o LEA calcule a posi¸c˜ao do terminal m´ovel na fase online a partir de um ´unico mapa escolhendo-o apropriadamente como ser´a explicado ainda nesta subsec¸c˜ao. No segundo, o algoritmo ponderado, pretende-se que o LEA devolva um resultado de posicionamento utilizando todos dos mapas constituintes e, por fim, dar um peso distinto a cada um dos resultados obtidos de acordo com o grau de perten¸ca de cada um deles.
O algoritmo direto pretende realizar uma escolha direta do mapa que ser´a usado como base para a aplica¸c˜ao do LEA resolvendo assim o problema da localiza¸c˜ao. Como j´a foi explicado na sec¸c˜ao 4.2 com as adi¸c˜oes deste projeto, o Fingerprint Map orientado ´e composto por um conjunto de mapas tradicionais, tantos quanto as dire¸c˜oes desejadas. Cada um destes mapas ´e caracterizado por uma orienta¸c˜ao, ao qual se d´a o nome de slice, que abrange um conjunto de valores em graus do circulo trigonom´etrico. A cada valor de azimute corresponde uma e apenas uma
slice. Como tamb´em j´a foi visto o tamanho destas slices varia conforme o n´umero de orienta¸c˜oes pretendidas para o mapa.
No algoritmo direto quando o terminal m´ovel pretende obter a sua localiza¸c˜ao corrente, ´e-lhe fornecido o valor da orienta¸c˜ao no momento e a fun¸c˜ao deste ´e decidir qual slice corresponde ao valor de azimute recebido. Quando a slice ´e determinada, atrav´es do m´etodo getSlice() que aceita como parˆametros o n´umero total de orienta¸c˜oes e o valor do ˆangulo corrente presente em Listagem5, simultanea- mente ´e escolhido o mapa sobre o qual ser´a feito o calculo da localiza¸c˜ao atrav´es do LEA desejado, podendo este ser qualquer um dos enumerados na subse¸c˜ao 4.2.3. Como esta slice do mapa se comporta como um mapa tradicional, o LEA ´e aplicado diretamente produzindo um resultado que dever´a ser o mais aproximado com a posi¸c˜ao real.
Listagem 5 M´etodo getSlice() - Obter a slice a partir do ˆangulo
public int getSlice(int numberOfMaps, double angle) {
int slice;
int result = 360 / numberOfMaps;
slice = (int) (angle / result);
return slice; }
Quando ´e usado o algoritmo ponderado a forma de procura e c´alculo do resultado ´e feita de forma diferente. Desta vez pretende-se estimar a localiza¸c˜ao do terminal m´ovel atrav´es da pondera¸c˜ao de v´arios resultados distintos tantos quanto o n´umero de mapas constituintes do FM, de acordo com o grau de perten¸ca de cada destes. O primeiro passo neste algoritmo ´e calcular os pesos associados a cada um dos mapas constituintes que ser´a tanto maior quanto maior for o grau de perten¸ca. O m´etodo que realiza esta opera¸c˜ao tem o nome de calcularPesosMedida() pertencente `a classe Fingerprint Map e cuja implementa¸c˜ao pode ser observada em Listagem 6.
Os passos para encontrar o grau de perten¸ca de cada mapa e simultaneamente os pesos dos resultados proporcionados por cada um s˜ao ent˜ao em primeiro lugar
4.2. M ´ULTIPLOS FINGERPRINT MAPS 91
Listagem 6 C´alculo dos pesos de cada mapa no resultado final - M´etodo calcularPesosMedida()
public double[] calcularPesosMedida(...) { (...)
doubletamanhoQuad = 360 / getNumberOfMaps();
int nMapas = getNumberOfMaps() − 1;
doubleintervaloQuad = tamanhoQuad − (2 ∗ alpha);
for (int i = 0; i < pesos.length; i ++) { centros [ i ] = 45 + (tamanhoQuad ∗ i); pesos[ i ] = 0;
}
if (getNumberOfMaps() == 1) { pesos [0] = 1;
}else {
doubleazim = bm.get(0).getAzimuth();
int slice = getSlice(azim);
doublelimiteEsquerdo = centros[slice ] − alpha;
doublelimiteDireito = centros[ slice ] + alpha;
if (azim <= limiteDireito && azim >= limiteEsquerdo) { pesos[ slice ] = 1;
}else if (azim > limiteDireito) {
if ( slice != nMapas) {
pesos[ slice ] = 1 − ((azim − limiteDireito) / intervaloQuad); pesos[ slice + 1] = 1 − pesos[slice ];
}else {
pesos[ slice ] = 1 − ((azim − limiteDireito) / intervaloQuad); pesos [0] = 1 − pesos[slice ];
}
} else if (azim < limiteEsquerdo) {
if ( slice != 0) {
limiteDireito = centros[ slice − 1] + alpha;
pesos[ slice ] = ((azim − limiteDireito) / intervaloQuad); pesos[ slice − 1] = 1 − pesos[slice ];
} else {
limiteDireito = centros[nMapas] + alpha;
pesos[ slice ] = ((360 − limiteDireito + azim) / intervaloQuad); pesos[nMapas] = 1 − pesos[slice]; } } returnpesos; } returnpesos; }
encontrar o n´umero de mapas constituintes do Fingerprint Map orientado utilizado. Sabendo o n´umero de mapas constituintes ´e poss´ıvel encontrar o n´umero de slices ou quadrantes que existem no mapa. Como segundo passo deve-se encontrar os centros e limites de cada uma das slices que caracterizam cada um dos mapas. Caso o valor do azimute proporcionado pelo terminal m´ovel se encontre dentro de um destes limites o peso recai todo para o mapa da slice correspondente sendo o comportamento do algoritmo igual ao algoritmo direto. Este valor de limite ou abertura da slice ´e vari´avel para efeitos de teste. Quando o valor de azimute n˜ao se encontra dentro da abertura de qualquer uma das slices ´e necess´aria uma pondera¸c˜ao do resultado, sendo que esta pondera¸c˜ao ´e dada pela distˆancia, em graus, do azimute de entrada
ao limite inferior da slice imediatamente a seguir e pela distˆancia deste mesmo ao limite superior da slice imediatamente antes. A Figura 4.8 pretende ilustrar com um exemplo este m´etodo.
Atrav´es da an´alise da Figura4.8pode-se observar um exemplo pr´atico do funcionamento da pondera¸c˜ao. Supondo, a t´ıtulo de exemplo, que o valor do azimute da amostra retirada na fase online fosse de 25◦, e que o Fingerprint Map orientado fosse composto
por quatro orienta¸c˜oes distintas ter´ıamos o resultado observado na figura. Seria calculada, com a ajuda do LEA, a posi¸c˜ao do terminal m´ovel para cada uma das slices obtendo quatro resultados distintos. O resultado final seria dado pela soma ponderada de cada um destes. Este m´etodo de c´alculo de posi¸c˜ao aproximada com pondera¸c˜ao ´e implementado nos pr´oprios algoritmos de estima¸c˜ao de posi¸c˜ao e tem o nome de getDynamicLocation(). Temos de uma maneira geral que:
P osx= n X i=1 (αn∗ xn); P osy = n X j=1 (αn∗ yn); (4.2) P osx= n X i=1 (α2n∗ xn); P osy = n X j=1 (α2n∗ yn); (4.3) Onde:
• P osx - Valor de X da localiza¸c˜ao do terminal m´ovel;
• P osy - Valor de Y da localiza¸c˜ao do terminal m´ovel;
• αn - Valor do peso para a slice n;
• xn - Resultado de X com a utiliza¸c˜ao do mapa da slice n;
• yn - Resultado de Y com a utiliza¸c˜ao do mapa da slice n;
No caso do exemplo da Figura 4.8, seriam dados os valores seguintes para os pesos da pondera¸c˜ao:
4.2. M ´ULTIPLOS FINGERPRINT MAPS 93 • α1 = 1 − 0.0833; • α2 = 0; • α3 = 0; • α4 = 1 − 0.9266; ´
E importante tamb´em notar que caso o mapa seja o tradicional, apesar de n˜ao adicionar nada de novo, funciona tamb´em com estes algoritmos sendo que a aplica¸c˜ao ´e direta.
Figura 4.8 – Exemplo de Pondera¸c˜ao dos Mapas
Depois de estes algoritmos estarem conclu´ıdos, decidiu-se dar-lhe uma outra funcionalidade, a possibilidade de obter pesos quadr´aticos, equa¸c˜ao 4.3. A forma de obten¸c˜ao dos
graus de perten¸ca de cada mapa e a obten¸c˜ao dos valores dos pesos respectivos ´e muito semelhante `a descrita anteriormente nesta sec¸c˜ao. Os testes e resultados obtidos com esta abordagem ser˜ao descritos no cap´ıtulo 5 desta disserta¸c˜ao.