Últimamente he estado leyendo mucho sobre la arquitectura de subsunción y hay algunas maneras diferentes en que las personas parecen abogar.
Por ejemplo, algunas personas usan una variable global de "bandera" para que una tarea tome el control. Otros usan endTimeSlice()y permiten que el árbitro realmente elija. Y creo que esto es correcto.
Tengo esta pequeña sección del código de RobotC en la que estoy trabajando para una línea que sigue al robot, pero no estoy seguro de que lo esté haciendo bien, ya que actualmente el método de seguimiento siempre se hará cargo del método de búsqueda. El flujo correcto debe ser que find debe guiar al robot a la línea usando una ruta en espiral para encontrar la línea. Una vez que se encuentra la línea, la pista debe tomar el control.
task evade(){
if(SensorValue(forwardSonarSensor) > threshold){
//box the obstruction
}
}
task find(){
if(SensorValue(lightSensor) > threshold){
//spiral the robot
}
}
task track(){
if(SensorValue(lightSensor) < threshold){
//go straight
}else{
//execute turns to follow the line
}
}
task main(){
while(true){
StartTask(evade,9);
StartTask(track,8);
StartTask(find,7);
wait1Msec(250);
}
}
Acabo de usar algunos comentarios aquí en lugar del código real para mantenerlo breve. Son mis declaraciones if no lo suficientemente buenas como condiciones porque cuando el robot está fuera de línea, se track()hace cargo. ¿Es esto debido a la declaración else dentro de la pista? Si es así, ¿cómo track()realizar giros cuando pierde la línea sin hacerse cargo del forraje al comienzo del programa?
fuente

StartTask, ¿son la prioridad de la tarea? ¿9 va a ser la máxima prioridad? En ese caso, ¿no deberíafindtener más prioridad quetrack? De hecho, la condiciónfindy laelsecondición detrackson las mismas. Entonces, como humano, si el valor del sensor es mayor que el umbral, ¿qué harías? ¿Ir en espiral o girar para ajustar la línea?Respuestas:
Con la arquitectura de subsunción, debe diseñar cuidadosamente sus comportamientos de tal manera que si asigna la
Tprioridad de la tarean,Tdebería ser lo que el robot debería hacer sinse ignoran todas las tareas con mayor prioridad .Ordenemos sus tareas de ejemplo, luego busquemos una manera de implementarlo. Sus tareas son
evade,findytrack.En general, desearía que el robot rastree una línea. Sin embargo, si no pudo detectar la línea, entonces debería intentar encontrarla. Sobre todo, debe evadir los obstáculos. Esto nos da el siguiente orden:
evadefindtrackLa razón
findtiene mayor prioridad quetrackes que, como he mencionado anteriormente, lo haríatracksólo sievadeyfindson innecesarias. Si ponesfindabajotrack, eso significa que comienzas a rastrear si no hay obstáculo, incluso si no estás en la línea.Ahora veamos su implementación:
Recuerde que le dimos
finduna mayor prioridad. Por lo tanto, si el robot no puede detectar ellightSensor, irá en espiral tratando de encontrar la línea. Una vez que lo hace,trackentra en acción. Como puede ver, laelsecondición detracknunca ocurre.Mientras esto funciona, el robot se movería muy torpemente. De hecho, no hay mucho que pueda hacer al respecto, dada la construcción actual de su robot.
Aunque ya respondí tu pregunta, aquí hay una mejora simple para tu seguimiento de línea:
En lugar de un sensor de luz, use dos;
ls_leftyls_right. Usando (al menos) dos sensores, puede comprender si está totalmente fuera de la pista o si está a punto de salir de la pista. En el segundo caso, puede girar fácilmente en la dirección correcta y volver a la pista.Tu
findtarea es similar:Es decir, vas en espiral solo si no sientes nada
Su
tracktarea ahora se vuelve más eficiente:Obviamente, con una matriz de sensores de luz, puede juzgar mejor qué tan mal se está desviando (es decir, con qué ángulo) y decidir mejor cómo volver a la pista (es decir, con qué velocidad angular).
fuente
respuesta corta; no, realmente necesitas hacer las cosas de manera bastante diferente.
respuesta larga e incompleta; Permíteme darte un código de psuedo apropiado para robotC, que te coloca en un mejor camino. Primero, no use tareas, esto NO es para lo que son las tareas robotC. Podrían hacer que funcionen, tal vez, tal vez no (y necesita bastantes cambios para intentarlo).
hay un par de cosas aquí; La prioridad se vuelve irrelevante. Por agradable que parezca tener tareas en robotC con prioridades, en mi experiencia no son una buena opción para la implementación de subsunción. Por razones como, las prioridades no siempre se cumplen, las tareas no se pueden interrumpir (a veces), por lo que cuando se produce un evento de mayor prioridad, no va a reaccionar como se esperaba, robotC se volvió a ingresar recientemente, por lo que cosas como acceder a un sensor de más de 1 tarea puede ser arriesgado (problemas de sincronización I2C), y en algunos casos no lo es (sensores sondeados automáticamente).
Puede agregar su propia implementación prioritaria al bucle anterior a medida que las cosas funcionan, pero realmente no es necesario para comenzar.
Su comentario "// recuadro la obstrucción" describe un comportamiento balístico. Es un poco complicado implementarlo mediante la multitarea. El bucle simple que utilicé lo hace mucho más fácil y mejor para principiantes / aprendizaje.
La otra cosa con la que te dejaré es que la subsunción, aunque es ordenada y apropiada para muchas cosas, no es una buena manera de implementar lo que se hace mejor tradicionalmente. De hecho, la parte 'evadir' puede ser un buen candidato para la subsunción, pero, sinceramente, su otra tarea debería llamarse 'GoOnAboutYourBusiness'. Digo esto porque probablemente no quieras cambiar de búsqueda a seguimiento con subsunción. Manejar aquellos con bucles de programación tradicionales. Con un solo sensor, ¿la luz se siente más oscura o más clara que el último bucle? si se oscureció (suponiendo una línea negra) siga girando en la misma dirección, si se aclara, gire hacia el otro lado, si se mantuvo igual, siga recto. Probablemente necesite agregar algo de PID y usar una curva de dirección en lugar de simplemente girar a izquierda y derecha para ser más suave.
Y sí, múltiples sensores ayudan. http://www.mindsensors.com/ - sí, ese soy yo en la película actualmente (10/11/2012)
Actualización: código real
Probaré esto dentro de poco, pero compila e ilustra lo que escribí arriba:
fuente