SimHub ShakeIt Bass Shakers custom 4 corner tire slip

blekenbleu

SimHub+Arduino hacker
Premium
My sim driving is Assetto Corsa with an office chair and wheel stand.
Without a harness keeping one's back contacting them,
back transducers seem of arguable benefit.

Already using SimHub,
having unused motherboard 7.1 sound and obsolete Denon surround receiver,
a ShakeSeat pad (no longer available) was ordered because:
An equivalent can be made using Dayton pucks
with e.g. 40cm square zippered cushion covers and EVA foam floor tiles.
SimHub's ShakeIt tire slip effect does not consider tire loading.
For example, an inside tire may be fully unloaded during cornering,
with very high slippage, but no perceived sensation in actual driving.
Haptic slip effects ideally change frequency based on slip
but change amplitude based on load,
which was impossible using only earlier SimHub support.

This SimHub profile attempts to approximate track sensations from street tires,
when securely harnessed in a fitted racing seat.
Usefulness of such haptic feedback may vary widely among users:
This haptic wheel slip feedback was IMO less useful
than deceleration and cornering simulation from harness tensioners,
but reduced a sense of "something missing".

Unambiguously directional haptic cues
wants direct stimulation of body parts,
e.g. left and right thighs, lumbar and/or sit bones.

Original 4-puck SRS ShakeKit cushion is no longer available,
but equivalent DIY PuckSeat assembly is not very hard.
SRS_EVA.jpg

Sensations to be simulated here:
  • squeal for small slippage, transitioning to moaning with more slippage,
  • then shuddering near breakaway,
    with intensities proportional to tire loadings
Implementation augments SimHub Wheels SLIP effect
with Custom Effects
  1. latitudinal and longitudinal acceleration properties
  2. loaded tire slips, products of tire slip properties times accelerations
Again, because load modulates slip in telemetry,
heavily loaded small slip could not be generated
as strong high frequency tactile effect
until SimHub added Forced frequency option.

Accelerations were originally estimated from speed and yaw changes,
serving as G force proxies.
Earlier SimHub versions sampled speed and yaw
at a lower rate than Assetto Corsa telemetry waas updated,
resulting in some changes 2x others, which code here detects and mitigates.

Loaded tire slip corner effects use products of tire slips and G force proxies:

A complete SimHub ShakeIt profile is available on GitHub.
It is now IMO obsolete.

SimHub slip telemetry in this profile is not portable among all games;
specifically, iRacing provides no slip telemetry.

An upgraded ShakeIt profile based on slip/grip ratio is recommended:
  • requires less car/track/sim-specific tweaking
  • delivers haptics better correlated with tires reaching grip limit,
    based on slip/grip ratios.
  • Improved grip estimation combines lateral and longitudinal
    and is modulated by heave
 
Last edited:
SimHub release 7.3.14 adds lateral acceleration support.
Since SimHub now "officially" supports longitudinal and lateral acceleration,
then it makes sense to remove code which attempted the same.
As is not mentioned on SimHub's download page, "Just run the new version exe"
(extracted from the downloaded .zip file) to update an existing SimHub installation.

Sadly, instead of a property named lateral acceleration in SimHub release 7.3.114.
there seems to be only AccelerationSurge, AccelerationSway, and AccelerationHeave,
which are evidently +/- 10x GameRawData.Physics.AccG01-3:
Surge.gif

Sway.gif

Heave.gif

.. where Sway and Surge do not exactly overlay AccG01 and AccG03 may be rounding differences
between Gnuplot and SimHub or perhaps minor filtering.
AccelerationSurge also appears to duplicate GlobalAccelerationG with a sign change...
 
Last edited:
Upvote 0
Comparing my Javascript proxies to SimHub's GameRawData.Physics properties:
deltaS.gif

deltaY.gif

They are similar enough to justify code changes.

For the curious, above Gnuplots were generated using this Javascript Custom serial device update message:
JavaScript:
// Initialize history
var s = $prop('SpeedMph');
var y = $prop('OrientationYaw');
if(null == root["speed"]) {
   root["speed"] = s;
   root["delta_s"] = 0.2;
   root["yaw"] = y;
   root["delta_y"] = 0.2;
}

var ds = root["speed"] - s;        // negative of speed change
var dy = y - root["yaw"];

if (Math.abs(dy) > 180) {  // yaw went +/- 180
  if (Math.abs(root["yaw"]) > 150)
    dy = -(y + root["yaw"]);
}
var YawGain = 72;
var DecelGain = 178;
dy *= YawGain;
ds *= DecelGain;
var ms = 1;
var my = 1;  // sample interval factors
var Gy = root["delta_y"];
var Gs = root["delta_s"];

// check for delta spikes from missed samples
var t = 2;                                   // non-linear spike threshold
if (Math.abs(Gy * dy) > t && Math.abs(dy) > Math.abs(1.8 * Gy))
  dy /= (my = 2);      // compensate sampling artifacts
if (Math.abs(Gs * ds)  > t && Math.abs(ds) > 1.8 * Math.abs(Gs))
  ds /= (ms = 2);      // compensate sampling artifacts
 
// low-pass IIR filters
var tc = 3;  // lowpass IIR
Gs += ms * (ds - Gs) / tc;
Gy += my * (dy - Gy) / tc;
root["delta_y"] = Gy;
root["delta_s"] = Gs;
// store unfiltered values for next increment
root["speed"] = s;
root["yaw"] = y;


// SimHub
var accel = $prop('GlobalAccelerationG');
var acc01 = $prop('GameRawData.Physics.AccG01');
var acc02 = $prop('GameRawData.Physics.AccG02');
var acc03 = $prop('GameRawData.Physics.AccG03');
var acs = accel.toString();
var a1s = acc01.toString();
var a2s = acc02.toString();
var a3s = acc03.toString();
var dys = Gy.toString();
var dss = Gs.toString();
return dys.concat('\t',dss,'\t',acs,'\t',a1s,'\t',a2s,'\t',a3s,'\r\n');
... which was echoed back to the Incoming serial data window
using this Arduino sketch.
 
Upvote 0
With AccuForce feedback for understeer and ShakeSeat pucks for loaded tire slip feedback,
one missing piece was feedback for unloaded rears wheel slip (oversteer while braking),
which is now provided by a pair of Dayton Thruster exciters shaking the seatback laterally:
SideThrusters.jpg

.. driven by another CUSTOM EFFECT in the updated SimHub ShakeIt Bass Shakers profile.
 
Last edited:
Upvote 0
Hi Blekenbleu,
A note to say thanks for your repository with the effects for simhub bass shakers.
I could not get your latest version to run with RaceRoom, it appears that the GameRawData.Physics properties are not available, at least they don't come up when I do a search.
So I'm running a modified version of the Loaded WheelSlips profile to Dayton BST-1 in each corner.
I'm probably using it in a way you didnt intend, as I started out looking for tactile information for understeer and brake lock.
This is working terrificly well for brake lock in RaceRoom, with an ABS like Brrr when locking. I'm still looking for a better way to have them setup for understeer.
I found your profile when I was considering yaw as a potential feedback solution, I still am, I just don't really know how to create a working formula for that.
I've gotten close to something sensible using some of your work and a little of my own.
JavaScript:
// speed @ left front
var tslf = $prop('GameRawData.TireSpeed.FrontLeft') ;
// speed @ Right front
var tsrf = $prop('GameRawData.TireSpeed.FrontRight') ;
// load @ left front
var tllf = $prop('ShakeITBSV3Plugin.Export.proxyL.FrontLeft') ;


return (tllf-25)*(tsrf-tslf);

This goes ok ish, but I'm sure there are better methods. the 25 is to remove the standing value in the load.

Any ideas welcomed, and thanks again for the profiles, I wouldn't be anywhere without them to start with.
 
Upvote 0
better methods
First, belt tensioning and ShakeSeat feedback
allow reducing other effects in steering FFB,
making understeer FFB more dependable.

Using difference between front tirespeeds is interesting;
I suppose that you change the sign of (tsrf-tslf) between left and right....
A lightly or unloaded (inside) tire typically slips a LOT;
slip of the (outside) loaded tire is more important,
perhaps using differences between loaded wheel speed
and suitably scaled vehicle speed could be more useful
(difference should be zero on straights).

If RaceRoom does not provide e.g. $prop('GameRawData.Physics.WheelSlip01'),
then what is 'ShakeITBSV3Plugin.Export.proxyL.FrontLeft'?

Before SimHub offered $prop('AccelerationSurge') and $prop('AccelerationSway'),
their equivalents were calculated from changes in $prop('SpeedMph') and $prop('OrientationYaw'), accounting for abrupt +/-180 degree changes in the latter.

Before SimHub provided wheel loads,
they were calculated from changes in speed and yaw,
e.g.:
JavaScript:
// left front loaded slip
// convert unsigned lateral Gs to signed left G
var L = $prop('ShakeITBSV3Plugin.Export.proxy_G.FrontLeft');
L -= $prop('ShakeITBSV3Plugin.Export.proxy_G.RearLeft');
// convert lateral G to left load
L = 25 + 25 * L / 100;
// convert unsigned accelerations to signed deceleration
var d = $prop('ShakeITBSV3Plugin.Export.proxy_G.FrontRight')
d -= $prop('ShakeITBSV3Plugin.Export.proxy_G.RearRight');
// apply deceleration to left load
L += L * d/100;
//return L;    // load test
// apply left front load to conditioned corner slip
var s = $prop('ShakeITBSV3Plugin.Export.proxyS.FrontLeft');
return s *  L / 100;
 
Upvote 0
Thanks for the reply, and for sharing.
I used a profile you linked elsewhere.
https://www.racedepartment.com/attachments/loadedwheelslip-siprofile-txt.451260/
ProxyL is your loaded calculated values, which uses ProxyG also from your loaded wheel slip profile.
After more testing, specifically using RRE F4 at hockenheim, I doubt I will go further with my filters.
The work you have done identifies most of what I struggle with, and is of real benefit.
I have changed only the frequency to match the BST-1.
I'd love a detailed explanation of the IIR filter code in ProxyG and the practical working of the coefficients.
I would encourage you to publish your work on your github, as I consider it works really well, I know you have for later versions, this version has real transformational feedback. I'd love to make the frequency speed dependent, but I think this is not available in SimHub.

unknown.png
 
Last edited:
Upvote 0
@blekenbleu, currently busy with other things at the moment, but did see some potential with earlier work you had done with this. I'd like to look into new ongoing efforts and then do comparisons with some multilayer effects I currently had been using for slip. So keen to see how you progress with it.

Technical aspects aside, what it comes down to is how well the effect's operation helps improve a driver's consistency or even laptime. So I would like to also compare in real-time the standard effect, my own multilayer approach, and your custom effect.

I can route 12 channels needed to see all 4 wheels in operation for each of the 3 methods.
This will show the activity and full spectral analysis
 
Upvote 0
Thanks for the clarifications.
I used a profile you linked elsewhere.
https://www.racedepartment.com/attachments/loadedwheelslip-siprofile-txt.451260/
ProxyL is your loaded calculated values, which uses ProxyG also from your loaded wheel slip profile.
The work you have done identifies most of what I struggle with, and is of real benefit.
I have changed only the frequency to match the BST-1.
I'd love a detailed explanation of the IIR filter code in ProxyG and the practical working of the coefficients.
I would encourage you to publish your work on your github, as I consider it works really well, I know you have for later versions, this version has real transformational feedback.
I'd love to make the frequency speed dependent, but I think this is not available in SimHub.

unknown.png
As fate would have it:

Thanks for encouragement to document that profile.
  • I'll have to download it to relearn whatever made it uniquely interesting.
FWIW, I have lately been preoccupied:
 
Upvote 0
OK, having returned to the thrilling days of yesteryear..
I'd love a detailed explanation of the IIR filter code in ProxyG

IIR stands for Infinite Impulse Response, which means that its responses to impulses in theory never completely dies. Consider: Gyb4 += my * (dy - Gyb4) / tc;, where:
  1. Gyb4 is that filtered response, which is stored between Javascript invocations.
  2. my is a sample interval of 1 or 2, depending on whether a missed sample update is suspected, which causes input parameter changes to nominally double. This used to occur when SimHub's sample rate was somewhat less than game update rate..
  3. dy is that change in parameter value between previous and current Javascript invocations.
  4. tc is the IIR tuning coefficient.
Consider a typical case, when my = tc = 1
  • then Gyb4 += (dy - Gyb4) simplifies to Gyb4 = dy, thus no filtering
  • for tc = 2, the new value of Gyb4 would be half its previous value and half of dy,
    • smoothing changes
  • for tc = 1/2, the new value of Gyb4 would be 2*dy - Gyb4
    • amplifying changes.
In other words, values of tc > 1 smooth results, values < 1 aggravate differences.
Practically, such smoothing is relatively unimportant for bass shakers,
but the resulting property was at one time also used for driving harness tension servos,
and smoothing reduced servo noise and wear.

Most code in that first CUSTOM EFFECT should be unnecessary in newer versions of SimHub, which provide equivalent $prop('AccelerationSurge') and $prop('AccelerationSway') properties.
 
Upvote 0
I'd like to look into new ongoing efforts and then do comparisons with some multilayer effects I currently had been using for slip.
Sure, I may have never started tactile without your threads here.
Recent tweaks involve:
  • simplified Javascript where SimHub added equivalent properties
  • a lateral shaking channel for unloaded rear slip (e.g. trailing throttle oversteer)
  • a brake pedal channel (less feedback with increased braking)
I would like to also compare in real-time the standard effect,
my own multilayer approach, and your custom effect

I just learned that SimHub can playback telemetry without the actual game,
e.g. stored in SimHub\telemetry\GameName\20210326_181717.telemetry.json

If an interesting telemetry.json replay were made available,
I could tweak a Loaded4-WheelSlips.siprofile to suit it.
 
Last edited:
Upvote 0
Sure, I may have never started tactile without your threads here.
Recent tweaks involve:
  • simplified Javascript where SimHub added equivalent properties
  • a lateral shaking channel for unloaded rear slip (e.g. trailing throttle oversteer)
  • a brake pedal channel (less feedback with increased braking)


I just learned that SimHub can playback telemetry without the actual game,
e.g. stored in SimHub\telemetry\GameName\20210326_181717.telemetry.json

If an interesting telemetry.json replay were made available,
I could tweak a Loaded4-WheelSlips.siprofile to suit it.
My focus is not on the code side of things. Which yes with custom effects can bring potential benefits over certain standard effects operation. So I’m keen to see people get creative and experiment.

Monitoring what frequencies and dB the effects generate is relevant too for the transducers they are used on. Having improvements on the effects operation needs to be combined with what vibrations or dynamic range the effect can offer from its min-max values.

I’m curious what benefits your custom effect may bring. Would appreciate if you share it here as a .txt we can rename back into a profile as much easier.

Another query, certain titles support Engine Torque. Can you offer a custom effect that works solely based on torque output?
 
Upvote 0
a replay from Raceroom of the F4 at Hockenheim
Thanks, playing that required updating SimHub to 7.04.2 from 7.03.14
(7.04.00: "Updated RRRE telemetry definition").

I have no real life experience with open wheel racers;
fully sorting this telemetry may take some awhile,
but data at first glance appears to show
more correlation between front and rear wheel slip on each side
than between left and right on each axle,
as seems more typical for production-based cars.
 
Upvote 0
Dayton BST-1 in each corner
Physics: driving metal by a shaker tends to be highly resonant, like a tuning fork.
  • unless carefully equalized (DSP), multiple signals (frequencies) can be hard to distinguish
  • for unequalized shakers, mixing properties to generate single signals may be better than mixing multiple Outputs generated by separate properties?
    • create a "mixer" CUSTOM effect which simply sums properties from other effects:
      • wheel slips
      • understeer and oversteer
      • loaded wheel slips
      • loaded understeer and oversteer
    • Control relative strengths of effects being mixed by Response filter Input Gains.
    • since all effects are available, the user can choose whether to use mixer effect or mix separate property effects in Sound Output
 
Upvote 0
tactile information for understeer
Understeer by definition is more front slip than rear
  1. non-negative results of LFU = front left slip - rear left; RFU = front right slip - rear right
  2. since both must slip for understeer, correlate: Understeer = sqrt(LFU * RFU)
similarly for oversteer...
 
Upvote 0
with RaceRoom, it appears that the GameRawData.Physics properties are not available
Based on your RRRE replay,
my 33-line Javascript for left yaw changes with an IIR tc = 2 is equivalent to:
-5 * $prop('AccelerationSway').
Eliminating overhead from a CUSTOM EFFECT with 120 lines of Javascript is a win.

ShakeIt Bass Shakers has effects for ACCELERATION, DECELERATION, and LATERAL G-FORCE, which IMO:
  • saturation/clip too much, too often
  • lack seemingly useful details
Consequently, a new CUSTOM EFFECT simply generates properties
for absolute values of $prop('AccelerationSway') and $prop('AccelerationSurge')
to which a gamma of 3.0 is applied.
Its Input gain should be adjusted so that Live Effects rarely saturate.

This profile includes the threatened mix CUSTOM EFFECT
  • Consider editing each corner setting to comment out e.g. (unloaded) mix += $prop('ShakeITBSV3Plugin.Export.proxyS.RearRight');
  • If using mix, then probably disable other effect outputs and vice versa..
  • No effort was made to tune actual sounds, since tactile devices differ so much
  • separate, dedicated tactile devices for under and oversteer are recommended.
14 Aug 2021: I think there is a fundamental bug in formulae for "understeer, oversteer" custom effect. Rewriting and retesting is wanted...
 

Attachments

  • NewLoaded4-chanWheelslipUndersteer.siprofile.txt
    13.9 KB · Views: 306
Last edited:
Upvote 0

What are you racing on?

  • Racing rig

    Votes: 528 35.2%
  • Motion rig

    Votes: 43 2.9%
  • Pull-out-rig

    Votes: 54 3.6%
  • Wheel stand

    Votes: 191 12.7%
  • My desktop

    Votes: 618 41.2%
  • Something else

    Votes: 66 4.4%
Back
Top