mercoledì 26 novembre 2025

Cinematica Inversa SpiderCam

La spidercam e' la videocamera sospesa a fili che si vede spesso utilizzata negli eventi sportivi. Di fatto non e' trattabile come un corpo rigido perche' i vari tratti di cavo si allungano ed accorciano

Pensavo fosse piu' difficile dal punto di vista matematico. Basta calcolare la lunghezza del cavo usando la distanza cartesiana tra la coordinata della camera ed il vincolo del cavo...poi nella realta' i problemi di gestire la tensione dei cavi ed il corretto avvolgimento sono tutto un altro discorso 

  


 

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

# --- 1. Definizione della Scena e degli Ancoraggi ---
def setup_spidercam():
# Dimensione dello stadio
L_stadio = 100 # Lunghezza
W_stadio = 60 # Larghezza
H_massima = 30 # Altezza massima operativa (Z)

# Coordinate 3D dei 4 punti d'ancoraggio (i piloni)
Ancoraggi = np.array([
[0, 0, H_massima], # A1: Angolo basso-sinistra
[L_stadio, 0, H_massima], # A2: Angolo basso-destra
[L_stadio, W_stadio, H_massima], # A3: Angolo alto-destra
[0, W_stadio, H_massima] # A4: Angolo alto-sinistra
])
return Ancoraggi, L_stadio, W_stadio, H_massima

# --- 2. Funzione di Calcolo della Lunghezza dei Cavi ---
def calcola_lunghezze(P_carrello, Ancoraggi):
"""Calcola le lunghezze dei 4 cavi data la posizione del carrello."""
Lunghezze = np.linalg.norm(Ancoraggi - P_carrello, axis=1)
return Lunghezze

# --- 3. Funzione di Animazione (MODIFICATA) ---
def animate_spidercam(frame, Ancoraggi, L_stadio, W_stadio, ax, line_cavi, scat_carrello):
# Definiamo la traiettoria del carrello (una semplice sinusoide 3D)
t = frame * 0.1
# Movimento:
x_pos = 50 + 30 * np.sin(t / 5)
y_pos = 30 + 20 * np.cos(t / 3)
z_pos = 15 + 10 * np.sin(t / 7)
P_carrello = np.array([x_pos, y_pos, z_pos])
# Aggiorna la posizione del carrello
scat_carrello._offsets3d = ([P_carrello[0]], [P_carrello[1]], [P_carrello[2]])
# Aggiorna i cavi
for i in range(4):
x_dati = [P_carrello[0], Ancoraggi[i, 0]]
y_dati = [P_carrello[1], Ancoraggi[i, 1]]
z_dati = [P_carrello[2], Ancoraggi[i, 2]]
line_cavi[i].set_data(x_dati, y_dati)
line_cavi[i].set_3d_properties(z_dati)
# Calcola le lunghezze dei cavi
lunghezze = calcola_lunghezze(P_carrello, Ancoraggi)
# Formattazione delle lunghezze a 3 decimali
lunghezze_formattate = [f"{l:.3f}" for l in lunghezze]

# Aggiorna il titolo del grafico con le lunghezze formattate
title_text = (
f"Posizione: ({x_pos:.1f}, {y_pos:.1f}, {z_pos:.1f}) | "
f"Lunghezze Cavi: {lunghezze_formattate}"
)
ax.set_title(title_text)

return scat_carrello, *line_cavi

# --- 4. Configurazione della Visualizzazione Matplotlib ---
Ancoraggi, L_stadio, W_stadio, H_massima = setup_spidercam()
num_frames = 200

fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')

# Impostazioni iniziali degli assi
ax.set_xlim([0, L_stadio])
ax.set_ylim([0, W_stadio])
ax.set_zlim([0, H_massima + 10])

ax.set_xlabel("Asse X (Lunghezza)")
ax.set_ylabel("Asse Y (Larghezza)")
ax.set_zlabel("Asse Z (Altezza)")

# Disegna gli ancoraggi (Piloni)
ax.scatter(Ancoraggi[:, 0], Ancoraggi[:, 1], Ancoraggi[:, 2],
c='r', marker='o', s=100, label='Ancoraggi')

# Disegna il carrello iniziale a metà altezza
P_iniziale = np.array([L_stadio/2, W_stadio/2, H_massima/2])
scat_carrello = ax.scatter([P_iniziale[0]], [P_iniziale[1]], [P_iniziale[2]],
c='b', marker='^', s=200, label='Carrello/Telecamera')

# Linee dei cavi iniziali
line_cavi = []
for i in range(4):
line, = ax.plot([P_iniziale[0], Ancoraggi[i, 0]],
[P_iniziale[1], Ancoraggi[i, 1]],
[P_iniziale[2], Ancoraggi[i, 2]],
'k--', alpha=0.7, linewidth=1)
line_cavi.append(line)

ax.legend()
ax.view_init(elev=20, azim=135)

# --- 5. Esegui l'Animazione ---
anim = FuncAnimation(fig, animate_spidercam, frames=num_frames,
fargs=(Ancoraggi, L_stadio, W_stadio, ax, line_cavi, scat_carrello),
interval=50, blit=False)

plt.show()


Nessun commento:

Posta un commento

Algoritmo Reed Solomon

 Sto progettando una trasmissione radio di immagini ed uno dei vincoli e' che non e' garantita la perfetta qualita' della trasmi...