ForceSeatMI è un’interfaccia facile da usare ma potente che consente di aggiungere il supporto per piattaforme di movimento a qualsiasi applicazione o gioco (indicato come SIM nelle sezioni successive). Nella maggior parte delle applicazioni non è necessario controllare l’hardware direttamente dal SIM. Per questo motivo ForceSeatMI viene utilizzato solo per inviare telemetria o richieste di posizionamento a ForceSeatPM. Questo approccio delega la responsabilità di trasformare i dati di telemetria in un effettivo movimento della piattaforma dal SIM a ForceSeatPM. Semplifica inoltre la gestione degli errori che il SIM deve implementare.

Con l’ultima versione di ForceSeatMI, è possibile controllare l’hardware utilizzando la cinematica inversa. Il SIM invia la posizione richiesta del telaio superiore e ForceSeatPM calcola le posizioni richieste dei bracci (o attuatori). Questa funzione può essere utilizzata in applicazioni dove è richiesto un posizionamento preciso invece della simulazione di forze.

Fsmi Diagram (1)

Questa documentazione si applica solo a ForceSeatMI 2.63 o versioni successive. Le versioni precedenti dell’API non sono coperte da questo documento. ForceSeatMI 2.63+ non è inoltre retrocompatibile a livello di interfaccia e binario con le versioni 2.61 e precedenti. Il passaggio da una versione precedente di ForceSeatMI alla 2.63+ richiederà modifiche nel codice sorgente della tua applicazione.

Funzionalità

  • Il SIM può scegliere tra modalità operative: simulazione di forze (telemetria), posizionamento rapido del telaio superiore e posizionamento preciso del telaio superiore
  • Il SIM non deve tradurre i dati di telemetria in una posizione effettiva dei motori – questo viene fatto da ForceSeatPM
  • Il SIM non dipende da hardware specifico della piattaforma di movimento, le regolazioni relative all’hardware vengono effettuate all’interno di ForceSeatPM
  • Tutte le funzionalità diagnostiche e di elaborazione di ForceSeatPM sono ancora disponibili e possono essere utilizzate

Contenuto del pacchetto

  • ForceSeatMI_Loader.c – un wrapper che inoltra le chiamate di funzione alla DLL reale (la DLL viene installata da ForceSeatPM)
  • ForceSeatMI_Common.h, ForceSeatMI_Common.cs – header con tipi ed enumerazioni
  • ForceSeatMI_Functions.h – API C/C++ pura
  • ForceSeatMI.cs – API C#
  • ForceSeatMI_Telemetry.h, ForceSeatMI_Telemetry.cs – strutture per i dati di telemetria
  • ForceSeatMI_Positioning.h, ForceSeatMI_Positioning.cs – strutture per i dati di posizionamento
  • ForceSeatMI_TactileTransducers.h, ForceSeatMI_TactileTransducers.cs – strutture per gli effetti dei trasduttori tattili
  • ForceSeatMI_Status.h, ForceSeatMI_Status.cs – strutture per i dati di stato corrente della piattaforma di movimento
  • Unity/*.cs – API C# per Unity 3D
  • Plugins/UnrealEngine – plug-in dedicato per Unreal Engine con classe helper per l’estrazione di telemetria di veicoli e aerei
  • Examples – esempi
ForceSeatMI utilizza una DLL che viene installata come parte del software ForceSeatPM. Assicurati di avere ForceSeatPM installato sul tuo computer.

Requisiti

  • I seguenti linguaggi e framework sono supportati nativamente: C, C++, C#, Unity 3D(C#), Unreal Engine (C++)
  • La DLL dell’API nativa è compilata con Visual Studio 2015 – viene utilizzato il collegamento statico con MSVC.
  • Gli esempi Unity 3D richiedono Unity 5.x o versioni successive
  • Gli esempi Unreal Engine richiedono Unreal Engine 4.14 o versioni successive
  • Gli esempi C# richiedono almeno Visual Studio 2013 Express per Windows Desktop e .NET Framework 4.0.
  • Gli esempi C/C++ richiedono almeno Visual Studio 2013 Express per Windows Desktop.
  • Supporta solo Windows PC

Modalità operative

ForceSeatMI funziona in una delle modalità descritte di seguito. Per gli utenti alle prime armi si consiglia di iniziare da Logical Table Position in quanto è l’esempio più semplice e funziona con il profilo integrato SDK – Positioning.

ModalitàDescrizioneApplicazioniProfilo consigliato
Dati di telemetriaIn questa modalità il SIM invia informazioni sulla posizione del veicolo, forze g e accelerazioni nel sistema di coordinate del veicolo direttamente a ForceSeatPM. L’intera trasformazione dalle forze ai movimenti del telaio superiore viene eseguita all’interno del motore di scripting di ForceSeatPM. Ciò consente di modificare facilmente i parametri di mappatura e filtro senza la necessità di cambiare nulla nel SIM. Giochi e simulazioni di fisica dei veicoliSDK – Vehicle Telemetry
SDK – Plane Telemetry
Posizione logica della tavolaIn questa modalità il SIM invia la posizione del telaio superiore (imbardata, beccheggio, rollio, sollevamento, oscillazione laterale e longitudinale) in unità astratte (percentuali di rotazione/traslazione massima). Ciò consente al SIM di assumere il pieno controllo sulla posizione del telaio superiore, ma spetta al SIM calcolare angoli e offset corretti. Per applicazioni che desiderano avere un migliore controllo sulla posizione del telaioSDK – Positioning
Posizione precisa della tavolaQuesto modulo utilizza la matrice di trasformazione del telaio superiore fornita dal SIM e calcola le posizioni di tutti i bracci/attuatori in unità del mondo reale.Applicazioni di test delle attrezzatureSDK – Positioning

Dettagli di implementazione

structSize è un campo obbligatorio che DEVE essere compilato. Viene utilizzato per gestire la compatibilità retroattiva/futura tra la DLL e il SIM.

telemetry.structSize = sizeof(ForceSeatMI_Telemetry);

mask indica quali altri campi sono impostati. Ad esempio, se il SIM fornisce roll nella struttura FSMI_TopTablePositionLogical, allora il campo mask deve contenere il bit FSMI_POS_BIT_POSITION. È necessario includere sempre il campo state nella mask (FSMI_POS_BIT_STATE o FSMI_TEL_BIT_STATE).

#define FSMI_POS_BIT_STATE ...
#define FSMI_POS_BIT_POSITION ...
#define FSMI_POS_BIT_MATRIX ...
#define FSMI_POS_BIT_MAX_SPEED ...
#define FSMI_POS_BIT_TRIGGERS ...
#define FSMI_POS_BIT_AUX ...
 
#define FSMI_TEL_BIT_STATE ...
#define FSMI_TEL_BIT_RPM ...
#define FSMI_TEL_BIT_SPEED ...
 
#define FSMI_TEL_BIT_YAW_PITCH_ROLL ...
#define FSMI_TEL_BIT_YAW_PITCH_ROLL_ACCELERATION ...
#define FSMI_TEL_BIT_YAW_PITCH_ROLL_SPEED ...
#define FSMI_TEL_BIT_SWAY_HEAVE_SURGE_ACCELERATION ...
#define FSMI_TEL_BIT_SWAY_HEAVE_SURGE_SPEED ...
 
#define FSMI_TEL_BIT_PEDALS_POSITION ...
#define FSMI_TEL_BIT_GEAR_NUMBER ...
#define FSMI_TEL_BIT_GROUND_TYPE ...
#define FSMI_TEL_BIT_COLLISION ...
 
#define FSMI_TEL_BIT_GLOBAL_POSITION ...
#define FSMI_TEL_BIT_TIME ...
#define FSMI_TEL_BIT_TRIGGERS ...
 
#define FSMI_TEL_BIT_MAX_RPM ...
#define FSMI_TEL_BIT_FLAGS ...
#define FSMI_TEL_BIT_AUX ...

Se ForceSeatMI viene utilizzato nel SIM, il SIM deve chiamare ForceSeatMI_BeginMotionControl almeno una volta, altrimenti sarà sempre presente lo stato di pausa. Dopo la prima chiamata, puoi scegliere come gestire la pausa. Un’opzione è chiamare ForceSeatMI_EndMotionControl e un’altra opzione è impostare il bit state. La nostra raccomandazione è la seguente:

  1. Quando il SIM entra in modalità runtime (sta per inviare dati di telemetria), chiama ForceSeatMI_BeginMotionControl
  2. Quando il SIM esce dalla modalità runtime (non invierà dati di telemetria per un po’), chiama ForceSeatMI_EndMotionControl
  3. Quando durante il runtime si verifica un breve evento di pausa (ad es. l’utente preme pausa sulla tastiera), il SIM dovrebbe utilizzare il campo state

In altre parole, si consiglia di utilizzare ForceSeatMI_BeginMotionControl/ForceSeatMI_EndMotionControl per gestire le transizioni runtime – menu principale e state per gestire eventi di pausa di breve durata.

Il campo state è composto da 8 bit, ma nella versione corrente viene utilizzato solo il primo bit.

  • BIT n. 0 — 1 (FSMI_STATE_PAUSE) significa che la modalità runtime nel SIM è in pausa, 0 (FSMI_STATE_NO_PAUSE) significa che la modalità runtime nel SIM è in esecuzione.
Ricorda di aggiungere FSMI_POS_BIT_STATE o FSMI_TEL_BIT_STATE a mask se il campo state verrà impostato. Assicurati di impostare state almeno una volta per togliere la pausa alla piattaforma di movimento dopo che ForceSeatMI_BeginMotionControl è stato chiamato.

Esempi

I seguenti esempi sono forniti insieme all’SDK. Assicurati di utilizzare il profilo corretto per ogni esempio.

EsempioDescrizioneProfilo richiesto
TableLogPos_CPP
TableLogPos_CS
TableLogPos_Unity
TableLogPos_Unreal
Mostra come controllare la posizione della tavola superiore specificando rollio, beccheggio, imbardata, sollevamento, oscillazione laterale e longitudinale in percentuale dei movimenti massimi. Può essere utilizzato per controllare tutti i tipi di piattaforme di movimento. SDK – Positioning
TablePhyPos_CPP
TablePhyPos_CS
TablePhyPos_Unity
TablePhyPos_Unreal
Mostra come specificare la posizione precisa della tavola superiore fornendo rollio, beccheggio, imbardata, sollevamento, oscillazione laterale e longitudinale in unità del mondo reale. Funziona solo con macchine 3DoF e 6DoF. SDK – Positioning
TableMatrixPos_CPP
TableMatrixPos_CS
Mostra come specificare la posizione precisa della tavola superiore fornendo una matrice di trasformazione. È consigliato solo per macchine 6DoF. SDK – Positioning
Telemetry_Veh_Unity
Telemetry_Veh_Unreal
Mostra come inviare dati di telemetria del veicolo dal SIM a ForceSeatPM.SDK – Vehicle Telemetry
Telemetry_Fly_Unity
Telemetry_Fly_Unreal
Mostra come inviare dati di telemetria dell’aereo dal SIM a ForceSeatPM.SDK – Plane Telemetry

Considerazioni finali

  • Quando la piattaforma non si muove o il sistema è in stato di pausa, allora:
    • Verifica se il profilo corretto è attivo in ForceSeatPM
    • Verifica se il profilo corretto è stato importato in ForceSeatPM (diverse modalità operative richiedono profili diversi)
    • Controlla la diagnostica di ForceSeatMI per vedere se ForceSeatPM riceve dati dal SIM.
    • Verifica se l’indicatore paused è acceso o spento
    • Ricorda di configurare il campo mask
    • Ricorda di impostare il valore corretto di state per uscire dalla modalità pausa.
  • ForceSeatMI32.dll/ForceSeatMI64.dll sono state progettate per alte prestazioni, quindi non è disponibile alcun logging e la DLL esegue solo i controlli di coerenza dei dati minimi necessari.
Sign up to our newsletter
Always be the first to know about new products, updates and company news
  • Questo campo serve per la convalida e dovrebbe essere lasciato inalterato.