Competencia: Aprendizaje Autónomo. (Nivel 1).
Asignatura: Proyecto de Robótica.
Palabras clave: Informe, lenguaje NQC, programa Bricx Command Center.
Descripción de la Actividad
Les voy a compartir mi experiencia, como estudiante de 1er año de Ingeniería civil informática, sobre la vez que tuve que realizar un informe sobre el Proyecto 1: Dribbler que realice con el Robot NXT de la Universidad.
Reglas del juego:
La idea de la competencia es que un robot autónomo encuentre la mayor cantidad de “zonas de puntaje” en la pista, sin chocar con los obstáculos presentes (paredes, bloques, etc), ya que cuando pase esto, termina el juego.
Cuando el robot vaya a chocar, el jugador debe indicarle que existe peligro de choque, a través de una señal audible (grito, pitazo, aplauso, etc), de modo que el robot no colisione.
Cada vez que el robot encuentra una zona de puntaje irá aumentando su velocidad.
Gana el jugador que logre pasar por la mayor cantidad de zonas de puntaje antes de chocar con algún obstáculo.
Especificaciones:
El robot debe iniciar su recorrido con una potencia de 10%.
La potencia de movimiento se aumentará en 10% cada vez que el robot detecte una zona de puntaje (círculo negro) hasta el máximo de 100%.
Mientras el robot busca zonas de puntaje se emitirá constantemente una música ad-hoc.
Cuando se detecte una zona de puntaje, el robot emitirá una música de anotación de puntos, registrará el puntaje obtenido, girará aleatoriamente sobre su eje, seguirá su rumbo con la nueva velocidad, y volverá a su música de recorrido.
Cuando el robot choque contra algún obstáculo se detendrá, finalizará todas las tareas y mostrará por pantalla el puntaje acumulado en el visor.
Solución
Grupo: Robotek2.0
Jefe de grupo: Jorge Muñoz
Productor multimedia: Gianinna Salazar
Staff de Apoyo: Hernán Espinoza
Secretario: Erick Matus
Introducción:
Productor multimedia: Gianinna Salazar
Staff de Apoyo: Hernán Espinoza
Secretario: Erick Matus
Introducción:
A través de este informe se proporcionará toda la información recabada en el Proyecto Nº1 Dribbler, estrategias de solución, conocimientos empleados y las dificultades que se presentaron en el transcurso de esta actividad, además indicaremos la responsabilidad de cada integrante del grupo y organización del mismo.
Además de esto mostraremos de forma audiovisual el resultado, de este quehacer.
Les invitamos a disfrutar de un trabajo realizado con mucha dedicación y responsabilidad.
Les invitamos a disfrutar de un trabajo realizado con mucha dedicación y responsabilidad.
Estrategia de trabajo:
Jefe de Grupo (Jorge Muñoz): Se encarga de desarrollar y designar las actividades a realizar para cada integrante del grupo.
Productor Multimedia (Gianinna Salazar): Alumna delegada a grabar y registrar cada movimiento de robot, administrar los registros visuales.
Staff de Apoyo (Hernan Espinoza): Persona que colabora en todos los procesos de la actividad ya sea en la programación y el registro audiovisual, como la confección del informe.
Secretario (Erick Matus): Registro escrito y apoyo audiovisual.
Cada integrante del grupo se encargó de ayudar en la programación del robot (lenguaje NXT) y en realizar las pruebas.
Alumnos: Jorge Muñoz – Hernán Espinoza – Gianinna Salazar –Erick Matus.
Objetivo: Programar un código NXC que en primera instancia busque puntos negros (para sumar puntaje) y que al recibir un sonido superior al umbral estipulado, esquiva los obstáculos propuestos (pared y bloques).Finalmente debe mostrar todas las estadísticas por la pantalla del ladrillo.
#define Umbral 40
#define db 50
int potencia=20;
int i =0;
int k;
int tiempo;
int acumula_puntos[];
int t_actual;
int t_anterior;
int suma=0;
mutex avanzarMutex;
task buscar()
int potencia=20;
int i =0;
int k;
int tiempo;
int acumula_puntos[];
int t_actual;
int t_anterior;
int suma=0;
mutex avanzarMutex;
task buscar()
{
while(true){
OnFwd(OUT_AB, potencia);
}
}
while(true){
OnFwd(OUT_AB, potencia);
}
}
task puntos()
{
while (true)
while (true)
{
if(Sensor(IN_3) < Umbral)
if(Sensor(IN_3) < Umbral)
{
t_actual=CurrentTick();
PlayTone(100,100);
Wait(1000);
t_actual=CurrentTick();
PlayTone(100,100);
Wait(1000);
tiempo =(t_actual-t_anterior)/1000;
t_anterior=t_actual;
i++;
if(tiempo<=10)
t_anterior=t_actual;
i++;
if(tiempo<=10)
{
acumula_puntos[i] = -5*tiempo+50;
}
if(tiempo>10){
acumula_puntos[i]=0;
}
potencia+=10;
if(potencia>=100)
acumula_puntos[i] = -5*tiempo+50;
}
if(tiempo>10){
acumula_puntos[i]=0;
}
potencia+=10;
if(potencia>=100)
{
potencia=100;}
OnFwd(OUT_B,potencia);
Wait(Random(1000));
}
}
}
potencia=100;}
OnFwd(OUT_B,potencia);
Wait(Random(1000));
}
}
}
task musica_busqueda()
{
while(true){
PlayTone(100,80);
Wait(120);
PlayTone(200,80);
Wait(115);
PlayTone(300,80);
Wait(115);
PlayTone(400,80);
Wait(115);
PlayTone(500,50);
Wait(115);
}
}
task sonido()
{
if(Sensor(IN_2)> db)
{
OnRev (OUT_AB, potencia);
Wait(1000);
OnFwd(OUT_A,potencia);
Wait (2000);
}
}
task detener()
{
if(Sensor(IN_1)==1
{
for (k=0; k<i; k++)
{
NumOut(5,80-k*5,acumula_puntos[k]);
suma=acumula_puntos[k]+suma;
} // del for
}// de la subrutina
Wait(10000);
StopAllTasks();
} //del if } //del task detener
task main()
{
t_anterior=CurrentTick();
SetSensorLight(IN_3);
SetSensorSound(IN_2);
SetSensorTouch(IN_1);
Precedes(buscar,musica_busqueda,puntos,sonido,detener);
}
Video de la Actividad:
Reflexión
En conclusión utilizar tareas paralelas permite desarrollar comportamientos más complejos y hacer en el caso particular de nuestro robot una detección de elementos externos más efectiva y rápida (sensores), pero además de ser más efectivo el uso de concurrencia, también necesita de mayor trabajo, en relación a el uso de recursos paralelos, como por ejemplo los motores que de no usar un semáforo de uso, hubiesen recibido varias órdenes al mismo tiempo.
Los problemas particulares con los que nos topamos fueron en primer lugar, que el robot al girar sobre su eje en el momento de detectar un punto seguía detectando el mismo punto ya que la tarea paralela de detección seguía funcionando mientras el robot giraba, lo que corregimos con una bandera simple, en segundo lugar nunca fue posible detener una tarea desde otra, por lo que nos vimos en la obligación de utilizar banderas globales.
Y por último nos topamos con el problema de mantener la pantalla funcionando después del termino del programa, cosa imposible por lo que al dejar una tarea corriendo y las demás con sus respectivas banderas en falso solucionamos el ultimo problema.
No hay comentarios:
Publicar un comentario