🎢 Pendulum - Fuzzy Control
Simulazione interattiva del pendolo inverso con controllore fuzzy
← Torna a Virtual Desktop Site
Descrizione
Pendulum è una simulazione educativa del classico problema del pendolo inverso (inverted pendulum), controllato da un sistema di logica fuzzy Mamdani. L’applicazione visualizza in tempo reale la fisica del sistema, le membership functions, le regole attive e l’output del controllore.
Il Problema del Pendolo Inverso
Il pendolo inverso è un banco di prova classico per i sistemi di controllo: un’asta rigida montata su un carrello mobile deve essere mantenuta in equilibrio verticale applicando forza al carrello.
Variabili di Stato
- θ (theta): angolo del pendolo rispetto alla verticale
- θ̇ (theta-dot): velocità angolare del pendolo
- x: posizione del carrello sul binario
- F: forza applicata al carrello (output del controllore)
Sfida
Il sistema è intrinsecamente instabile: senza controllo, il pendolo cade. Il controllore deve reagire rapidamente alle perturbazioni mantenendo il pendolo in equilibrio.
Controllore Fuzzy
Perché Fuzzy?
A differenza di un controllore PID classico, il controllo fuzzy:
- Usa regole linguistiche intuitive (“se il pendolo cade a destra, spingi a destra”)
- Gestisce naturalmente la non-linearità del sistema
- È più robusto a variazioni dei parametri
- È interpretabile: le regole sono leggibili
Architettura Mamdani
Input (θ, θ̇)
│
▼
┌──────────────┐
│ Fuzzificazione │ → Calcola grado di appartenenza
└──────────────┘
│
▼
┌──────────────┐
│ Inferenza │ → Applica regole fuzzy (AND = min)
└──────────────┘
│
▼
┌──────────────┐
│Defuzzificazione│ → Calcola output crisp (centroide)
└──────────────┘
│
▼
Output (F)
Variabili Linguistiche
Ogni variabile usa 5 termini linguistici:
| Termine | Significato |
|---|---|
| NB | Negative Big (molto negativo) |
| NS | Negative Small (poco negativo) |
| ZE | Zero (neutro) |
| PS | Positive Small (poco positivo) |
| PB | Positive Big (molto positivo) |
Base di Regole (25 regole)
La matrice 5×5 definisce l’output per ogni combinazione di input:
θ̇ (velocità angolare)
NB NS ZE PS PB
┌─────────────────────────────────┐
NB │ NB NB NB NS ZE │
NS │ NB NB NS ZE PS │
θ ZE │ NB NS ZE PS PB │
PS │ NS ZE PS PB PB │
PB │ ZE PS PB PB PB │
└─────────────────────────────────┘
Esempi di interpretazione:
- SE θ=PB E θ̇=PB → F=PB: “Pendolo molto inclinato a destra E cadendo veloce a destra → spingi forte a destra”
- SE θ=ZE E θ̇=ZE → F=ZE: “Pendolo verticale E fermo → non fare nulla”
Visualizzazione
Canvas Simulazione
- Binario: traccia orizzontale con tacche di riferimento
- Carrello: blocco mobile con ruote
- Pendolo: asta con massa terminale
- Freccia forza: indicatore visivo della forza applicata
Pannello Membership Functions
Visualizzazione in tempo reale di:
- MF θ: funzioni di appartenenza dell’angolo con indicatore valore corrente
- MF θ̇: funzioni di appartenenza della velocità angolare
- Output: barre di forza aggregate
- Regole attive: top 5 regole con strength
- Centroide: linea dorata sull’output defuzzificato
Simulazione Fisica
Parametri di Default
const PHYSICS = {
g: 9.81, // Gravità (m/s²)
M: 1.0, // Massa carrello (kg)
m: 0.4, // Massa pendolo (kg) - rapporto m/M = 0.4
l: 0.8, // Lunghezza pendolo (m) - braccio lungo
friction: 0.1, // Attrito carrello
maxForce: 100 // Forza massima (N)
};
Integrazione Runge-Kutta 4
Per una simulazione accurata, il sistema usa RK4:
step(state, force, dt) {
const k1 = derivatives(state, force);
const k2 = derivatives(state + k1*dt/2, force);
const k3 = derivatives(state + k2*dt/2, force);
const k4 = derivatives(state + k3*dt, force);
return state + (dt/6) * (k1 + 2*k2 + 2*k3 + k4);
}
Controlli
Simulazione
- ▶ Play: avvia la simulazione
- ⏸ Pause: mette in pausa
- ↺ Reset: riporta allo stato iniziale
- 💥 Disturb: applica impulso casuale
Impostazioni
- Toggle Fuzzy Controller: abilita/disabilita il controllore
- Drag pendolo: trascina il pendolo per impostare angolo iniziale
Interazione Mouse (durante la simulazione)
- Click e trascina: applica disturbo al pendolo in tempo reale
- Click a sinistra: spinge il pendolo verso sinistra
- Click a destra: spinge il pendolo verso destra
- La forza è proporzionale alla distanza dal centro
Statistiche
- Tempo: secondi di sopravvivenza
- Max θ: angolo massimo raggiunto
-
**Avg F **: forza media applicata
Implementazione Tecnica
File Principali
core/js/inverted-pendulum.js: engine completo (~850 righe)core/styles/inverted-pendulum.css: stili UI- Piano dettagliato:
docs/plans/INVERTED_PENDULUM_plan.md
Classi Principali
class InvertedPendulum2025 // Orchestratore principale
class PhysicsEngine // Simulazione dinamica
class FuzzyController // Controllore Mamdani
class PendulumRenderer // Visualizzazione Canvas
Contesto Accademico
Questa mini-app si collega alla ricerca sulla logica fuzzy documentata in:
- Tesi di Laurea in Scienze dell’Informazione (1995)
- Paper: “Interpolation (FPI) and Fuzzy Linear Regression (LFR)” - Le Matematiche, 1996
- Disponibile: novelli-fuzzy-paper.pdf
Applicazioni Reali
Il controllo fuzzy del pendolo inverso ha applicazioni in:
- Robotica: bilanciamento robot bipedi
- Trasporti: Segway, hoverboard
- Aerospaziale: stabilizzazione razzi
- Industria: gru a torre, manipolatori
Link Utili
Sperimenta con Pendulum sul desktop virtuale aprendo l’icona 🎢 Pendulum dal gruppo Mini Apps.