Movimiento servo suave para un robot que se arrastra

11

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 unyo 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 3un0 0un1un2un3

r a t e ( t ) = p o s i t i o n ( t ) = a 1 + 2 a 2 t + 3 a 3 t

pagsosyotyoonorte(t)=un0 0+un1t+un2t2+un3t3
runtmi(t)=pagsosyotyoonorte(t)=un1+2un2t+3un3t2

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 )pagsosyotyoonorte(0 0)pagsosyotyoonorte(tF)runtmi(0 0)runtmi(tF)

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?

Robz
fuente
El código debería haber sido relativamente sencillo. ¿Puedes hablar más sobre por qué estuvo involucrado?
DaemonMaker
1
Tienes razón, el código era bastante sencillo, aunque el método resultante para controlar los servos era más complejo que antes. He editado mi pregunta para incluir una descripción de las limitaciones de este método.
Robz
NURBS , splines B racionales no uniformes, podrían hacer el trabajo
James Waldby - jwpat7
@ jwpat7 gracias por su aporte, pero no creo que NURBS funcione porque esas curvas no están garantizadas para alcanzar los puntos provistos
Robz
¿Es tan simple como reducir su coeficiente ? Kpags
Ian

Respuestas:

6

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

ddevaz
fuente
+1: definitivamente generación de perfil de movimiento.
Guy Sirton el
2

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.

Guy Sirton
fuente