tratamiento estadístico de...

53
Tratamiento Estadístico de Señales Instituto de Ingeniería Eléctrica - UdelaR Monografía Final: Filtro de Kalman para lápiz digitalizador Mauro Andrés Di Leonardi Borreani

Upload: others

Post on 29-Mar-2020

8 views

Category:

Documents


0 download

TRANSCRIPT

Tratamiento Estadístico de Señales Instituto de Ingeniería Eléctrica - UdelaR

Monografía Final:

Filtro de Kalman para lápiz digitalizador

Mauro Andrés Di Leonardi Borreani

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

Contenido Resumen .......................................................................................................................- 3 - Introducción y Motivación ...........................................................................................- 4 -

El proyecto LAPIX...............................................................................................- 4 - I El Filtro de Kalman....................................................................................................- 6 - II Modelo para el Filtro de Kalman ..............................................................................- 9 -

El modelo..................................................................................................................- 9 - III Discretización del modelo y parámetros ...............................................................- 11 -

Determinación de los parámetros ...........................................................................- 12 - Inicialización del Filtro.......................................................................................- 12 - Varianza del Ruido .............................................................................................- 12 - Potencia del Random – Walk .............................................................................- 13 -

Determinación de los valores óptimos del RW ..............................................- 15 - IV Simulaciones y Resultados Experimentales ..........................................................- 17 -

Simulación en Matlab.........................................................................................- 17 - Comprobación con el hardware..........................................................................- 20 - Desarrollo futuro ................................................................................................- 27 -

Conclusiones...............................................................................................................- 28 - ANEXOS....................................................................................................................- 29 -

Códigos utilizados en Matlab .................................................................................- 30 - Codigo utilizado en C (fragmento)........................................................................- 46 -

Referencias .................................................................................................................- 53 -

- 2 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

Resumen En el presente trabajo se realiza un filtro de Kalman para utilizar con un lápiz digitalizador. Se presenta el algoritmo a utilizar así como también un modelo adecuado para describir los movimientos de la punta de un lápiz. Se determinan los parámetros óptimos para el filtro mediante ensayos y se realizan pruebas para verificar el buen funcionamiento del mismo. Se muestra además la aplicación real del filtro agregado al driver del Proyecto LAPIX y finalmente se establecen posibles caminos a seguir para trabajos posteriores.

- 3 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

Introducción y Motivación Hoy en día la utilización de la tecnología ha llegado a puntos inimaginables hace muchos años. Disponemos de procesadores capaces de facilitarnos las tareas, que nos apoyan en lo cotidiano tanto a nivel de hogar como a nivel profesional. Interactuamos con esta tecnología de variadas formas, desde un teclado para introducir órdenes hasta poder dar comandos mediante la voz e incluso formas más complejas. Una extensión natural a la forma de interactuar, son los productos digitalizadores de escritura en sus variadas formas. Las posibilidades que brinda ésta funcionalidad son realmente extensas. Desde poder escribir directamente sobre una pantalla, guardar esas notas o enviarlas inmediatamente por email, o simplemente realizar actividades artísticas, hasta utilizarlo como sustituto de un mouse que además nos permite tomar notas. En un futuro podría sustituir completamente el uso de papel brindando un gran alivio ecológico. Es en este marco que surge el proyecto LAPIX, quien da origen al presente trabajo.

El proyecto LAPIX Dada la fuerte conexión del presente trabajo con dicho proyecto, se presenta una breve introducción al mismo con el fin de mejorar el entendimiento del trabajo situándonos en la problemática a resolver. El proyecto LAPIX consiste en la realización de un prototipo funcional de un lápiz digitalizador el cual funcionará con las computadoras del plan Ceibal, las XO. Se debe lograr escribir directamente sobre la pantalla (con todo lo que implica el hecho de que el trazo se sitúe justo debajo de la punta) y también fuera de ella. La tecnología utilizada para cumplir con estos objetivos es una conjunción ultrasonido-infrarrojo. Se debe conocer la posición de la punta del lápiz par luego poder representarla en pantalla. Para ello se utiliza el método del “rayo-trueno”. Este método es el que se utiliza si se quiere saber la distancia a la que cayó un rayo durante una tormenta. El método se basa en que se dispone de una señal rápida (rayo) y una señal lenta (trueno). Cuando vemos la señal rápida, activamos un contador hasta escuchar el trueno. Luego, asumiendo una velocidad para el sonido, podemos calcular a la distancia que cayó el rayo. Si disponemos de dos relojes separados una distancia x en lugar de 1, tenemos un punto dado por la intersección de dos circunferencias. Para el caso particular del proyecto, el infrarrojo hace las veces de señal rápida y el ultrasonido las veces de señal lenta. En la Figura 1 se muestra un esquema del funcionamiento del sistema.

- 4 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

Figura 1

Dada la naturaleza del proyecto, es decir utilizarlo para escribir en la pantalla, inmediatamente surge un contratiempo. Si el trazo que se despega en pantalla se ve afectado por ruido provocando que el mismo no quede similar al original o que su forma quede distorsionada, entonces no se estaría cumpliendo con la función de lápiz digitalizador. Esto hace necesario que el hardware se realice teniendo todas las precauciones posibles para la minimización de cualquier posible ruido. Sin embargo también hace necesario considerar la posibilidad de realizar filtrado por software. Es aquí donde entra el filtro de Kalman. Existen varias fuentes de ruido:

1. El generado por los circuitos 2. El generado en la recepción de ultrasonido 3. El generado en la recepción de IR

Particularmente, mientras transcurre el proyecto se cuenta con un jitter en la recepción del IR, que produce que el conteo no se exacto provocando variaciones del cursor en pantalla. Posteriormente se minimizaría este problema quedando como factores predominantes los mencionados.

- 5 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

I El Filtro de Kalman El filtro de Kalman presenta particularidades que lo hacen el candidato adecuado para nuestra aplicación. La solución del filtro es computada recursivamente, en particular cada actualización es hallada directamente de la anterior y de la nueva medición obtenida por lo que solo es necesario guardar la estimación anterior. Además es más eficiente que hallar la estimación utilizando todos los datos anteriores. Dado que nuestro sistema correrá en una máquina donde la cantidad de recursos esta limitada, cada optimización de los mismos que se pueda realizar es bienvenida. El filtro de Kalman se basa en la descripción del sistema en variables de estado:

⎩⎨⎧

+=+Φ=+

)()()()()()()()1(

krkxkCkykwkxkkx

Ec. 1. 1

Donde:

)(kx : estados del proceso (nx1) )(kΦ : dinámica del proceso (nxn) )(kw : ruido blanco de media nula (nx1) )(ky : mediciones (mx1) )(kC : matriz de observaciones (mxn)

)(kr : ruido blanco de media nula (mx1) Diagrama de funcionamiento del filtro El filtro funciona según el diagrama de la Figura 1. 1 Luego de la inicialización del filtro (k=0) se realiza la primer proyección (k=1). En base a la misma se calcula la ganancia de Kalman y cunando de obtiene la medición ‘y’ se actualiza la estimación realizada previamente. Posteriormente se calcula la matriz P y se realiza la nueva proyección. En la Ec. 1. 2 se listan las expresiones mediante las cuales se hallan las proyecciones, la ganancia y se actualiza el estimador en el filtro de Kalman.

- 6 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

Inicialización

−0x̂ −0P

Ganancia

kK

Matriz P

kP

Proyección −+1ˆ kx

−k+1P

Actualización delEstimador

Medicion

y kk xx →−

Figura 1. 1 : Diagrama de funcionamiento del filtro de Kalman

Ecuaciones del Filtro de Kalman Proyección

−−+ Φ= kkk xx ˆˆ 1

k

Tkkkk QPP +ΦΦ=−

+1

Ganancia

[ ] 1−−− += kTkkk

Tkkk RCPCCPK

Actualización del Estimador

[ ]−− −+= kkkkkk xCyKxx ˆˆˆ Covarianza del error

( ) −−= kkkk PCKIP

Ec. 1. 2

- 7 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

Observaciones sobre la utilización Cabe destacar que en gral el filtro se utiliza para realizar una predicción del siguiente paso del proceso. Es decir, en general lo que se busca como salida, es la proyección del siguiente estado −

+1ˆ kx . En nuestro caso en particular lo que nos interesa es realizar una disminución del ruido y lograr suavizar el trazo que se aprecia en pantalla, por lo que no es adecuado, y no tiene sentido, tomar la estimación de la posición siguiente. En su lugar, lo que se tomará como salida del filtro será la actualización del estimador, es decir kx̂ . Lo que se logra con esto, es que en base al modelo y a las mediciones anteriores se realiza una estimación de la posición, luego, cuando llega la medición, la cual esta contaminada con ruido, se actualiza el estimador y de este modo se contrasta el modelo con la medición ruidosa obteniendo una serie de posiciones correlacionadas entre si donde se disminuye el efecto del ruido y se suaviza el trazo. En la Figura 1. 2 se muestra el esquema de utilización.

Ganancia

kK

Matriz P

kP

Proyección −+1ˆ kx

−+1kP

Actualización delEstimador

kk xx →−

Salida del Filtro

kx̂ Figura 1. 2 : Esquema de utilización del filtro de Kalman

- 8 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

II Modelo para el Filtro de Kalman Dado que el filtro será utilizado con un lápiz digitalizador se hace necesaria la introducción de un modelo adecuado para representar los movimientos de una punta de un lápiz al escribir y/o realizar distintos tipos de trazos. El modelo encontrado, luego de una extensa búsqueda en la Web, sale del trabajo para el doctorado del Sr. Mario Enrique Munich [1]. El mismo trata de una aplicación digitalizadora donde utilizan la diferencia cuadro a cuadro, mientras escribe, para ver donde se ha generado trazo. En el mismo utilizan un filtro de Kalman para predecir la posición de la punta de modo de no tener que realizar la diferencia de todo el cuadro, implicando esto más procesamiento, pudiendo analizar solo el sector donde se predice estará la punta.

El modelo La consigna es que el filtro prediga la posición más probable de la punta basándose en la posición, velocidad y aceleración anteriores. De la referencia mencionada anteriormente, se tiene que la mejor forma para cumplir con éste objetivo es asumir un modelo de Random-Walk para la aceleración de la punta del lápiz. El denominado “Random-Walk” (o RW) es una formalización matemática para representar una trayectoria que consiste en realizar pasos aleatorios sucesivos. Debe su nombre del ejemplo de una persona que toma pasos de largo fijo en direcciones arbitrarias al desplazarse. Tiene aplicaciones en variados campos, por ejemplo se utiliza para modelar la trayectoria de una molécula al viajar en un líquido o en un gas, el camino realizado por un animal salvaje, etc. Desde un punto de vista más formal, el proceso de Random-Walk resulta cuando señales no correlacionadas son integradas. La ecuación en variables de estado que representa el random walk es la siguiente:

wx =&

Ec. 2. 1

[ ] )()()()( τδτ −= ttqwtwEDonde se tiene que y w representa un ruido, que en nuestro caso sea blanco aditivo y Gaussiano. El diagrama de la Figura 2. 1: Random Walk representa el proceso.

x w ∫

Figura 2. 1: Random Walk

- 9 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

En la forma discreta, se tiene:

kkk wxx +=+1

Ec. 2. 2

En el caso del modelo a utilizar, se asume random walk para la aceleración, esto sería:

wa =&kkk waa +=+1

Ec. 2. 3

Visto entonces la forma de expresar la suposición de RW para la aceleración, y considerando las ecuaciones de cinemática para la velocidad y posición, se tiene que el modelo queda de la siguiente forma Ec. 2. 4:

⎪⎪⎩

⎪⎪⎨

+====

)()()()()()()()()(

tntxtytntatatvtvtx

y

a&

&

&

Ec. 2. 4

Donde:

• x(t),v(t) y a(t) son las componentes bidimensionales de la posición, velocidad y aceleración de la punta respectivamente.

• na(t) y ny(t) son ruido blanco, aditivo Gaussiano y de media nula.

La salida del modelo, y(t), es la posición de la punta contaminada con ruido blanco. Para poder utilizar el modelo presentado, se debe obtener la forma discreta del mismo dado que se trabajará con un sistema discreto por naturaleza. En la siguiente sección se presenta la discretización del modelo junto con la elección de los parámetros del mismo.

- 10 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

III Discretización del modelo y parámetros El modelo presentado en la ecuación Ec. 2. 4, representa una situación continua. Sin embargo el caso de aplicación es discreto por naturaleza dado que se trabaja con muestras de la posición de la punta. En las referencias [1], [2] y [3] se encuentran las bases para la discretización del modelo. La versión discreta del modelo sería la presentada en la ecuación Ec. 3. 1

⎪⎪

⎪⎪

+=+=++=+

++=+

)()()()()()1(

)()()1(

)(21)()()1(

knkxkyknkaka

kakvkv

kakvkxkx

y

a

Ec. 3. 1

Si llamamos ahora A, a la matriz de transición y C a la matriz de observación, el modelo expresado en notación matricial sería como sigue:

⎩⎨⎧

+=+=+

)()()()()()()1(

knkXkCXkyknkAXkX

y

X

Ec. 3. 2

Donde,

⎥⎥⎥

⎢⎢⎢

⎡=

)()()(

)(kakvkx

kX ⎥⎥⎥

⎢⎢⎢

⎡=

)(00

)(kn

kn

a

X

⎥⎥⎥⎥⎥⎥⎥⎥

⎢⎢⎢⎢⎢⎢⎢⎢

=

1000000100001010000101005.001010

05.00101

A ⎥⎦

⎤⎢⎣

⎡=

000010000001

C

- 11 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

⎥⎦

⎤⎢⎣

⎡=

y

y

nn

kR0

0)(

⎥⎥⎥⎥⎥⎥⎥⎥

⎢⎢⎢⎢⎢⎢⎢⎢

=

ay

ax

nn

kQ

0000000000000000000000000000000000

)(

Donde en la matriz R(k) se esta asumiendo que el ruido afecta a las dos componentes de igual manera, y en la matriz Q(k) se hace una diferencia en las varianzas del Random-Walk según sea la componente x o y. Esto nos da 2 posibles parámetros a variar de modo de optimizar el funcionamiento del filtro. Los valores de la potencia del ruido serán determinados en base a las especificaciones del sistema. Luego se escriben las ecuaciones del filtro de Kalman en base a las expresadas en la ecuación Ec. 1. 2 Como observación del modelo, notar que se asumen las matrices Q y R invariantes en el tiempo y diagonales, esto implica que las medidas así como las componentes de estado no están correlacionadas. Las únicas componentes con incertidumbre en el modelo son las aceleraciones. Asumir que éstas no están correlacionadas no es de lo mas real dado que al escribir los músculos que controlan el movimiento de la punta no mueven a esta en la dirección x e y independientemente. Sin embargo de esta forma se logra una primera aproximación al problema.

Determinación de los parámetros

Inicialización del Filtro Para realizar la inicialización del filtro, se toma como primer elemento el vector nulo, y como matriz P se toma la dada en el paper de Munich, esto es:

⎥⎥⎥⎥⎥⎥⎥⎥

⎢⎢⎢⎢⎢⎢⎢⎢

=

000000

0X

⎥⎥⎥⎥⎥⎥⎥⎥

⎢⎢⎢⎢⎢⎢⎢⎢

=

5

5

2

2

0

1000000010000000100000001000000010000001

ee

ee

P

Varianza del Ruido Para poder realizar las simulaciones se debe asumir un valor de ruido que se estima se tendrá en la realidad.

- 12 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

Dado que el hardware del proyecto LAPIX, con el cual se utilizará el filtro, se realizó intentando minimizar todas las posibles fuentes de ruido, se espera que éste no sea extremadamente grande. Sin embargo para realizar las simulaciones se supondrá el peor caso, es decir que el ruido este en los límites de las especificaciones del sistema. Como condición, se acordó con el cliente que el sistema debería tener una exactitud de 0.5mm, por loquee durante las simulaciones se supondrán ruidos que hagan exceder dicho valor para poder evaluar realmente la performance del filtro de Kalman.

Potencia del Random – Walk Como se mencionaba anteriormente, el sistema posee dos grados de libertad, estos son las varianzas y . El valor de las mismas afecta rotundamente el desempeño del filtro y son determinantes en la efectividad del mismo.

aynaxn

Empíricamente, se puede observar que cuanto mas grande sean dichas varianzas, mas fácilmente se sigue a la señal, sin embargo esto tiene como contraparte que también se sigue al ruido. Si por otro lado ponemos valores muy pequeños, se observa una salida del sistema libre de todo ruido y con trazos de curvatura elegante, pero que no siguen fielmente el camino del trazo original. Como ejemplo de lo mencionado, en la Figura 3. 2: Ejemplo con alta potencia de Random - Walk se muestra un trazo con forma de sinusoide al que se le adiciono un ruido blanco. En este caso el filtro se implemento con valores altos de potencia de Random – Walk. Como resultado de ello se tiene que se sigue exactamente al trazo original, pero también al ruido contaminante, por lo que la señal filtrada se ve muy afectada por el ruido. Para este caso 001.0=ayn04.0=axn y . En cambio, en la Figura 3. 1 se corre el filtro con valores pequeños de RW. Se puede ver claramente que el trazo queda con curvaturas excelentes (a), sin embargo los cambios en la trayectoria se siguen pero con algo de “retraso” (b).

- 13 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

0 5 10 15 20 25 30 350

5

10

15

20

Coordenadas reales

0 5 10 15 20 25 30 35-5

0

5

10

15

20Coordenadas Estimadas (varRuido = 10 varRandomWalkEjex= 5.000000e-009 varRandomWalkEjeY= 5.000000e-007)

0 5 10 15 20 25 30 350

5

10

15

20Coordenadas con ruido

0 5 10 15 20 25 30 35-5

0

5

10

15

20

Centimetrtos

Cen

timet

rtos

Comparacion coordenadas reales, ruidosas y estimadas (varRuido = 10 varRandomWalkEjex= 5.000000e-009 varRandomWalkEjeY= 5.000000e-007)

Coordenadas RealesCoordenadas estimadascoordenadas Ruidosas

Figura 3. 1: Ejemplo con baja potencia de Random - Walk

0 5 10 15 20 25 30 350

5

10

15

20Coordenadas reales

0 5 10 15 20 25 30 350

5

10

15

20Coordenadas Estimadas (varRuido = 10 varRandomWalkEjex= 4.000000e-002 varRandomWalkEjeY= 1.000000e-003)

0 5 10 15 20 25 30 350

5

10

15

20Coordenadas con ruido

Figura 3. 2: Ejemplo con alta potencia de Random - Walk

En si se tiene un trade-off entre que tanto se puede disminuir el ruido y que tanto se puede seguir fielmente a la señal.

- 14 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

Determinación de los valores óptimos del RW A los efectos de determinar los valores óptimos para las potencias del RW, se realiza un algoritmo el cual ensaya posibles combinaciones de valores y devuelve la que haya tenido mejor desempeño. Para tales efectos se hace necesaria una forma objetiva de medir la efectividad de una combinación de valores de y dada. aynaxn El candidato mas intuitivo, y el que se utilizara para dichos efectos, es la distancia media cuadrática punto a punto. Se tomará el total de las distancias punto a punto al cuadrado y se divide entre la cantidad de muestras. Esto es:

( )N

yyxxDist i iEiRiEiR∑ −+−

=22 )()(

Ec. 3. 3

Donde el subíndice R denota “real” y el E “estimada”. N es la cantidad de muestras. Para correr el algoritmo se utiliza un trazo generado mediante Matlab, con la funcionalidad de obtener la posición del puntero. El programa utilizado se puede encontrar en el anexo.. Posteriormente, a dicho trazo se le adiciona ruido blanco, Gaussiano y de media nula. La varianza de éste ruido será de var = 10, medido en píxeles. Esto, de acuerdo a la resolución de la pantalla donde se tomaron las muestras, da una varianza en mm de varmm = 2.7. Con este valor de varianza se tiene una desviación estándar de ~ 5mm con lo que estamos en el pero caso para las especificaciones. Luego obtener la señal contaminada, se crea una matriz con todas las combinaciones posibles, y razonables, de y y se pasa la misma por el filtro tantas veces como combinaciones halla.

aynaxn

El hecho de probar un gran número de combinaciones con un ruido en particular, puede provocar que el resultado obtenido no se verdaderamente el óptimo sino que sea un caso particular para los valores de ruido adicionados en ese caso. Entonces surgen dos posibilidades: 1 - Se realizan todas las combinaciones posibles, y se ensaya cada una varias veces con varios ruidos distintos. Para cada una se halla la distancia a la señal real. Finalmente se promedian todas las distancias para una combinación y luego se elije entre todas las combinaciones la que haya tenido la menor distancia promedio.

- 15 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

2 - Se forman todas las combinaciones y se hall la combinación óptima varias veces. Finalmente se promedian las combinaciones óptimas halladas. Se opta por evaluar ambas posibilidades y elegir la que tenga mejor desempeño. Dado que existe una infinidad de combinaciones posibles para los valores de y se prueba en primera instancia, empíricamente paral lograr obtener una idea de por donde buscar el valor.

ayn axn

Una vez hecho esto se obtiene que en gral, se obtienen buenos resultados trabajando con valores bajos de RW. Se realiza entonces una primer etapa de estimación mediante la cual se determina el orden. Se prueba con los valores 5x10-1,5x10-2….5x10-9 para ambas variables. Luego de la prueba, realizada con la señal mostrada en la Figura 3. 1 se obtiene que el mejor orden es 10-7 para la dirección X y 10-5 para la dirección Y. Una vez determinado esto, se realizan las pruebas según el método 1 y 2 para los siguientes intervalos: [1:0.1:9]x1e-6 [1:0.1:9]x1e-7 [1:0.1:9]x1e-8 [1:0.1:9]x1e-4 [1:0.1:9]x1e-5 [1:0.1:9]x1e-6 Se realiza la prueba con 100 ruidos para cada combinación para el método 1 y se hallan, según el método 2, 100 valores óptimos. Los resultados obtenidos son los siguientes: Método 1 Método 2

axn 71094.1 −x 710966.1 −x

ayn 51062.3 −x 5104520.3 −x Distancia obtenida 0.0864 0.0223

Evaluando las distancias obtenidas, se puede ver que el método 2 dos logra mejor performance Entonces, finalmente se obtiene que los valores óptimos para la varianza del RW, medido en píxeles con una relación de 96 píxeles por pulgada es:

710966.1 −= xnax 5104520.3 −= xnay

- 16 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

IV Simulaciones y Resultados Experimentales Luego de haber determinado los valores óptimos para la potencia del random – walk en las direcciones x e y se realizan algunas simulaciones para comprobar el desempeño del filtro. Se obtuvieron dos tipos de datos para realizar las simulaciones, datos generados mediante Matlab y datos reales obtenidos directamente de hardware con el cual se utilizará el filtro. En un principio los resultados arrojados por las simulaciones no eran nada alentadores, sin embargo eso se debía a que, si bien en Matlab se fijaba una frecuencia de muestreo de 1/75 en analogía a la utilizada por el hardware de LAPIX, la cantidad de muestras tomadas no se condecía con la esperada. Una vez solucionado éste problema si lograron obtener resultados que mostraban el buen funcionamiento.

Simulación en Matlab Para evaluar el comportamiento del filtro previo a su utilización en LAPIX se realizan simulaciones utilizando un trazo generado artificialmente. Se realizan varias simulaciones utilizando un mismo trazo y variando la componente de ruido. En primera instancia se utiliza la misma potencia de ruido utilizada para la búsqueda de la potencia óptima de RW. En la Figura 4. 1 puede observarse dicha simulación. Si se contrasta a simple vista el trazo real con el estimado (Figura 4. 2) se aprecia cierta diferencia la cual puede no ser aceptable para una aplicación de lápiz digitalizador. Sin embargo, si se incluye la componente de ruido y se comparan las 3 señales (Figura 4. 3), se puede apreciar claramente que el efecto del filtro es muy beneficioso. Es decir, si bien no se ha representado exactamente el trazo, en una aplicación real (con éstas condiciones de ruido) es preferible tener las pequeñas desviaciones que se aprecian a tener un trazo totalmente distorsionado por la componente de ruido. Se puede ver además (Figura 4. 4) la convergencia del filtro, el error decae por debajo de un umbral y se mantiene salvo algunos puntos.

- 17 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

0 5 10 15 20 25 30 350

5

10

15

20Coordenadas reales

0 5 10 15 20 25 30 350

5

10

15

20Coordenadas Estimadas (varRuido = 10 varRandomWalkEjex= 1.966000e-007 varRandomWalkEjeY= 3.452000e-005)

0 5 10 15 20 25 30 350

5

10

15

20Coordenadas con ruido

Figura 4. 1

0 5 10 15 20 25 30 350

2

4

6

8

10

12

14

16

18

Centimetrtos

Cen

timet

rtos

Comparacion coordenadas reales y estimadas (varRuido = 10 varRandomWalkEjex= 1.966000e-007 varRandomWalkEjeY= 3.452000e-005)

Coordenadas RealesCoordenadas estimadas

Figura 4. 2

0 5 10 15 20 25 30 350

2

4

6

8

10

12

14

16

18

Centimetrtos

Cen

timet

rtos

Comparacion coordenadas reales, ruidosas y estimadas (varRuido = 10 varRandomWalkEjex= 1.966000e-007 varRandomWalkEjeY= 3.452000e-005)

Coordenadas RealesCoordenadas estimadascoordenadas Ruidosas

Figura 4. 3

- 18 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

0 50 100 150 200 250 300 350 400 4500

5

10

15

20

25Error cuadrático medio

punto

erro

r (pi

xele

s)

Figura 4. 4

A los efectos de lograr evaluar la robustez del filtro se generan condiciones de ruido realmente adversas, como ser varruido=20pixeles, que sería equivalente a considerar una varianza de mas de 5mm (considerando 96 píxeles cada 2.54cm). Luego de varias simulaciones, se logró comprobar que recién luego de los 150 píxeles de potencia de ruido (~40mm) el trazo filtrado se tornaba indistinguible (Figura 4. 5). Sin embargo, a simple vista es totalmente imposible distinguir el trazo en la señal contaminada.

0 5 10 15 20 25 30 350

5

10

15

20Coordenadas reales

0 5 10 15 20 25 30 35-5

0

5

10

15

20Coordenadas Estimadas (varRuido = 150 varRandomWalkEjex= 1.966000e-007 varRandomWalkEjeY= 3.452000e-005)

-10 -5 0 5 10 15 20 25 30 35 40-10

0

10

20

30Coordenadas con ruido

Figura 4. 5: Evaluación de robustez frente al ruido

Dado que las muestras “artificiales” no garantizan que se estuviese en idénticas condiciones a las cuales se va a utilizar en la realidad, mas precisamente no esta garantizada la frecuencia de muestreo de 75Hz, se hace necesario una prueba en condiciones reales. Para tales efectos, utilizando el driver del Proyecto, el cual estaba en ese momento en parte desarrollado, se toman muestras de un trazo generado con el hardware a utilizar. Cabe destacar, que en dicha etapa se atravesaba una etapa problemática donde la

- 19 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

presencia de cierto jitter (causado por un problema de hardware) provocaba grandes errores en la medición del tiempo (parámetro fundamental utilizado para la determinación de la ubicación de la punta). Debido a esto, el trazo en pantalla se tornaba gravemente distorsionado y era totalmente inaceptable. Luego de pasar el trazo muestreado por el filtro en Matlab se tuvo la primera comprobación del que el filtro podría funcionar (en orden cronológico, primero funcionó dicha simulación a las realizadas con trazos artificiales en Matlab!). Lo que se observa en la Figura 4. 6 es el resultado de dicho filtrado. Si bien se carece de una señal “ideal” con la cual contrastar se puede observar como el filtro logra rechazar el jitter que se tenía en ese momento, y produce un trazo mas limpio y sin las variaciones causadas por el error en la medición.

-400 -200 0 200 400 600 800 10000

200

400

600

800

1000

1200

1400

Pixeles

Pix

eles

Comparacion coordenadas reales y estimadas (varRuido = 60 varRandomWalkEjex= 1.966000e-007 varRandomWalkEjeY= 3.452000e-005)

Coordenadas RealesCoordenadas estimadas

Figura 4. 6: Filtrado de muestras reales

Comprobación con el hardware Luego de las simulaciones descriptas anteriormente, como comprobación final de funcionamiento lo que resta es evaluar el desempeño en la realidad. Para ello se realiza un código equivalente al programado en Matlab pero en lenguaje C, el cual es utilizado para el Driver de LAPIX. Se realiza una primera versión con la cual se hacen las pruebas. Esta versión., dado los tiempos que se disponían en el momento, se enfoca mas en la funcionalidad que en la utilización óptima de los recursos computacionales. En el anexo se encuentran las funciones y declaraciones realizadas dentro del driver. Una interrogante planteada en el momento de la implementación es en que etapa del driver es mejor colocar el filtrado. El driver funciona según el siguiente esquema:

1. Se obtienen los valores de los timers 2. Se hallan los puntos de corte 3. Se convierten a un sistema cartesiano

- 20 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

4. Mediante transformadas se lleva al sistema de la pantalla teniendo en cuenta la calibración.

5. Se desplega en pantalla Colocarlo justo luego del punto 1 no es aceptable dado que en ocasiones, al hallar los puntos de corte se descartan muestras dado que no existe punto se corte, por lo que se gastaron recurso que luego no se utilizaron De las otras opciones se elije realizar el filtrado justo antes de desplegar en pantalla. Se entiende que esto arrojará mejores resultados, además es mucho mas sencillo obtener datos de varianza y otros en dicho punto. Para lograr un funcionamiento óptimo con el hardware desarrollado, se debe determinar la varianza que se tiene en pantalla de modo de poder introducir los parámetros en el filtro. Para ello se toman muestras con el lápiz estático en 5 puntos de la pantalla (las cuatro esquinas y el centro) (Figura 4. 7) se halla la varianza en cada punto en particular y finalmente se promedian los valores.

28.98 29 29.02 29.04 29.06 29.08 29.1 29.12 29.14 29.16-3.18

-3.16

-3.14

-3.12

-3.1

-3.08

-3.06

-3.04

centimetros

cent

imet

ros

Varianza antes de filtrar, esquina 2

Figura 4. 7: Ejemplo varianza en esquina 2 (superior derecha)

De lo anterior resulta:

varX = 4.2975 pix varY = 2.2396 pix

Estos fueron evaluados con una relación de 0.0322cm/pix, por lo que en mm sería:

varX = 1.3849mm varY = 0.7217mm

Una vez cargados estos valores en el filtro, así como también los de RW, se toman muestras de varios tipos de trazos.

- 21 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

En las figuras Figura 4. 8 a Figura 4. 16 se pueden ver algunos ejemplos muestreados directamente con el hardware y software a utilizar. En las figuras Figura 4. 17 a la Figura 4. 21 se pueden ver ejemplos de escritura hechos con kolourPaint (aplicación tipo “paint” para Ubuntu). Si hallamos la varianza nuevamente, pero justo después del filtrado obtenemos que ésta descienda respecto a la tomada antes del filtro, lo que avala que éste es capaz de lograr una reducción de la misma

varX (pix) varY (pix) 4.2975 2.2396 Antes de Filtrar 3.3619 1.4177 después del Filtrado

Se logra una disminución de aproximadamente un 20% en el eje X y un 37% en el eje Y.

0 5 10 15 20 25 30 35-18

-16

-14

-12

-10

-8

-6

-4

-2

eje x (centimetros)

eje

y (c

entim

etro

s)

Muestras sin filtrar

Figura 4. 8

0 5 10 15 20 25 30 35-20

-18

-16

-14

-12

-10

-8

-6

-4

-2

eje x (centimetros)

eje

y (c

entim

etro

s)

Muestras filtradas

Figura 4. 9

- 22 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

0 5 10 15 20 25 30 35-20

-18

-16

-14

-12

-10

-8

-6

-4

-2

eje x (centimetros)

eje

y (c

entim

etro

s)

Comparacoin trazo filtrado v.s. trazo sin filtrar

Trazo sin filtratTRazo filtrado

Figura 4. 10

6 8 10 12 14 16 18 20 22 24-18

-16

-14

-12

-10

-8

-6

eje x (centimetros)

eje

y (c

entim

etro

s)

Muestras sin filtrar

Figura 4. 11

6 8 10 12 14 16 18 20 22 24-18

-16

-14

-12

-10

-8

-6

eje x (centimetros)

eje

y (c

entim

etro

s)

Muestras filtradas

Figura 4. 12

- 23 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

6 8 10 12 14 16 18 20 22 24-18

-16

-14

-12

-10

-8

-6

eje x (centimetros)

eje

y (c

entim

etro

s)

Comparacoin trazo filtrado v.s. trazo sin filtrar

Trazo sin filtratTRazo filtrado

Figura 4. 13

4 6 8 10 12 14 16 18 20 22 24-20

-15

-10

-5

eje x (centimetros)

eje

y (c

entim

etro

s)

Muestras sin filtrar

Figura 4. 14

4 6 8 10 12 14 16 18 20 22 24-20

-15

-10

-5

eje x (centimetros)

eje

y (c

entim

etro

s)

Muestras filtradas

Figura 4. 15

- 24 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

4 6 8 10 12 14 16 18 20 22 24-20

-15

-10

-5

eje x (centimetros)

eje

y (c

entim

etro

s)

Comparacoin trazo filtrado v.s. trazo sin filtrar

Trazo sin filtratTRazo filtrado

Figura 4. 16

Figura 4. 17

Figura 4. 18

- 25 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

Figura 4. 19

Figura 4. 20

- 26 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

Figura 4. 21

Desarrollo futuro Como posibilidad que se manejo en su momento pero que debido razones de tiempo no se logró implementar surge la idea de realizar cambios en la varianza del ruido del modelo a medida que se realizan los trazos. Como se pudo comprobar al tomar muestra en la pantalla la varianza cambia según la distancia al receptor. Una posibilidad de mejora, a cual habría que evaluar el costo-beneficio, ir calculando la distancia al receptor e ir cargando valores de varianza previamente fijados. Evidentemente esta opción debe ser analizada ya que puede tener un impacto adverso sobre el filtrado.

- 27 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

Conclusiones En el presente trabajo, se encontró y aplico un modelo para construir un filtro de Kalman para un lápiz digitalizador. Se evaluó el funcionamiento del modelo en variadas condiciones para determinar su grado de aplicabilidad. Además se determinaron los parámetros óptimos para su funcionamiento. De todas las pruebas realizadas, se pudo comprobar su buen funcionamiento y aplicabilidad a la resolución del problema planteado. Se vio que el modelo presenta una gran robustez en condiciones de grandes componentes de ruido Se logro además implementar el filtro en la realidad como parte del Driver utilizado en el proyecto LAPIX, comprobando su funcionalidad y además que realiza un suavizado del trazo desplegado en pantalla convirtiéndolo en una herramienta óptima y fundamental en éste tipo de aplicaciones. A continuación se presenta un resumen de los parámetros utilizados por el modelo.

Vector inicial Vector nulo

Matriz P0 diag([1 1 10e-2 10e-2 10e-5 10e-5])

Varianza del ruido dirección X 10 pix

Varianza del ruido dirección Y 10 pix

Varianza RW dirección X 1.9660e-007 pix (96 pix/inch)

Varianza RW dirección Y 3.4520e-005 pix (96 pix/inch)

- 28 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

ANEXOS

- 29 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

Códigos utilizados en Matlab timerCallback.m function timerCallback(timerObj,event,str_arg) % esta función se ejecuta cada vez que se dispara el objeto % lectura de las coordenadas coords = get(0,'PointerLocation'); % imprimo en pantalla fprintf('x: %4i y: %4i\n',coords) end % función GerarTrazo.m clear all clc close all Period = inv(75); timerObj = timer('TimerFcn',@timerCallback,'Period',Period) set(timerObj,'ExecutionMode','fixedRate') % ahora cambiarle el atributo de single shoot %seteo a ceentimetros (opcional) %set(0,'Unit','Centimeters') start(timerObj); (...) stop(timerObj)

- 30 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

Función Kalman Filt function [CoordEsti,ProyX,ProyP] = KalmanFilt(Xk_,Pk_,y,A,C,Qk,Rk) %Calculo Kk(i) Kk = Pk_*C'*inv(C*Pk_*C' + Rk); %Actualizo el estimador Xk = Xk_ + Kk*(y - C*Xk_); %Hallo Pk(i) Pk = (eye(6) - Kk*C)*Pk_; % Hallo la Proyecci´ones Xk_ = A*Xk; Pk_ = A*Pk*A' + Qk; %Devolucion de variables CoordEsti = [Xk(1) Xk(2)]; ProyX = Xk_; ProyP = Pk_; Función EstimaiconMain clc close all clear all %============Elejir tipo de trazo a probar=============== %load('LineaComun.mat') %load('Sinu.mat') %load('letrah.mat') %palabraHola; %hecho con MovAlyzer coord = load('Sin5.txt'); % En cetímetros %load('sinuCent.mat') %load('dienteDeSierra.mat') % coord = load('sin.txt'); % a=380; % b=length(coord(:,1)); % coord = coord(a:b,:) %coord = (coord/(80e6))*344; % ======================================================= % cantidad de muestras N = length(coord(:,1)) %Delcaro vector de muestras reales CoordR = coord; varAx = 1.9660e-007; varAy = 3.4520e-005; %20100403

- 31 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

%Construyo las supuestas muestras tomadas o a las que llego luego de hacer las cuentas con los tiempos t1 y t2. En si ser´ia % simplemente contaminar conruido blanco a las corrdenadas reales %Declaro el ruido contaminante (supongo que contamino por igual las 2 coordenadas) varR = 10; muR = 0; ruido = randn(N,2)*varR + muR; % Muestras contaminadas yCont = CoordR + ruido; cof = 2.54/96; %Para pasar a cm (con trazos artificiales realizados a 96 pix/inch) figure plot((coord(:,1)*cof),(coord(:,2)*cof),'-*',(yCont(:,1)*cof),yCont(:,2)*cof,'-*') legend('Coordenadas Reales','Coordenadas con ruido') title('Comparacion Coordenadas reales vs Coordenadas mas ruido') xlabel('Centimetrtos') ylabel('Centimetrtos') grid %=================Construccion del modelo========================= %Genero la matriz A A = [ 1 0 1 0 0.5 0 0 1 0 1 0 0.5 0 0 1 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 ]; %Genero la matriz C C = [1 0 0 0 0 0 0 1 0 0 0 0 ]; % Qk Qk = [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 varAx 0 0 0 0 0 0 varAy]; % Rk Rk = [varR 0 0 varR];

- 32 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

% Acondicionamiento de las mediciones. (escribirlo como un vector de mediciónes) [x1,y1, ... xi,yi]' %Inicializo y = zeros(2*N,1); y(1:2:2*N-1) = yCont(:,1); y(2:2:2*N) = yCont(:,2); %================Fin Construccion del Modelo======================== % Inicializacion del Filtro %Primera corrida xo = [0 0 0 0 0 0]'; %Po elejido seg´un paper de Munich pag 67pdf Po = diag([1 1 10e-2 10e-2 10e-5 10e-5]); %Proyecto ProyX = A*xo; ProyP = A*Po*A' + Qk; % Aplico el Filtro a las muestras j = 1; for i=1:2:2*N-1 [CoordEst(j,:) ProyX ProyP] = KalmanFilt(ProyX,ProyP,[y(i) y(i+1)]',A,C,Qk,Rk); j = j+1; end % Calculo del error error = (CoordEst(:,1)*cof - CoordR(:,1)*cof).^2 + (CoordEst(:,2)*cof - CoordR(:,2)*cof).^2; % Gr´aficas %error figure plot(error); title('Error cuadrático medio') xlabel('punto') ylabel('error (píxeles)') grid figure plot(CoordR(:,1)*cof,CoordR(:,2)*cof,'-*',CoordEst(:,1)*cof,CoordEst(:,2)*cof,'-*r',yCont(:,1)*cof,yCont(:,2)*cof,'-*g') legend('Coordenadas Reales','Coordenadas estimadas','coordenadas Ruidosas') title([sprintf('%s','Comparacion coordenadas reales, ruidosas y estimadas (varRuido = ') sprintf('%d',varR) sprintf('%s',' varRandomWalkEjex= ') sprintf('%d',varAx) sprintf('%s',' varRandomWalkEjeY= ') sprintf('%d',varAy) sprintf('%s',')')]) xlabel('Centimetrtos') ylabel('Centimetrtos') grid figure plot(CoordR(:,1)*cof,CoordR(:,2)*cof,'-*',CoordEst(:,1)*cof,CoordEst(:,2)*cof,'-*r') legend('Coordenadas Reales','Coordenadas estimadas') title([sprintf('%s','Comparacion coordenadas reales y estimadas (varRuido = ') sprintf('%d',varR) sprintf('%s',' varRandomWalkEjex= ') sprintf('%d',varAx) sprintf('%s',' varRandomWalkEjeY= ') sprintf('%d',varAy) sprintf('%s',')')]) xlabel('Centimetrtos') ylabel('Centimetrtos')

- 33 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

grid figure subplot(3,1,1) plot(CoordR(:,1)*cof,CoordR(:,2)*cof,'-') title('Coordenadas reales') grid subplot(3,1,2) plot(CoordEst(:,1)*cof,CoordEst(:,2)*cof,'-r') title([sprintf('%s','Coordenadas Estimadas (varRuido = ') sprintf('%d',varR) sprintf('%s',' varRandomWalkEjex= ') sprintf('%d',varAx) sprintf('%s',' varRandomWalkEjeY= ') sprintf('%d',varAy) sprintf('%s',')')]) grid subplot(3,1,3) plot(yCont(:,1)*cof,yCont(:,2)*cof,'-g') title('Coordenadas con ruido') grid

- 34 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

Ite100Ruidos %Ite100Ruidos close all clc clear all varRWX2 = [[1:0.1:9.9]*1e-6 [1:0.1:9.9]*1e-7 [1:0.1:9.9]*1e-8]; varRWY2 = [[1:0.1:9.9]*1e-4 [1:0.1:9.9]*1e-5 [1:0.1:9.9]*1e-6]; %Señal a utilizar : Sin5 coord = load('Sin5.txt'); % cantidad de muestras N = length(coord(:,1)) % Cantidad de ruidos a probar M = 100; %Delcaro vector de muestras reales CoordR = coord; %Declaro el ruido contaminante (supongo que contamino por igual la 2 coordenadas) varR = 10; muR = 0; ruido = randn(N,2*M)*varR + muR; %==================Construccion del Modelo=========================== %Genero la matriz A A = [ 1 0 1 0 0.5 0 0 1 0 1 0 0.5 0 0 1 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 ]; %Genero la matriz C C = [1 0 0 0 0 0 0 1 0 0 0 0 ]; % Qk %se define dentro del for % Rk Rk = [varR 0 0 varR]; %===============Fin Construccion del Modelo======================== distMatrx = zeros (length(varRWX2),length(varRWY2)); wb2 = waitbar(0,'Please wait...'); for z=1:2:(2*M-1),

- 35 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

% Muestras contaminadas yCont = CoordR + ruido(:,z:z+1); % Acondicionamiento de las mediciones. (escribirlo como un vector de medicioes [x1,y1, ... xi,yi]' %Inicializo y = zeros(2*N,1); y(1:2:2*N-1) = yCont(:,1); y(2:2:2*N) = yCont(:,2); dist = 10000; wb = waitbar(0,'Please wait...'); for iRWX=1:(length(varRWX2)), for iRWY=1:(length(varRWY2)), varAx = varRWX2(iRWX); varAy = varRWY2(iRWY); Qk = [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 varAx 0 0 0 0 0 0 varAy]; % Inicializacion del Filtro %Primera corrida xo = [0 0 0 0 0 0]'; %Po elejido seg´un paper de Munich pag 67pdf Po = diag([1 1 10e-2 10e-2 10e-5 10e-5]); %Proyecto ProyX = A*xo; ProyP = A*Po*A' + Qk; % Aplico el Filtro a las muestras j = 1; for i=1:2:2*N-1 [CoordEst(j,:) ProyX ProyP] = KalmanFilt(ProyX,ProyP,[y(i) y(i+1)]',A,C,Qk,Rk); j = j+1; end %calculo la distancia dist = DistCalc(CoordEst,CoordR); %Guardo la distancia para esta combiancion distMatrx(iRWX,iRWY) = distMatrx(iRWX,iRWY) + dist; end%for ppal 2 waitbar(iRWX/(length(varRWX2)),wb) disp([sprintf('%s','Fila ') sprintf('%d',iRWX) sprintf('%s',' competada')])

- 36 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

end%for ppal1 close(wb) waitbar(((z+1)/2)/M,wb2) disp([sprintf('%s','Ruido ') sprintf('%d',(z+1)/2) sprintf('%s',' competado')]) end%for ppal0 close(wb2) distMatrx = distMatrx/M % busco el minmo valor en la matriz, la combinaicon que lo obtenga ser´ala ´optima minVal = min(min(distMatrx)); for i=1:length(distMatrx(:,1)), for j=2:length(distMatrx(1,:)), if (distMatrx(i,j) <= minVal) iX = i; iY = j; end end end optX = varRWX2(iX) optY = varRWY2(iY)

- 37 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

Ite100Optimos %Ite100Optimos M=100; vectOptRWX = zeros(1,10); vectOptRWY = zeros(1,10); wb2 = waitbar(0,'Please wait...'); for z=1:M, %Señal a utilizar : Sin5 coord = load('Sin5.txt'); % cantidad de muestras N = length(coord(:,1)) %Delcaro vector de muestras reales CoordR = coord; %Declaro el ruido contaminante (supongo que contamino por igual las 2 coordenadas) varR = 10; muR = 0; ruido = randn(N,2)*varR + muR; % Muestras contaminadas yCont = CoordR + ruido; %==================Construccion del Modelo========================== %Genero la matriz A A = [ 1 0 1 0 0.5 0 0 1 0 1 0 0.5 0 0 1 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 ]; %Genero la matriz C C = [1 0 0 0 0 0 0 1 0 0 0 0 ]; % Qk %se define dentro del for % Rk Rk = [varR 0 0 varR]; % Acondicionamiento de las mediciones. (escribirlo como un vector de medicioes [x1,y1, ... xi,yi]' %Inicializo y = zeros(2*N,1); y(1:2:2*N-1) = yCont(:,1); y(2:2:2*N) = yCont(:,2);

- 38 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

varRWX2 = [[1:0.1:9.9]*1e-6 [1:0.1:9.9]*1e-7 [1:0.1:9.9]*1e-8]; varRWY2 = [[1:0.1:9.9]*1e-4 [1:0.1:9.9]*1e-5 [1:0.1:9.9]*1e-6]; dist = 10000; optDist = 100000000; optX = 1; optY = 1; %wb = waitbar(0,'Please wait...'); for iRWX=1:(length(varRWX)), for iRWY=1:(length(varRWY)), varAx = varRWX(iRWX); varAy = varRWY(iRWY); Qk = [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 varAx 0 0 0 0 0 0 varAy]; % Inicializacion del Filtro %Primera corrida xo = [0 0 0 0 0 0]'; %Po elejido seg´un paper de Munich pag 67pdf Po = diag([1 1 10e-2 10e-2 10e-5 10e-5]); %Proyecto ProyX = A*xo; ProyP = A*Po*A' + Qk; % Aplico el Filtro a las muestras j = 1; for i=1:2:2*N-1 [CoordEst(j,:) ProyX ProyP] = KalmanFilt(ProyX,ProyP,[y(i) y(i+1)]',A,C,Qk,Rk); j = j+1; end %calculo la distancia dist = DistCalc(CoordEst,CoordR); if (dist < optDist) optDist = dist; optRWX = varRWX(iRWX); optRWY = varRWY(iRWY); optX = iRWX; optY = iRWY; end end%for ppal 2 disp([sprintf('%s','Fila ') sprintf('%d',iRWX) sprintf('%s',' competada')])

- 39 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

end%for ppal1 vectOptRWX(z) = optRWX; vectOptRWY(z) = optRWY; waitbar(z/M,wb2) disp([sprintf('%s','Iteración ') sprintf('%d',z) sprintf('%s',' competada')]) end%for ppal0 close(wb2) optFinalRWX = sum(vectOptRWX)/M optFinalRWY = sum(vectOptRWY)/M

- 40 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

DistCalc function dist = DistCalc(CoordEst,CoordR) %función que calcula la distancia cuadr´atica media entre las señales pasadas dist = 0; for i=1:length(CoordEst(:,1)), dist = (CoordEst(i,1)-CoordR(i,1))^2 + (CoordEst(i,2)-CoordR(i,2))^2 + dist; dist = (dist/(length(CoordEst(:,1)))); end

- 41 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

DetVarianzaXY clear all clc close all % Determinacion de la varianza

% este programa determina la varianza de los ejes X e Y. Estos valores son los que van en el filtro como varRx y varRy. Lo hace utilizando muestras que se tomaron el 20100323. Para mas detalle ver notas del dia % 20100405. Lo que hace es primero ver cada esquina por separado y luego se promedian los valores. Cabe destacar que los valores son en píxeles seg´un resolucion de la m´aquina lapix: 33cm/1024pixles

% Las esquinas se nombraron en sentido horario % 1: esquina superior izquierda % 2: esquina superior derecha % 3: esquina inferior derecha % 4: esquina inferior izquierda % determino la varianza en 4 cuadrantes y en el medio y después la promedio disp('Varianza de las muestras sin filtrar') mues1 = load('varesq1.txt'); varianza(1,1) = var(mues1(:,1)); varianza(2,1) = var(mues1(:,2)); mues2 = load('varesq2.txt'); varianza(1,2) = var(mues2(:,1)); varianza(2,2) = var(mues2(:,2)); mues3 = load('varesq3.txt'); varianza(1,3) = var(mues3(:,1)); varianza(2,3) = var(mues3(:,2)); mues4 = load('varesq4.txt'); varianza(1,4) = var(mues4(:,1)); varianza(2,4) = var(mues4(:,2)); % del an´alisis de los datos se ve que la componente en X es muy grande. Posiblemente debido a que se movio la punta durante el muestreo. Se descarta para el calculo de la varianza mues5 = load('varesq5.txt'); varianza(1,5) = var(mues5(:,1)); varianza(2,5) = var(mues5(:,2)); %Promedio varX = (sum(varianza(1,1:3)+varianza(1,5)))/(length(varianza(1,:))-1) % descarto esquina 4 en X varY = sum(varianza(2,:))/(length(varianza(2,:))) %%%%%%%%%% AHORA CON LAS MUESTRAS FILTRADAS %%%%%%%%%%%% disp('Varianza de las muestras filtradas')

- 42 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

varianza(1,1) = var(mues1(:,3)); varianza(2,1) = var(mues1(:,4)); varianza(1,2) = var(mues2(:,3)); varianza(2,2) = var(mues2(:,4)); varianza(1,3) = var(mues3(:,3)); varianza(2,3) = var(mues3(:,4)); varianza(1,4) = var(mues4(:,3)); varianza(2,4) = var(mues4(:,4)); varianza(1,5) = var(mues5(:,3)); varianza(2,5) = var(mues5(:,4)); %Promedio varX = (sum(varianza(1,1:3)+varianza(1,5)))/(length(varianza(1,:))-1) varY = sum(varianza(2,:))/(length(varianza(2,:))) %%% Gr´aficas comparativas cof = 33/1024; %para pasar a cm segun la resolucin de la maquina del salon de Proyectos %Muestras sin filtrar figure plot(mues1(:,1)*cof,-mues1(:,2)*cof,'*') xlabel('centimetros') ylabel('centimetros') title('Varianza antes de filtrar, esquina 1') grid figure plot(mues2(:,1)*cof,-mues2(:,2)*cof,'*') xlabel('centimetros') ylabel('centimetros') title('Varianza antes de filtrar, esquina 2') grid figure plot(mues3(:,1)*cof,-mues3(:,2)*cof,'*') xlabel('centimetros') ylabel('centimetros') title('Varianza antes de filtrar, esquina 3') grid figure plot(mues4(:,1)*cof,-mues4(:,2)*cof,'*') xlabel('centimetros') ylabel('centimetros') title('Varianza antes de filtrar, esquina 4') grid figure plot(mues5(:,1)*cof,-mues5(:,2)*cof,'*') xlabel('centimetros') ylabel('centimetros')

- 43 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

title('Varianza antes de filtrar, centro de la pantalla') grid %Muestras sin filtradas %subplot(2,2,1) figure plot(mues1(:,3)*cof,-mues1(:,4)*cof,'*') xlabel('centimetros') ylabel('centimetros') title('Varianza después de filtrar, esquina 1') grid %subplot(2,2,2) figure plot(mues2(:,3)*cof,-mues2(:,4)*cof,'*') xlabel('centimetros') ylabel('centimetros') title('Varianza después de filtrar, esquina 2') grid %subplot(2,2,3) figure plot(mues3(:,3)*cof,-mues3(:,4)*cof,'*') xlabel('centimetros') ylabel('centimetros') title('Varianza después de filtrar, esquina 3') grid %subplot(2,2,4) figure plot(mues4(:,3)*cof,-mues4(:,4)*cof,'*') xlabel('centimetros') ylabel('centimetros') title('Varianza después de filtrar, esquina 4') grid figure plot(mues5(:,3)*cof,mues5(:,4)*cof,'*') xlabel('centimetros') ylabel('centimetros') title('Varianza después de filtrar, centro de la pantalla') grid

- 44 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

DesplegaMues clear all close all clc % Programa hecho para desplegar las muestras reales tomadas %s = 'hola.txt'; %s = 'holaLento.txt'; %s = 'LapixImp.txt'; % s = 'sinu.txt'; %queda exelente %s = 'lapixCur.txt'; Mues = load(s); cantMues = length(Mues(:,1)); ini = 90; cof = 33/1024; %para pasar a cm segun la resolucin de la maquina del salon de Proyectos %Graficacion de las muestras %sin filtrar plot(Mues((ini:cantMues),1)*cof,-Mues((ini:cantMues),2)*cof); xlabel(' eje x (centimetros)') ylabel(' eje y (centimetros)') title('Muestras sin filtrar') grid %filtradas figure plot(Mues((ini:cantMues),3)*cof,-Mues((ini:cantMues),4)*cof); xlabel(' eje x (centimetros)') ylabel(' eje y (centimetros)') title('Muestras filtradas') grid %Graficacion de las muestras %sin filtrar figure plot(Mues((ini:cantMues),1)*cof,-Mues((ini:cantMues),2)*cof,Mues((ini:cantMues),3)*cof,-Mues((ini:cantMues),4)*cof,'r'); legend('Trazo sin filtrat','TRazo filtrado') xlabel(' eje x (centimetros)') ylabel(' eje y (centimetros)') title('Comparacoin trazo filtrado v.s. trazo sin filtrar') grid

- 45 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

Codigo utilizado en C (fragmento) #include "lapix_usb.h" #include <math.h> #include <tgmath.h> (.... ..... ....) #include <unistd.h> #define NIL (0) // A name for the void pointer #define dim 6 #define varx 1.5552e-006 #define vary 1.8177e-004 #define RWx 5.4185e-011 #define RWy 3.1169e-09 (…. ….. …..) ///////////////Variables para Kalman/////////////// double Xk[dim]; double A[dim][dim] = { {1,0,1,0,0.5,0}, {0,1,0,1,0,0.5}, {0,0,1,0,1,0}, {0,0,0,1,0,1}, {0,0,0,0,1,0}, {0,0,0,0,0,1} }; double At[dim][dim] = { {1,0,0,0,0,0}, {0,1,0,0,0,0}, {1,0,1,0,0,0}, {0,1,0,1,0,0}, {0.5,0,1,0,1,0}, {0,0.5,0,1,0,1}}; double Qk[dim][dim] = { {0,0,0,0,0,0}, {0,0,0,0,0,0}, {0,0,0,0,0,0}, {0,0,0,0,0,0},

- 46 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

{0,0,0,0,RWx,0}, {0,0,0,0,0,RWy} }; double C[2][dim] = { {1,0,0,0,0,0}, {0,1,0,0,0,0} }; double Ct[dim][2] = { {1,0}, {0,1}, {0,0}, {0,0}, {0,0}, {0,0} }; double R[2][2] = { {varx,0}, {0,vary} }; double ProyXk[dim] = {0,0,0,0,0,0}; double ProyPk[dim][dim]; double Po[dim][dim] = { {1,0,0,0,0,0}, {0,1,0,0,0,0}, {0,0,10e-2,0,0,0}, {0,0,0,10e-2,0,0}, {0,0,0,0,10e-5,0}, {0,0,0,0,0,10e-5} }; double Pk[dim][dim]; //Ganancia double PCt[dim][2]; double CPCtR[2][2]; double Re[2][2]; double det; double Kk[dim][2]; //Actualización double yCXk_[2]; double y[2]; double Id[dim][dim] = { {1,0,0,0,0,0}, {0,1,0,0,0,0}, {0,0,1,0,0,0},

- 47 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

{0,0,0,1,0,0}, {0,0,0,0,1,0}, {0,0,0,0,0,1}}; double Caux[6][6]; ////////////////////// Fin Variables para Kalman ///////////////////////////// (……. ……… ………) ////////////Funciones Para el Filtro///////////////////////////// void ProyPkf(double P[dim][dim]){ //función que carga en la variable ProyPk la proyeccion para la matriz P double PAt[dim][dim], APAt[dim][dim]; double acum = 0; int i,j,k; //ProyP = APAt + Qk //primero hallo PAt //ProductoM(P,At,PAt); //ver bien si modifca las cosas por referencia //REVISADO for(i=0;i<dim;i++){ for(k=0;k<dim;k++){ for(j=0;j<dim;j++){ acum += P[i][j]*At[j][k]; } PAt[i][k] = acum; acum = 0; } } //ahora APAt //ProductoM(A,PAt,APAt); //REVISADO for(i=0;i<dim;i++){ for(k=0;k<dim;k++){ for(j=0;j<dim;j++){ acum += A[i][j]*PAt[j][k]; } APAt[i][k] = acum; acum = 0; } } //ahora le sumo Qk //SumaM(APAt,Qk,ProyPk); //REVISADO for(i=0;i<dim;i++){

- 48 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

for(j=0;j<dim;j++){ ProyPk[i][j] = APAt[i][j] + Qk[i][j]; } } } void ProyXkf(double X[dim]){ //función que halla la proyeccion para X y la guarda en la variable global ProyXk //ProyXk = A*Xk int i,j; double acum; acum = 0; for(i=0;i<dim;i++){ for(j=0;j<dim;j++){ acum += A[i][j]*X[j]; } ProyXk[i] = acum; acum = 0; } } void inicializacion_Kalman(void){ // las matrices del modelo se cargan al declararse, así como X ProyPkf(Po); } void KalmanFilt(void){ // Función que realiza el filtrado de Kalman y las proyecciones para el paso siguiente. El resultado de la estimacion se guardara en XO.x y XO.y que son // los que se van a plotear. Esta basado en la función KalmanFilt hecha en Matlab (la que hice para el programa de simulación). //:::::::::Ganancia::::::::::: //Kk = Pk_*C'*inv(C*Pk_*C' + Rk); Pk_ seria ProyPk //halloPCt int i,j,k; double acum = 0; for(i=0;i<dim;i++){ for(k=0;k<2;k++){ for(j=0;j<dim;j++){ acum += ProyPk[i][j]*Ct[j][k]; } PCt[i][k] = acum;

- 49 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

acum = 0; } } //Hallo CPCtR acum = 0; for(i=0;i<2;i++){ for(k=0;k<2;k++){ for(j=0;j<dim;j++){ acum += C[i][j]*PCt[j][k]; } CPCtR[i][k] = acum + R[i][k]; acum = 0; } } //Hallo la inversa de CPCtR que seria Re det = (((CPCtR[0][0])*(CPCtR[1][1]))-((CPCtR[0][1])*(CPCtR[1][0]))); Re[0][0] = CPCtR[1][1]/det; Re[0][1] = -CPCtR[0][1]/det; Re[1][0] = -CPCtR[1][0]/det; Re[1][1] = CPCtR[0][0]/det; // ahora la ganancia posta Kk = PCt*Re acum = 0; for(i=0;i<dim;i++){ for(k=0;k<2;k++){ for(j=0;j<2;j++){ acum += PCt[i][j]*Re[j][k]; } Kk[i][k] = acum; acum = 0; } } //:::::::::::::::::::: Fin ganancia :::::::::::::::::::::: //:::::::::::::::::::: Actualización del Estimador::::::::::::: //Xk = Xk_ + Kk*(y - C*Xk_); //Hallo yCXk_ (tener en cuenta que Xk_ seria ProyXK) acum = 0; y[0] = XO.x; y[1] = XO.y; for(i=0;i<2;i++){ for(j=0;j<dim;j++){ acum += C[i][j]*ProyXk[j]; } yCXk_[i] = y[i] - acum; acum = 0;

- 50 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

} //ahora multiplico por la ganancia, sumo Xk_ y hallo Xk acum = 0; for(i=0;i<dim;i++){ for(j=0;j<2;j++){ acum += Kk[i][j]*yCXk_[j]; } Xk[i] = ProyXk[i] + acum; acum = 0; } //Ahora hallo Pk //Pk = (eye(6) - Kk*C)*Pk_; donde eye es la identidad y Pk_ sería ProyPk //primero cargo la resta en Caux acum = 0; for(i=0;i<dim;i++){ for(k=0;k<dim;k++){ for(j=0;j<2;j++){ acum += Kk[i][j]*C[j][k]; } Caux[i][k] = Id[i][k] - acum; acum = 0; } } //ahora multiplico por ProyPk y guardo en Pk (ver bien si esto funca, si guarda en Pk efectivamente acum = 0; for(i=0;i<dim;i++){ for(k=0;k<dim;k++){ for(j=0;j<dim;j++){ acum += Caux[i][j]*ProyPk[j][k]; } Pk[i][k] = acum; acum = 0; } } //========================================================== //Ahora hallo las proyecciónes ProyXkf(Xk); for(i=0;i<6;i++){printf(" %e\n", ProyXk[i]);} ProyPkf(Pk); for(i=0;i<6;i++){ for(k=0;k<6;k++){ } }

- 51 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

//ahora devuelvo las corrdenadas XO.x = Xk[0]; XO.y = Xk[1]; } (……. ……… ………) Main () (……. ……… ………) //Inicialización del Filtro de Kalman inicializacion_Kalman(); (……. ……… ………) //:::::::::::::::::::::::::::::::::::::::: FILTRADO :::::::::::::::::::::: KalmanFilt(); //:::::::::::::::::::::::::::::::::::::::: FIN FILTRADO ::::::::::::::::::::: (……. ……… ………)

- 52 -

Tratamiento Estadístico de Señales Monografía Final: Filtro de Kalman para lápiz digitalizador

Referencias [1] Visual Input for Pen Based Computers(Mario Enrique Munich) [2] applied_optimal_estimation (Arthur Gelb, Joseph F. Kasper) [3] Optimal Filterin (Brian D. O. Anderson y Johon B. Moore) [4] Oppenheim A.V., Schafer R.W. Discrete-Time Signal Processing (2ed., PH, 1998) [5] Random walk - Wikipedia, the free encyclopedia [6] Random walk model http://web.duke.edu/~rnau/411rand.htm [7] Acceleration Models http://de.scientificcommons.org/43286567 [8] PARAMETER ESTIMATION OF CONICS APPLICATION TO HANDWRITTEN DIGITS http://www.eurasip.org/Proceedings/Eusipco/Eusipco1998/sessions/T%20A/TA%20P-6/435/Eusip98.PDF [9] Towards an Ubiquitous Wireless Digital Writing Instrument Using http://scholar.google.com.uy/scholar?q=pen+tip+tracking+Kalman&hl=es&btnG=Buscar&lr= [10] US4896002_method and aparatus for displaying raw tablet location data http://www.freepatentsonline.com/4896002.pdf [11] Handwritten Chinese Trajectories Prediction with an Improved Flat Functional-Link Neural Networks and Kalman Filter http://www.computer.org/portal/web/csdl/doi/10.1109/ICIG.2004.77http://ieeexplore.ieee.org/search/wrapper.jsp?arnumber=1410495 [12]PADCAM: A Human-Centric Perceptual Interface for Temporal Recovery of Pen-Based Input http://org.csail.mit.edu/memos/Memo1-Champaneria.pdf

http://hal.archives-ouvertes.fr/docs/00/30/11/24/PDF/acpd-5-1891-2005.pdf[13]

http://people.cs.ubc.ca/~murphyk/Software/Kalman/kalman.html#example[14] [15] HIGH-ACCURACY POSITIONING FOR GEOPHYSICAL TARGET CHARACTERIZATION http://geonav.ensco.com/reports/SAGEEP-High_Accuracy_Positioning_For_Geophysical_Target_Characterization_Final.pdf

- 53 -