ForceSeatMI is an easy to use yet powerful interface that allows to add a motion platforms support to any application or game (referred as SIM in next sections). In most applications there is no need to control the hardware directly from the SIM. Because of that ForceSeatMI is used only to send telemetry or positioning request to ForceSeatPM. This approach delegates responsibility of transforming telemetry data to an actual platform motion from the SIM to ForceSeatPM. It also simplifies error handling that the SIM has to implement.
With the latest version of the ForceSeatMI, it is possible to control the hardware with usage of Inverse Kinematics. The SIM sends required top frame position and ForceSeatPM calculates required arms (or actuators) positions. This feature can be used in application where precise positioning is required instead of forces simulation.
This documentation applies only to ForceSeatMI 2.63 or newer. Older version of the API is not covered by this document. ForceSeatMI 2.63+ is also not backward compatible on interface and binary levels with 2.61 and previous versions. Switching from older ForceSeatMI to 2.63+ will require changes in your application source code. |
ForceSeatMI uses DLL which is installed as part of the ForceSeatPM software. Make sure that you have ForceSeatPM installed on your computer. |
ForceSeatMI works in one of modes described below. For first time users it is recommended to start from Logical Table Position as it is the simplest example and works with built-in profile SDK – Positioning.
Mode | Description | Applications | Recommended profile |
Telemetry data | In this mode the SIM sends information about vehicle position, g-forces and accelerations in vehicle coordination system directly to ForceSeatPM. The whole transformation from forces to top frame movements is done inside ForceSeatPM scripting engine. It allows to easy change mapping and filter parameters without the need to change anything in the SIM. | Games and vehicle physics simulations | SDK – Vehicle Telemetry SDK – Plane Telemetry |
Logical table position | In this mode the SIM sends top frame position (yaw, pitch, roll, heave, sway and surge) in abstract units (percents of maximum rotation/translation). This allows the SIM to take full control over top frame position, but it is up to the SIM to calculate correct angles and offsets. | For applications that want to have better control over frame position | SDK – Positioning |
Precise table position | This module uses top frame transformation matrix delivered by SIM and calculates positions of all arms/actuators in real world units. | Equipment testing applications | SDK – Positioning |
structSize is a mandatory field which MUST be filled. It is used to handle backward/forward compatibility between DLL and the SIM.
telemetry.structSize = sizeof(ForceSeatMI_Telemetry);
mask indicates what other fields are set. For example, if the SIM provides roll in FSMI_TopTablePositionLogical structure, then mask field has to contains FSMI_POS_BIT_POSITION bit. It is required to always include state field in the mask (FSMI_POS_BIT_STATE or 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 ...
If ForceSeatMI is used in the SIM, the SIM has to call ForceSeatMI_BeginMotionControl at least once, otherwise there will be pause state present all the time. After first call, you can choose how to handle pause. One option is to call ForceSeatMI_EndMotionControl and another option is to set state bit. Our recommendation is as follows:
In other words, is is recommended to use ForceSeatMI_BeginMotionControl/ForceSeatMI_EndMotionControl to handle runtime – main menu transitions and state to handle short time pause events.
state fields consists of 8 bits, but in current version only the first bit is used.
Remember to add FSMI_POS_BIT_STATE or FSMI_TEL_BIT_STATE to mask if state field is going to be set. Make sure to set state at least once to unpause the motion platform after ForceSeatMI_BeginMotionControl is called. |
Following examples are provided together with the SDK. Please make sure to use correct profile for each example.
Example | Description | Required profile |
TableLogPos_CPP TableLogPos_CS TableLogPos_Unity TableLogPos_Unreal | Shows how to control top table position by specifying roll, pitch, yaw, heave, sway and surge in percent of maximum movements. It can be used to control all kind of motion platforms. | SDK – Positioning |
TablePhyPos_CPP TablePhyPos_CS TablePhyPos_Unity TablePhyPos_Unreal | Shows how to specify precise top table position by providing roll, pitch, yaw, heave, sway and surge in real world units. It works only with 3DoF and 6DoF machines. | SDK – Positioning |
TableMatrixPos_CPP TableMatrixPos_CS | Shows how to specify precise top table position by providing transformation matrix. It recommended only for 6DoF machines. | SDK – Positioning |
Telemetry_Veh_Unity Telemetry_Veh_Unreal | Shows how to send vehicle telemetry data from the SIM to ForceSeatPM. | SDK – Vehicle Telemetry |
Telemetry_Fly_Unity Telemetry_Fly_Unreal | Shows how to send aeroplane telemetry data from the SIM to ForceSeatPM. | SDK – Plane Telemetry |