ForceSeatMI est une interface facile à utiliser mais puissante, qui permet d’ajouter la prise en charge d’une plateforme de mouvement à n’importe quelle application ou jeu (appelé SIM dans les sections suivantes). Dans la plupart des applications, il n’est pas nécessaire de contrôler le matériel directement depuis le SIM. C’est pourquoi ForceSeatMI sert uniquement à envoyer des données de télémétrie ou des demandes de positionnement à ForceSeatPM. Cette approche délègue au ForceSeatPM la responsabilité de transformer les données de télémétrie en mouvements réels de la plateforme, au lieu de le faire dans le SIM. Elle simplifie aussi la gestion des erreurs que le SIM doit implémenter.

Avec la dernière version de ForceSeatMI, il est possible de contrôler le matériel en utilisant la cinématique inverse. Le SIM envoie la position requise du châssis supérieur et ForceSeatPM calcule les positions nécessaires des bras (ou des actionneurs). Cette fonctionnalité peut être utilisée dans une application où un positionnement précis est requis, plutôt qu’une simulation des forces.

Schéma Fsmi (1)

Cette documentation s’applique uniquement à ForceSeatMI 2.63 ou plus récent. Les anciennes versions de l’API ne sont pas couvertes par ce document. ForceSeatMI 2.63+ n’est pas non plus rétrocompatible, au niveau de l’interface et du binaire, avec les versions 2.61 et antérieures. Passer d’une ancienne version de ForceSeatMI à 2.63+ nécessitera des modifications dans le code source de ton application.

Fonctionnalités

  • Le SIM peut choisir entre des modes de fonctionnement : simulation des forces (télémétrie), positionnement rapide du châssis supérieur et positionnement précis du châssis supérieur
  • Le SIM n’a pas à traduire les données de télémétrie en positions réelles des moteurs : c’est ForceSeatPM qui s’en charge
  • Le SIM ne dépend pas d’un matériel de plateforme de mouvement spécifique ; les ajustements liés au matériel se font dans ForceSeatPM
  • Toutes les fonctionnalités de diagnostic et de traitement de ForceSeatPM restent disponibles et peuvent être utilisées

Contenu du package

  • ForceSeatMI_Loader.c – un wrapper qui redirige les appels de fonctions vers la DLL réelle (la DLL est installée par ForceSeatPM)
  • ForceSeatMI_Common.h, ForceSeatMI_Common.cs – en-tête avec les types et les énumérations
  • ForceSeatMI_Functions.h – API C/C++ pure
  • ForceSeatMI.cs – API C#
  • ForceSeatMI_Telemetry.h, ForceSeatMI_Telemetry.cs – structures pour les données de télémétrie
  • ForceSeatMI_Positioning.h, ForceSeatMI_Positioning.cs – structures pour les données de positionnement
  • ForceSeatMI_TactileTransducers.h, ForceSeatMI_TactileTransducers.cs – structures pour les effets des transducteurs tactiles
  • ForceSeatMI_Status.h, ForceSeatMI_Status.cs – structures pour les données d’état actuel de la plateforme de mouvement
  • Unity/*.cs – API C# Unity 3D
  • Plugins/UnrealEngine – plug-in dédié Unreal Engine avec une classe d’aide pour l’extraction de la télémétrie des véhicules et des avions
  • Examples – exemples
ForceSeatMI utilise une DLL installée dans le cadre du logiciel ForceSeatPM. Assure-toi d’avoir ForceSeatPM installé sur ton ordinateur.

Configuration requise

  • Les langages et frameworks suivants sont pris en charge nativement : C, C++, C#, Unity 3D (C#), Unreal Engine (C++)
  • La DLL de l’API native est compilée avec Visual Studio 2015 : un lien statique avec MSVC est utilisé.
  • Les exemples Unity 3D nécessitent Unity 5.x ou plus récent
  • Les exemples Unreal Engine nécessitent Unreal Engine 4.14 ou plus récent
  • Les exemples C# nécessitent au moins Visual Studio 2013 Express pour Windows Desktop et .NET Framework 4.0.
  • Les exemples C/C++ nécessitent au moins Visual Studio 2013 Express pour Windows Desktop.
  • Compatible uniquement avec Windows PC

Modes de fonctionnement

ForceSeatMI fonctionne dans l’un des modes décrits ci-dessous. Pour une première utilisation, il est recommandé de commencer par Logical Table Position, car c’est l’exemple le plus simple et il fonctionne avec le profil intégré SDK – Positioning.

ModeDescriptionApplicationsProfil recommandé
Données de télémétrieDans ce mode, le SIM envoie directement à ForceSeatPM des informations sur la position du véhicule, les forces g et les accélérations dans le système de coordonnées du véhicule. Toute la transformation des forces en mouvements du châssis supérieur est effectuée dans le moteur de scripts de ForceSeatPM. Cela permet de modifier facilement le mapping et les paramètres de filtrage sans avoir à changer quoi que ce soit dans le SIM. Jeux et simulations de physique de véhiculesSDK – Vehicle Telemetry
SDK – Plane Telemetry
Position logique de la tableDans ce mode, le SIM envoie la position du châssis supérieur (lacet, tangage, roulis, heave, sway et surge) en unités abstraites (pourcentages de la rotation/translation maximale). Cela permet au SIM de prendre le contrôle total de la position du châssis supérieur, mais c’est au SIM de calculer les angles et décalages corrects. Pour les applications qui veulent mieux contrôler la position du châssisSDK – Positioning
Position précise de la tableCe module utilise la matrice de transformation du châssis supérieur fournie par le SIM et calcule les positions de tous les bras/actionneurs en unités réelles.Applications de test d’équipementSDK – Positioning

Détails d’implémentation

structSize est un champ obligatoire qui DOIT être renseigné. Il sert à gérer la compatibilité ascendante/descendante entre la DLL et le SIM.

télémétrie.structSize = sizeof(ForceSeatMI_Telemetry);

mask indique quels autres champs sont définis. Par exemple, si le SIM fournit roll dans la structure FSMI_TopTablePositionLogical, alors le champ mask doit contenir le bit FSMI_POS_BIT_POSITION. Il est nécessaire d’inclure toujours le champ state dans le mask (FSMI_POS_BIT_STATE ou 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 ...

Si ForceSeatMI est utilisé dans le SIM, le SIM doit appeler ForceSeatMI_BeginMotionControl au moins une fois, sinon l’état pause sera présent en permanence. Après le premier appel, tu peux choisir comment gérer la pause. Une option consiste à appeler ForceSeatMI_EndMotionControl et une autre consiste à définir le bit state. Notre recommandation est la suivante :

  1. Quand le SIM passe en mode d’exécution (il va envoyer des données de télémétrie), il appelle ForceSeatMI_BeginMotionControl
  2. Quand le SIM quitte le mode d’exécution (il ne va pas envoyer de données de télémétrie pendant un moment), il appelle ForceSeatMI_EndMotionControl
  3. Quand, pendant l’exécution, il y a un court événement de pause (par ex. l’utilisateur appuie sur pause au clavier), le SIM doit utiliser le champ state

Autrement dit, il est recommandé d’utiliser ForceSeatMI_BeginMotionControl/ForceSeatMI_EndMotionControl pour gérer les transitions exécution – menu principal, et state pour gérer les événements de pause de courte durée.

Les champs state se composent de 8 bits, mais dans la version actuelle seul le premier bit est utilisé.

  • BIT n° 0 — 1 (FSMI_STATE_PAUSE) signifie que le mode d’exécution dans le SIM est en pause ; 0 (FSMI_STATE_NO_PAUSE) signifie que le mode d’exécution dans le SIM est en cours d’exécution.
Pense à ajouter FSMI_POS_BIT_STATE ou FSMI_TEL_BIT_STATE au mask si le champ state doit être défini. Assure-toi de définir state au moins une fois pour sortir la plateforme de mouvement de la pause après l’appel à ForceSeatMI_BeginMotionControl.

Exemples

Les exemples suivants sont fournis avec le SDK. Assure-toi d’utiliser le bon profil pour chaque exemple.

ExempleDescriptionProfil requis
TableLogPos_CPP
TableLogPos_CS
TableLogPos_Unity
TableLogPos_Unreal
Montre comment contrôler la position de la table supérieure en spécifiant le roulis, le tangage, le lacet, le heave, le sway et le surge en pourcentage des mouvements maximum. Peut être utilisé pour contrôler tous types de plateformes de mouvement. SDK – Positioning
TablePhyPos_CPP
TablePhyPos_CS
TablePhyPos_Unity
TablePhyPos_Unreal
Montre comment spécifier une position précise de la table supérieure en fournissant le roulis, le tangage, le lacet, le heave, le sway et le surge en unités réelles. Fonctionne uniquement avec les machines 3DoF et 6DoF. SDK – Positioning
TableMatrixPos_CPP
TableMatrixPos_CS
Montre comment spécifier une position précise de la table supérieure en fournissant une matrice de transformation. Recommandé uniquement pour les machines 6DoF. SDK – Positioning
Telemetry_Veh_Unity
Telemetry_Veh_Unreal
Montre comment envoyer des données de télémétrie véhicule du SIM vers ForceSeatPM.SDK – Vehicle Telemetry
Telemetry_Fly_Unity
Telemetry_Fly_Unreal
Montre comment envoyer des données de télémétrie avion du SIM vers ForceSeatPM.SDK – Plane Telemetry

Dernières remarques

  • Quand la plateforme ne bouge pas ou que le système est en pause :
    • Vérifie que le bon profil est actif dans ForceSeatPM
    • Vérifie que le bon profil a été importé dans ForceSeatPM (les différents modes de fonctionnement nécessitent des profils différents)
    • Vérifie le diagnostic ForceSeatMI pour voir si ForceSeatPM reçoit des données du SIM.
    • Vérifie si l’indicateur paused est activé ou non
    • Pense à configurer le champ mask
    • Pense à définir la bonne valeur state pour quitter le mode pause.
  • ForceSeatMI32.dll/ForceSeatMI64.dll ont été conçues pour des performances élevées ; il n’y a donc pas de journalisation disponible et la DLL n’effectue que les vérifications de cohérence des données strictement nécessaires.
Sign up to our newsletter
Always be the first to know about new products, updates and company news
  • Ce champ n’est utilisé qu’à des fins de validation et devrait rester inchangé.