martes, 21 de mayo de 2013

Tarea 7: Simuación de movilidad

Para esta tarea se nos pide realizar un código documentado en donde implementemos una simulación de una MANET que cumpla con las siguientes características.

  • Llegadas y salidas de nodos con una distribución exponencial, procesos poisson.
  • Un modelo de movilidad
  • Nodos con capacidad de batería inicial
  • Envío de mensajes consume batería según el radio de transmisión
  • El radio es ajustable en cada nodo
  • Se utiliza una inundación con un TTL adaptable.

Por lo que realicé un código en python, utilizando pygame, y numeros random con la librería estandar de python y de numpy, para poder realizar esta simulación.

Primero que nada declaro variables generales, de esta manera, podemos tener el largo y ancho de la ventana, esto es importante para obtener los limites de la imagen, los cuales van a estar rebotando durante toda la pantalla, en las muestras de simulación declaro una población de 100 nodos que van entrado por procesos poisson, estoy verificando el tiempo cada corrida y estos en su vez tienen su propio tiempo que si entran dentro de los parámetros aparecen en la simulación.

El campo de visión de cada nodo es parametrizado de manera inicial, este puede ser modificado durante el transcurso de la simulación, al igual que el TTL, el cual crea conexiones con los nodos vecinos que se encuentran a su alrededor,

El TTL se puede cambiar según su propagación hacia atrás, pero esto afecta considerablemente su rendimiento ya que cada nodo tiene una batería y al momento de tener más TTL, estas conexiones pierden la batería y se quedan sin poder propagar la información por inundación.

El movimiento que desarrollé fue el agregar velocidad de manera exponencial y cambiar sus ángulos con un aleatorio con distribución uniforme, y luego de esta manera genera pequeños vectores y de esta manera hace buenos movimientos y creo que es apropiado para este tipo de simulación.

El TTL es una función recursiva que hace la propagación según cada distancia junto con todos los nodos y vamos comparando para obtener las que se encuentran en el rango de recepción, por lo que cambiamos sus estados y estos a su vez, van hacia atrás para obtener un mayor rango de información según su TTL.

En esta simulación podemos suponer que el enemigo es un helicóptero que esta en un campo tratando de mandar bombas en un campo de batalla, entonces, los soldados tienen radios que mandan información cuando uno de estos ve que en su campo de visión se encuentra el helicóptero, se quedan quietos y envían a los demás.

Código


Video de muestras


Referencias
Peter's Website, Project pygame physics simulation, Peter Colling, extraido de http://www.petercollingridge.co.uk/
Redes ad hoc, Redes de telecomunicaciones, Elisa Schaeffer, extraido de http://elisa.dyndns-web.com/~elisa/

miércoles, 15 de mayo de 2013

Lab: Detección de movimiento

Para esta entrada se nos pide realizar un la detección de movimiento de una secuencia de imágenes por lo que para esto tengo una secuencia de imagenes que las voy combinando con frames e ir calculando su histograma y calcular su entropia, si la entropia es menor a 2.0, quiere decir que no hay movimiento en la imagen, luego checo en base a los filtros, en la diferencia, la cantidad donde existen blancos, de esta manera pongo una flecha que indica el movimiento de la imagen.

De esta manera podemos saber si existe movimiento o no en la imagen, comparada con el frame de la imagen anterior, por ejemplo imágenes creadas donde un circulo se mueve hacia la derecha.

Para este laboratorio solamente checo el movimiento de un solo objeto.

Ahora les presento el video.



Y por ejemplo, si llega un momento en que no se mueve, el programa indica que no se esta en movimiento.



Este es el código relevante.


Referencias. 
Animation using image sequence, Tkinter-discuss, Extraido de http://mail.python.org/pipermail/tkinter-discuss/2009-December/002138.html

Proyecto: QTigual

Presentación




Propósito
Actualmente el desarrollo de sistemas en dispositivos móviles es una de las muchas maneras en las cuales nosotros como futuros ingenieros en software podemos utilizar para hacer uso de todas sus capacidades y aprovecharlas para hacer innovadoras ideas y atraer al público en general.

Para el proyecto visión computacional se nos pide realizar un sistema que utilice las técnicas aprendidas durante el semestre, es por eso que estuve trabajando en la combinación de tratamiento de imágenes y los dispositivos móviles para realizar un juego donde el usuario debe dibujar lo más igual posible, una imagen que se le muestra al principio de manera que contra el tiempo, luego de un proceso con la imagen dibujada y la original, realizar filtros para obtener un porcentaje de igualdad de imagenes.

Diseño de software
El software está orientado a diferentes campos, primero que nada tenemos una aplicación móvil desarrollada en el lenguaje de programación Objective-C en donde tenmos diferentes vistas, de manera que tenemos una vista principal en donde se la bienvenida al usuario en el juego y tiene que seleccionar si desea continuar jugando.

Durante 4 segundos aparece una imagen que se carga desde el servidor, luego se pasa a la siguiente vista para que el usuario mediante un canvas pueda capturar el dibujo y después de 10 segundos, esta imagen se mande al servidor donde por medio de una aplicación WEB desarrollada en PHP lo guarde y establesca conexión con el puerto 6699 creado mediante un socket en python, de esta manera, al momento de mandar un mensaje a este socket se crea una conexión independiente mediante un hilo y se empieza a procesar la imágen para dar como regreso un promedio de cuanta cantidad de imagen es igual o semejante a la capturada por el usuario, para esta a su vez responder a la aplicación WEB de PHP y retornar un mensaje por HTTP a la aplicación móvil mediante una alerta.

Descripción textual
El sistema se divide en diferentes partes importantes:

  • La aplicación móvil la cual captura mediante un canvas el dibujo hecho por el usuario para mandarlo a la aplicación WEB.
  • Aplicación WEB en PHP que guarda la captura y hace una llamada al puerto que contiene el procesamiento de los filtros.
  • Socket que hace todas las imagenes de tratamiento para devolver el porcentaje de semejanza con la imagen.


En diagrama anterior podemos ver las etapas por las que pasa el juego, de manera que podamos los procedimientos por lo que pasa y sobre los tratamiento de imagen necesarios para obtener un buen porcentaje de semejanza.

Entre los filtros que es necesario desarrollar son:

  • Cambiamos a grises
  • Agregamos el filtro de la mediana varias veces
  • Sacamos la diferencia 
  • Ponemos un umbral
  • Obtenemos esquinas
  • Obtenemos los bordes con Laplaciana
  • Agregamos BFS
  • Obtenemos figura
  • Dibujamos en dicha figura cada esquina detectada con un elipse
  • Se comprara con el mismo procedimiento la figura hecha por canvas
  • Obtenemos el porcentaje de blancos de la imagen
Imagen de server


Detección de esquinas de imagen de server 

Detección de esquinas de imagen dibujada

Se sobre ponen los círculos más grandes
con los círculos más pequeños y
 sacamos la cantidad de blanco en la imagen,
En este caso, no coincidió con ninguno, por lo tanto
no se tiene semejanza






Librerías utilizadas
En la parte de visión computacional no utilicé ningún recurso para realizar los filtros, todo fue escrito por mi, utilizando solamente la librería de imagenes de Python para poder accesar a cada pixel y aplicar los diferentes filtros.

En la parte web, utilizo los recursos de python para números random, numpy y para crear sockets y en la parte móvil utilizo los recursos necesarios para las interfaces y vistas.


  • Threading
  • PIL
    • Image, 
    • ImageTk, 
    • ImageDraw
  • math 
    • floor,
    • atan, 
    • fabs, 
    • pi, 
    • cos, 
    • sin, 
    • ceil, 
    • sqrt, 
    • degrees, 
    • atan2
  • random 
    • randint
  • time
  • numpy
  • socket



Desempeño
Al ser hecha por mi, el proyecto al principio demoraba mucho para dar una respuesta, este fue en el problema que estuve trabajando durante este tiempo en hacer tiempos de respuesta más pequeñas, por lo que hice de cierta manera que la imágen bajara de tamaño para de esta forma el procesado de los pixeles fuera más rápido y dar un resultado rapidamente.

Las imágenes con las que trabaje al principio eran computacionalmente pesadas, por lo de un tiempo aproximado de 15 segundos de respuesta, lo baje a 10, para luego en la versión entregable del proyecto final, lo tenemos aproximadamente en unos 4-5 segundos.


El tiempo está siendo marcado siempre por el tiempo de vida de la conexión del hilo en python, por lo que podemos ver los resultados cada que se inicia un nuevo juego en el terminal.

Trabajo a futuro
Como trabajo futuro yo creo que sería el hacer mucho menos el tiempo de espera al porcentaje de la similitud para de esta manera poder hacer que el usuario tenga una respuesta más rapida sobre lo que esta jugando y no se aburra de estarlo esperando.

Otro proyecto futuro sería el agregar niveles, agregar dificultades de manera que cada vez sean imágenes más dificiles para su similitud, esto mas o menos se encuentra contemplado en el proyecto ya que como lo dije anteriormente al momento de detectar las esquinas el radio de esta detección cambia y de esta manera podemos hacer que los radios sean más pequeños y aumente la dificultad de similitud.

Y como proyecto de largo plazo también el agregar funcionalidades necesarias para su proyección, por ejemplo el jugar contra enemigos, el compartir en redes sociales, en poner puntaje en el gamecenter, etc...


Este es un video de cómo funciona el juego.


Liga a mi repositorio. aquí.

martes, 14 de mayo de 2013

Triangulación

Un receptor GPS utiliza la Triangulación para determinar su posición en la superficie de la Tierra por señales de temporización a partir de tres satélites del sistema de posicionamiento global. El sistema GPS es una red de satélites que orbitan la tierra que envían señales a los receptores GPS, proporcionando información sobre la posición, el tiempo y la velocidad de movimiento del dispositivo.

Cada satélite de la constelación GPS envía señales periódicas junto con una señal horaria. Estas señales son recibidas por los receptores GPS, el cual calcula la distancia entre el sensor y cada satélite como una función del retardo entre el tiempo de transmisión y el momento de la recepción. Aunque las señales (tipo de ondas de radio) viajan a la velocidad de la luz, siempre hay una demora debido a que los satélites están a decenas de miles de kilómetros sobre la Tierra.

Una vez que el GPS ha calculado las distancias a lo menos tres satélites, puede realizar los cálculos. Triangulación vuelve a afirmar su posición en un mapa con dos compases saber la distancia exacta desde tres lugares diferentes. El área de superposición de tres círculos centrados en cada lugar corresponde a su sitio ya que el radio de cada círculo corresponde a la distancia entre su lugar y cada lugar.

En la versión GPS de los cálculos se realizan en tres dimensiones con un conjunto imaginario de la brújula 3D, por lo que su posición corresponde a la superposición de los tres círculos cuyo radio viene dado por la distancia entre su posición y cada satélite. Si el receptor GPS puede recibir datos de un cuarto satélite, las mediciones se pueden verificar de nuevo.

El proceso de cálculo es extremadamente rápido, que permite que el receptor GPS para indicar su posición, altitud (aire), la velocidad y el destino.

Para hacer la Triangulación es necesario realizar un plano cartesiano de manera que el centro de nuestro plano sea 0,0, esto para poder asegurar que vamos a tener una intersección entre los circulos, es por eso que la creación de las antenas, cuyo radio es la intensidad de la señal, se crean uno, en el centro del plano catesiano, otro sobre el eje y y otro más, debajo de los dos circulos anteriores, esta manera es mucho más facil calcular lo que es la i y la j, por lo tanto tener una buena ubicación.

Para crear la interfaz para la observación del comportamiento de la trigonalización, utilicé la libreria tk de python en donde primero generé una ventana de 500 pixeles x 500 pixeles, programé un script en el cual pudiéramos obtener valores de -1:1 y tenerlos en sus planos correspondientes, por lo que dividí la ventana de manera que tuviéramos un plano de cuatro partes, en donde en la parte superior derecha tengamos los valores positivos de estos números, luego en la parte superior izquierda los valores negativos respecto al eje x y los valores positivos respecto al eje y, la parte inferior derecha los valores prositivos respecto al eje x y los valores negativos respecto al eje y, y en la parte inferior izquierda los valores negativos respecto a ambos ejes, por lo que por medio de la fórmula (1-x)*250, donde x es el número de que queremos graficar entre -1:1 y el menos uno para controlar la posición de pixeles, por lo que de esta manera podemos posicionar los elementos de manera correcta.

Luego de tener los valores de las fuerzas de los circulos, podemos calcular donde está posicionado según las matemáticas de la triangulación, en base a Wikipedia, se saca la derivación de los puntos a calcular y obtenemos.


X = (ar**2 - br**2 + d**2)/float((2*d))
Y = ((ar**2-br**2+i**2+j**2)/(2*j))-((float(i/j))*X)


En  donde:
ar = radio antena A
br = radio antena B
d = distancia entre antena A y antena B
i = distancia del origen a antena C
j = la distancia entre el punto de encuentro y la ubicación de la antena C

Tomada de wikipedia

Para entenderlo, primero hice un dibujo.

Ahora les muestro el código.



Este es un video que tomo sobre la animación del mismo ejercicio que dibuje.


Referencias.
NA, (2012). Qu'est-ce que la trilatération?. Mio web. Recuperado de http://eu.mio.com/fr_fr/systeme-positionnement-global_4991.htm

lunes, 13 de mayo de 2013

Lab: Telecomunicaciones y satélites

Los servicios de telecomunicaciones en todo el mundo dependen en gran medida de los satélites, proporcionando enlaces a la tierra entre diferentes aplicaciones, para este laboratorio se nos pide realizar una investigación de dichas aplicaciones, al igual que de los mecanismos que se utilizan para interceptar las comunicaciones y las maneras que existen para protegerlas.

Entre las diferentes aplicaciones que podemos encontrar en los satélites de comunicaciones, tenemos los siguientes:

Los servicios fijos, son conexiones fijas o de distancia de punto a punto, donde se tienen antenas fijas y los satélites ofrecen una gran variedad de aplicaciones, por ejemplo transporte de voz, datos, televisión y contenidos de internet a diferentes centros de distribución y empresas de redes que hacen enlaces a terminales, llamados VSAT, logrando así la conectividad a gran escala con una buena flexibilidad.

En muchas partes del mundo, las redes terrestres están fragmentados o no existen, por lo que la conexión por satélite abre una puerta a esas zonas que están desatendidas.

La radiodifusión ha sido la principal aplicación de los satélites durante muchos años, la televisión a difusión directa o por radio, canales de televisión y radio que se transmiten desde las estaciones terrestres de satélites que regresan en grandes áreas de cobertura de la tierra, directamente a nuestra la casa.

Un solo satélite puede ofrecer cientos de canales de un país o de un continente entero, la transmisión de escaneo o la adquisición de estas señales ha aumentado el potencial de un satélite en términos de número de canales, las emisiones pueden ser recibidos por los usuarios privados, así como a trés de claves públicas que dan acceso a la conexión por satélite.

Las conexiones móviles también forman parte de las aplicaciones, las conexiones de voz, datos, video, a los dispositivos móviles, las centrales locales llevan a las llamadas a una estación terrena (algunas veces llamado telepuerto), en el que se emiten en la dirección de un satélite geoestacionario, de esta manera, se reenvía al satélite otra estación que hace la recepción y el enrutamiento final, existen algunos teléfonos que se conectan directamente por satélite como los barcos o aviones, siendo capaces de transmitir una señal y el punto de enlace con el satélite, incluso cuando se están moviendo.

Los satélites también permite beneficiarnos por el acceso a internet mediante la creación de un vinculo bidireccional entre una banda ancha y una estación conectada a la red, esto es especialmente útil para los usuarios que se encuentran en lugares muy remotos y no pueden conectarse por ADSL a través de una red telefónica.

Se necesitan un seguimiento eficaz, oportuno y sobre todo las comunicaciones seguras, es un tema fundamental en el área de los satélites, sobre todo en la conducción de operaciones militares modernas, las comunicaciones militares existen ya que hay momentos en que la información debe ser transmitida con seguridad a las personas adecuadas, independientemente del lugar y la hostilidad del medio ambiente, las fuerzas armadas saben que los satélites cumplen con esta necesidad de comunicación, a diferencia de las redes de tierra, los satélites proporcionan, en cualquier momento, una amplia cobertura, una mayor flexibilidad en términos de potencia de transmisión y frecuencia, son casi completamente independientes a los obstáculos que dificultan el funcionamiento de redes terrestres.


La importancia de porque se necesitan cuidar las redes por satelites es por ejemplo, existen varias iniciativas internacionales de vigilancia que han participado activamente después de la Segunda Guerra Mundial. Actualmente, la mayoría dependen de centros terrestres, aeronaves de gran altitud y los satélites. En los Estados Unidos, la inteligencia de comunicación entra dentro de las riendas de la Directiva de inteligencia de señales de los Estados Unidos (USSID) y las leyes de privacidad del mismo país. Los proveedores de servicios terrestres y de satélite deben ayudar a las entidades cuando sea necesario a lo dispuesto por CALEA (Asistencia de Comunicación para el Cumplimiento de la Ley) del gobierno. También existen amenazas extranjeras, siempre se debe pedir ayuda a los principales sistemas de espionaje por satélite y terrestres que son de varias naciones extranjeras. En particular, los esfuerzos principales en la inteligencia de señales se han documentado en las instalaciones de inteligencia de señales estratégicamente ubicados.

Las comunicaciones por satélite son especialmente vulnerables a los eavesdropping debido a las grandes áreas que cubren. Existían algunas estaciones que eran conocidos para interceptar todas las comunicaciones por satélite en los años 80. Sólo unos pocos satélites geoestacionarios llevaban sobre todo el tráfico de voz, y el espionaje era una cosa bastante simple. Las comunicaciones por satélite de ahora tienen más probabilidades de no ser interceptados dado el alcance de la comunicación, y dado que las comunicaciones terrestres requieren una gran cantidad de reutilización de frecuencias geográficas, pero expuestas de todas maneras.

Existen algunos software de seguridad comerciales que están disponibles para teléfonos de satélites, por ejemplo, que se basan en algoritmos de cifrado comunes. Sin embargo, los enlaces por satélite siempre deben ser consideradas poco fiables, y siempre se deben utilizar las medidas de autenticación y cifrado específicos.

Los servicios de satélite son sin embargo una buena solución para el servicio resistente en caso de emergencias graves. En los EE.UU. cuatro empresas ofrecen servicio satelital móvil y por ejemplo en los días inmediatamente después del huracán Katrina, los proveedores del SMS mandaron más de 20.000 teléfonos GSM controlados por satélite.

Referencias.
Schwengler Thomas, (2012). Wireless & Cellular Communications. Class Notes. University of Colorado. Recuperado de http://morse.colorado.edu/~tlen5510/text/

NA. (2011). Des satellites pour toutes les applications: Télécommunications & Communications sécurisées. Astrium web. Recuperado de http://www.astrium.eads.net/fr/articles/des-satellites-pour-toutes-les-applications.html

miércoles, 8 de mayo de 2013

Error-Correcting codes

For this homework we need to implement a block code for a binary channel, then we need to explain how many errors it is able to detect or correct and why, we need to do a test program and try it out.

So, I do the hamming code because I think is easy to implement and explain, hamming code is a block code that can detect and correct errors in a binary channel, but this code can only detect just one bit for a all the sequence of bits, so for that, you need to implement a variant of this block code, for this homework I just experiment a normal hamming code.

For do the hamming code we need to do some procedures into the program, for example we need to do some subroutine that can do a parity and also check and jump into vector, I'm going to explain how I do it in Python.

So, first of all, we have a sequence of bits, then, I made a subroutine that creates a vector that have a bits only in a position when the number is the power of two, that is in the position 1, 2, 3, 8, 16, 32, 64, etc. and in the others position we didn't want save any data.

Then, we need to compute a bit of parity, so for that, I do a procedure that do a general rule that we have in the hamming code, jump n-1 bits, then check n bits, then jump n bit, etc, at the moment to do that, we have another vector that we need to compute a logic xor for each value in the vector, just for have the parity bits.

Then we need to join the bits of parity into the vector that we have, and we already have a hamming code, but now the important thing is to know when we have an error, so for that we need to do a test of parity, and if we have in each row, 0 in the xor, we are right, it is just the same of the hamming code but in the inverse.

If we can detect an error, we have a sequence of bits that we can translate to a decimal and we have that number to know the position of the error, then just change that bit and we already have a good sequence.

This only works when we have only one bit with an error, but if we have many, we need to implement another error-correcting code, so, in conclusion, this is simple to implement, to understand how works a block code with a correcting solution, but it fail at the moment that we have many errors.

This is an example, suppose that we have the following bits

1010101

Then we do a vector just in the positions that are power of two.

['', '', '1', '', '0', '1', '0', '', '1', '0', '1']

Then we do for each vector, xor of all the items, following the rule " jump n-1 bits, then check n bits..."


['', '', '1', '', '0', '', '0', '', '1', '', '1'] :  1
['', '', '1', '', '', '1', '0', '', '', '0', '1'] :  1
['', '', '', '', '0', '1', '0', '', '', '', '']     :  1
['', '', '', '', '', '', '', '', '1', '0', '1']     :  0


So we add this bit into the coding

['1', '1', '1', '1', '0', '1', '0', '0', '1', '0', '1']

Suppose that we have an error, and we have the next sequence.

['1', '0', '1', '1', '0', '1', '0', '0', '1', '0', '1']

So we do with that sequence, just obtain the bits and compare if we have the same using parity, for that we need to do for each vector an xor.

COMP:1
ERRO:1

COMP:1
ERRO:0

COMP:1
ERRO:1

COMP:0
ERRO:0

We have the next sequence:
['0', '0', '1', '0']
     Pos = 2

Then if we know, in 10 are 2 in decimal, so in the position 2, we have the error.


['1', '0', '1', '1', '0', '1', '0', '0', '1', '0', '1']
['1', '1', '1', '1', '0', '1', '0', '0', '1', '0', '1']

And we correct this sequence.

I hope my english is good and you can understand.

This is my code.

Lab: detección de esquinas

Se nos pide realizar para este laboratorio como parte básica, detectar las esquinas con el método de diferencia de filtro mediano y como parte avanzada, hacer un wire-frame uniendo las esquinas con segmentos de líneas.

El procedimiento que realicé:

  • Cambiamos a grises
  • Agregamos el filtro de la mediana varias veces
  • Sacamos la diferencia 
  • Ponemos un umbral
  • Obtenemos esquinas
  • Obtenemos los bordes con Laplaciana
  • Agregamos BFS
  • Hacemos un corte en cada primera esquina detectada
  • Agregamos otra vez BFS en la imagen cortada
  • Unimos esquinas 
Capturas de pantalla:







Este es el código importante:

martes, 7 de mayo de 2013

Infográfico: Puntos extra

Infográfico sobre los saltélites artificiales orbitando en el mundo

Referencias
The Ten Most Important Satellites Orbiting Earth Now, Stephanie Fox, iO9 web, liga

Infográfico



Referencias
SANS Institute InfoSec Reading Room (2003), The GSM Standard: An overview of its security, watchfire, Obtenido de: http://www.sans.org/reading_room/whitepapers/telephone/

jueves, 2 de mayo de 2013

Polígonos


Para esta tarea se nos pide detectar polígonos por medio del método detección de lineas rectas.

Lo que realicé y no está terminado es:
  1. Cambiar a grises
  2. Sacar convolución Laplaciana para sacar bordes
  3. Normalizo la imagen
  4. Binarizo los datos
  5. Sacamos el promedio
  6. Se agrega un umbral
  7. Agregamos BFS para detectar todos los bordes 
  8. Los pintamos de diferentes colores
  9. Sacamos mascara de sobel en X
  10. Sacamos mascara de sobel en Y
  11. Detectamos la pendiente de cada pixel
  12. Calculamos su theta (pendiente) 
  13. Ordenamos valores calculados según su pendiente.
  14. Checamos el cambio de cada theta para detectar los lados
  15. Pintamos cada lado de diferente color.
Les muestro unas capturas de pantalla del procedimiento:







Existe mucho ruido en la imagen y no pude detectar cada lado de los polígonos, por ejemplo en la primera imagen obtuve estos lados.

Donde si tengo 5 figuras, pero los lados no concuerdan.

Código relevante





Eso es lo que tengo :(