El brazo servo de bricolaje que utiliza una cinemática inversa incorrecta no hace una línea recta

1

He construido un Servo-Arms con un servo HS-422 (servomotores básicos super simples que se encuentran en un kit de inicio) que obtiene valores de ángulo con cinemática inversa en el procesamiento (java).

La cinemática inversa (en computadora) está bien y se basa en this

La comunicación con arduino está bien, en el sentido de que si pongo los 2 servos a 0 ° -0 °, 90 ° -90 °, 180 ° -180 °, los brazos se colocan en la posición correcta.

PERO si trazo una línea recta en mis bocetos de Java ... el sorteo de 2servo-arms ... una especie de 'U' rara.

El Código de cinemática inversa es aquí .

Pero creo que es correcto y hay un problema estructural-mecánico que no puedo entender. Alguien me puede aconsejar algo?

EDITAR:

resuelto! Hubo algunos problemas, causados por cinemática inversa incorrecta. Tanto el comentario como la respuesta fueron útiles, ¡gracias a esta poderosa comunidad!

    
pregunta nkint

2 respuestas

2

Parece que la velocidad del servo no está siendo controlada adecuadamente.

¿Puedes frenar el movimiento del brazo hacia abajo?

Recuerde, para que la cinemática inversa funcione correctamente, necesita un control muy preciso de la velocidad de rotación. Si su sistema tiene el brazo moviéndose de un punto a otro a la velocidad máxima posible, los servos pueden estar alcanzando su velocidad de rotación máxima. Como tal, un servo completaría su movimiento antes que el otro, lo que convertiría su línea en una serie de segmentos de arco, que se mezclan parcialmente.

Intente controlar el sistema para que el brazo se mueva a los puntos en un sistema de coordenadas X-Y. Si el brazo puede mover correctamente el lápiz a los puntos especificados, es un problema de velocidad de servo. Si no, es otra cosa.

    
respondido por el Connor Wolf
1

Ya que es casi imposible asegurar que dos servos se muevan exactamente a la misma velocidad, la solución simple y global sería generar una trayectoria para sus coordenadas de efector final (X, Y). Entonces, por ejemplo, si desea dibujar una línea recta, simplemente cree una trayectoria lineal de la forma y = mx + b (debería ser familiar para la mayoría de ustedes). Simplemente haga que la x sea una función del tiempo colocando "x = t; t ++;" al final del bucle. Por supuesto, debe tener un tiempo de bucle fijo: si no necesita hacer nada más durante el movimiento, simplemente use un bucle while que termine cuando se alcancen las coordenadas deseadas. Otra ventaja de este método es que puede variar la velocidad a la que dibuja la línea; por ejemplo, en lugar de "t ++" puede poner "t + = 0.7" para una velocidad más lenta.

    
respondido por el AnandS

Lea otras preguntas en las etiquetas