Actualmente es posible crear robots avanzados que sean capaces de seguir a una persona guiándose por determinados patrones: como por el color de la ropa, su altura, … Aunque estos robots no tienen gran utilidad en la actualidad, es una funcionalidad que podría ser útil para complementar otras en un futuro. Con los LEGO Mindstorms NXT no es posible ser tan preciso, pero se puede conseguir un comportamiento parecido. Construiremos un Robot seguidor básico con ultrasonidos.
Programa de prueba:
Puesto que hoy no dispongo de mucho tiempo, el artículo no es tan largo como de costumbre. Antes de poneros con este programa os recomiendo que os leáis mis anteriores artículos de RobotC, especialmente el del manejo del sensor de ultrasonidos.
Este robot lo que hará principalmente es seguir a un objeto que se encuentre en línea con el. Cuando el objeto avance el robot lo seguirá avanzando también. Si el objeto se acerca demasiado el robot dará marcha atrás para no chocar con el.
Es importante definir unos buenos umbrales de distancia para saber cuando el robot tiene que seguir al objeto, o cuando tiene que dar marcha atrás. Teniendo en cuenta que el sensor de ultrasonidos suele fallar bastante en distancias menores a los 15cm, es aconsejable que la distancia para empezar a dar marcha atrás sea mayor (unos 25 cm por ejemplo). También es buena idea que no sean la misma distancia, que haya un margen de más de 10cm entre ellas. Por ejemplo si estoy diciendo que el robot de marcha atrás cuando me acerque a el a menos de 30 cm, le tendré que decir que se mueva para adelante solo cuando me encuentre a más de 40 cm. Si el robot se encuentra dentro de ese intervalo deberá estar parado.
Es también recomendable que cuando el sensor de utrasonidos detecte 255 cm (que en la mayoría de casos significa error) se quede quieto. Así evitaremos que el robot acelere cuando nos acercamos demasiado a el y las lecturas fallan. El código del programa no es muy largo, os lo escribo a continuación:
#pragma config(Sensor, S4, sonar1, sensorSONAR)
task main(){
int min = 25, max = 35;
nxtDisplayCenteredTextLine(1, “Distancia al”);
nxtDisplayCenteredTextLine(3, “objetivo: “);
while(true){
nxtDisplayCenteredTextLine(5, “%d cm”, SensorValue[sonar1]);
if (SensorValue[sonar1] != 255){
if (SensorValue[sonar1] > max){
motor[motorA] = 100;
motor[motorC] = 100;
}
else if (SensorValue[sonar1] < min){
motor[motorA] = -100;
motor[motorC] = -100;
}
else{
motor[motorA] = 0;
motor[motorC] = 0;
}
}
else{
motor[motorA] = 0;
motor[motorC] = 0;
}
}
}
Aquí os dejo un vídeo bastante orientativo de como se comportaría el robor con dicho programa:
Por último añadir que todas las dudas que os surjan os las resolveremos sin problemas en el foro.