Ú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íafind
tener más prioridad quetrack
? De hecho, la condiciónfind
y laelse
condición detrack
son 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
T
prioridad de la tarean
,T
debería ser lo que el robot debería hacer sin
se ignoran todas las tareas con mayor prioridad .Ordenemos sus tareas de ejemplo, luego busquemos una manera de implementarlo. Sus tareas son
evade
,find
ytrack
.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:
evade
find
track
La razón
find
tiene mayor prioridad quetrack
es que, como he mencionado anteriormente, lo haríatrack
sólo sievade
yfind
son innecesarias. Si ponesfind
abajotrack
, 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
find
una 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,track
entra en acción. Como puede ver, laelse
condición detrack
nunca 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_left
yls_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
find
tarea es similar:Es decir, vas en espiral solo si no sientes nada
Su
track
tarea 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