nombres_marcadores = []
para m en marcadores: si m y (no nombres_marcadores o m! = nombres_marcadores[-1]): nombres_marcadores.append(m) líneas_datos = líneas[header_lines:]
datos = []
para línea en data_lines: vals = line.strip().split(‘\t’) si len(vals) > 2: intente: fila = [float(v) if v else np.nan for v in vals]
data.append(row) excepto ValueError: continuar data = np.array(data) return nombres_marcadores, datos, metadatos trc_files = sorted((work_dir / “pose-3d”).glob(“*.trc”)) print(f”📊 Encontrado {len(trc_files)} archivo(s) TRC):”) para f en trc_files: print(f” {f.name}”) trc_file = Ninguno para f en trc_files: si ‘filt’ en f.name.lower() y ‘augm’ no en f.name.lower(): trc_file = f break si trc_file es Ninguno y trc_files: trc_file = trc_files[0]
if trc_file: print(f”\n📈 Visualizando: {trc_file.name}”) marcadores_nombres, datos, metadatos = parse_trc(trc_file) print(f” Marcadores: {len(marker_names)}”) print(f” Marcos: {data.shape[0]}”) print(f” Nombres de marcadores: {nombres_marcadores[:10]}{‘…’ si len(marker_names) > 10 else ”}”) frames = datos[:, 0].astype(int) si datos.forma[1] > 0 más []
tiempos = datos[:, 1] si datos.forma[1] > 1 más []
coordenadas = datos[:, 2:]
n_markers = len(marker_names) mid_frame = len(data) // 2 fig = plt.figure(figsize=(16, 6)) ax1 = fig.add_subplot(131, proyección=’3d’) xs = coords[mid_frame, 0::3][:n_markers]
ys = coordenadas[mid_frame, 1::3][:n_markers]
zs = coordenadas[mid_frame, 2::3][:n_markers]
ax1.scatter(xs, ys, zs, c=”dodgerblue”, s=40, alpha=0.8, edgecolors=”navy”) para i, nombre en enumerate(marker_names[:len(xs)]): si i % 3 == 0: ax1.text(xs[i]sí[i]zs[i]f’ {nombre}’, tamaño de fuente=6, alfa=0.7) ax1.set_xlabel(‘X (m)’) ax1.set_ylabel(‘Y (m)’) ax1.set_zlabel(‘Z (m)’) ax1.set_title(f’Puntos clave 3D (Marco {int(marcos)[mid_frame])})’, tamaño de fuente=10) ax2 = fig.add_subplot(132) key_markers = [‘RAnkle’, ‘LAnkle’, ‘RWrist’, ‘LWrist’, ‘Nose’]
colores_map = {‘RAnkle’: ‘rojo’, ‘LAnkle’: ‘azul’, ‘RWrist’: ‘naranja’, ‘LWrist’: ‘verde’, ‘Nose’: ‘púrpura’} para mkr en key_markers: if mkr en Marker_names: idx = Marker_names.index(mkr) z_col = idx * 3 + 2 if z_col < coords.shape[1]: ax2.plot(tiempos, coordenadas[:, z_col]label=mkr, color=colors_map.get(mkr, 'gris'), ancho de línea=1.2, alpha=0.8) ax2.set_xlabel('Tiempo (s)') ax2.set_ylabel('Posición Z (m)') ax2.set_title('Trayectorias verticales', tamaño de fuente=10) ax2.legend(tamaño de fuente=8, loc="mejor") ax2.grid(True, alpha=0.3) ax3 = fig.add_subplot(133) si len(times) > 1: dt = np.diff(times) dt[dt == 0] = 1e-6 para mkr en [‘RAnkle’, ‘RWrist’]: si mkr en nombres_marcadores: idx = nombres_marcadores.index(mkr) x_col, y_col, z_col = idx * 3, idx * 3 + 1, idx * 3 + 2 si z_col < coords.shape[1]: dx = np.diff(coords[:, x_col]) dy = np.diff(coords[:, y_col]) dz = np.diff(coords[:, z_col]) velocidad = np.sqrt(dx**2 + dy**2 + dz**2) / dt velocidad = np.clip(velocidad, 0, np.nanpercentile(velocidad, 99)) ax3.plot(veces[1:]velocidad, etiqueta=mkr, color=colors_map.get(mkr, 'gris'), ancho de línea=0.8, alfa=0.7) ax3.set_xlabel('Tiempo (s)') ax3.set_ylabel('Velocidad (m/s)') ax3.set_title('Velocidades de marcador (comprobación de calidad)', tamaño de fuente=10) ax3.legend(fontsize=8) ax3.grid(True, alpha=0.3) plt.tight_layout() plt.savefig(work_dir / 'trajectory_analysis.png', dpi=150, bbox_inches="tight") plt.show() print("✅ Gráficos de trayectoria guardados en trajectory_analysis.png") else: print("⚠ No se encontró ningún archivo TRC visualizar.")