<jupyter_start><jupyter_text>Problemas Defina una función que obtenga la cinemática inversa de un pendulo doble.<jupyter_code>def ci_pendulo_doble(x, y):
    # tome en cuenta que las longitudes de los eslabones son 2 y 2
    l1, l2 = 2, 2
    from numpy import arccos, arctan2, sqrt
    # YOUR CODE HERE
    raise NotImplementedError()
    return q1, q2
from numpy.testing import assert_allclose
assert_allclose(ci_pendulo_doble(4, 0), (0,0))
assert_allclose(ci_pendulo_doble(0, 4), (1.57079632,0))<jupyter_output><empty_output><jupyter_text>Obtenga las posiciones en el espacio articular, $q_1$ y $q_2$, necesarias para que el punto final del pendulo doble llegue a las coordenadas $p_1 = (0,1)$, $p_2 = (1,3)$ y $p_3 = (3,2)$.<jupyter_code># YOUR CODE HERE
raise NotImplementedError()
from numpy.testing import assert_allclose
assert_allclose((q11, q21),(0.25268 , 2.636232), rtol=1e-05, atol=1e-05)
from numpy.testing import assert_allclose
assert_allclose((q12, q22),(0.589988, 1.318116), rtol=1e-05, atol=1e-05)
from numpy.testing import assert_allclose
assert_allclose((q13, q23),(0.14017 , 0.895665), rtol=1e-05, atol=1e-05)<jupyter_output><empty_output><jupyter_text>Genere las trayectorias necesarias para que el pendulo doble se mueva del punto $p_1$ al punto $p_2$ en $2s$, del punto $p_2$ al punto $p_3$ en $2s$ y del punto $p_3$ al punto $p_1$ en $2s$.> Utiliza 100 puntos por segundo y asegurate de guardar las trayectorias generadas en las variables correctas para que ```q1s``` y ```q2s``` tengan las trayectorias completas.<jupyter_code>from generacion_trayectorias import grafica_trayectoria
# YOUR CODE HERE
raise NotImplementedError()
q1s = q1s1 + q1s2 + q1s3
q2s = q2s1 + q2s2 + q2s3
from numpy.testing import assert_allclose
assert_allclose((q1s[0], q1s[-1]),(0.25268, 0.25268), rtol=1e-05, atol=1e-05)
from numpy.testing import assert_allclose
assert_allclose((q2s[0], q2s[-1]),(2.636232, 2.636232), rtol=1e-05, atol=1e-05)<jupyter_output><empty_output><jupyter_text>Cree una animación con las trayectorias generadas y las funciones proporcionadas a continuación (algunas funciones estan marcadas con comentarios en donde hace falta agregar código).<jupyter_code>from matplotlib.pyplot import figure, style
from matplotlib import animation, rc
rc('animation', html='html5')
from numpy import sin, cos, arange

fig = figure(figsize=(8, 8))
axi = fig.add_subplot(111, autoscale_on=False, xlim=(-0.6, 3.1), ylim=(-0.6, 3.1))
linea, = axi.plot([], [], "-o", lw=2, color='gray')

def cd_pendulo_doble(q1, q2):
    l1, l2 = 2, 2
    # YOUR CODE HERE
    raise NotImplementedError()
    return xs, ys

def inicializacion():
    '''Esta funcion se ejecuta una sola vez y sirve para inicializar el sistema'''
    linea.set_data([], [])
    return linea

def animacion(i):
    '''Esta funcion se ejecuta para cada cuadro del GIF'''
    # YOUR CODE HERE
    raise NotImplementedError()
    linea.set_data(xs, ys)
    
    return linea

ani = animation.FuncAnimation(fig, animacion, arange(1, len(q1s)), interval=10, init_func=inicializacion)
ani
from numpy.testing import assert_allclose
assert_allclose(cd_pendulo_doble(0, 0), ([0,2,4], [0,0,0]), rtol=1e-05, atol=1e-05)
assert_allclose(cd_pendulo_doble(1.57079632,0), ([0, 0, 0],[0, 2, 4]), rtol=1e-05, atol=1e-05)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.12484885126964934, 'fraction_numerical': 0.07285368802902055, 'mean_word_length': 5.552475247524752, 'pattern_counts': {'":': 0, '<': 17, '<?xml version=': 0, '>': 18, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '226132', 'license': 'MIT', 'n_tokens_mistral': 1423, 'n_tokens_neox': 1304, 'n_words': 346, 'path': 'Practicas/practica5/Problemas.ipynb', 'repo_name': 'robblack007/clase-cinematica-robot', 'size': '3308'}