Vai al contenuto principale
Torna al blog
8 min di letturaItaliano

Trenord Infotainment: un’app per chi viaggia sui treni regionali

Un’app in React Native per i pendolari Trenord: continua a tracciare il treno anche in galleria, riduce il mal d’auto con indici visivi di movimento e sfrutta il layout a due colonne sui tablet.

#Mobile Engineering#React Native#Expo#Transit Tech#System Design#TypeScript

Disponibile anche in inglese: English version.

I treni regionali in Lombardia sono un banco di prova severo per un’applicazione mobile. Il convoglio attraversa trincee e gallerie in cui il segnale GNSS e la connettività dati cellulare spariscono del tutto; il dispositivo aggancia e sgancia celle radio ogni pochi minuti, e molti passeggeri soffrono di cinetosi (il classico mal d’auto) quando provano a leggere a bordo.

Trenord Infotainment (repository GitHub(si apre in una nuova scheda)) è stato il nostro progetto conclusivo per l’insegnamento di Design and Implementation of Mobile Applications (DIMA) della laurea magistrale in Computer Science and Engineering al Politecnico di Milano. Lo abbiamo sviluppato in collaborazione con Trenord(si apre in una nuova scheda), la principale società ferroviaria regionale lombarda. Il team era composto da Tommaso Morganti, Luca Suzani e me. L’obiettivo: creare un’applicazione offline-first capace di mostrare la posizione del treno in ogni istante, mitigare la cinetosi e intrattenere i viaggiatori anche in totale assenza di rete.

Tracciamento in tempo reale del viaggio su mappa e cronologia delle fermate in Trenord Infotainment

I problemi da risolvere

La stragrande maggioranza delle app per smartphone dà per scontata una connettività continua. Su un treno regionale questa ipotesi viene smentita costantemente:

  1. Gallerie e zone d’ombra. Un’interfaccia che attende una risposta di rete prima di aggiornarsi si blocca non appena il convoglio entra in un tunnel.
  2. Cinetosi. L’orecchio interno percepisce le accelerazioni, le frenate e le oscillazioni della carrozza, mentre gli occhi fissano lo schermo immobile dello smartphone. Questo conflitto sensoriale provoca nausea e malessere.
  3. Informazioni frammentate. Ritardi, cambi di binario, meteo a destinazione e coincidenze sono distribuiti su portali diversi o annunci in stazione difficili da ascoltare.
  4. Fattori di forma eterogenei. I pendolari viaggiano con smartphone compatti, telefoni grandi e tablet appoggiati sul tavolino del sedile. Allungare una vista pensata per smartphone su uno schermo ampio spreca tutto lo spazio utile.

Abbiamo affrontato ogni criticità con soluzioni architetturali mirate: tutti i dati necessari al viaggio vengono scaricati e salvati in locale all’avvio, gli indicatori visivi di movimento girano sul thread nativo dell’interfaccia, e il layout si divide in due colonne su schermi larghi.

Iniziare un viaggio

Il passeggero può inquadrare il codice a barre 2D o il codice PNR presente sul biglietto, oppure digitare il numero del treno (ad esempio 24869).

Flusso di onboarding con scansione del biglietto e selezione della stazione di arrivo

L’applicazione interroga i servizi di orario di Trenord e scarica:

L’app memorizza l’intero itinerario sul dispositivo. Se la connessione cade pochi secondi dopo, tutte le informazioni rimangono accessibili.

Tracciare la posizione del treno, anche in galleria

Quando il convoglio viaggia a cielo aperto, l’applicazione riceve aggiornamenti continui dal ricevitore satellitare dello smartphone.

Dashboard principale con telemetria del treno, conto alla rovescia per la stazione e feed contestuale

Il segnale GPS all’interno di una carrozza ferroviaria è rumoroso: la schermatura metallica della struttura attenua il segnale e le onde rimbalzano sulle pareti. Per evitare che l’indicatore di velocità oscilli in modo anomalo, filtriamo ogni lettura con una media mobile esponenziale (EMA):

vsmooth,t=α⋅vmisurato,t+(1−α)⋅vsmooth,t−1v_{\text{smooth}, t} = \alpha \cdot v_{\text{misurato}, t} + (1 - \alpha) \cdot v_{\text{smooth}, t-1}

con α=0.35\alpha = 0.35.

Nelle gallerie il segnale GNSS si interrompe bruscamente. Molte applicazioni di trasporto mostrano un cursore bloccato o un’icona di caricamento infinito. Noi abbiamo implementato una macchina a stati per la navigazione stimata:

  1. Rilevamento della perdita di segnale. Se non arrivano nuovi fix satellitari entro 5 secondi, l’app passa automaticamente dalla modalità GPS alla navigazione stimata.
  2. Stima basata sugli orari e sul percorso. L’applicazione combina i dati memorizzati dell’orario con il tempo trascorso dall’ultima stazione superata, posizionando il treno lungo la tratta corretta tra le due fermate.
  3. Riconnessione fluida. All’uscita dal tunnel, quando il segnale torna stabile, il cursore si riallinea alle coordinate satellitari con una transizione continua, senza scatti e senza resettare l’interfaccia.

Indicatori visivi contro il mal di movimento

In curva, l’apparato vestibolare percepisce l’inclinazione del vagone, ma la vista fissa uno schermo fermo tra le mani. Questo disallineamento è la causa principale della cinetosi.

Abbiamo inserito nell’interfaccia un sistema di indicatori di movimento (motion cues).

Indicatori di movimento attivi con particelle inerziali lungo i bordi dello schermo

L’overlay renderizza 40 punti lungo i margini dello schermo. Quando il convoglio oscilla, accelera o curva, i punti si muovono nella direzione opposta all’accelerazione inerziale. La visione periferica registra così il movimento fisico avvertito dal corpo, funzionando come un orizzonte artificiale.

Esecuzione sul thread UI

Eseguire questi calcoli fisici sul thread JavaScript provocherebbe cali di frame rate. Il calcolo delle traiettorie viene eseguito direttamente sul thread nativo dell’interfaccia tramite worklet di React Native Reanimated:

Architettura della pipeline di elaborazione dei sensori hardware e cinematica

  1. useAnimatedSensor(SensorType.ACCELEROMETER) campiona l’accelerometro alla frequenza di aggiornamento dello schermo (60 Hz o 120 Hz).
  2. Un filtro passa-basso (α=0.8\alpha = 0.8) separa la componente gravitazionale (1.0G1.0\text{G}) dall’accelerazione lineare del treno.
  3. L’accelerazione dinamica sposta le particelle, che scorrono lungo i bordi e svaniscono in profondità.
  4. Il worklet non tocca mai l’event loop di JavaScript, mantenendo l’animazione stabilmente a 60 FPS.

Abbiamo aggiunto anche la funzione shake to report. Se il telefono rileva uno scuotimento marcato o una decelerazione improvvisa (M>2.2GM > 2.2\text{G}, ΔM>1.2G\Delta M > 1.2\text{G}), l’app apre una scheda di segnalazione immediata per permettere al passeggero di comunicare ritardi, guasti a bordo o emergenze sanitarie.

Giochi e contenuti multimediali completamente offline

Guardare video in streaming tramite il Wi-Fi di bordo o con una connessione mobile discontinua è frustrante. Tutta la sezione di intrattenimento dell’app è progettata per funzionare offline.

Sezione multimediale con rassegne cinematografiche e podcast audio in background

L’hub multimediale include notizie, approfondimenti sul territorio e passatempi:

Giochi arcade offline: Trenord Hop a 60 FPS e il Sudoku per pendolari

Entrambi i giochi girano localmente sul telefono senza richiedere alcuna connessione di rete.

Arrivo a destinazione

Verso la conclusione del viaggio, l’app presenta una panoramica utile sulla città di arrivo:

Scheda dei punti di interesse a destinazione e rassegna stampa digitale

Cronologia delle notifiche e controlli delle preferenze del passeggero

Ottimizzazione per tablet

Molti pendolari utilizzano un tablet durante il viaggio. Invece di allungare elenchi verticali su display ampi o duplicare il codice, il layout si riorganizza a livello di rendering:

Layout per iPad a due colonne con mappa e cronologia delle fermate affiancate

Quando la larghezza della finestra supera i 768 px768\,\mathrm{px}:

Dashboard principale per tablet su iPad con visualizzazione a colonne multiple

A cambiare è unicamente il layout visivo: lo stato dell’app, la riproduzione audio e i giochi in corso non vengono interrotti quando si ruota il dispositivo o si ridimensiona l’area visibile.

Architettura del sistema e collaudo

L’applicazione è strutturata nei container descritti in questo diagramma C4:

Diagramma C4 dell'architettura dei container per Trenord Infotainment

Tecnologie adottate

AreaTecnologiaScopo
RuntimeReact Native 0.83.10 / Expo SDK 55Esecuzione sulla New Architecture di React Native
LinguaggioTypeScript 5.9Tipizzazione statica rigorosa per modelli, payload API, store e proprietà dei componenti
StatoZustand 5 + AsyncStorage11 store di dominio persistiti su disco e azzerati al termine del viaggio
NavigazioneExpo Router v5Routing basato su file, tab bar e pannelli modali
AnimazioniReact Native Reanimated 3Gestione degli indicatori visivi di movimento sul thread UI a 60 FPS
Sensoriexpo-sensors + expo-locationLettura dell’accelerometro a 3 assi e fix GPS ad alta frequenza per il tachimetro
Audioexpo-audioRiproduzione in background con controlli nativi su schermata di blocco
Funzionalità nativeexpo-camera, expo-haptics, expo-notificationsScansione biglietti, feedback con vibrazione e notifiche sull’arrivo
TestingJest 29 + React Native Testing Library + fast-check142 suite, 921 test, test property-based per i filtri EMA e verifiche di accessibilità
API esterneProxy edge + OAuth 2.0 (JWT RS256)Trenord B2B, percorsi OpenStreetMap, Open-Meteo, CurrentsAPI e Listen Notes
Localizzazionereact-i18nextTutte le stringhe disponibili in italiano e inglese

Test automatizzati

La codebase è protetta da 142 suite di test con 921 unit test:

Diagramma della piramide di testing e dei gate di qualità automatizzati

Report di code coverage automatizzato con copertura superiore al 90 percento su 142 suite

La copertura include:

Conclusioni e lezioni apprese

La collaborazione con Trenord ci ha permesso di lavorare con vincoli e dati operativi reali. Questo ha spinto il progetto ben oltre una tipica applicazione mobile: abbiamo dovuto gestire l’instabilità dei sensori, le perdite di segnale, i consumi energetici e il malessere dei passeggeri in viaggio.

Su un treno la connessione non è una certezza, ma un valore aggiunto occasionale. Mantenere le informazioni critiche sul dispositivo, delegare le animazioni al thread nativo e adattare l’interfaccia a qualunque schermo sono state le scelte decisive per rendere l’app affidabile perfino nel cuore di una galleria alpina.

Un ringraziamento sincero ai compagni di squadra Tommaso Morganti e Luca Suzani, al team ingegneristico di Trenord per il supporto e il tempo dedicato, e a tutti i docenti del corso DIMA del Politecnico di Milano.

Il codice sorgente e la documentazione tecnica sono interamente open source su GitHub(si apre in una nuova scheda).