UD04 · Notebook 4 — Cinemática de un manipulador¶
Requisitos
pip install roboticstoolbox-python spatialmath-python numpy matplotlib
En el aula se podrá usar además un simulador 3D (Webots o CoppeliaSim), según lo que decida el profesor y los equipos disponibles.
Objetivo: cargar un robot real (Panda de Franka o Puma 560), calcular su cinemática directa e inversa, generar una trayectoria y detectar singularidades.
Es una entrega evaluable: se corrige con la rúbrica de su tarea en 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¶
Anota en el informe: número de articulaciones, tipo de cada una y el nombre del modelo.
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)¶
Verifica que la posición del efector coincide con la que predice el modelo.
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)¶
Comprueba que al aplicar FK a la solución IK se recupera la pose original.
# 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¶
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¶
¿En algún punto el rango baja de 6? Si es así, anota cuál y por qué ocurre.
# 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¶
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í)
Entrega¶
Sube el notebook ejecutado. Se valora que expliques lo que ocurre, no solo que la celda dé un resultado: una salida sin interpretar no demuestra que hayas entendido nada.
| Fase | Evidencia mínima |
|---|---|
| 1 | El robot cargado, con el número y el tipo de sus articulaciones |
| 2 | Posición y orientación del efector, y por qué la FK tiene una única solución |
| 3 | La solución de IK verificada con FK, y por qué los ángulos no coinciden con los de partida |
| 4 | La trayectoria generada y la diferencia entre jtraj y ctraj |
| 5 | El rango del jacobiano a lo largo de la trayectoria, y qué habría que cambiar para provocar una singularidad |
| 6 | El recorrido del efector dibujado en 3D, con inicio y fin marcados |
Soluciones
Las soluciones no se publican: se corrigen y comentan en clase.