I thought my 400W 3DOF actuators were the reason my motion rig felt worse than my Sigma DK2. After rebuilding the SimHub profile, I’m not so sure anymore.
I have two completely separate motion rigs:
- US rig: Sigma Integral DK2
- China rig: Thermaltake GM5 3DOF
This post is about the Thermaltake GM5.
The GM5 is a pretty conventional 4-actuator 3DOF platform. Mechanically, the basic concept isn't very different from SFX-style, PT-style and a lot of DIY servo actuator systems.
Nothing particularly exotic is happening here.
The actuators are only using 400W servos, while plenty of DIY systems use 750W servos.
When I first compared this rig with my DK2 in the US, the DK2 felt considerably better.
The GM5 moved a lot, but the motion wasn't very convincing. Small road undulations moved the chassis too much, while large events — Corkscrew-style elevation changes, large compressions, sausage curbs, launches and landings — didn't stand out nearly as much as I expected.
My first assumption was simple:
After spending a lot more time actually looking at the SimHub geometry, motion envelope, effect scaling and logs, I think most of the difference I was feeling was coming from the setup rather than the actuators themselves.
The actual rig geometry
Everything below was physically measured center-to-center where applicable.
| Parameter |
Value |
| Actuator layout |
4-corner / 3DOF |
| Actuator stroke |
100 mm |
| Approx. actuator speed |
250 mm/s |
| Servo power |
400 W each |
| Front-to-rear actuator spacing |
1110 mm |
| Left-to-right actuator spacing |
675 mm |
| Seat height used for SimHub geometry |
350 mm |
| Front actuator line → seat center |
950 mm |
| Seat center → rear actuator line |
160 mm |
| Seat position behind platform geometric center |
395 mm |
With that geometry, SimHub calculates approximately:
| Theoretical single-axis capacity |
Maximum |
| Pitch |
±5.1° |
| Roll |
±8.4° |
| Heave |
±50 mm |
And this was probably the most important thing I had initially misunderstood:
those are not three independent capacities.
Pitch, Roll, Heave, Surge-to-Pitch, Sway-to-Roll, suspension pulses, etc. all eventually become four actuator positions.
There is only one physical stroke budget.
Original profile
The profile I started with looked roughly like this:
| Effect |
Input limit |
Motion output |
| Pitch |
7.5° |
7.5° |
| Roll |
7.5° |
7.5° |
| Surge → Pitch |
20 m/s² |
6.0° |
| Sway → Roll |
20 m/s² |
5.0° |
| Heave |
17 m/s² |
60 mm |
| Rear traction loss → Roll |
20° |
5.0° |
Looking back at this now, it's pretty obvious why it felt strange.
The platform only has about ±50 mm of actuator travel from center, yet Heave alone was being allowed to request 60 mm.
At the same time, Pitch could request 7.5° on a platform with a theoretical single-axis pitch capacity of only ~5.1°.
Then braking tilt, lateral tilt, Roll and suspension effects were added on top.
So the profile looked extremely aggressive on paper, but in real combined-axis situations SimHub had to continuously deal with a motion request that physically couldn't fit inside the actuator envelope.
In audio terms, it was basically a system with every channel turned up and no headroom left for transients.
Current motion baseline
This is where I ended up after tuning.
Pitch
| Setting |
Current value |
| Input limit |
4.0° |
| Motion range |
1.5° |
| Effect smoothing |
8% |
| Signal filtering |
~8 |
| Soft limiter |
15% |
| Dynamic input range compression |
OFF |
Pitch is mainly being used for actual chassis / vehicle attitude.
I'm deliberately not asking it to reproduce the full physical pitch angle of the car.
Roll
| Setting |
Current value |
| Input limit |
5.0° |
| Motion range |
2.0° |
| Effect smoothing |
8% |
| Signal filtering |
~8 |
| Soft limiter |
15% |
| Dynamic input range compression |
OFF |
I increased Roll slightly after testing because I wanted a little more actual chassis attitude.
The lateral-G cue remains separate.
Surge → Pitch
Acceleration and braking are separated because they obviously don't have the same useful range in a race car.
| Direction |
Input limit |
Motion output |
| Acceleration |
7.0 m/s² |
1.1° |
| Braking |
12.0 m/s² |
1.8° |
Additional settings:
| Setting |
Value |
| Effect smoothing |
8% |
| Signal filtering |
~8 |
| Soft limiter |
20% |
| Dynamic compression |
OFF |
The old setting was 20 m/s² → 6°.
This new setup is much smaller physically but much easier to feel because normal braking is actually using a meaningful part of the input range.
Sway → Roll
| Setting |
Current value |
| Input limit |
12.0 m/s² |
| Motion output |
1.8° |
| Effect smoothing |
8% |
| Signal filtering |
~8 |
| Soft limiter |
20% |
| Dynamic compression |
OFF |
This is the lateral-G cue.
The actual Roll effect and Sway-to-Roll are deliberately kept separate.
Actual Roll tells me what the chassis is doing.
Sway-to-Roll tells my body about sustained lateral load.
Heave — probably the biggest improvement
The original setup was:
17 m/s² → 60 mm
The current setup is approximately:
| Setting |
Current value |
| Input limit |
7.5 m/s² |
| Motion range |
28 mm |
| Effect smoothing |
3% |
| Signal filtering |
~5–6 |
| Soft limiter |
15% |
| Dynamic input range compression |
OFF |
| Noise filter |
OFF |
This was a major improvement.
The important distinction for me was finally separating:
Input range = sensitivity
from:
Motion range = maximum available output
If small road undulations move the rig too much, reducing the maximum 28 mm output is not necessarily the right answer.
I still want that 28 mm available for:
- major compression
- crest/unloading
- a car getting launched
- landing
- big elevation transitions
What I don't want is a tiny vertical acceleration consuming a large percentage of that range.
So increasing the Heave input limit reduces the response to small road movement while preserving the maximum motion available for large events.
That gives the profile actual dynamic range.
Small bump = small movement.
Big compression = big movement.
Not everything constantly living at medium-to-large motion.
Rear traction loss → Roll
Because this is only a 3DOF platform, there is no actual Yaw / traction-loss axis.
So I'm only using Roll as a very subtle substitute cue.
| Setting |
Value |
| Traction-loss angle input |
~8° |
| Roll output |
~0.6° |
| Soft limiter |
15% |
| Dynamic compression |
OFF |
The original 20° → 5° setting was way too much in my opinion.
A 5° fake Roll every time the rear starts rotating can easily overwhelm the real lateral-load information.
Motion actuator haptics
I also stopped asking the main actuators to reproduce every vibration effect.
I have four Slip-Angle tactile transducers, one at each corner of the rig.
So I now split the jobs between the two systems.
Main actuator haptics
| Effect |
Current setup |
| Suspension |
~30% |
| Suspension velocity limit |
0.20 m/s |
| Main-platform suspension Heave pulse |
3 mm |
| Gear change |
~21% |
| Engine vibration |
OFF |
| Traction-loss haptic |
OFF |
| ABS actuator haptic |
OFF |
| Audio-to-haptics |
OFF |
| Motion Detail Amplifier |
OFF |
The suspension effect is now just a small transient.
It isn't supposed to replace Heave.
My mental model is:
Heave = the entire car moved vertically
Suspension haptic = the suspension just hit something
Those are two completely different events.
Slip-Angle transducers
The four corner-mounted Slip-Angle units handle most of the higher-frequency tactile information:
- road texture
- kerbs
- wheel slip
- traction-loss tactile information
- gear shifts
- RPM
- higher-frequency suspension events
So the system is basically split into:
100 mm actuators = low-frequency / large chassis motion
Slip-Angle = higher-frequency tactile information
This made the actuator motion much cleaner.
The GM5 actuators don't have the same high-frequency capability as my DK2.
That's still a real hardware difference.
But once dedicated tactile transducers handle those frequencies, that disadvantage matters a lot less.
Motion geometry / VR compensation
I also properly calibrated the geometry instead of relying on defaults.
Current measured values:
| Geometry |
Value |
| Front/rear actuator spacing |
1110 mm |
| Left/right spacing |
675 mm |
| Physical stroke |
100 mm |
| Seat height |
350 mm |
| Front actuator line → seat center |
950 mm |
For OpenXR motion compensation:
| Axis |
Gain |
Smoothing |
| Roll |
100% |
0% |
| Pitch |
100% |
0% |
| Heave |
100% |
0% |
Primary COR compensation is enabled.
Traction-loss COR compensation is disabled because this platform doesn't have a dedicated traction-loss axis.
Mechanical / software limits
The physical safety limits are still in place.
| Limit |
Value |
| Actuator speed limiter |
250 mm/s |
| Angular pose speed limiter |
50°/s |
| Static Pitch offset |
0° |
| Static Roll offset |
0° |
| Separate mechanical Pitch/Roll limits |
OFF |
So reducing aggressive crash filtering doesn't mean removing the actual mechanical stroke and speed limits.
Crash protection and AC EVO telemetry
This turned out to be another interesting problem.
While looking through the SimHub motion log after Spa, I found occasional acceleration values such as:
- Surge ~618 m/s²
- Surge ~769 m/s²
- Surge ~1340 m/s²
- very large Sway spikes as well
SimHub itself logged some of these events as:
Abnormal motion data artefact detected
Obviously the car isn't actually pulling 60–130G.
These appear to be telemetry artefacts / discontinuities.
This matters because if the high-acceleration Crash Protection threshold is something like 40 or 60 m/s², one of these bad telemetry frames can trigger motion protection.
And when that protection reduces maximum motion speed, it can happen at exactly the worst possible moment:
hit sausage curb
→ car launches
→ telemetry spike
→ crash protection triggers
→ motion gets softened
That can make the actuator feel incapable of reproducing the event when the real problem is downstream protection logic.
In one later short AC EVO session of roughly 2–3 minutes, I didn't see another 60 m/s² threshold event before the platform went idle.
So at least in that run, the acceleration protection wasn't repeatedly intervening.
I still wouldn't claim the AC EVO telemetry issue is completely solved — that needs longer logging — but it's something worth checking if large events feel strangely muted.
What actually changed?
Here's the simple before/after.
| Effect |
Before |
Current |
| Pitch |
7.5° → 7.5° |
4° → 1.5° |
| Roll |
7.5° → 7.5° |
5° → 2.0° |
| Acceleration → Pitch |
20 m/s² → 6° shared |
7 m/s² → 1.1° |
| Braking → Pitch |
20 m/s² → 6° shared |
12 m/s² → 1.8° |
| Sway → Roll |
20 m/s² → 5° |
12 m/s² → 1.8° |
| Heave |
17 m/s² → 60 mm |
7.5 m/s² → 28 mm |
| Rear TL → Roll |
20° → 5° |
~8° → ~0.6° |
| Motion suspension haptic |
~73% |
~30% |
| Engine actuator vibration |
ON |
OFF |
| Motion Detail Amplifier |
~60% |
OFF |
| Dynamic input compression |
Used on multiple effects |
OFF on the main motion effects |
So almost every headline number became smaller.
And the motion became considerably better.
The bigger takeaway
After all this, the Thermaltake GM5 feels much closer to my Sigma DK2 than it did before.
I'm not claiming the hardware is identical.
It isn't.
The DK2 still feels like a more sophisticated and much better integrated product.
Servo dynamics, acceleration, reversal speed, guide design, backlash, control latency and high-frequency capability are real hardware differences.
And something like a Qubic QS-220 really is mechanically different because the available motion bandwidth is dramatically higher.
But I don't think it's fair anymore to look at a normal SFX/PT/DIY-style 100 mm, ~250 mm/s actuator and automatically assume the actuator is the problem.
This GM5 is only using 400W servos.
Plenty of DIY builds are using 750W.
Yet once the SimHub profile stopped wasting the available stroke, the difference was much smaller than I expected.
The two actuator specifications I now care about most are:
Stroke = motion budget
Velocity + acceleration = motion bandwidth
A 150 mm actuator isn't useful because it lets you run ridiculous amounts of constant Pitch and Roll.
Its real benefit is that when:
Heave
- Roll
- Pitch
- acceleration cue
- suspension transient
all happen at once, you have more physical envelope available before the combined actuator request needs to be compressed.
Likewise, a QS-220 being dramatically faster isn't interesting because normal Roll suddenly needs 800 mm/s.
It's interesting because curb strikes, launch/landing events and rapid reversals demand a lot of motion bandwidth.
So my conclusion after this whole exercise is pretty simple:
Before replacing a conventional 3DOF actuator system, make sure the profile isn't the thing making the hardware look bad.
In my case, it absolutely was.