ForceSeatMI es una interfaz fácil de usar pero potente que permite añadir soporte para plataformas de movimiento a cualquier aplicación o juego (denominado SIM en las siguientes secciones). En la mayoría de las aplicaciones no es necesario controlar el hardware directamente desde el SIM. Por ello, ForceSeatMI se utiliza únicamente para enviar telemetría o solicitudes de posicionamiento a ForceSeatPM. Este enfoque delega la responsabilidad de transformar los datos de telemetría en un movimiento real de la plataforma del SIM a ForceSeatPM. También simplifica el manejo de errores que el SIM debe implementar.

Con la última versión de ForceSeatMI, es posible controlar el hardware mediante el uso de Cinemática Inversa. El SIM envía la posición requerida del bastidor superior y ForceSeatPM calcula las posiciones requeridas de los brazos (o actuadores). Esta característica se puede utilizar en aplicaciones donde se requiere un posicionamiento preciso en lugar de la simulación de fuerzas.

Diagrama Fsmi (1)

Esta documentación se aplica únicamente a ForceSeatMI 2.63 o posterior. Las versiones anteriores de la API no están cubiertas por este documento. ForceSeatMI 2.63+ tampoco es compatible con versiones anteriores en los niveles de interfaz y binario con 2.61 y versiones anteriores. El cambio de una versión anterior de ForceSeatMI a 2.63+ requerirá cambios en el código fuente de tu aplicación.

Características

  • El SIM puede elegir entre modos de operación: simulación de fuerzas (telemetría), posicionamiento rápido del bastidor superior y posicionamiento preciso del bastidor superior
  • El SIM no tiene que traducir los datos de telemetría a una posición real de los motores; esto lo hace ForceSeatPM
  • El SIM no depende de un hardware de plataforma de movimiento específico; los ajustes relacionados con el hardware se realizan dentro de ForceSeatPM
  • Todas las funciones de diagnóstico y procesamiento de ForceSeatPM siguen estando disponibles y pueden utilizarse

Contenido del paquete

  • ForceSeatMI_Loader.c – un envoltorio que reenvía las llamadas a funciones a la DLL real (la DLL es instalada por ForceSeatPM)
  • ForceSeatMI_Common.h, ForceSeatMI_Common.cs – cabecera con tipos y enumeraciones
  • ForceSeatMI_Functions.h – API pura de C/C++
  • ForceSeatMI.cs – API de C#
  • ForceSeatMI_Telemetry.h, ForceSeatMI_Telemetry.cs – estructuras para datos de telemetría
  • ForceSeatMI_Positioning.h, ForceSeatMI_Positioning.cs – estructuras para datos de posicionamiento
  • ForceSeatMI_TactileTransducers.h, ForceSeatMI_TactileTransducers.cs – estructuras para efectos de transductores táctiles
  • ForceSeatMI_Status.h, ForceSeatMI_Status.cs – estructuras para datos de estado actuales de la plataforma de movimiento
  • Unity/*.cs – API de Unity 3D C#
  • Plugins/UnrealEngine – complemento dedicado de Unreal Engine con clase auxiliar para la extracción de telemetría de vehículos y aviones
  • Examples – ejemplos
ForceSeatMI utiliza una DLL que se instala como parte del software ForceSeatPM. Asegúrate de tener ForceSeatPM instalado en tu ordenador.

Requisitos

  • Los siguientes lenguajes y frameworks son compatibles de forma nativa: C, C++, C#, Unity 3D (C#), Unreal Engine (C++)
  • La DLL de la API nativa se compila con Visual Studio 2015 – se utiliza vinculación estática con MSVC.
  • Los ejemplos de Unity 3D requieren Unity 5.x o posterior
  • Los ejemplos de Unreal Engine requieren Unreal Engine 4.14 o posterior
  • Los ejemplos de C# requieren al menos Visual Studio 2013 Express para Windows Desktop y .NET Framework 4.0.
  • Los ejemplos de C/C++ requieren al menos Visual Studio 2013 Express para Windows Desktop.
  • Solo es compatible con Windows PC

Modos de operación

ForceSeatMI funciona en uno de los modos descritos a continuación. Para los usuarios primerizos, se recomienda empezar por Logical Table Position, ya que es el ejemplo más sencillo y funciona con el perfil integrado SDK – Positioning.

ModoDescripciónAplicacionesPerfil recomendado
Datos de telemetríaEn este modo, el SIM envía información sobre la posición del vehículo, las fuerzas G y las aceleraciones en el sistema de coordenadas del vehículo directamente a ForceSeatPM. Toda la transformación de las fuerzas a los movimientos del bastidor superior se realiza dentro del motor de scripting de ForceSeatPM. Esto permite cambiar fácilmente los parámetros de mapeo y filtro sin necesidad de cambiar nada en el SIM. Juegos y simulaciones de física de vehículosSDK – Telemetría de vehículos
SDK – Telemetría de aviones
Posición lógica de la mesaEn este modo, el SIM envía la posición del bastidor superior (guiñada, cabeceo, balanceo, elevación, balanceo lateral y avance) en unidades abstractas (porcentajes de rotación/traslación máxima). Esto permite al SIM tomar el control total sobre la posición del bastidor superior, pero depende del SIM calcular los ángulos y desplazamientos correctos. Para aplicaciones que desean tener un mayor control sobre la posición del bastidorSDK – Posicionamiento
Posición precisa de la mesaEste módulo utiliza la matriz de transformación del bastidor superior entregada por el SIM y calcula las posiciones de todos los brazos/actuadores en unidades del mundo real.Aplicaciones de prueba de equiposSDK – Posicionamiento

Detalles de implementación

structSize es un campo obligatorio que DEBE rellenarse. Se utiliza para manejar la compatibilidad hacia atrás/adelante entre la DLL y el SIM.

telemetría.structSize = sizeof(ForceSeatMI_Telemetry);

mask indica qué otros campos están configurados. Por ejemplo, si el SIM proporciona roll en la estructura FSMI_TopTablePositionLogical, entonces el campo mask debe contener el bit FSMI_POS_BIT_POSITION. Es necesario incluir siempre el campo state en la máscara (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 ...

Si ForceSeatMI se utiliza en el SIM, el SIM debe llamar a ForceSeatMI_BeginMotionControl al menos una vez, de lo contrario, el estado de pausa estará presente todo el tiempo. Después de la primera llamada, puedes elegir cómo manejar la pausa. Una opción es llamar a ForceSeatMI_EndMotionControl y otra opción es establecer el bit state. Nuestra recomendación es la siguiente:

  1. Cuando el SIM entra en modo de ejecución (va a enviar datos de telemetría), llama a ForceSeatMI_BeginMotionControl
  2. Cuando el SIM sale del modo de ejecución (no va a enviar datos de telemetría por un tiempo), llama a ForceSeatMI_EndMotionControl
  3. Cuando durante la ejecución, hay un evento de pausa breve (por ejemplo, el usuario presiona pausa en el teclado), el SIM debe usar el campo state

En otras palabras, se recomienda usar ForceSeatMI_BeginMotionControl/ForceSeatMI_EndMotionControl para manejar las transiciones de ejecución – menú principal y state para manejar eventos de pausa de corta duración.

Los campos state constan de 8 bits, pero en la versión actual solo se utiliza el primer bit.

  • BIT n.º 0 — 1 (FSMI_STATE_PAUSE) significa que el modo de ejecución en el SIM está en pausa, 0 (FSMI_STATE_NO_PAUSE) significa que el modo de ejecución en el SIM está en funcionamiento.
Recuerda añadir FSMI_POS_BIT_STATE o FSMI_TEL_BIT_STATE a mask si se va a establecer el campo state. Asegúrate de establecer state al menos una vez para reanudar la plataforma de movimiento después de llamar a ForceSeatMI_BeginMotionControl.

Ejemplos

Los siguientes ejemplos se proporcionan junto con el SDK. Asegúrate de utilizar el perfil correcto para cada ejemplo.

EjemploDescripciónPerfil requerido
TableLogPos_CPP
TableLogPos_CS
TableLogPos_Unity
TableLogPos_Unreal
Muestra cómo controlar la posición de la mesa superior especificando el balanceo, cabeceo, guiñada, elevación, balanceo lateral y avance en porcentaje de los movimientos máximos. Se puede utilizar para controlar todo tipo de plataformas de movimiento. SDK – Posicionamiento
TablePhyPos_CPP
TablePhyPos_CS
TablePhyPos_Unity
TablePhyPos_Unreal
Muestra cómo especificar la posición precisa de la mesa superior proporcionando el balanceo, cabeceo, guiñada, elevación, balanceo lateral y avance en unidades del mundo real. Solo funciona con máquinas de 3 y 6 grados de libertad. SDK – Posicionamiento
TableMatrixPos_CPP
TableMatrixPos_CS
Muestra cómo especificar la posición precisa de la mesa superior proporcionando la matriz de transformación. Se recomienda solo para máquinas de 6 grados de libertad. SDK – Posicionamiento
Telemetry_Veh_Unity
Telemetry_Veh_Unreal
Muestra cómo enviar datos de telemetría de vehículos desde el SIM a ForceSeatPM.SDK – Telemetría de vehículos
Telemetry_Fly_Unity
Telemetry_Fly_Unreal
Muestra cómo enviar datos de telemetría de aviones desde el SIM a ForceSeatPM.SDK – Telemetría de aviones

Consideraciones finales

  • Cuando la plataforma no se mueve o el sistema está en estado de pausa, entonces:
    • Comprueba si el perfil correcto está activo en ForceSeatPM
    • Comprueba si el perfil correcto ha sido importado en ForceSeatPM (los diferentes modos de operación requieren diferentes perfiles)
    • Comprueba el diagnóstico de ForceSeatMI para ver si ForceSeatPM recibe datos del SIM.
    • Comprueba si el indicador de pausado está encendido o apagado
    • Recuerda configurar el campo mask
    • Recuerda establecer el valor state correcto para salir del modo de pausa.
  • ForceSeatMI32.dll/ForceSeatMI64.dll han sido diseñadas para un alto rendimiento, por lo que no hay registro disponible y la DLL solo realiza las comprobaciones mínimas necesarias de coherencia de datos.
Sign up to our newsletter
Always be the first to know about new products, updates and company news
  • Este campo es un campo de validación y debe quedar sin cambios.