Resolver robots articulados con Arduino


En esta entrada vamos a ver las ecuaciones necesarias para calcular un robot articulado en un procesador como Arduino. Y al final ¡veremos una librería para que no tengáis que hacerlo nunca más!

La resolución de la posición y ángulos de polígonos articulados, en especial triángulos y cuadriláteros, resulta importante porque aparece frecuentemente al trabajar con robots articulados, como en el caso de brazos robóticos, cuadrípedos, hexápodos, bípedos, etc.

En general, en los robots articulados sabemos la distancia de cada uno de los lados del polígono articulado y actuamos sobre los motores para variar el ángulo que forman entre ellas.

También conocemos las coordenadas del punto inicial del polígono (o bien no nos importan, si vamos a usar coordenadas relativas al mismo). Por su parte, cada nodo de la articulación tiene sus propias coordenadas, teniendo especialmente interés en el “punto final” porque normalmente es donde tendremos el efector (la pinza del brazo, la pata del robot, etc).

Anuncio:

Con esto, tenemos dos tipos de cálculos que aparecen en la resolución de robots articulados:

  • Directo, donde sabemos los ángulos de las articulaciones, y queremos saber la posición del efector.
  • Inverso, donde sabemos la posición del efector, y queremos calcular los ángulos necesarios para conseguirlo.

Siendo más frecuente en robots articulados el último de estos dos. Por ejemplo, sabemos donde esta la pelota que queremos coger o donde queremos poner una pata, y necesitamos saber qué ángulos fijar en los motores para conseguirlo.

El cálculo no es especialmente complicado, pero requiere de una pequeña dosis de trigonometría. Por otro lado, destacar que no todas las posiciones van a tener resolución, mientras que por el contrario algunas van a tener más de una (en general, infinitas) soluciones posibles.

Sin más, vamos a ver cómo resolver este problema para el caso de triángulos y cuadriláteros articulados en 2D, y 3D, los casos más frecuentes que tendremos al trabajar con robots articulados.

Triángulo articulado 2D

Directo

El cálculo directo de la posición del efectos (P2), en función de los ángulos absolutos de los segmentos se obtiene simplemente proyectando en X e Y, de la siguiente forma.

P2_x = L_1 \cdot cos(\alpha_1) + L_2 \cdot cos(\alpha_2) \\ P2_y = L_1 \cdot sin(\alpha_1) + L_2 \cdot sin(\alpha_2)

Donde la relación entre los ángulos relativos entre los segmentos (tanto interior, como exterior) y los ángulos absolutos de los mismos se calculan mediante las siguientes expresiones

\beta_{1,2} = 180 - \alpha_2 + \alpha_1 \\ \gamma_{1,2} = \alpha_2 + \alpha_1 + 180

Inverso

El cálculo inverso, es igualmente sencillo, considerando que los dos segmentos forman un triángulo junto con la línea imaginaría que unen P0 y P2.

Podemos calcular distancia D desde la base P0 a P2, aplicando el teorema de pitágoras.

 D = \sqrt{{P2_x} ^ 2 + {P2_y} ^ 2}

Con esta distancia y las longitudes de los segmentos podemos calcular todos los ángulos interiores del triángulo aplicando el teorema del coseno generalizado.

 \theta_{L2} = \sqrt{\frac{{L_1} ^ 2 + {D} ^ 2 - {L_2} ^ 2}{2 \cdot L_1 \cdot D}} \\ \beta_{1,2} = \sqrt{\frac{{L_1} ^ 2 + {L_2} ^ 2 - {D} ^ 2}{2 \cdot L_1 \cdot L_2}}

Por otro lado, podemos calcular el ángulo que forma el triángulo respecto al eje X con la siguiente expresión.

 \lambda_0 = tan^{-1}(\frac{y}{x})

Finalmente, calculamos el ángulo absoluto del primer segmento haciendo.

 \alpha_1 = \lambda_0 + \theta_{L2}

Conocido el ángulo absoluto del primer segmento y el ángulo relativo entre los mismos, podemos calcular el resto de ángulos relativos y absolutos usando las expresiones que hemos visto con anterioridad.

Lógicamente, no todas las posiciones admiten una solución, como por ejemplo las que excedan el alcance de los brazos.

Código

Así sería un posible ejemplo de código para resolver un triángulo articulado en 2D en un procesador como Arduino.

Cuadrilátero articulado 2D

Directo

La resolución de un cuadrilátero articulado es similar al triángulo articulado, simplemente proyectamos el nuevo segmento en los ejes X e Y.

 P3_x = P2_x + L_3 \cdot cos(\alpha_3) \\ P3_y = P2_y + L_3 \cdot sin(\alpha_3)

Inverso

La resolución de un cuadrilátero articulado no es más compleja que la del triángulo en 2D. El nuevo segmento añade un grado de libertad adicional por lo que, en general, el problema admite múltiples soluciones (infinitas).

Para poder resolver el sistema debemos imponer una condición (o relación entre condiciones). Lo habitual es proporcionar el ángulo absoluto del ultimo segmento, que corresponde con el angulo de ataque del efector.

 P2_x = P3_x - L_3 \cdot cos(\alpha_3) \\ P2_y = P3_y - L_3 \cdot sin(\alpha_3)

Con las coordenadas del punto P2, resolveríamos como en el caso anterior. Igual que en el caso del triángulo, no todas las posiciones admiten solución. Por otro lado, es posible que exista solución solo para un cierto rango de valores de ángulo del efector.

Con frecuencia, se establece una relación entre la posición del efector y su ángulo alpha_3, basado en que la variación del ángulo durante el recorrido del robot sea “suave”.

Código

Así sería un posible ejemplo de código para resolver un cuadrilátero articulado en 2D en un procesador como Arduino.

Triángulo articulado 3D

Directo

El caso de un polígono articulado en 3D puede resolverse con las mismas herramientas que en el caso 2D, simplemente considerando que ocurren en un plano girado un ángulo alpha_0 respecto al eje Z.

Para convertir las coordenadas de cualquier punto calculado en el plano (Pn’) a sus equivalentes en 3D (Pn) usamos las siguientes relaciones.

 PN_x = PN'_x \cdot cos(\sigma ) \\ PN_y = PN'_x \cdot sin(\sigma ) \\ PN_z = PN'_y

Siendo sigma el ángulo de rotación entre el plano y el eje X.

 \sigma = tan^{-1}(\frac{P2_y}{P2_x})

Inverso

De forma similar, podremos convertir el cálculo inverso de un triángulo en 3D a un caso en 2D proyectando en el plano equivalente.

Para ello, llevaremos las coordenadas 3D del efector (P2) a su equivalente en 2D (P2′) mediante la siguientes relaciones.

 P2'_x = \sqrt{{P2_x} ^ 2 + {P2_y} ^ 2} \\ P2'_y = P2_z

Finalmente, resolveríamos como en el caso 2D. Los ángulos entre segmentos calculados son los mismos que en el caso 3D. Si quisiéramos calcular coordenadas de puntos, usaríamos las relaciones anterior para pasar de 2D a 3D.

Código

Así sería un posible ejemplo de código para resolver un triángulo articulado en 3D en un procesador como Arduino.

Cuadrilátero articulado 3D

Directo

Análogamente, para el calculo directo de un cuadrilátero articulado en 3D proyectamos igualmente en un plano 2D usando las expresiones del apartado anterior, únicamente considerando que el ángulo alpha_0 esta vez es.

 \sigma = tan^{-1}(\frac{P3_y}{P3_x})

Inverso

Igualmente, un cuadrilátero articulado puede resolverse con las mismas herramientas que su equivalente en 2D. La única diferencia es que, en esta ocasión, las coordenadas del efectos en el caso equivalente en 2D (P3′) se calculan a partir del punto 3D (P3) según la siguiente relación.

 P3'_x = \sqrt{{P3_x} ^ 2 + {P3_y} ^ 2} \\ P3'_y = P3_z

Código

Así sería un posible ejemplo de código para resolver un cuadrilátero articulado en 3D en un procesador como Arduino.

Librería de Arduino Articulated

¿Y si lo metemos en una librería para que sea más cómodo de usar? Por supuesto que sí, aquí una librería de Articulated para Arduino, que realiza todos los cálculos anteriores de forma cómoda y sencilla. A disfrutarlo!

Si te ha gustado esta entrada y quieres leer más sobre Arduino puedes consultar la sección
tutoriales de Arduino

Anuncio:

Previous Crear y leer ficheros Json fácilmente en C# con JsonNET
Next Librería Arduino Articulated
1000