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:
OK, here are some settings that approximate loaded tire squeal-to-judder:
loaded.jpg

Front Left Custom Effect:
[GameRawData.Physics.WheelLoad01]*[ShakeITBSV3Plugin.Export.slip.FrontLeft]/2000
Front Left Forced Frequency:
8*(rand(40)+100-[ShakeITBSV3Plugin.Export.slip.FrontLeft])
 
Upvote 0
But the above seems to be a good enough approximation
We tried, but estimated wheel loads are based only on
weight transfer from lateral and longitudinal acceleration,
excluding e.g. road camber changes or bumps.

FWIW, that specific profile outputs only a single frequency (92Hz).
That value may be tweaked to suit resonances specific to transducer installation, but makes Forced Frequencies inapplicable.
 
Last edited:
Upvote 0
OK, here are some settings that approximate loaded tire squeal-to-judder:
View attachment 722904
Front Left Custom Effect:
[GameRawData.Physics.WheelLoad01]*[ShakeITBSV3Plugin.Export.slip.FrontLeft]/2000
Front Left Forced Frequency:
8*(rand(40)+100-[ShakeITBSV3Plugin.Export.slip.FrontLeft])
nice work, I use more or less the same ideas !

One tip : the rand() function returns whole numbers, I do this to get decimal point numbers: rand(value x 1000) / 1000

It might also be interesting to calculate the load relative to the other wheels:
Load@FL = [GameRawData.Physics.WheelLoad01]/ ([GameRawData.Physics.WheelLoad01]+[GameRawData.Physics.WheelLoad02]+[GameRawData.Physics.WheelLoad03]+[GameRawData.Physics.WheelLoad04]) /0.25


you can also test multiple harmonics for wheelslip, works great :
 

Attachments

  • slip.png
    slip.png
    49.1 KB · Views: 61
Upvote 0
Interesting gents, both of you... Will wait till more is done before trying if these are made available.

Im not convinced "per wheelslip" can even be fully appreciated on everyones rig/setup (tough luck for them) but I am all for general improvements in the levels of operation, detailing or felt sensations. I maybe can't contribute much...

Are you thinking of having front wheels separated from rear to be able to apply different settings? More control surely, higher slip sensivity for front?

If you want a fundamental to use multiples of, try 7Hz and 11Hz.

Thoughts......
Slip could be complimented with Lateral G and possibly Speed Sen Steering or Speed itself. I dont see one effect necessarily having to be the only component that determines the generated reponse in the scenario.

So look and see what other effects have activity in that scenario perhaps?

Maybe you can convince Wotever to enable WAV files to be operational (like SSW) but instead also applied with tone generation. Sound generators or sampled sounds could then be imported for more complexed audio elements.
 
Last edited:
Upvote 0
nice work, I use more or less the same ideas !
Thanks, but this first working (in AC) prototype
depends on GameRawData.Physics.WheelLoad0x,
which are unavailable in many other games.
One tip : the rand() function returns whole numbers, I do this to get decimal point numbers: rand(value x 1000) / 1000
Each rand() result is for only 1/60 second.
This effectively multiplies that nominal frequency by a 60Hz square wave,
generating harmonics, and is then added to the varying slip signal.
A spectrogram of my signal vs yours will differ,
but to my ear, butt and thighs from my seat cushion pucks
not enough to merit additional complexity.

It might also be interesting to calculate the load relative to the other wheels:
Load@FL = [GameRawData.Physics.WheelLoad01]/ ([GameRawData.Physics.WheelLoad01]+[GameRawData.Physics.WheelLoad02]+[GameRawData.Physics.WheelLoad03]+[GameRawData.Physics.WheelLoad04]) /0.25

Relative loading is one flaw in estimates calculated from 2D accelerations,
since not accounting for track variations generating load impulses.
Relative load models implicitly suppose shocks instantly affect all 4 tires,
ignoring tire, suspension and chassis deformations and deflections
working against car inertia.

you can also test multiple harmonics for wheelslip

That seems a lot of CUSTOM effects,
given harmonics already being generated.
Minimizing (i5) CPU resources is one goal while running sims in VR,
with SimHub also e.g. harness tensioning (IMO higher priority).
 
Last edited:
Upvote 0
nonlinearities
[ICODE][/ICODE]Minimizing (i5) CPU resources
“A foolish consistency is the hobgoblin of little minds"

Addressed some Loaded_WheelSlip9.1.20 concerns:
  • slip for amplitude should be a gate, muting when no slip
    but otherwise minimally affecting amplitude:
    nlslip.jpg

    These become separate nlslip properties.
  • wheel slip amplitudes want to be more sensitive to load differences,
    accomplished by lowering CUSTOM Response filter Gamma and increasing Gain:
    CUSTOM.jpg
  • profile has been appropriately updated
 
Last edited:
Upvote 0
Struggling a bit with the slip feedback, wondering if an oversteer / understeer efect isn't more useful for performance oriented driving after all.

Also wondering if we can simplify the calculation for ACC since ACC provides tire slip angle for all four corners. Now I'm not too familiar with the math, can anyone point me to some ressources that explains how to calculate oversteer / understeer from slip angles ?

I found this but wondering if there isn't more to it ?

This would translate to:
Code:
rl = Math.max(0, $prop('ShakeITBSV3Plugin.Export.SlipAngle.RearLeft') - $prop('ShakeITBSV3Plugin.Export.SlipAngle.FrontLeft'))
rr = Math.max(0, $prop('ShakeITBSV3Plugin.Export.SlipAngle.RearRight') - $prop('ShakeITBSV3Plugin.Export.SlipAngle.FrontRight'))
return Math.sqrt(rl*rr)
 
Last edited:
Upvote 0
This should be possible with the newly added "Force Frequencies" feature in Simhub 9.1.20. I'm currently using this profile: https://github.com/blekenbleu/SimHub-Profiles/blob/main/sierses_4-channel_wheelslip.siprofile

Now we can define code to modulate the frequency as a function of the slip, but I'm not sure how the existing formulas should be altered as slip is currently modulating the amplitude ? Any tips ?
OK, I had forgot that profile employs only a single frequency with white noise;
Forced Frequency implies doing something quite different;
My tire squeal-to-shudder may not be what you expect...
but here it is.

The only other change: mix JavaScript converted to NCalc,
which runs faster but yields identical results.
IMO, this profile does not much distinguish left slip from right.
 
Last edited:
Upvote 0
All-Sim loaded 4 wheel slips with squeal-to-shudder force frequency

Similar to the Assetto Corsa version, but
  • estimated wheel loads (many sims lack wheel load telemetry)
  • additional separate under- and oversteer tactile outputs
    these could in theory be mixed into wheel slip tactile signals in Sound Output
  • unlike @sierses' mixed digital telemetry, amplitudes are just wheel loads gated by slips
    • more distinct tactile signals from each wheel.
  • Depending on game, track, car and driving style,
    adjust WHEELS SLIP ProxyS Response filter Input Gain
 
Upvote 0
Interesting gents, both of you... Will wait till more is done before trying if these are made available.

Im not convinced "per wheelslip" can even be fully appreciated on everyones rig/setup (tough luck for them) but I am all for general improvements in the levels of operation, detailing or felt sensations. I maybe can't contribute much...

Are you thinking of having front wheels separated from rear to be able to apply different settings? More control surely, higher slip sensivity for front?

If you want a fundamental to use multiples of, try 7Hz and 11Hz.

Thoughts......
Slip could be complimented with Lateral G and possibly Speed Sen Steering or Speed itself. I dont see one effect necessarily having to be the only component that determines the generated reponse in the scenario.

So look and see what other effects have activity in that scenario perhaps?

Maybe you can convince Wotever to enable WAV files to be operational (like SSW) but instead also applied with tone generation. Sound generators or sampled sounds could then be imported for more complexed audio elements.
Slip is complicated to reproduce, as many things influence it in real life!
It might be interesting to separate the longitudinal slip from the lateral slip, this page explains things pretty well: https://link.springer.com/article/10.1007/s11249-020-1273-5

there are many parameters that influence amplitudes and frequencies: tyre compound , car weight, road temperature, tyre pressure....

on my car, I measured 50Hz as fundamental frequency for lateral slip (see the attachment)
 

Attachments

  • lat-slip.png
    lat-slip.png
    379.9 KB · Views: 46
Upvote 0
Each rand() result is for only 1/60 second.
This effectively multiplies that nominal frequency by a 60Hz square wave,
generating harmonics, and is then added to the varying slip signal.
A spectrogram of my signal vs yours will differ,
but to my ear, butt and thighs from my seat cushion pucks
not enough to merit additional complexity.

That seems a lot of CUSTOM effects,
given harmonics already being generated.
Minimizing (i5) CPU resources is one goal while running sims in VR,
with SimHub also e.g. harness tensioning (IMO higher priority).


I don't understand how you use rand(), I was thinking of this to modulate a frequency by +/- X%:
freq = freq x (1-X/2 + rand(1000X)/1000)


I use more than one hundred of custom effects, written in Ncacl, with no performance problems. after all, these are just very simple mathematical operations.
 
Upvote 0
I don't understand how you use rand(),
Relatively larger dither at lower frequency works better for tires IMO,
so constant Rand() instead of proportional, e.g.:
freq+Rand(const)

Given that exact center frequency is not critical,
freq + 20% is simpler than freq +/- 10%.
In NCalc (with which I am only just coming to grips), that would be:
freq+Rand(truncate(freq/5))

For modulation: freq*(80+Rand(20))/100

I am no artist, and other projects remain incomplete;
80% of ideal haptic involving only 20% of effort will for me suffice
until e.g. after direct drive harness tensioner also approaches 80%.
 
Last edited:
Upvote 0
Slip is complicated to reproduce, as many things influence it in real life!
It might be interesting to separate the longitudinal slip from the lateral slip, this page explains things pretty well: https://link.springer.com/article/10.1007/s11249-020-1273-5

there are many parameters that influence amplitudes and frequencies: tyre compound , car weight, road temperature, tyre pressure....

on my car, I measured 50Hz as fundamental frequency for lateral slip (see the attachment)

Thanks for responding and just shared discussion on the matter.
Have seen a few benefits from some YT videos to monitor the audio or to help get ideas on frequencies for effects that apply in real world scenarios.

I was just trying to offer some other perspectives but yes can respect the efforts that others seek to share. Also commend people on their own efforts in looking at seeking ways to improve effects. Some of you guys maybe just enjoy the mental challenge within that too and with the coding.

My point was in simulation and with Simhub often people will be applying various effects active at similar times. So one single effects generated output is not necessarily all that has to be considered, or what way it applies frequencies or amplitude of them.

Surely, this is particularly relevant within the usage case of other effects people will be using?

Additionally, varying tactile hardware used by the user will bring its own restrictions or limitations and people have a tendency to apply more volume to effects they prefer over others. I am not sure, but I certainly can and indeed may be wrong, that wheelslip, even at 50Hz may not be, one of the primary effects the majority of people would prefer to feel over some others or enjoy the most?

I get people wanting to feel burnouts, I get the desire for front / rear slip sensations. Those are fun and already possible with standard effects.

"If it ain't broke dont' fix it"

Motion is maybe better suited for this, but even motion that has done it, brought certain issues. It's why for folks reading, the reason I play it down a little, others may be hyped for something like this though....
 
Last edited:
Upvote 0
Slip/Grip
One of the first things taught at driver schools:
Slip+Angle+Graph.jpg

The amount of reported slip that becomes problematic
varies by tire, car, track and sim,
but the ratio of slip/grip seems more robust.

This SimHub profile works for multiple cars and tracks
in AC and AMS2 without tweaking.
The profile works as is for 4 Dayton pucks in a seat cushion,
with signals starting at some higher audible frequency,
simulating tire squeal, then dropping to haptic frequencies
as tires give up.

Frequency range is adjustable.
Please read documentation at the URL;
NCalc, unlike JavaScript, seemingly disallows comments.
 
Last edited:
Upvote 0
Slip/Grip
One of the first things taught at driver schools:
Slip+Angle+Graph.jpg

The amount of reported slip that becomes problematic
varies by tire, car, track and sim,
but the ratio of slip/grip seems more robust.

This SimHub profile works for multiple cars and tracks
in AC and AMS2 without tweaking.
The profile works as is for 4 Dayton pucks in a seat cushion,
with signals starting at some higher audible frequency,
simulating tire squeal, then dropping to haptic frequencies
as tires give up.

Frequency range is adjustable.
Please read documentation at the URL;
NCalc, unlike JavaScript, seemingly disallows comments.
I use the same principle , you can also apply it to longitudinal slip (friction=f(slipratio)).
One difficulty: each car has its own F & R peak slip angle, and the telemetry doesn't tell you :(
1707289689739.png
 
Upvote 0
Back
Top