El servobrazo de bricolaje que usa una cinemática inversa incorrecta no hace una línea recta

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?

EDITAR:

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

Tal vez: supongo que tendrá que intentar dibujar líneas de 0, 90, 180, 270 grados. | Intente dibujar una línea de 45, 135, 225, 315 grados hacia adelante y hacia atrás y vea qué resultados son simétricos y cuáles asimétricos. por ejemplo, si un componente tiene el signo incorrecto, es posible que en algunos cuadrantes el resultado se curve hacia la izquierda y en otros hacia la derecha. Hacer que los brazos tengan la misma longitud (pueden o no serlo) simplifica los cambios que pueden afectar las cosas. Eché un vistazo rápido a tu código pero nada obvio. ¿Puede simplificar acciones/código para eliminar posibles fuentes de error?
¡gracias por comentar! Estoy tratando de simplemente rellenos. por cierto, ¡mi servo está solo entre 0 ° y 180 °!

Respuestas (2)

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.