En este documento se describe el proceso de obtención de la dinámica de un robot manipulador (pendulo simple) por medio de la ecuación de Euler-Lagrange, empecemos importando las librerias necesarias:
In [ ]:
from sympy import var, sin, cos, pi, Matrix, Function, Rational
from sympy.physics.mechanics import mechanics_printing
mechanics_printing()
Una vez que hemos importado las funciones necesarias, podemos empezar definiendo las variables a utilizar dentro del calculo:
In [ ]:
var("l1")
Cuando se definen las variables, se pueden mandar a llamar con el mismo nombre:
In [ ]:
l1
Definimos de una vez todas las variables necesarias:
In [ ]:
var("m1 J1 t g")
Y definimos las variables que dependen de otra variable, especificamente en este calculo, todo lo anterior es constante y solo $q_1$ es una variable dependiente del tiempo:
In [ ]:
q1 = Function("q1")(t)
Ya con las variables definidas, puedo empezar a definir la posición del centro de masa del primer (y único eslabon):
In [ ]:
x1 = l1*cos(q1)
y1 = l1*sin(q1)
In [ ]:
x1
In [ ]:
y1
De manera que si necesitamos calcular la derivada con respecto del tiempo de $x_1$, tenemos que hacer:
In [ ]:
x1.diff(t)
Calculamos el cuadrado de la velocidad traslacional del primer centro de masa:
In [ ]:
v1c = x1.diff(t)**2 + y1.diff(t)**2
In [ ]:
v1c
Pero como se puede ver, no necesariamente se va a simplificar completamente la expresión calculada; por lo que podemos decir explicitamente que trate de simplificar más, el motor de algebra simbolica:
In [ ]:
v1c.simplify()
Guardando esta expresion simplificada:
In [ ]:
v1c = v1c.simplify()
Y calculando la altura y velocidad rotacional del eslabon:
In [ ]:
h1 = y1
ω1 = q1.diff(t)
Calculando la energía cinética y potencial:
In [ ]:
K = Rational(1,2)*m1*v1c + Rational(1,2)*J1*ω1**2
In [ ]:
U = m1*g*h1
Con estas energias se puede calcular el Lagrangiano:
In [ ]:
L = K - U
In [ ]:
L
Y una vez obtenido el Lagrangiano, podemos empezar a derivar, $\frac{\partial L}{\partial \dot{q}_1}$, $\frac{d}{dt}\left( \frac{\partial L}{\partial \dot{q}_1} \right)$ y $\frac{\partial L}{\partial q_1}$
In [ ]:
L.diff(q1.diff(t))
In [ ]:
L.diff(q1.diff(t)).diff(t)
In [ ]:
L.diff(q1)
O bien, agrupandolo en la ecuación de Euler - Lagrange:
$$ \tau_1 = \frac{d}{dt}\left( \frac{\partial L}{\partial \dot{q}_1} \right) - \frac{\partial L}{\partial q_1} $$
In [ ]:
L.diff(q1.diff(t)).diff(t) - L.diff(q1)
En este caso, podemos utilizar el metodo collect para factorizar con respecto a ciertos terminos, en este caso $\ddot{q}_1$:
In [ ]:
τ1 = (L.diff(q1.diff(t)).diff(t) - L.diff(q1)).collect(q1.diff(t).diff(t))
In [ ]:
τ1
Una vez que hemos concluido este proceso, podemos pasar al documento llamado numerico.ipynb