Hice un pequeño robot rastreador hace un rato que tenía dos patas con dos grados de libertad cada una, por lo que 4 servos RC en total. Mientras programaba el movimiento de las piernas, noté que se movían con bastante rigidez. Tiene sentido que el controlador interno del servo RC tenga una respuesta muy rápida a los comandos de posición, pero quería que mi rastreador se mueva de una manera que parezca un poco más suave y realista.
Mi solución fue crear una función cúbica de tiempo que describa la ruta de los servos, y luego establecer su posición en pequeños incrementos de tiempo, lo que resulta en un movimiento más suave. Esencialmente lo que hice fue resolver las coeficientes en una ecuación cúbica usando el intervalo de tiempo, comenzando y la posición del servo que termina, y empezando y terminando las tasas de la servo debe mover (que es simplemente la derivada de la posición):
Resuelva para , , y :a 1 a 2 a 3
r a t e ( t ) = p o s i t i o n ′ ( t ) = a 1 + 2 a 2 t + 3 a 3 t
Dado: , posición (t_f) , tasa (0) , tasa (t_f)p o s i t i o n ( t f ) r a t e ( 0 )
Establecí la tasa del servo entre un par de movimientos en cero si los movimientos estaban en direcciones opuestas, y positiva o negativa si los movimientos estaban en la dirección positiva o negativa, respectivamente.
Esto funcionó bastante bien, pero esta solución está limitada de varias maneras. Por un lado, es difícil decidir cuáles deberían ser exactamente las tasas entre los movimientos que van en la misma dirección. Utilicé el promedio de las pendientes delante y detrás de una posición particular entre movimientos, pero no está claro para mí que sea óptimo. En segundo lugar, las curvas cúbicas podrían llevar el servo a una posición fuera del rango de las posiciones al principio y al final de un movimiento, lo que puede ser indeseable. Por ejemplo, en algún momento durante el intervalo de tiempo, la curva podría hacer que el servo vaya más allá de la segunda posición o debajo de la primera posición. En tercer lugar, la generación de curvas aquí no considera la velocidad máxima que el servo puede girar, por lo que una curva puede hacer que el servo se mueva a una velocidad poco realista. Con ese,
Descuidando esta última preocupación, estos problemas pueden resolverse aumentando el grado del polinomio y agregando restricciones para resolver los coeficientes, pero ahora empiezo a preguntarme ...
¿Hay una mejor manera que esta para hacer que el movimiento del servo sea suave y parezca más realista?