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?
fuente
Respuestas:
Generación de perfil de movimiento
En el pasado, he usado un generador de perfiles de movimiento para resolver este problema. Para usarlo, necesitaría la posición deseada (punto de ajuste), la velocidad máxima y los valores de aceleración asociados con sus motores. Funciona integrando una curva de velocidad trapezoidal para obtener un perfil de posición uniforme. Se puede usar una curva en S si el movimiento tiene que ser aún más suave. Referencia al artículo que explica el perfil de movimiento .
Prefiltrado de punto de ajuste
Además de la ruta de creación de perfiles de movimiento, puede intentar simplemente filtrar el comando de paso bajo a los servos. Este tipo de filtrado del punto de ajuste ralentizará su respuesta, pero también lo suavizará y es fácil de implementar. La frecuencia de corte tendrá que elegirse para que sea compatible con el ancho de banda de su sistema (para que no filtre el movimiento deseado). Implementación simple de filtro de paso bajo en C
fuente
Creo que la pregunta se refiere a este tipo de dispositivo: servo RC
Por lo general, no tienen un rendimiento muy alto, por lo que no podrán rastrear muy bien un perfil de movimiento generado. La mayoría de los sistemas comerciales de control de motores utilizan una curva S para un movimiento de punto a punto (ver la respuesta de @ ddevaz) que hace un perfil por partes donde cada segmento usa una ecuación diferente. Su problema será que para que su motor rastree el perfil generado, es probable que tenga un perfil muy "lento". De lo contrario, el perfil que intente y le ordene al dispositivo que siga tendrá un error de posición grande frente a la posición real del dispositivo.
Idealmente, querrá algún tipo de retroalimentación que pueda ver mientras ejecuta el movimiento para que pueda ver qué tan bien el dispositivo está siguiendo el comando. Desde una perspectiva más práctica, si desea un movimiento significativamente mejor, es posible que necesite diferentes motores y diferentes controles de motor.
fuente