domingo, 2 de noviembre de 2014

Programación de Robots

Caso de Estudio: Regresión Lineal

Autor: Felipe Álvarez
Competencia: Aplicación de las Ciencias de Ingeniería 
Asignatura: Programación de Robots


Descripción de la Actividad:


El objetivo principal de este trabajo fue grabar un vídeo en el cual consistía en lanzar una pelota sobre una superficie lisa en donde de se debía grabar todo el tiempo, la idea de realizar este vídeo es poder usarlo en el programa denominado "Tracker" en donde se podía configurar este programa para poder ver si la trayectoria que tomaba la pelota se encontraba en los 2 ejes principales que son X e Y.

Estos puntos se determinaban con las formulas de regresión lineal y usando una base de datos para así facilitar un poco mas los resultados que se esperaban y así poder demostrarlo por medio de un gráfico de puntos que nos arroja nuestra base de datos.

En resumen la actividad consiste en lo siguiente:
- Determinar los coeficientes a y b mediante el método de los mínimo cuadrado
- Establecer 3 rectas alternativas a la establecida mediante mínimos cuadrados a partir de la inspección visual de la nube y la selección de 2 puntos.
- Establecer para toda las rectas la calidad del ajuste mediante r2.

Modelo de Solución:















Después de instalar el software tracker, necesitaremos un vídeo con una resolución bastante buena para que se distinga el objeto y su fondo que en este caso es la superficie lisa, de no ser así el programa podría detectar puntos que no se encuentran en el vídeo dificultando mucho mas el trabajo.





A continuación se ingresaran los puntos en el programa de los cuales se perciben en el vídeo como se puede apreciar en la imagen de la izquierda, esto se debe repetir una gran cantidad de veces para poder generar una enorme cantidad de puntos.





Utilizamos el MySQL para generar una tabla donde almacenamos los datos adquiridos durante el proceso, la cual se almacena en la base de datos para ser utilizada mas adelante.

Con UPDATE  logramos insertar nuevos datos en las columnas.




















Sacamos toda la suma de X e Y









Sacamos el valor de A y B
















Y al final después de realizar todo ese proceso se realiza la suma de R2








Calculo de las Variables

Para poder realizar todo estos proceso de calculo lo cual son bastantes sencillos gracias a Mysql y sus cálculos matemáticos , yo simplemente tenia  que interpretar las formulas que se encontraban en la Internet las cuales son la siguientes:

Esta es la que me sirvió para poder calcular A y B









El R2 se calculo de la siguiente forma:










Como resultado entregado ya visto anteriormente es 0.81......., y la idea de este trabajo era comparar ese resultado con una tabla entregada la cual es la siguiente




Como se puede apreciar con el resultado entregado anteriormente el problema realizado se encuentra dentro del rango " Buena" que es (0.8 <= IRI < 0.9) , luego de conseguir este resultado en la tabla se procede a ingresar los puntos en un gráfico los cuales nos arroja los siguientes resultados.





















¿En que me ayudo esta actividad?

Esta actividad ayuda bastante a lo que es manejarse en tema de Algebra y mapeo como es trabajar con los ejes X e Y es un trabajo bastante agotador si no se realiza con el programa Tracker el cual básicamente nos facilita la mayoría del trabajo gracias a que se pueden insertar los puntos y ver como se comporto nuestra "Pelotita" , el resto era trabajar con las base datos las cuales contenían nuestros puntos entregados por el programa y solo realizar los cálculos matemáticos necesarios para que se completar esta actividad con éxito.

domingo, 28 de septiembre de 2014

                  Mantención y Administración de Sistemas


Caso de Estudio : Window Server


Autor: Felipe Álvarez
Competencia: Gestión de TI
Asignatura: Mantención y Administración de Sistemas

Descripción de la Actividad:

La actividad consiste en básicamente instalar un Window Server 2003 y un Window XP a través del Active Directory y crear usuarios, pero ¿ Para que necesitamos esto? , en la administración de sistemas se usa demasiado el concepto de Servidores en empresas y lo que esta detrás de todo esto es la conexión de Windows entre Windows, el motivo por el cual se realiza esto es para poder estar al tanto de que es lo que sucede en una Empresa tanto problemas de computadores o problemas de los sistemas en ese mundo entra el concepto de Servidores de computadores, es para estar al tanto y poder controlar los computadores de una Empresa que no necesariamente se tienen que encontrar en el mismo sitio y esto facilita mucho el trabajo a un Ingeniero en TI, es fácil de manipular y controlar.

Se evidenciara esto por medio de Imágenes la herramienta que se uso para poder demostrar esto es VirtualBox y 2 ISOS que es Window Server 2003 y Windows XP.


Modelo de Solución:

Configuración de Window Server:

Primero configuramos la dirección de Ip que es lo primordial para que nuestra conexión funcione entre estos sistemas, si el caso de que las Ip fueran diferentes o hay un en el ingreso de estas se tendría que realizar todo el proceso de nuevo de configuración lo cual es bastante extenso.




































Tras haber configurado nuestra dirección con lo cual concuerda con la del Window Xp que se mostrara mas adelante,, se inicializa los pasos para que nuestro Windows Server funcione a la perfección, uno de los primeros pasos es el Servidor DHCP el cual si no se tiene instalado este
no se pueden unir los sistemas operativos y la conexión no se realizara.





















Aquí se inicializa el nombre de mantención como ámbito, el cual ayuda a identificar de manera rápida la red.





















Tras terminar los pasos de arriba son simplemente pasos de “Siguiente” y no hay que configurar nada en especifico después de haber terminado todo se tiene el servidor DHCP.





















La siguiente instalación es el DNS el cual son pasos bastantes sencillos y la configuración bastante importante para el funcionamiento del win server, dado a que si no se tiene esto instalado no se podrá seguir con la instalación del Active Directory.





















En esta parte en especifico se define como el nombre del servidor de autorización que puede tener cualquier nombre pero se puede tener el dominio de la organización o un alias.





















Y por ultimo se deja la configuración del Active Directory para al final, una vez que todo lo anterior esta instalado este proceso es mucho mas rápido.























Aquí se inicializa el nombre del dominio el cual es muy importante para poder conectarse en winXP si no se conoce el nombre del dominio se puede saber simplemente abriendo las configuraciones del DNS.







































Esta es la contraseña de administrador la cual si se olvida lo mas probable es que se tenga que reinstalar todo el sistema de nuevo asi que por eso en lo ideal es crear una clave fácil de aprenderse y mas para esto que es solo de prueba.





















En lo siguiente se observara la opción de agregar usuario que solo se puede cuando el Active Directory esta finalizado en este caso agregaremos al usuario fel a la nuevo dominio y lo conectaremos al XP.





Conexión desde Windows XP

Como bien se configuro en el Window Server la dirección de Ip tiene que ser la misma para que estas 2 maquinas funcionen y se puedan conectar así que se tiene que configurar la Ip de estas.




















Una vez que se tiene todo terminado la configuración de la IP, se puede logear al Dominio que es EMPRESA a través del usuario fel el cual nos solicitara la clave definida previamente en la creación de cuentas y asi nos permitirá conectarnos al Window Server























Después de haber realizado esto somos capaces de poder entrar a nuestro Servidor de Mantención el cual el Dominio es EMPRESA y la cuenta de usuario que en este caso es FEL. Windows nos da la bienvenida evidenciando que la conexión fue un exito





















Despues de ya estabecer la conexion se reinicia el computador para que el usuario pueda entrar a su cuenta en nuestro Servidor y aparezca un login al inicio de Windows como se ve en la siguiente imagen :






















Y listo ya esta realizada nuestra conexión y se puede verificar que estamos en nuestra cuenta porque cuando vamos a Inicio en el top de la barra de acción se ve nuestro nombre de Usuario que es " Fel " lo cual se puede apreciar en la siguiente imagen :






















¿ En que me ayudo esta actividad?

Esta actividad ayuda bastante a los que es la conexión entre 2 Windows, como generar una conexión por medio de IP , creación de cuentas y manejo de sistema como Administrador el cual contiene mucho poder en estos Sistemas de Conexiones, es una actividad bastante divertida me ayudo demasiado con lo que es la estructura de un Window Server siendo la primera vez que trabajaba con ello el cual personalmente lo recomiendo para cualquier persona que lea esto. Se sintetizo el uso de imágenes dado a que si se usaban todas las imágenes iba a hacer un poco aburrido ver puras imágenes pero fueron puros pasos de " Siguiente " y no algo de gran importancia así que si se sigue estas imágenes podrás realizar una conexión de Window Server y Window XP con éxito.

                                   Programación II


   Dibujar figuras en Python


Autor: Felipe Álvarez
Competencia: Desarrollo de Software
Asignatura: Programación


Descripción de la Actividad:

La actividad consiste en aprender a programar en MatplotLib el cual es una librería la cual permite poder dibujar figuras de diferentes tipos, la cual esto puede ser bastante útil en términos de aprender geometría y poder tener la capacidad de uno de dibujar un plano cartesiano "Mental", el permite poder programar las coordinas e ir viendo como esta maravillosa librería interpreta lo que uno desea realizar y lo mejor es que se puede visualizar a través de un JPG el cual mostrara el resultado de la actividad.

Lo que se solicita en la actividad es lo siguiente :

- Generar y dibujar un triangulo equilátero, cuyo lado a debe ser generado aleatoriamente entre 0.5 y 0.7. Poner el punto inferior izquierdo en el origen de los ejes cartesianos.

- Encontrar y dibujar la circunferencia en el cual el triangulo generado anteriormente este inscrito.

- Encontrar y dibujar el cuadrado circunscrito a la circunferencia anterior

- Encontrar y dibujar la circunferencia en la cual el cuadrado generado anteriormente este inscrito.

- Guardar todo los resultado generados en una imagen png o JPG.


Modelo de Solución:

A continuación guiare paso a paso como fue la creación de estas diferentes funciones por parte en el cual se explicaran trozos de código, como se llego a la solución y una explicación previa de cada una de las partes de este código, al final se mostrara el código completo y la imagen generada en este Programa.

Crear Triangulo: En la siguiente función nos solicitan que creemos un triangulo equilátero, el cual como se conoce tiene sus 3 lados iguales, pero esto tiene una particularidad sus lados se tienen que generar no por un lado definido si no por números aleatorios entre 0.5 y 0.7, en el cual lo crearemos en una variable denominada "a", también haremos uso de una de las funciones de matplolib denominada Polygon la cual nos ayuda a definir el polígono que queremos, también hay figuras especificas que se existen como función en matploblib para poder definir esta figura se usa Polygon.

# Creacion de los puntos aleatorios, puntos el cual nos calcula la altura de esta figura que es el triangulo y finalmente se setea los colores.

a=((random.random()*0.2))+0.5
puntos = numpy.array([[0,0],[a,0],[a/2,a/2*numpy.sqrt(3)]])
triangle = mat.Polygon(puntos,color=(1,0,1))

Creación Circunferencia: En la siguiente función nos solicitan crear una circunferencia, pero tiene una gracia que no es solo crear la circunferencia en si, si no crearla donde el triangulo creado anteriormente fuera adentro de la circunferencia esto se denomina Inscrito para eso creamos una función denominada centrox y centroy la cual nos ayuda a dejar las figuras inscritas como es en este caso.

#Creacion de la Circunferencia
centrox = ((0)+(a)+(a/2))/3
centroy = ((0)+(0)+(a/2*numpy.sqrt(3)))/3
r=numpy.sqrt(((centrox-0)**2)+((centroy-0)**2))
circulo1 = mat.Circle((centrox,centroy),radius=r,color=(1,0,0))

Creación del Cuadrado: En la siguiente función se solicita crear un cuadrado pero es parecido a la función anterior simplemente que ahora el cuadrado tiene que estar circunscrito dentro dela circunferencia creada anteriormente para eso hacemos uso de la misma función centrox y centroy, para ello sumamos la posición X con el radio de la circunferencia y así sucesivamente.

#Creacion del Cuadrado Circunscrito

pts = numpy.array([[centrox-r,centroy-r],[centrox+r,centroy-r],[centrox+r,centroy+r],[centrox-r,centroy+r]])

Cuadrado = mat.Polygon(pts,color=(1,1,0))

Creación de la Circunferencia: En la siguiente se solicita crear una circunferencia para ello usamos la misma funcion usada anteriormente pero con la diferencia que usamos los centrox y centrosy para poder posicionar la circunferencia dentro del cuadrado así dejándolo inscrito.

#Creacion de la cirfuncerencia inscrita

r=numpy.sqrt(((centrox-(centrox-r))**2)+((centroy-(centroy-r))**2))

circulo2 = mat.Circle((centrox,centroy),radius=r,color=(0,1,1))


Código Final e Imagen.

import random
import matplotlib.pyplot as mat
import numpy 


a=((random.random()*0.2))+0.5
puntos = numpy.array([[0,0],[a,0],[a/2,a/2*numpy.sqrt(3)]])
triangle = mat.Polygon(puntos,color=(1,0,1))

centrox = ((0)+(a)+(a/2))/3
centroy = ((0)+(0)+(a/2*numpy.sqrt(3)))/3
r=numpy.sqrt(((centrox-0)**2)+((centroy-0)**2))
circulo1 = mat.Circle((centrox,centroy),radius=r,color=(1,0,0)) 

pts = numpy.array([[centrox-r,centroy-r],[centrox+r,centroy-r],[centrox+r,centroy+r],[centrox-r,centroy+r]])
Cuadrado = mat.Polygon(pts,color=(1,1,0))

r=numpy.sqrt(((centrox-(centrox-r))**2)+((centroy-(centroy-r))**2))
circulo2 = mat.Circle((centrox,centroy),radius=r,color=(0,1,1)) 

ax = mat.gca()
ax.add_patch(circulo2)
ax.add_patch(Cuadrado)
ax.add_patch(circulo1)
ax.add_patch(triangle)
ax.set_xlim(-1,5,1.5)
ax.set_ylim(-1.5,1.5) 

mat.savefig('triangulo_'+str(a) +'.png')


















¿En que me ayudo esta actividad?

Esta actividad ayuda bastante a lo que es programar en Python y la base de lo que es matplolib es una actividad bastante divertida la cual se recomienda en un 100% de realizar, la información de como usar esta librería en Internet ayuda bastante a conocer las funciones en si y que se puede hacer con ellas, matplolib es una librería a mi parecer que contiene muchas ventajas tanto como en el área de geometría como para poder generar gráficos de diferentes tipos ayuda bastante a lo que es la programación científica en términos de evidenciar resultados.




domingo, 31 de agosto de 2014

Programación en NXC


               Robot "Dribbler"

Autor: Felipe Álvarez
Competencia : Desarrollo de Software
Asignatura : Programación de Robots

Descripción de la Actividad:
El problema consiste en programar un robot que fuera capaz de encontrar la máxima cantidad de Puntos en una pista de forma rectangular, sin chocar en los obstáculos que se encuentran en la pista ya que si llegase a suceder esto seria fin del juego.
Cuando el robot estuviera cerca un obstáculo debería ser capaz de evitar esto a través de una señal audible (Aplauso) el cual activara un mecanismo de evasión el cual  el robot pueda desviarse hacia la izquierda o derecha con el fin de evitar este obstáculo.
Cada vez que el robot encuentre un Punto aumentara su puntaje y aumentara su velocidad secuencialmente, los puntajes en la pista se definen a través de diferentes puntos negros que se encuentran en la misma pista, como ya mencionado anteriormente toda esta actividad si el robot llegara a chocar contra algún obstáculo que este se encuentre por lo tanto una vez esto terminado el robot debe de mostrar la cantidad de puntaje acumulado tras haber chocado.
Todo esto se logra a través de la programación en NXC la cual es bastante parecida a los que es la Programación en C#, lo cual es una buena actividad para poder iniciar el proceso de programación en nuestra carrera como Alumnos de Ingenieria Civil en Informatica.

Modelo de Solución:
Como modelo de solución a este problema aplique un pseudocódigo el cual me ayudo bastante a entender el problema y llegar mejor a la solución al problema propuesto el cual se puede apreciar en estas siguientes lineas: 
Variables
punto=0;
puntos=0;
aplauso=0;
aplausos=0;
puntaje=0;
puntajetotal=0;
velocidad=50;
subtarea MarcaPunto()
{
Melodia
}
subtarea ApagarMotores()
{
Apagar(Motor_AB):
}
subtarea PuntajePantalla()
{
Si punto<aplauso/4
{
Puntajetotal=0
}
Imprimir(puntajetotal)
Tiempo(10 segundos);
}
Subtarea ApagarTodo()
{
ParaTodasLasTares();
}
Subtarea CambioVelocidad();
{
Si velocidad menor 100;
{
velocidad + 5
}
}
Subtarea Puntaje();
{
puntos=(100*punto);
aplausos=(25*aplauso);
puntajetotal=(puntos-aplausos);
}
Subtarea Actividad()
{
Mientras (sensortacto=0)
{
Avanzar(ambos motores);
Si (sensor sonido)>80
{
Avanzar (motor A);
Retroceder (motor B);
Tiempo(100)
Sumar 1 a aplauso;
}Si (sensor luz)<=20
{
Avanzar (motor A);
Retroceder (motor B);
Tiempo al azar;
Sumar 1 a puntos;
Melodia();
Cambio de velocidad;
}
}
}
Tarea principal()
{
Setear sensor luz;
Setear sensor sonido;
Setear sensor tacto;
Subtarea
Subtarea
Subtarea
Subtarea
Subtarea
}
Actividad();
Puntaje();
ApagarMotores();
PuntajePantalla();
ApagarTodo();


Código del Programa:

int punto=0;
int puntos=0;
int puntaje=0;
int puntajetotal=0;
int velocidad=50;
int aplauso=0;
int aplausos=0;


sub Marcapunto()

 {
  PlayTone(1318,80);
  Wait(200);
  PlayTone(1568,80);
  Wait(200);
  PlayTone(2637,80);
  Wait(200);
  PlayTone(2093,80);
  Wait(200);
  PlayTone(2349,80);
  Wait(200);
  PlayTone(3136,980);
  Wait(1000);
}

sub ApagarMotores()

{
Off(OUT_AB);
}

sub PuntajePantalla()

{
TextOut(10,30,"Puntaje Total: ");
NumOut(10,20,puntajetotal);
  Wait(15000);
}

sub ApagarTodo()

{
StopAllTasks();
}

sub CambioVelocidad()

{
if (velocidad<100){
           velocidad=velocidad+5;
                 }
}

 sub Puntaje()

 {
 puntos=(100*punto);
 aplausos=(25*aplauso);
 puntajetotal=(puntos-aplausos);


 }


sub Actividad() {


while (Sensor(IN_1)==0)

{
    OnFwd(OUT_AB, velocidad);
    if (SENSOR_2>80)
{
      OnFwd(OUT_A, 60);
   OnRev(OUT_B, 60);
     Wait(100);
   aplauso=aplauso+1;
      //NumOut(10,10,aplauso);
      //Wait(1000);
      }

if (Sensor(IN_3)<=20)

{
      OnFwd(OUT_A,60);
   OnRev(OUT_B,60);
      Wait(Random(100)+100);
      punto=punto+1;
Marcapunto();
      CambioVelocidad();
      }

  }

}

task main ()

{

SetSensorLight(IN_3);

SetSensorSound(IN_2);
SetSensorTouch(IN_1);

Actividad();

Puntaje();
ApagarMotores();
PuntajePantalla();
ApagarTodo();
}

Como se puede apreciar en el código de arriba el código esta dividido en SubTareas las cuales facilitan mucho este Ejercicio a desarrollar dado a que son muchas acciones en paralelo que están sucediendo en este trabajo.
Lo que caracterizan a la subtareas es la habilidad de poder realizar tareas en paralelo sin que estas puedan chocar entre si, de lo cual uno simplemente define diferentes subtareas con sus respectivas funciones que estas tienen y después simplemente se puede llamar en el Task Main de manera simple como ingresando el nombre de la SubTarea y así todo eso se ejecutara de manera secuencial.

Video de la Actividad:

https://www.youtube.com/watch?v=FAbthMUHI2E

¿En que me ayudo esta actividad?

Este ejercicio en si me ayudo a bastante a entender lo que es trabajar de forma ordenada y clara con el objetivo que me estas proponiendo, como siempre uno como Ingeniero tiene que buscar la mejor solución para cualquier problema que nos propongan, de manera clara y sencilla con tal de que nuestro clientes puedan entender nuestras soluciones a estos problemas.
Esta actividad ayuda bastante a entender la programación básica en NXC y hacer uso de sus propias funciones que contiene este lenguaje como es el uso de sus diferentes sensores, funciones de sonido y música lo cual yo pude trabajar y poder realizar este trabajo con éxito.