He construido un Servo-Arms con servo HS-422 (servomotores básicos súper simples que se encuentran en un kit de inicio) que obtiene valores de ángulo con cinemática inversa en Procesamiento (java).
La cinemática inversa (en computadora) está bien y se basa en esto
La comunicacion con arduino esta bien, en el sentido de que si pongo los 2 servos a 0°-0°, 90°-90°, 180°-180° los brazos van en la posicion correcta.
PERO si dibujo una línea recta en mis bocetos de Java... los 2 servobrazos dibujan... una especie de 'U' extraña.
El código de la cinemática inversa está aquí .
Pero creo que es correcto y hay algún problema estructural-mecánico que no puedo entender. Alguien me puede aconsejar algo?
¡resuelto! hubo algunos problemas, causados por una cinemática inversa incorrecta. tanto el comentario como la respuesta fueron útiles, ¡gracias a esta poderosa comunidad!
Parece que la velocidad del servo no se controla correctamente.
¿Puedes ralentizar el movimiento del brazo?
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 máxima velocidad posible, los servos pueden estar alcanzando su máxima velocidad de rotación. 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 puntos en un sistema de coordenadas XY. Si el brazo puede mover correctamente la pluma a los puntos especificados, es un problema de velocidad del servo. Si no, es otra cosa.
Dado que es casi imposible garantizar que dos servos cualesquiera se muevan exactamente a la misma velocidad, la solución simple y general sería generar una trayectoria para las coordenadas del 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 (debe ser familiar para la mayoría de ustedes). Simplemente haga la función xa del tiempo poniendo " x = t; t++; " al final del ciclo. Por supuesto, debe tener un tiempo de ciclo fijo; si no necesita hacer nada más durante el movimiento, simplemente use un ciclo while que termine cuando se alcancen las coordenadas deseadas. Otra ventaja de este método es que puedes variar la velocidad a la que dibuja la línea; por ejemplo, en lugar de "t++" puedes poner "t += 0.7" para una velocidad más lenta.
Russel McMahon
nkint