jueves, 7 de marzo de 2013

[Lab VC] Actividad 4: Detección de círculos (radio diferentes)

Para esta actividad se debieron programar las rutinas para detectar círculos de diferentes tamaños, es decir, con radios variables, en una imagen. Para ello se utilizó la Transformada de Hough.

En la entrada anterior:


se describió el método utilizado para la detección de círculos a detalle, las bases para esta actividad son las mismas, sin embargo, ahora el radio es variable, por lo que hay que adaptar el código para que haga ésto.

Cuando el radio no es conocido, la solución más simple es comenzar con un radio de cota inferior e ir aumentándolo en cierta cantidad, pasos de 1 o 2.
Posteriormente hay que establecer una cota superior, una cota superior segura generalmente es la longitud de la diagonal mayor de la imagen ya que no tiene sentido buscar por circulos más grandes que ese tamaño.

Fuente: http://www.aishack.in/2010/03/circle-hough-transform/


Podemos limitar un poco más la búsqueda, por ejemplo, a 3/4 del tamaño de la longitud mayor.

Posteriormente, por cada radio tendremos una arreglo de bidimensional de votos, si cada arreglo lo agregamos a una lista terminaremos con un arreglo de tres dimensiones que contendrá los votos por cada radio probado.

Las imágenes utilizadas para la prueba fueron:

Original
Binarizada
Contornos

Los resultados fueron los siguientes:


Como podemos ver en las imágenes, hasta cierto punto el programa sabe dónde se encuentran los círculos ya que detecta y dibuja los contornos dentro de los límites de los mismos, y, por ejemplo en la primea imagen  ignora cualquier otra cosa (caso del triángulo invertido a la derecha). Sin embargo, no detecta correctamente los círculos lanzando basura en cada radio analizado.

Se necesita alguna rutina que limpie esa basura, ya que el problema que he notado es que por cada radio analizado, no importa cuan pequeño sea el radio o que el radio analizado no corresponda a un círculo en específico, siempre me lanza algún resultado, centros de círculos en alguna posición de la imagen  posiblemente porque a pesar de que el radio analizado no corresponde a ningún círculo visible, los pixeles aún así votan, los votos aún así se agrupan y aún así se lanza algún "centro" falso.


Implemente un pequeño algoritmo que hace una segunda agrupación de votos para detectar mejor los círculos y barrer un poco la basura, los resultados obtenidos fueron los siguientes:





Como podemos ver, los resultados son un poco mejores, en la primera imagen por lo menos se ubican los círculos, pero no exactamente en los centros. En la segunda imagen el resultado fue un poco mejor ya que se detectan los centros de 2 de los círculos, por lo menos de los 2 mas grandes. Sin embargo, esta segunda agrupación elimina la posibilidad de detectar la longitud del radio y no puedo dibujar el contorno de los círculos.

Mejoraré un poco el código, pienso que algún tipo de hibridación entre el primero y el segundo puede funcionar

Código


En el repositorio encuentran la implementación completa en código, la carpeta marcada como Tarea 5.

La mayoría de las funciones fueron explicadas en la entrada anterior, ahora solo se modularizó un poco el código y se adaptó a lo nuevo.


Referencias:

martes, 5 de marzo de 2013

[Lab RT] Actividad 5: Práctica con NS-2 y NAM

"NS es un simulador de redes basado en eventos discretos. Se usa principalmente en ambientes educativos y de investigación. Permite simular tanto protocolos unicast como multicast y se utiliza intensamente en la investigación de redes móviles ad-hoc. Implementa una amplia gama de protocolos tanto de redes cableadas como de redes inalámbricas. La versión actual, ns-3, esta diseñada para soportar todo el flujo de trabajo de la simulación desde la configuración hasta la recolección y análisis de tramas."
de: http://es.wikipedia.org/wiki/Ns_(simulador)


"NAM es una herramienta de animación basada en  TCL / TK, utilizada para ver las huellas de simulación y reales trazas de paquetes de una simulación de una topología de red utilizando NS. Soporta diseño de topologías, animación a nivel de paquete, y varias herramientas de inspección de datos. Nam comenzó a LBL. Ha evolucionado considerablemente en los últimos años. El esfuerzo de desarrollo nam fue una colaboración continua con el proyecto VINT. Actualmente, se está desarrollando como un proyecto de código abierto alojado en Sourceforge."
de: http://www.isi.edu/nsnam/nam/

Instalación


Para instalar el simulador NS y NAM en Ubuntu 12.04 necesitamos hacer lo siguiente:
  1. Descargar el código fuente desde http://sourceforge.net/projects/nsnam/
  2. Verificar que nuestro Ubuntu esté actualizado, tecleando el comando: sudo apt-get update 
  3. Instalar algunas dependencias, el comando completo es: sudo apt-get install build-essential autoconf automake libxmu-dev
  4. Nos desplazamos a la ubicación donde descargamos el código fuente de NAM y lo descomprimimos con el comando tar -xzvf ns-allinone-2.35.tar.gz (el número 2.35 es el número de versión el cual puede variar, para la fecha actual 2.35 es la más nueva)
  5. Una vez descomprimido, escribimos el siguiente comando para cambiar de carpeta cd ns-allinone-2.35
  6. Instalamos ejecutando el comando ./install
Esperamos a que la instalación termine.

Después procedemos a configurar las variables de entorno para que NS y NAM funcionen correctamente, son 3 variables de entorno que hay que configurar.

  • PATH
  • LD_LIBRARY_PATH
  • TCL_LIBRARY

Ahora, todas las variables de entorno de configuran de acuerdo a la ubicación de la instalación, en mi caso corresponde a /home/juancarlos/Downloads/ , ustedes ubiquen la propia. El directorio de instalación lo identificaremos más adelante con la abreviación [install_path]

Para configurar las variables de entorno nos vamos a nuestro home tecleando cd en la terminal, ahí editaremos el archivo .bashrc

Abrimos el archivo con nuestro editor favorito y nos vamos hasta el final del archivo, ahí comenzaremos a escribir. Las variables de entorno las configuramos añadiendo las siguientes líneas al .bashrc:

export PATH=[install_path]/ns-allinone-2.35/bin:[install_path]/ns-allinone-2.35/tcl8.5.10/unix:[install_path]/ns-allinone-2.35/tk8.5.10/unix:$PATH

export LD_LIBRARY_PATH=[install_path]/ns-allinone-2.35/otcl-1.14:[install_path]/ns-allinone-2.35/lib:$LD_LIBRARY_PATH

export TCL_LIBRARY=[install_path]/ns-allinone-2.35/tcl8.5.10/library:$TCL_LIBRARY

Hay que tener cuidado en esta parte de no escribir nada mal para evitar romper algo en el sistema operativo, verifiquen bien los datos antes de guardarlos. Después solo reiniciamos.

Si todo funciona bien, al teclear en la terminal el comando ns se abrirá una consola especial que solo mostrará el símbolo % que indica que NS ha iniciado en modo interactivo.
Si tecleamos nam se abrirá la ventana del visualizador.

ns nam

Práctica

Para ésta semana la actividad fue documentar una práctica utilizando cualquiera se los simuladores NS. En mi caso utilicé el simulador NS-2 y NAM para visualizar los resultados. La topología de la red se define mediante scripts TCL de una forma muy simple.

El modelo de red que simulé tiene las siguientes característica:

  • Topología de estrella
  • 4 nodos, uno central y tres hoja
  • Todos se conectan al nodo central mediante una conexión full duplex
El flujo de datos tuvo las siguientes características:
  • Dos flujos UDP con tasa de transferencia constante (CBR)
  • Un flujo TCP de tipo FTP.
  • El flujo TCP y UDP en cierto momento corren paralelos.
Todos los scripts siempre comienzan con la línea:
set ns [new Simulator]
con la que se define un nuevo objeto simulador. A partir de aquí podemos comenzar a definir toda las características de la topología de red que queremos simular.
Primero definimos los archivos de salida, para poder guardar las trazas producidas por la simulación y ver la simulación en NAM
set myFile [open out.tr w] $ns trace-all $myFile set myNamFile [open out.nam w] $ns namtrace-all $myNamFile

Despues, para cuestiones de visualización, coloreamos cada flujo de tráfico de diferente color. No es necesario indicar cuál flujo va de cuál color, NS-2 lo hace automáticamente.
$ns color 0 blue $ns color 1 red $ns color 2 green

Ahora definimos la topología, son 4 nodos:
set n0 [$ns node] set n1 [$ns node] set n2 [$ns node] set n3 [$ns node]

Y conectamos los nodos entre sí definiendo los enlaces. En este caso todas las conexiones son de tipo full duplex, las conexiones entre el nodo 0 y el nodo 2, así como la del nodo 1 con nodo 2 tienen las mismas características, la entre el nodo 2 y nodo 3 es más rápida pero tiene más delay. Todas tienen una queue de tipo Tail Drop. NS-2 ofrece una gran variedad de enlaces
$ns duplex-link $n0 $n2 1.5Mb 2ms DropTail $ns duplex-link $n1 $n2 1.5Mb 2ms DropTail $ns duplex-link $n2 $n3 3.0Mb 10ms DropTail
Ahora, para cuestiones de visualización nuevamente, posicionamos cada nodo en un layout que se vea bonito, 2 nodos a la izquierda, arriba y abajo, un nodo al centro y un nodo a la derecha en el centro.
Creamos también un monitor en cada conexión para mantener una queue de paquetes y evitar desbordamientos y pérdida de paquetes.
$ns duplex-link-op $n0 $n2 orient right-up $ns duplex-link-op $n1 $n2 orient right-down $ns duplex-link-op $n2 $n3 orient right $ns duplex-link-op $n0 $n2 queuePos 0.5 $ns duplex-link-op $n1 $n2 queuePos 0.5 $ns duplex-link-op $n2 $n3 queuePos 0.5
Ahora definimos las conexiones UDP, debemos crear un agente UDP por cada una, crear un "sink" que no es más que un agente que recibe el flujo de tráfico UDP, y también es necesario colocarle a cada conexión UDP una fuente de tráfico constante CBR.
Las conexiones UDP van del nodo 0 al nodo 3 y del nodo 1 al nodo 3, pasando forzozamente por el nodo 2 aunque esto último no es necesario especificarlo.
La primera conexión UDP comienza en el segundo 0.2 y la segunda conexión UDP comienza en el segundo 0.5, ambas permanecen activas durante toda la simulación.
set udp0 [new Agent/UDP] $ns attach-agent $n0 $udp0 $udp0 set class_ 0 set null0 [new Agent/Null] $ns attach-agent $n3 $null0 $ns connect $udp0 $null0 set cbr0 [new Application/Traffic/CBR] $cbr0 attach-agent $udp0 $ns at 0.2 "$cbr0 start" set udp1 [new Agent/UDP] $ns attach-agent $n3 $udp1 $udp1 set class_ 1 set null1 [new Agent/Null] $ns attach-agent $n1 $null1 $ns connect $udp1 $null1 set cbr1 [new Application/Traffic/CBR] $cbr1 attach-agent $udp1 $ns at 0.5 "$cbr1 start"
Por último creamos una fuente de tráfico TCP de tipo FTP, la cual va del nodo 1 al nodo 3. La conexión TCP comienza en el segundo 1 de simulación y finaliza en el segundo 2.
set tcp0 [new Agent/TCP] $ns attach-agent $n0 $tcp0 $tcp0 set class_ 2 set fin0 [new Agent/TCPSink] $ns attach-agent $n3 $fin0 $ns connect $tcp0 $fin0 set ftp [new Application/FTP] $ftp attach-agent $tcp0 $ns at 1.0 "$ftp start" $ns at 2.0 "$ns detach-agent $n0 $tcp0 ; $ns detach-agent $n3 $fin0"
Finalmente siguen las instrucciones para la simulación, indicamos que la misma durara 3 segundos. Después declaramos el procedimiento de finalización donde limpiamos la memoria, cerramos los archivos y ejecutamos NAM para visualizar los resultados.
$ns at 3.0 "finish" proc finish {} { global ns myFile myNamFile $ns flush-trace close $myFile close $myNamFile puts "Simulacion terminada" exec nam out.nam & exit 0 }
Los scripts finalizan con la instrucción para indicar cuándo la simuación debe correr, hasta que terminan de configurarse todos los parámetros.
$ns run

Script completo


Los dejo el script completo, comentado, con el que corrí la simulación de la topología definida.

Video de la simulación.


El video muestra la visualización de la simulación en NAM, los momentos interesantes del video son:
  • 0:30 comienza a correr la simulación
  • 0:33 comienza el primer tráfico UDP
  • 0:39 comienza el segundo tráfico UDP
  • 0:50 comienza el tráfico TCP, podemos ver como los monitores comienzan a enviar los paquetes a las queues debido a que el nodo 2 esta a capacidad máxima debido a que ya tiene 2 conexiones activas. La queue de la conexión entre los nodos n0 y n2 es la que se hace más grande.
  • 1:14 Finaliza el tráfico TCP


Ésta fue una implementación muy sencilla utilizando NS-2 pero se puede leer la documentación del simulador para lograr topologías mas complejas.
Las ligas están en las referencias al final de la entrada.

Referencias

[VC] Tarea 4: Detección de círculos (radio conocido)


Para ésta tarea se debieron programar las rutinas para detectar circulos con radio conocido y preestablecido un una imágen. Para ello se utilizó la Transformada de Hough.


Para la detección de bordes es necesario:
  • Aplicar máscaras mediante el método de convolución discreta.

Los pasos necesarios son muy parecidos a la detección de lineas, éstos son:
  • Elegir las máscaras a aplicar, en mi caso elegí 2 máscaras de Sobel
  • Aplicar las máscaras utilizando convolución discreta (2D)
    • Aplicar por separado para obtener 2 gradientes Gx y Gy
    • Obtener G con la fórmula
$$ G=\sqrt{Gx^{2} + Gy^{2}} $$
  • A partir de las matrices de gradientes obtenidas, calcular los ángulos para seno y coseno con las fórmulas:
$ \cos\theta = Gx/G $
$ \sin\theta = Gy/G $
  • Hayar las coordenadas del centro del circulo aplicando las formulas
$x_{c} = x - r \cos\theta$
$y_{c} = y - r \sin\theta$
  • Hacer esto por cada pixel para obtener las coordenadas centro a partir de un radio establecido.
  • Declarar un acumulador de votos, que puede ser un arreglo del mismo tamaño de la imágen en pixeles. El acumulador de votos recoge los potenciales centros de circulos de acuerdo al número de votaciónes de los pixeles que lo rodean.
  • Agrupar los votos que ésten demasiado cerca, que el pixel con mayores votos se coma a los pixeles con menores votos para reducir el ruido y centros falsos.
  • Los pixeles con mayores votos son los centros, implementar las rutinas necesarias para descartar falsas alarmas no detectadas en el proceso anterior.
  • A partir de los centros, dibujar el contorno de los círculos encontrados, marcar su centro, etiquetar cada círculo y obtener el diámetro total.

Las imágenes necesitan tratarse antes de pasar por el proceso de detección de círculos:
  • Binarizar la imágen
  • Obtener su contorno
El radio es un parámetro de la simulación y se mide utilizando cualquier software de edición de imágenes, simplemente se mide cuantos pixeles hay de contorno a contorno en el centro, asi obtenemos el diámetro, diámetro entre dos nos da el radio estimado en pixeles.

Las imágenes utilizadas para el ejercicio fueron las siguientes:


Datos Original Binarizada Contornos
Radio=72px
Radio=46px
Radio=41px

Después las imágenes pasan por el proceso donde se detectan los círculos  los contornos se pintan de color amarillo y los centros se marcan con un punto verde y se les coloca una etiqueta. Así mismo, en la terminal, se imprime el ID del círculo y la longitud de su diámetro  el porcentaje del diámetro se calcula a partir de la diagonal máxima de la imagen.

Los resultados fueron


Como podemos ver, los círculos se detectan muy bien, puede haber pocos círculos, muchos círculos o círculos incompletos.
El único bug visible es un centro ligeramente desplazado en la última imágen, pero creo es más cuestión de ajustes de los parámetros de procesamiento que un error en si.


Código

En el repositorio encuentran la implementación completa en código, la carpeta marcada como Tarea 5.

El dibujo en el canvas se hace con la siguiente función

viernes, 1 de marzo de 2013

[Lab CU] Actividad 5: Listado de proveedores

Adafruit


"Adafruit fue fundada en 2005 por la ingeniera del MIT, Limor "Ladyada" Fried. Su objetivo era crear el mejor lugar en línea para el aprendizaje de la electrónica y hacer los mejores productos diseñados para los responsables de todas las edades y niveles de habilidad. En los últimos 6 años Adafruit ha crecido a más de 45 empleados y se encuentra en el corazón de Nueva York. Adafruit ha ampliado su oferta para incluir herramientas, equipos y componentes electrónicos que Limor personalmente selecciona, prueba y aprueba antes de ir a la tienda Adafruit."
http://www.adafruit.com/about/

Adafruit es una excelente tienda en línea que ofrece un muy amplio catálogo de productos para eléctronica, componentes, chips, tarjetas de desarrollo, kits de robótica, baterias, entre muchas cosas más.
El beneficio principal de esta tienda son los precios, los cuales se encuentran muy por debajo de los ofecidos por otras tiendas dedicadas al mismo giro.
Otro de los beneficios de la tienda es que ofrece envío a muchos lugares del mundo, entre ellos México, lo que permite recibir nuestros componentes a la puerta de la casa, pagando obviamente el respectivo precio del envío internacional.

Nos parece una buena opción como proveedora ya que es la única tienda que distribuye uno de los componente que más ocupamos a un buen precio, el componente Adafruit PN532 NFC/RFID Controller Shield for Arduino.

Fuente: https://www.adafruit.com/products/789

Que es básicamente la tarjeta que necesitamos para leer y escribir tags NFC, y asi transferir los permisos necesarios para abrir y cerrar las puertas de un automóvil para el prototipo que planeamos hacer. Por $40USD se pueden hacer de uno de estos.

Otro producto que la compañia ofrece y es relevante es el kit Raspberry PI Starter Pack

Fuente: https://www.adafruit.com/products/1014

Incluye todo lo necesario para iniciar a manipular nuestra Raspberry PI.
El producto es relevante porque la Raspberry hará las veces de computadora dentro del automóvil. Se puede adquirir por $104USD.

Se puede ver todo el amplio catálogo de productos en la siguiente liga: https://www.adafruit.com/

...

Sparkfun



"SparkFun es una tienda online dedicada a la venta al por menor las partes y piezas para hacer casi cualquier proyecto de electrónica posible. Los productos y recursos están diseñados para hacer ell mundo de la electrónica más accesible para la persona promedio. Además de los productos, SparkFun, a través de su departamento de educación, ofrece clases y tutorías en línea diseñados para ayudar a educar a las personas en el maravilloso mundo de la electrónica incorporada. Su creciente catálogo de productos cuenta con más de 2.000 componentes y widgets diseñados para ayudarle a dar rienda suelta a su inventor interior."
https://www.sparkfun.com/static/about

Sparkfun es una comunidad de estudiantes ingenieros que se dedican a crear prototipos para eléctronica y demás componentes, cuya inspiración vino de la dificultad para hallar las partes que en algún momento ellos necesitaron para crear sus proyectos.
Parecido a Adafruit, su modelo de negocio primario es la venta de un variado tipo de componentes electrónicos, kits, tarjetas de desarrollo, entre muchas otros clasificaciones.
También cuenta con envío internacional, con el que podremos recibir todo lo que pidamos directo en nuestras casas.

En un buen proveedor debido a su amplio catálogo, entre los cuales tenemos varios componentes para nuestro proyecto, entre ellos esta la tarjeta de desarrollo Arduino UNO - R3
Fuente: https://www.sparkfun.com/products/11021

Necesitamos el Arduino porque en él irá montada la controladora de NFC/RFID, posteriormente el Arduino irá conectado a la Raspberry PI mediante una interfaz.Cuesta $30USD.

Otro componente relevante y que podemos incluir en el prototipo es el uso de comunicación mediante zigbee, más especificamente, el componente XBee 2mW Wire Antenna - Series 2.

Fuente: https://www.sparkfun.com/products/10414


Las antenas zigbee nos servirán para transmitir datos entre la computadora interna del automóvil y el servidor principal de autenticación de credenciales, posiblemente sea necesario otro Arduino para lograr ésto. Cada antena cuesta $21USD, posiblemente se necesiten 2.

Todos los productos y servicios se pueden consultar en la página https://www.sparkfun.com/

...

Newark




"Newark, parte de Premier Farnell plc global (LSE: PFL), es el distribuidor basado en conocimientos y líder en el mercado de componentes electrónicos, servicios de valor agregado y soluciones de eProcurement en todo el continente americano, con instalaciones en los Estados Unidos, Canadá, México y Brasil. Newark, un innovador en la distribución de electrónicos durante al menos 70 años, es parte de la familia de empresas InOne dentro del grupo Premier Farnell, las cuales trabajan en conjunto a través fronteras geográficas y comerciales para brindar a los clientes, grandes y pequeños, el imponente respaldo y apoyo que sólo una organización internacional puede ofrecer. Newark ofrece un excepcional servicio personalizado, el más amplio surtido de productos electrónicos y servicios de valor agregado únicos."
http://mexico.newark.com/jsp/bespoke/bespoke1.jsp?bespokepage=newark/es_MX/inside/profile.jsp

A diferencia de los dos casoa anteriores, Newark es un distribuidor de componentes electrónicos. Cuenta con un masivo catálogo de componentes de muy variados tipos que abarcan prácticamente todos los campos de la electrónica. Sus proveedores son reconocidos a nivel internacional y ello se encargan de distribuir sus productos de manera legal en México.

Se eligió como proveedor porque es una compañía local que ofrece un componente que necesitamos, el chip/módulo GPS

Fuente: http://mexico.newark.com/te-connectivity/a1080-a/module-gps-high-sensitivity/dp/50M3350

El módulo GPS nos servirá para ofrecer los servicios de reconocimiento y almacenamiento de rutas, y de medición de distancias y velocidad. Los precios varían, pero se ubican en una media de $200USD.

También tenemos en la mira utilizar un módulo GSM/3G

Fuente: http://mexico.newark.com/telit-wireless-solutions/gc864pyt730/module-gsm-gprs-quad-band/dp/25R4633

Es nuestra segunda opción de comunicación entre toda la infraestructura GPS + Arduino + Raspberry con el servidor principal, y nos servirá entre otras cosas para envíar toda la información recolectada por internet y almacenarla en la base de datos correspondiente. Los precios son algo elevados, pero se ubican en promedio en los $220USD.

Pata ver todo el catálogo de productos, se puede accesar al sitio http://mexico.newark.com/

...

Electrónica Steren

Steren es una tienda mexicana dedicada  a la venta de componentes electrónicos, pero con más énfasis en la venta de componentes para comunicaciones como cables y conectores. Actualmente esta limitación en su modelo de negocios se ha ido haciendo mas borrosa ya que ahora ofrece una gran cantidad de artículos de electrónica, desde pequeños componentes como chips PIC, transistores, circuitos integrados, resistores, capacitores; hasta artículos más especializados como equipos de medición, antenas VHF y UHF, kits sencillos de robótica, etcétera. Steren es distribuidor, sin embargo también manufactura productos bajo su propia marca.

Lo elegimos como proveedor de los artículos más simples pero importantes de todo proyecto de electrónica, ya que, a pesar de contar con los componentes fuertes, nada funcionaría sin ellos.
Entre estos productos relevantes estan los componentes eléctronicos
Fuente: http://www.steren.com.mx/

Estos componentes incluyen resistores, capacitores, leds, diodos, potenciometros, relevadores, entre muchas cosas más; y todos sabemos que éstos componentes nunca pueden faltar en todo proyecto de electrónica.
Los precios son muy económicos, por lo general en el orden de los 5 a 30 pesos por componente, o en el caso de las resistencias, paquetes de 10 componentes del mismo tipo.

Otro producto relevante en cualquier proyecto son los cables.
Fuente: http://www.steren.com.mx/

Como mencioné al principio, Steren se dedicaba mas que nada a la venta y distribución de estos productos, desde cableado de cobre simple hasta cables de telefonía y redes. Muchas veces necesitamos hacer conexiones simples para construir nuestros circuitos, entonces podemos sencillamente utilizar cables para realizarlas.
O si se desea transmitir información por medio de un cable, siempre existe la posibilidad de comprar cierta medida de cable cruzado o directo.
Los precios varían en función de la cantidad requerida, pero no van más allá de 50 pesos por metro.

Otros componentes importantes que podemos hallar en este proveedor son:
  • Semiconductores
  • Chips
  • Equipo para soldar
  • Herramientas de medición como multimetros.
Para ver el catálogo completo se puede visitar la página http://www.steren.com.mx/

...

Referencias