UD04 · Taller 1 — Cinemática de un manipulador¶
Objetivo: cargar un robot real, calcular su cinemática directa e inversa, generar una trayectoria y detectar singularidades.
Rellena las celdas marcadas con # TU CÓDIGO y responde en las celdas de texto marcadas con ✏️ Respuesta. Al terminar, descarga el notebook ejecutado y súbelo a Moodle.
Requisitos¶
La siguiente celda instala lo necesario. En Colab tarda un par de minutos la primera vez.
%pip install roboticstoolbox-python spatialmath-python numpy matplotlib
Fase 1 — Carga el robot¶
Carga el modelo Panda de Franka con roboticstoolbox e imprímelo.
import numpy as np
import roboticstoolbox as rtb
import spatialmath.base as smb
# TU CÓDIGO: carga el robot Panda e imprimelo
robot = ...
print(robot)
✏️ Respuesta: ¿cuántas articulaciones tiene? ¿De qué tipo es cada una?
(escribe aquí)
Fase 2 — Cinemática directa (FK)¶
Calcula la pose del efector para el vector articular q = [0, -0.8, 0.8, 0, 0.8, 0, 0] y muestra la posición y la orientación en ángulos de Euler.
q = np.array([0, -0.8, 0.8, 0, 0.8, 0, 0])
# TU CÓDIGO: calcula la pose con fkine y muestra posicion y orientacion
pose = ...
print("Posición del efector:", ...)
print("Orientación (Euler, grados):", ...)
✏️ Respuesta: ¿cuántas soluciones tiene la cinemática directa? ¿Por qué?
(escribe aquí)
Fase 3 — Cinemática inversa (IK)¶
Resuelve la cinemática inversa de esa pose y comprueba que al aplicar FK a la solución recuperas la pose de partida.
# TU CÓDIGO: resuelve la IK y verifica el resultado
sol = ...
print("Solución IK:", ...)
print("¿Converge?", ...)
print("Pose reconstruida:", ...)
✏️ Respuesta: la posición reconstruida coincide, pero los ángulos no tienen por qué ser los de partida. Explica por qué.
(escribe aquí)
Fase 4 — Genera una trayectoria¶
Genera una trayectoria de 50 pasos entre la configuración de reposo (robot.qr) y q1 = [0, -0.4, 1.2, 0, 0.8, 0, 0], y calcula la pose del efector a lo largo de ella.
from roboticstoolbox import jtraj
q0 = robot.qr
q1 = np.array([0, -0.4, 1.2, 0, 0.8, 0, 0])
# TU CÓDIGO: genera la trayectoria y calcula las poses
traj = ...
poses = ...
print(poses[:3])
✏️ Respuesta: jtraj interpola en el espacio articular con un polinomio de 5.º grado. ¿Qué habría cambiado usando ctraj? ¿En qué caso real preferirías cada uno?
(escribe aquí)
Fase 5 — Detecta singularidades¶
Recorre la trayectoria calculando el rango del jacobiano en varios puntos. Un rango menor que 6 indica que el robot ha perdido capacidad de movimiento en alguna dirección.
# TU CÓDIGO: calcula el rango del jacobiano cada 10 pasos
for i in range(0, 50, 10):
J = ...
rango = ...
print(f"Paso {i:2d}: rango del jacobiano = {rango}")
✏️ Respuesta: ¿baja el rango de 6 en algún punto? Si baja, ¿en cuál y por qué? Y si no baja, ¿qué habría que cambiar en la trayectoria para provocar una singularidad?
(escribe aquí)
Fase 6 — Visualiza la trayectoria¶
Dibuja en 3D el recorrido del efector, marcando el inicio y el fin.
import matplotlib.pyplot as plt
# TU CÓDIGO: extrae x, y, z de las poses y dibujalas en 3D
x, y, z = ..., ..., ...
ax = plt.figure().add_subplot(projection='3d')
ax.plot(x, y, z, label='Trayectoria')
ax.scatter(x[0], y[0], z[0], c='g', label='Inicio')
ax.scatter(x[-1], y[-1], z[-1], c='r', label='Fin')
ax.legend()
plt.show()
Cierre¶
✏️ Respuesta: en dos o tres frases, ¿qué relación hay entre lo que has hecho aquí y las técnicas de IA de las unidades anteriores (percepción, razonamiento, acción)?
(escribe aquí)