2010-04-12 19 views
9

Estoy tratando de implementar Cinemática inversa en un brazo 2D (compuesto por tres palos con juntas). Puedo rotar el brazo más bajo a la posición deseada. Ahora, tengo algunas preguntas:Implementación cinemática inversa 2D

  1. ¿Cómo puedo hacer el movimiento del brazo superior alongwith la tercera por lo que el punto extremo del brazo alcanza el punto deseado. ¿Necesito usar las matrices de rotación para ambos y, en caso afirmativo, alguien me puede dar algún ejemplo o una ayuda y existe alguna otra forma posible de hacerlo sin matrices de rotación?

  2. El brazo inferior solo se mueve en una dirección. Probé con Google, dicen que el producto cruzado de dos vectores da la dirección del brazo, pero esto es para 3D. Estoy usando 2D y el producto cruzado de dos vectores 2D da un escalar. Entonces, ¿cómo puedo determinar su dirección?

chicos Plz cualquier ayuda se agradece ....

Gracias de antemano Vikram

Respuesta

7

Voy a darle un tiro, pero ya que mis Robótica dos décadas en el pasado, Tómelo con un grano de sal.

De la forma en que lo aprendí, cada articulación fue descrita por su propia matriz de rotación, definida en relación con su posición y orientación actuales. La coordenada del punto final del brazo completo se calculó combinando las matrices de rotación juntas.

Esto logró exactamente el efecto que busca: podría mover solo una junta (cambiar su orientación), y todas las otras juntas se seguirían automáticamente.

No tendrá muchas posibilidades de evitar matrices aquí; de hecho, si utiliza coordenadas homogéneas, todos los cálculos conjuntos (rotaciones y traducciones) se pueden modelar con multiplicaciones de matrices. La ventaja es que la posición de brazo completo se puede describir con una matriz única (más el origen del brazo). Con esta matriz de transformación, puede abordar el problema cinemático inverso: dado que los elementos de la matriz de transformación dependerán de los ángulos de las juntas, puede tratar todo el cálculo 'punto final = punto de inicio x transformación' como un sistema de ecuaciones , y con el punto de inicio y el punto final conocidos, puede resolver este sistema para determinar los ángulos desconocidos. La dificultad aquí radica en que la ecuación puede no ser solvente o que existen soluciones múltiples.

Aunque no entiendo muy bien tu segunda pregunta, ¿qué estás buscando?

3

En robótica usamos con mayor frecuencia los parámetros DH para la cinemática directa e inversa. Wikipedia tiene una buena introducción.

3

La notación DH (Denavit-Hartenberg) es parte de la solución. Le ayuda a recopilar un conjunto sucinto de valores que describen la mecánica de su robot, como la longitud del enlace y el tipo de articulación.

A partir de allí se vuelve más fácil calcular la cinemática hacia adelante. Lo primero que debes entender es cómo traducir un marco de coordenadas de un lugar a otro marco de coordenadas. Por ejemplo, dado su robot (o la tabla DH), ¿cuál es el conjunto de rotaciones y traducciones que tiene que aplicar a un marco de coordenadas (el mundo, por ejemplo) para conocer la ubicación de un punto (o vector) en el marco de coordenadas de la muñeca del robot.

Como ya sabrá, las matrices de transformación homogénea son muy útiles para tales transformaciones. Son matrices 4x4 que encapsulan la rotación y la traducción. Otra propiedad muy útil de esas matrices es que si tienes dos marcos de coordenadas vinculados y definidos por alguna rotación y traslación, si multiplicas las dos matrices juntas, entonces solo necesitas multiplicar tu objetivo de transformación por el producto de esa multiplicación.

Así que la tabla DH te ayudará a construir esa matriz.

La cinemática inversa es un poco más complicada y depende de su aplicación. La complicación surge de tener múltiples soluciones para el mismo problema. Cuanto mayor es el número de DOF, mayor es el número de soluciones.

Piense en su brazo. Pellizque algo sólido a su alrededor. Puede mover su brazo a varias ubicaciones en el espacio y aún así mantener su vector de pellizco sin cambios. Resolver el problema de la cinemática inversa implica decidir qué solución elegir también.

6
  1. En lugar de una matriz de rotación, la rotación puede ser representado por su ángulo o por un complex number of the unit circle, pero es la misma cosa realmente. Más importante aún, necesita una representación T de rigid body transformations, de modo que pueda escribir cosas como t1 * t2 * t3 para calcular la posición y la orientación del tercer enlace.

  2. Usa atan2 para calcular el angle between the vectors.

Como muestra el siguiente ejemplo de Python, esas dos cosas son suficientes para construir un pequeño solucionador de IK.

from gameobjects.vector2 import Vector2 as V 
from matrix33 import Matrix33 as T 
from math import sin, cos, atan2, pi 
import random 

La biblioteca gameobjects no tiene transformaciones 2D, por lo que tienen que escribir matrix33 mismo. Su interfaz es como gameobjects.matrix44.

Define la función cinemática hacia adelante para la transformación de una unión a la siguiente. Suponemos que gira el conjuntas por angle y es seguido por una transformación fijo joint:

def fk_joint(joint, angle): return T.rotation(angle) * joint 

La transformación de la herramienta es tool == fk(joints, q) donde joints son las transformaciones fijos y q son los ángulos de las articulaciones:

def fk(joints, q): 
    prev = T.identity() 
    for i, joint in enumerate(joints): 
     prev = prev * fk_joint(joint, q[i]) 
    return prev 

Si la base del brazo tiene un desplazamiento, reemplace la transformación T.identity().

El OP está resolviendo el problema de IK para la posición mediante descenso de coordenadas cíclicas. La idea es acercar la herramienta a la posición objetivo ajustando una variable conjunta a la vez. Deje que q sea el ángulo de una junta y prev sea la transformación de la base de la junta.La unión debe ser girado por el ángulo entre los vectores a las posiciones de la herramienta y el objetivo:

def ccd_step(q, prev, tool, goal): 
    a = tool.get_position() - prev.get_position() 
    b = goal - prev.get_position() 
    return q + atan2(b.get_y(), b.get_x()) - atan2(a.get_y(), a.get_x()) 

Traverse las articulaciones y actualizar la configuración de la herramienta para cada cambio de un valor conjunto:

def ccd_sweep(joints, tool, q, goal): 
    prev = T.identity() 
    for i, joint in enumerate(joints): 
     next = prev * fk_joint(joint, q[i]) 
     q[i] = ccd_step(q[i], prev, tool, goal) 
     prev = prev * fk_joint(joint, q[i]) 
     tool = prev * next.get_inverse() * tool 
    return prev 

Nota que fk() y ccd_sweep() son lo mismo para 3D; solo tiene que volver a escribir fk_joint() y ccd_step().

Construir un brazo con n enlaces idénticos y ejecutar cnt iteraciones del barrido CCD, a partir de una configuración de brazo al azar q:

def ccd_demo(n, cnt): 
    q = [random.uniform(-pi, pi) for i in range(n)] 
    joints = [T.translation(0, 1)] * n 
    tool = fk(joints, q) 
    goal = V(0.9, 0.75) # Some arbitrary goal. 
    print "i  Error" 
    for i in range(cnt): 
     tool = ccd_sweep(joints, tool, q, goal) 
     error = (tool.get_position() - goal).get_length() 
     print "%d %e" % (i, error) 

Podemos probar el solucionador y comparar la tasa de convergencia para diferentes números de enlaces:

>>> ccd_demo(3, 7) 
i  Error 
0 1.671521e-03 
1 8.849190e-05 
2 4.704854e-06 
3 2.500868e-07 
4 1.329354e-08 
5 7.066271e-10 
6 3.756145e-11 
>>> ccd_demo(20, 7) 
i  Error 
0 1.504538e-01 
1 1.189107e-04 
2 8.508951e-08 
3 6.089372e-11 
4 4.485040e-14 
5 2.601336e-15 
6 2.504777e-15