Brazo Robot SCARA. La cinemática inversa más sencilla es la que se aplica al brazo robot tipo SCARA y brazo robot cilíndrico. En el brazo Scara tenemos que resolver los dos ángulos de las articulaciones. En este tipo de brazos el eje Z no interviene en la cinemática inversa porque es un resultado en sí mismo. Desde el punto de vista del cálculo sólo tenemos en cuenta los ejes X e Y, y la longitud de las articulaciones. (Si no ves la imagen, haz clic en el botón -Actualizar- de tu navegador) El triángulo formado por LongBrazo, LongAntBr e Hipotenusa suele ser del tipo irregular, sobre todo si los dos catetos (LongBrazo y LongAntBr) no son iguales. Para resolver los ángulos de este tipo de triángulo hay que aplicar el Teorema del Coseno. Observa que en las fórmulas trigonométricas se usa la función arcocoseno "Acos()" y un tipo de arcotangente llamado "Atan2()". No es lo mismo Atan(Y/X) que Atan2(Y, X). Se diferencia la una de la otra, además de la sintaxis, en que Atan2(), dependiendo de los signos contenidos en los valores X e Y tiene presente el cuadrante en el que se encuentra y puede recorrer los cuatro cuadrantes. Por contrapartida la función Atan() sólo tiene efecto en los cuadrantes 1 y 4. Comprueba que tu lenguaje de programación contiene la función Atan2() porque si no los datos no serán correctos. Más info haciendo clic en el gráfico a pie de este párrafo te llevará a la Wikipedia(En). En todos los lenguajes de programación las operaciones y los resultados de las funciones trigonométricas son siempre en radianes. Si queremos dar la información de los ángulos en el monitor es más cómodo hacerlo en grados "normales" llamados -grados sexagesimales- (se llama así porque cada grado son 60 minutos y a su vez, cada minuto son 60 segundos). Pasar radianes a grados sexagesimales se hace multiplicando el resultado en radianes por 180/Pi (57.29577951...). Y viceversa, para pasar grados sexagesimales a radianes hay que multiplicar por Pi/180 (0.017453292...). En el código fuente podrás ver ejemplos de estas conversiones según las necesidades del programa. Los nombres de las variables que verás en el código fuente también están en la imagen que ves aquí arriba para que sepas de dónde sale cada una de las fórmula trigonométrica en las que además viene con el ajuste para situarlo en una zona de la pantalla. La aparente complejidad del programa es debido a que tenemos que situar esos puntos en la pantalla para formar mediante dos líneas el brazo tipo Scara de 2GL (GL= Grado de Libertad). En el monitor el eje X se corresponde con el plano que estamos acostumbrados en matemáticas, pero el eje Y no comienza en la esquina inferior izquierda, sino en la parte superior izquierda. Por esta razón en el código fuente interviene la variable BaseY al comienzo de la cinemática inversa.
Te animo a que experimentes y puedas comprobar que tu Brazo Robot tipo Scara puede por ejemplo moverse en línea recta. Aquí se muestra para dos grados de libertad (2GL). Si necesitas que el brazo Scara tenga un ángulo de muñeca o quieres mover 3 grados de libertad pasa al siguiente capítulo. El código está escrito en FreeBasic IDE, pero es 99% compatible con QBasic.
The translation could modify the code. Use the code without translating or download the program by clicking the link above. Windowtitle "Cinematica Inversa para brazo robot SCARA con 2 grados de libertad." Screen 12 ' Resolución 640x480 Cls Dim As Double Pi, rad, grad Dim As Double PYa, PYb, PXa, PXb, LadoA, Alfa, Beta, Gamma Dim As Double AngAntBr,AngBrazo, BrazoPY, BrazoPX, AntBrazoPY,_ AntBrazoPX, Hipotenusa, x, y, Xaux, Yaux Dim As Integer BaseY, BaseX, LongBrazo, LongAntBr Dim As String Tecla Pi = Atn(1) * 4 rad = Pi / 180 grad = 180 / pi BaseX = 300 ' Punto X Base (hombro) Situamos el brazo en pantalla. BaseY = 250 ' Punto Y Base (hombro). LongBrazo = 120 ' Longitud Brazo. Puedes modificar las longitudes del brazo o antebrazo. LongAntBr = 120 ' Longitud AnteBrazo. x=(120) ' Posicion Inicial X. Damos las coordenadas iniciales de la punta del brazo. y=(120)+BaseY ' Posicion Inicial Y. Se puede modificar los valores que están dentro del paréntesis. ' Procurar que esté dentro del área de trabajo. Tecla="" While Tecla<>Chr(27) And Tecla<>Chr(13) Locate 22,24: Print "Pulsa W S A D para mover el Brazo Scara." Locate 23,27: Print "Para salir pulsa Esc. o Enter." Xaux=x Yaux=y Tecla=LCase(InKey) If Tecla="a" Then x=x-1 If Tecla="d" Then x=x+1 If Tecla="s" Then y=y-1 If Tecla="w" Then y=y+1 rror: 'Etiqueta para saltar cuando se produce una posición fuera de rango. LadoA=y-BaseY Hipotenusa=sqr( (LadoA^2)+(x^2) ) Alfa=ATan2(LadoA,x) Beta= ACOS( ((LongBrazo^2)-(LongAntBr^2)+(Hipotenusa^2))/(2*LongBrazo*Hipotenusa) ) AngBrazo=Alfa+Beta ' ANGULO BRAZO (en radianes). Gamma=ACOS( ((LongBrazo^2)+(LongAntBr^2)-(Hipotenusa^2))/(2*LongBrazo*LongAntBr) ) AngAntBr=Gamma-(180*rad) ' ANGULO ANTEBRAZO (en radianes). If Str(Beta)="-1.#IND" Or Str(Gamma)="-1.#IND" Then x=Xaux ' Cuando se produce una posición fuera de rango y=Yaux ' recarga las variables con la posición anterior correcta GoTo rror ' y recalcula todo de nuevo. EndIf '------------------------------------------- ' Cálculo de posición a dibujar en pantalla. '------------------------------------------- PYa=LongBrazo*-sin(AngBrazo) PYb=LongAntBr*-sin(AngAntBr+AngBrazo) PXa=LongBrazo*COS(AngBrazo) PXb=LongAntBr*COS(AngAntBr+AngBrazo) 'BRAZO punto(x,y) BrazoPY=PYa+BaseY ' Punto de coordenada Y del Brazo. BrazoPX=PXa+BaseX ' Punto de coordenada X del Brazo. 'ANTEBRAZO punto(x,y) AntBrazoPY=PYb+PYa+BaseY ' Punto de coordenada Y del AnteBrazo. AntBrazoPX=PXb+PXa+BaseX ' Punto de coordenada X del AnteBrazo. '------------------- ' Dibuja las líneas. '------------------- If Tecla<>"" Then Cls ' Una manera simple de borrar las líneas anteriores. PSet (BaseX, BaseY ), 0 ' Punto inicial. Line -(BrazoPX, BrazoPY ), 4 ' Dibuja línea del Brazo. Line -(AntBrazoPX, AntBrazoPY), 9 ' Dibuja línea del AnteBrazo. '----------------------------------------------------------------- 'Muestra en pantalla los resultados de la Cinematica Inversa (IK). '----------------------------------------------------------------- Locate 1,20: Print "Angulos ----> Brazo:"; CInt(AngBrazo*grad); Chr(248);_ " "; "AnteBrazo:"; CInt((AngAntBr*grad)+180); Chr(248);" " Locate 2,20: Print "Posicion ----> ";x;"X"; " "; y-BaseY; "Y " '----------------------------------------------------------------- Wend End |