Sviluppo di un sistema VR per la prototipazione di oggetti interattivi da parte dei bambini
febbraio 2021
Panoramica
Smart Codesign VR è una piattaforma prototipale per costruire e provare «oggetti intelligenti» interattivi nella realtà virtuale. Il giocatore sceglie tre carte — una per l’ambiente, una per l’ingresso e una per l’uscita — e usa movimenti del corpo per definire quando l’oggetto debba reagire e che cosa debba fare. Può poi collocare l’oggetto virtuale completato in un parco e verificarne il comportamento.
Il progetto parte da SNaP (The Smart Nature Protagonists), un gioco da tavolo sviluppato da i3Lab al Politecnico di Milano. In SNaP i bambini combinano carte per inventare oggetti intelligenti e li descrivono con una frase su carta. Questo progetto mirava a trasformare le descrizioni in oggetti virtuali che i bambini potessero assemblare e con cui potessero interagire attraverso i propri movimenti.
Il nostro gruppo di quattro persone ha progettato e implementato il sistema come progetto finale del corso Advanced User Interfaces del Politecnico di Milano, nell’anno accademico 2020–21. Lo abbiamo pensato per bambini dagli 11 ai 13 anni, con particolare attenzione a quelli con disturbi del neurosviluppo (NDD). Realizzato in Unity e C# per Oculus Quest 2, il prototipo supporta l’intero percorso, dalla scelta delle carte all’interazione nel parco virtuale.
SNaP e il contesto progettuale
Un gioco in cui i progettisti sono i bambini
In SNaP da due a quattro bambini assumono il ruolo di «progettisti», mentre un adulto facilitatore interpreta il «sindaco». Il sindaco presenta una missione e i bambini discutono idee e combinano carte per progettare un oggetto intelligente che vi risponda. Il gioco mira a sviluppare creatività, collaborazione e capacità di esprimere le proprie idee. È stato considerato anche l’uso da parte di bambini con disturbi del neurosviluppo, ma questo progetto non ne ha valutato gli effetti terapeutici o educativi.
Tre tipi di carte: ambiente, ingresso e uscita
SNaP ha tre tipi di carta, ciascuno con un ruolo diverso.
Le carte ambiente rappresentano l’oggetto da rendere intelligente: albero, panchina, altalena, specchio d’acqua, pietra, lampione, cestino, bicicletta, ponte, scale o zaino. Sono oggetti ed elementi familiari di parchi e strade. La carta ambiente identifica l’oggetto che conterrà le funzioni di ingresso e uscita.
Le carte ingresso definiscono che cosa l’oggetto rileva o a che cosa reagisce: per esempio un pulsante, un movimento, un contatto, una distanza, temperatura, umidità, luminosità, colore, suono, fuoco, livello dell’acqua o previsioni meteo. Rappresentano gli ingressi dell’oggetto intelligente, in modo analogo ai sensori.
Le carte uscita definiscono la risposta dell’oggetto: illuminarsi, emettere un suono, vibrare, muoversi, visualizzare, registrare o inviare informazioni. Rappresentano le funzioni di uscita, in modo analogo agli attuatori.
La carta ambiente dà un contesto alla coppia ingresso–uscita. Con il movimento come ingresso e il suono come uscita, un cestino potrebbe emettere un suono quando qualcuno sbaglia il lancio, mentre un lampione potrebbe annunciare l’avvicinarsi di una persona. Ingresso e uscita specificano il comportamento del dispositivo; l’ambiente lo collega a una situazione della vita quotidiana.
Le 49 carte: nomi e descrizioni in italiano
Le carte sono elencate nello stesso ordine dell’immagine, da sinistra a destra e dall’alto in basso. «Environment» significa ambiente, «Input» ingresso e «Output» uscita.
Ambiente — 20 carte
- Albero (Tree): un albero o una sua parte.
- Panchina (Bench): una panchina o un tavolo da picnic.
- Altalena (Swing): un’altalena o un altro gioco del parco.
- Suolo (Ground): la superficie del terreno.
- Acqua (Water): un fiume, un lago o un’altra area d’acqua.
- Pietra (Stone): una pietra, una roccia o un minerale.
- Fiore (Flower): un fiore o un’altra pianta.
- Foglia (Leaf): una foglia su un albero o per terra.
- Casetta per uccelli (Birdhouse): una casetta o una sua parte.
- Scale (Stairs): una scala o una rampa.
- Segnale stradale (Street sign): un segnale o un pannello.
- Cestino (Trash can): un contenitore per rifiuti o raccolta differenziata.
- Bicicletta (Bicycle): una bicicletta o una sua parte.
- Recinzione (Fence): una recinzione o un’altra struttura che delimita un’area.
- Lampione (Street light): un lampione, una lampada o un’altra sorgente luminosa.
- Fontanella (Street faucet): una fontanella o una fontana.
- Ponte (Bridge): un ponte o una sua parte.
- Percorso (Path): un sentiero o una strada.
- Canestro (Basketball hoop): un canestro o un’altra attrezzatura sportiva.
- Zaino scolastico (Schoolbag): uno zaino o un’altra borsa.
Ingresso — 21 carte
- Pulsante (Button): rileva se viene premuto.
- Movimento (Motion): rileva oggetti o persone in movimento nelle vicinanze.
- Cursore (Slider): regola il livello di intensità.
- Tocco (Touch): rileva un tocco o una pressione.
- Battito cardiaco (Heartbeat): misura le pulsazioni.
- Distanza (Distance): misura la distanza da un altro oggetto o da una persona.
- Umidità (Humidity): rileva l’umidità.
- Vento (Wind): misura la velocità del vento.
- Fuoco (Fire): rileva la presenza di fuoco.
- Posizione (Location): determina la posizione.
- Velocità (Speed): rileva se il movimento è rapido o lento.
- Luminosità (Luminosity): rileva l’intensità della luce.
- Rotazione (Rotation): rileva se l’oggetto ruota.
- Temperatura (Temperature): misura la temperatura.
- Colore (Color): rileva e riconosce i colori.
- Orientamento (Orientation): misura l’orientamento.
- Fotocamera (Camera): scatta fotografie e registra video.
- Livello dell’acqua (Water level): misura il livello dell’acqua.
- Inquinamento (Pollution): rileva la presenza di gas.
- Suono (Sound): rileva suoni.
- Previsioni meteo (Weather forecast): acquisisce informazioni sulle previsioni del tempo.
Uscita — 8 carte
- Muoversi (Move): fa muovere l’oggetto.
- Vibrare (Vibrate): fa vibrare l’oggetto.
- Emettere suoni (Make sound): produce suoni o riproduce musica.
- Illuminarsi (Light up): accende LED di colori diversi.
- Visualizzare (Display): mostra testi, immagini e video.
- Attivare (Activate): attiva o disattiva un altro dispositivo.
- Registrare (Record): registra dati.
- Inviare (Send): invia un’email o un SMS.
Trasformare le idee scritte in oggetti virtuali interattivi
All’epoca del progetto, una sessione di SNaP terminava con la descrizione scritta dell’oggetto intelligente progettato dai bambini. In parallelo, i3Lab stava sviluppando una «tavola fisica» che combinava un tablet con Arduino per trasformare queste descrizioni in prototipi fisici. Smart Codesign VR esplorava un altro approccio, usando la realtà virtuale, un mezzo che il gruppo di ricerca non aveva ancora studiato per questo scopo.
La VR offriva due opportunità. La prima era prototipare attraverso i movimenti di tutto il corpo: afferrare, trasportare, illuminare e dipingere con un pennello diventavano modi per impostare condizioni e definire comportamenti. La seconda era dare alle idee una forma visibile, attraverso oggetti virtuali con cui interagire subito. Una descrizione scritta poteva diventare un oggetto con dimensioni e forma davanti al bambino.
Utenti previsti
Gli utenti previsti erano bambini dagli 11 ai 13 anni, con particolare attenzione ai bambini con disturbi del neurosviluppo. Progettare un oggetto intelligente richiede un certo ragionamento logico: sia SNaP sia la versione VR sono stati quindi pensati per questa fascia d’età.
Il progetto mirava ad aiutare i bambini a esprimere le proprie idee attraverso la prototipazione pratica e l’interazione. Erano obiettivi progettuali, non risultati terapeutici o educativi dimostrati: il prototipo non è stato valutato con bambini.
Progettare uno spazio confortevole
Sulla base dei materiali consultati per il progetto, abbiamo orientato la progettazione dello spazio attorno a quattro ambiti: suono, luce e colore, organizzazione spaziale e materiali. Per il suono abbiamo considerato isolamento dal rumore, volume regolabile e un audio calmo e uniforme, tenendo conto delle sensibilità uditive. Per luce e colore abbiamo considerato uno sfondo tranquillo e poco saturo, riservando i colori luminosi e saturi a piccole aree. Anche confini spaziali chiari, una disposizione ordinata, forme semplici e leggibili e movimenti senza ostacoli hanno guidato il progetto. Un ambiente virtuale consente di controllare questi aspetti. Il progetto non ne ha valutato gli effetti sul comfort degli utenti.
Vincoli e rischi della VR
Il progetto ha considerato anche i vincoli e i rischi della VR: costo dell’hardware, nausea da movimento, affaticamento di testa e collo dovuto al peso del visore, incidenti quando il visore nasconde l’ambiente fisico, affaticamento visivo nell’uso prolungato e preoccupazioni relative alla dipendenza associata a un’immersione eccessiva.
Queste considerazioni hanno orientato tre decisioni: mantenere semplici le interazioni, lasciando una difficoltà sufficiente a sostenere l’apprendimento; rendere chiari immagini e suoni senza stimoli eccessivi; dare all’esperienza una conclusione definita. Dopo la prototipazione e la prova nel parco, l’attività termina, senza incoraggiare a rimanere indefinitamente nella VR.
Il prototipo: esperienza e implementazione
Le quattro fasi dell’esperienza
L’applicazione comprende quattro fasi: schermata di attesa, scelta delle carte, prototipazione e interazione nel parco virtuale.
1. Schermata di attesa
L’applicazione si apre con una schermata del titolo e attende la pressione di un pulsante del controller prima di proseguire. Questa pausa intenzionale lascia al giocatore il tempo di indossare il visore e sistemarsi prima dell’inizio dell’esperienza principale.
2. Scelta delle carte: afferrare e collocare
Il giocatore sceglie una carta ambiente, una ingresso e una uscita afferrando l’oggetto corrispondente a ciascuna e collocandolo nella rispettiva scatola. Questa interazione sfrutta lo spazio tridimensionale della VR. Quando tutte e tre le scatole sono piene, un’indicazione audio guida il giocatore alla fase di prototipazione. L’ordine di scelta è libero, ma servono tutte e tre le carte per proseguire.
3. Prototipazione: definire condizioni e comportamenti attraverso il movimento
La prototipazione è il nucleo del sistema. I giocatori definiscono la condizione di attivazione della carta ingresso scelta e la risposta della carta uscita. Ogni carta ha la propria interazione, basata su movimenti che richiedono il tracciamento a sei gradi di libertà.
Se per esempio si sceglie «previsioni meteo» come ingresso, compaiono a portata di mano oggetti che rappresentano sole, nuvole, pioggia, temporale e neve. Afferrandone uno e puntando sull’oggetto bersaglio il raggio che ne parte, la condizione viene fissata. Se si sceglie «illuminarsi» come uscita, il giocatore afferra un pennello, ne intinge la punta nel barattolo del colore e lo sfrega sull’oggetto per decidere il colore con cui si illuminerà. Per cancellare un colore già dato basta intingere il pennello nel barattolo dell’«acqua» e sfregare di nuovo.
Una decisione cruciale nell’implementazione è stata supportare più coppie ingresso–uscita per uno stesso oggetto. Il piano iniziale consentiva una sola regola, per esempio «illuminarsi di rosso quando c’è il sole». Più coppie permettono risposte diverse a condizioni diverse: rosso con il sole, blu con la pioggia, bianco con la neve. I giocatori possono provare ogni coppia prima di confermarla e tornare a modificarla se necessario.
4. Il parco: provare l’oggetto
Dopo aver confermato l’oggetto, il giocatore entra in un parco virtuale, lo colloca, attiva la condizione di ingresso definita e ne osserva la risposta. Una celebrazione segnala il corretto funzionamento dell’oggetto e conclude l’esperienza.
Il percorso complessivo
I diagrammi di attività UML qui sotto riassumono l’esperienza. Quello superiore mostra il percorso complessivo; i due inferiori descrivono nel dettaglio le interazioni «previsioni meteo» e «illuminarsi». Le diramazioni mostrano come il giocatore possa tornare alla scelta delle carte dopo aver ricevuto le istruzioni e alla modifica dell’oggetto dopo averlo confermato e provato.
Diagrammi di attività: tutti i passaggi in italiano
Percorso generale (Overall Activity)
- Premere un pulsante per uscire dalla schermata di attesa.
- Selezionare una carta di ingresso, una di ambiente e una di uscita. Le tre scelte possono essere compiute in qualsiasi ordine.
- Ricevere le istruzioni per la prototipazione; scegliere se cambiare le carte («change card choice») o proseguire («proceed»).
- Definire la condizione di ingresso (*) e il comportamento in uscita (**).
- Confermare l’oggetto intelligente e provarne il comportamento.
- Concludere la prototipazione («finalize») e interagire con l’oggetto nel parco virtuale, oppure tornare alla modifica («re-edit»).
(*) Condizione di ingresso: carta Previsioni meteo (Weather)
Afferrare uno degli oggetti: sole, nuvola, goccia di pioggia, fulmine o pupazzo di neve. Puntare verso l’oggetto da progettare il raggio corrispondente: soleggiato, nuvoloso, piovoso, con fulmini o nevoso. Proseguire oppure tornare alla modifica.
(**) Comportamento in uscita: carta Illuminarsi (Light Up)
Afferrare il pennello e immergerlo nel secchio di vernice LED rossa, blu, gialla o verde. Passare il pennello sull’oggetto intelligente per applicare il colore. Si può proseguire, aggiungere un colore («add color») tornando ai secchi, oppure togliere il colore («remove color»): immergere il pennello nel secchio dell’acqua e passarlo sull’oggetto per cancellare il colore.
Hardware e strumenti
Il prototipo è stato realizzato per Oculus Quest 2. Il tracciamento a sei gradi di libertà consente di girarsi, spostarsi e manipolare oggetti virtuali. Poiché l’interazione manuale ripetuta era centrale per l’esperienza, il gruppo ha escluso i visori per smartphone limitati al tracciamento a tre gradi di libertà.
L’applicazione è stata sviluppata in Unity e C#. Il pacchetto Oculus Integration la collegava al Quest 2 e forniva le API per la telecamera VR, il rendering e gli input dei controller.
Quattro scene e 13 classi
Il sistema usa quattro scene Unity, una per ciascuna fase dell’esperienza. Comprende 13 classi, di cui tre astratte.
La scena del titolo contiene una sola classe, TitleSceneCore, che passa alla scena successiva quando il giocatore preme un pulsante.
La scena di scelta delle carte usa CardSelectionSceneCore e CardSelectionDetector. CardSelectionSceneCore crea tre istanze di rilevamento, una per ciascuna scatola: ambiente, ingresso e uscita. Ogni scatola attira l’oggetto di una carta vicina e segna la relativa categoria come selezionata. Quando tutte e tre le scelte sono complete, la scena le scrive nella classe statica SmartObject e prosegue. SmartObject conserva questi dati tra i cambi di scena, collegando le quattro scene in un’esperienza continua.
Nella scena di prototipazione, PrototypingSceneCore coordina il percorso. Card rappresenta il comportamento delle carte attraverso una gerarchia di ereditarietà: Card è la classe di base; InputCard e OutputCard derivano da essa e classi concrete come Weather, Fire, MakeSound e LightUp implementano le singole interazioni. Card, InputCard e OutputCard sono astratte, poiché solo le sottoclassi concrete svolgono le operazioni di prototipazione.
PrototypingSceneCore mantiene una lista di istanze delle condizioni di ingresso e un’altra di istanze dei comportamenti in uscita. Se le carte scelte sono «previsioni meteo» e «illuminarsi», le liste contengono rispettivamente istanze di Weather e LightUp. All’avvio viene creata un’istanza per ciascun tipo; il pulsante di aggiunta crea un’altra coppia. A ogni fotogramma, il sistema valuta le condizioni di ingresso e richiama i comportamenti in uscita corrispondenti. Quando l’utente conferma l’oggetto, isConfirmed viene impostato a true e i dati del comportamento assemblato vengono scritti nelle proprietà statiche di SmartObject.
La scena di interazione contiene una sola classe, InteractionSceneCore. Gestisce la collocazione dell’oggetto nel parco, la prova delle condizioni e risposte definite e la celebrazione finale.
Smart Object», in basso al centro, conserva i dati tra le scene. Attributi e metodi sono semplificati per facilitarne la lettura.Diagramma delle classi: legenda in italiano
I nomi delle classi e i tipi di dati sono identificatori tecnici e rimangono nella forma originale. Le sezioni «Title Scene», «Card Selection Scene», «Prototyping Scene» e «Interaction Scene» corrispondono rispettivamente alle scene del titolo, di selezione delle carte, di prototipazione e di interazione. «access» indica l’accesso tra i componenti; «Instance» indica un’istanza. I numeri e gli intervalli presso le relazioni indicano le molteplicità riportate nel diagramma.
Title Scene Core- Passa alla scena successiva quando si preme un pulsante.
Card Selection Detector- Contiene i riferimenti alla scatola di selezione e all’oggetto che rappresenta la carta. Fornisce un effetto visivo per segnalare la selezione, imposta l’ambiente, l’ingresso o l’uscita scelti e attira l’oggetto vicino verso il centro della scatola. Le tre istanze
Environment Card Detector,Input Card DetectoreOutput Card Detectorassociano ciascuna la propria scatola all’oggetto corrispondente. Card Selection Scene Core- Contiene l’audio di guida e le tre scatole di selezione: ambiente, ingresso e uscita. Salva le carte scelte e passa alla scena successiva.
Card- Contiene l’oggetto dell’ambiente (per esempio cestino, albero o ponte), gli oggetti di supporto delle carte di ingresso e uscita, il nome della carta, l’identificativo dell’istanza (
instanceID) e lo stato di selezione (isFocused). Prepara gli oggetti di supporto, gestisce il comportamento durante la prototipazione, crea la casella dell’enunciato e controlla se la condizione di ingresso o il comportamento in uscita sono stati definiti. Input Card- Contiene il numero massimo di istanze, la funzione delegata per valutare l’ingresso, un dizionario di funzioni di valutazione e gli indicatori delle valutazioni positiva e negativa. Aggiorna la valutazione della condizione di ingresso.
Output Card- Definisce il comportamento da eseguire quando la condizione di ingresso è vera e quello da eseguire quando è falsa.
Weather Card- Contiene le rappresentazioni delle condizioni meteo (sole, pioggia, fulmini ecc.), il raggio luminoso corrispondente, lo stato meteo corrente e precedente e i gestori degli eventi di collisione. Rileva sole, nuvole, pioggia, fulmini e neve e gestisce il contatto del raggio con l’oggetto dell’ambiente.
Fire Card- Contiene il marcatore del fuoco, l’immagine dell’identificativo della distanza sul pavimento, la distanza dall’oggetto dell’ambiente e lo stato di presa del marcatore. Rileva distanze molto vicine, vicine e medie e aggiorna la distanza e lo stato di presa del marcatore.
Make Sound Card- Contiene il microfono e lo stato di registrazione (
isRecording). Avvia e salva la registrazione e gestisce l’animazione del microfono. Light Up Card- Contiene pennello, secchio di vernice, secchio d’acqua e gestori delle collisioni del pennello con la vernice emissiva o l’oggetto dell’ambiente. Gestisce gli eventi di contatto con i secchi e con l’oggetto e applica il colore all’oggetto.
Prototyping Scene Core- Contiene gli oggetti dell’ambiente, gli oggetti di supporto di ingresso e uscita, gli elementi dell’interfaccia, le liste di istanze delle condizioni di ingresso e dei comportamenti in uscita e lo stato di conferma (
isConfirmed). Inizializza le carte scelte, richiama i comportamenti di prototipazione, aggiorna le istanze, valuta le condizioni e richiama i comportamenti corrispondenti. Crea e rimuove istanze dalle liste, gestisce i pulsanti, conferma l’oggetto e finalizza l’oggetto intelligente. Smart Object- Conserva le carte selezionate in un dizionario e i riferimenti all’oggetto dell’ambiente e agli oggetti di supporto di ingresso e uscita. Valuta le condizioni di ingresso e definisce i comportamenti per condizioni vere e false. È statico, quindi conserva i dati tra le scene.
Interaction Scene Core- Posiziona l’oggetto intelligente nella scena di interazione e mostra l’effetto finale di congratulazioni.
Codice sorgente:
github.com/takafumihoriuchi/SmartCodesignVR — Assets/myScripts
Risultati e lavoro restante
Nove carte implementate su 49
Il prototipo implementa nove carte. Le funzioni fondamentali sono operative: scelta delle carte, definizione di condizioni e comportamenti, gestione di più istanze e trasferimento dei dati tra scene. Questo fornisce una base per aggiungere altre carte, ma il lavoro di implementazione resta da svolgere. Altre sei carte sono state progettate ma non implementate; per le restanti 34 occorrono sia la progettazione delle interazioni sia l’implementazione.
| Stato | Carte |
|---|---|
| Implementate (9) | Ambiente: albero, lampione, segnale stradale, cestino, ponte Ingresso: fuoco, previsioni meteo Uscita: emettere suono, illuminarsi |
| Solo progettate (6) | Ingresso: pulsante, velocità, suono Uscita: muoversi, vibrare, inviare |
| Non avviate (34) | 15 carte ambiente, 16 carte ingresso, 3 carte uscita (visualizzare, attivare, registrare) |
Non è stata svolta una valutazione con utenti
Il prototipo non è stato valutato con utenti. Lo sviluppo ha coinciso con la partecipazione a distanza durante la pandemia di COVID-19. Non è stato possibile organizzare né un laboratorio in presenza con visori VR né un’alternativa a distanza. Il progetto dimostra che l’esperienza progettata può essere realizzata come prototipo funzionante. La sua usabilità per i bambini e il suo valore in un contesto terapeutico restano da verificare.
Una futura valutazione esaminerebbe quanto sia intuitiva l’interfaccia per la prototipazione. Tra le possibili misure vi sono il tempo di completamento, la corrispondenza tra l’oggetto finale e l’idea iniziale del partecipante e il numero di pressioni involontarie dei pulsanti. Un questionario finale basato sulla System Usability Scale (SUS) fornirebbe altri dati quantitativi. Si potrebbe considerare la registrazione delle sessioni per osservare i movimenti dei partecipanti, con il loro consenso e procedure adeguate. Per il progetto del 2021 era stata proposta l’età di 13 anni, per conciliare la fascia di età di SNaP con le indicazioni Oculus consultate all’epoca. Qualsiasi studio futuro dovrebbe riesaminare i criteri di ammissione alla luce delle indicazioni applicabili e del protocollo di ricerca.
Sviluppi futuri
La prima priorità è rifinire l’interfaccia e l’esperienza d’uso. I limiti di tempo ed esperienza hanno concentrato gli sforzi sul funzionamento delle combinazioni di carte, lasciando meno sviluppati gli aspetti visivi, sonori e tattili. Va ripensato anche il ruolo del testo nella VR: informazioni concepite per una superficie piana potrebbero essere presentate meglio mediante un’interfaccia utente spaziale (SUI). L’interazione vocale è un’altra direzione da esplorare per gli utenti previsti.
Il progetto ha individuato tre direzioni di ricerca. La prima è il confronto con la tavola fisica in sviluppo presso i3Lab. Studi precedenti hanno rilevato più conversazione quando i partecipanti svolgevano lo stesso gioco collaborativo in un ambiente virtuale rispetto a uno fisico, suggerendo un confronto utile tra le due piattaforme. La seconda è la partecipazione simultanea di più utenti: in accordo con il nome «Codesign», i bambini potrebbero costruire insieme gli oggetti in VR. La terza è un formato standard per descrivere gli oggetti intelligenti, che consenta di trasferire i progetti tra piattaforme.
Sintesi
Il progetto ha creato un ambiente per prototipare oggetti intelligenti. Ha tradotto i tre tipi di carte SNaP in elementi costitutivi: l’oggetto, le condizioni che lo attivano e i suoi comportamenti. I giocatori li collegano afferrando, indicando e dipingendo. Il prototipo funzionante trasforma un’idea scritta in un oggetto virtuale interattivo, il cui comportamento è rappresentato da dati trasferibili tra scene.
Takafumi Horiuchi, Paul Cozma-Ivan, Elmira Katsajeva e Olivia Ludkiewicz, “Design and Implementation of a Smart Object Prototyping Platform in Virtual Reality for Children with NDD,” Advanced User Interfaces (a.a. 2020–21) Final Exam Project, Politecnico di Milano, febbraio 2021.

