Paso 2: El control lazo
La parte de dirección proporciona los hechos para nuestros cálculos. El siguiente paso es la estimación de que el robot debe ser como un comienzo de la parte controlada de la secuencia de comandos.
En primer lugar tendremos que escoger un intervalo para el bucle de control incluyendo las mediciones del sensor. Cuanto menor sea el intervalo, mejor: creando una retroalimentación rápida sobre nuestras estimaciones por los datos de los encoders. Preferiblemente el intervalo debe ser alrededor de 0,01 segundo.
Dagu Arduino como mini controlador de RB2 permite un intervalo de regeneración de los sensores de 0,01 seg. Pero hay algunas cosas a considerar. En principio hay son varias fuentes de retardo (por ejemplo, el tiempo de ejecución para el bucle de control sí mismo). En segundo lugar tener en cuenta es la resolución del codificador. En otras palabras: el tiempo mínimo necesario para generar por lo menos 1 garrapata en el arranque la velocidad (es decir, la velocidad de pérdida). RB2 se utiliza como intervalo de 0,1 seg. Una frecuencia de 10 veces menor retroalimentación tiene sus implicaciones en el bucle de control: limita el grado de ajuste de los errores y ajustes. Una trayectoria de 2 metros llevará una buena 6 segundos para terminar (0,31 m/s). En este período sólo será inferior a 60 minutos para leer los datos del actuador e implementar los ajustes calculados.
Para la buena afinación (llegará a la que describe el bucle de control) uno debe tener al menos un par de cien lazos de evaluación. Se puede ver el efecto en el video al comienzo del blog: las correcciones en la dirección a veces son un poco bruscas. Tener una mayor frecuencia de retroalimentación permitirá liso en las correcciones más. (Otra causa es la resolución del codificador: el error mínimo que se puede leer es 1 garrapata. Así que lo que ves en el video, es el mejor que pude exprimir de la situación.)
Es esencial que las evaluaciones se realizan con una frecuencia constante. Variaciones en los intervalos son desastrosas para el bucle de control. Es donde me enfrenté con otro obstáculo. Comenzó a utilizar la función de time.time() de Python, pero descubrió que él creó algunos picos extraños. Incluso cuando solo ejecutar un script con sólo el intervalo de bucle de sí mismo. Había conectada a la función time.clock() que es el tiempo de procesador y me funcionó el script en una ventana, un Unix y un sistema Linux. Halas con no mejores resultados. Incluso trató de roscar. Timer() para generar un lazo de sincronización como un subproceso independiente. Esto funcionó bien, pero a la secuencia de comandos demasiado complicado (para mí). Como se puede leer en el guión, acabé con tapado el temporizador a un máximo y omitir los lazos del control cuando el temporizador supera el límite. Un poco áspero y tiene sus consecuencias sobre la precisión, pero funciona mejor que tener demasiado las variaciones en los lazos de control. Probablemente uno podría producir una mejor sincronización/gestión de eventos en C y C++, pero para mí que me llevaría demasiado tiempo para descubrir a la luz de lo que debe hacer la secuencia de comandos.
Así que en cada 0,1 segundos se leen los codificadores, se calculan las diferencias (errores) en la estimación y se hace una nueva valoración. En la escritura de la velocidad deseada del bot se calcula y se fijó como objetivo. Objetivos se denominan más 'Puntos de referencia'. En la escritura de un punto de referencia es la velocidad deseada multiplicada por el intervalo de tiempo, la cantidad de garrapatas en el intervalo. Realmente esto no es correcto. La velocidad deseada es la velocidad al final del intervalo. Si uno quiere trabajar más exacto, uno debe utilizar la ecuación: Vt = Vo + a.t o por lo menos la velocidad media: (Vt-Vo) / t para calcular la cantidad exacta de pasos que deben realizarse en el intervalo. (V significa velocidad en m/s, a = la aceleración y t = tiempo de intervalo).
Tomando en cuenta todas las limitaciones que ya describí, mantuvo simple. Como se muestra en el video, uno puede llegar a resultados razonables de todos modos. Tener un punto de referencia establecido, el bot se ejecutará a cierta velocidad y en el inicio de un nuevo intervalo, el valor de consigna puede ser evaluado contra los datos del codificador. Es donde comienza la parte controlada.