Refactored tyre slip calculations

This commit is contained in:
Paul Dino Jones 2024-06-03 18:42:16 -04:00
parent 01277823ba
commit 1bfe8c94ac
3 changed files with 166 additions and 132 deletions

View File

@ -43,22 +43,22 @@ int sounddev_tyreslip_update(SimDevice* this, SimData* simdata)
SoundDevice* sounddevice = (void *) this->derived;
double play = 0;
if (this->tyre == FRONTLEFT || this->tyre == FRONTS || this->tyre == ALLFOUR)
{
play += (1.0 - simdata->wheelslip[0]);
}
if (this->tyre == FRONTRIGHT || this->tyre == FRONTS || this->tyre == ALLFOUR)
{
play += (1.0 - simdata->wheelslip[1]);
}
if (this->tyre == REARLEFT || this->tyre == REARS || this->tyre == ALLFOUR)
{
play += (1.0 - simdata->wheelslip[2]);
}
if (this->tyre == REARRIGHT || this->tyre == REARS || this->tyre == ALLFOUR)
{
play += (1.0 - simdata->wheelslip[3]);
}
//if (this->tyre == FRONTLEFT || this->tyre == FRONTS || this->tyre == ALLFOUR)
//{
// play += (1.0 - simdata->wheelslip[0]);
//}
//if (this->tyre == FRONTRIGHT || this->tyre == FRONTS || this->tyre == ALLFOUR)
//{
// play += (1.0 - simdata->wheelslip[1]);
//}
//if (this->tyre == REARLEFT || this->tyre == REARS || this->tyre == ALLFOUR)
//{
// play += (1.0 - simdata->wheelslip[2]);
//}
//if (this->tyre == REARRIGHT || this->tyre == REARS || this->tyre == ALLFOUR)
//{
// play += (1.0 - simdata->wheelslip[3]);
//}
if (play > .40)
{
sounddevice->sounddata.curr_frequency = sounddevice->sounddata.frequency * play;
@ -76,39 +76,39 @@ int sounddev_tyrelock_update(SimDevice* this, SimData* simdata)
SoundDevice* sounddevice = (void *) this->derived;
double play = 0;
if (simdata->velocity > 0)
{
if (this->tyre == FRONTLEFT || this->tyre == FRONTS || this->tyre == ALLFOUR)
{
if(simdata->wheelspeed[0])
{
play++;
}
}
if (this->tyre == FRONTRIGHT || this->tyre == FRONTS || this->tyre == ALLFOUR)
{
if(simdata->wheelspeed[1])
{
play++;
}
play += simdata->wheelspeed[1];
}
if (this->tyre == REARLEFT || this->tyre == REARS || this->tyre == ALLFOUR)
{
if(simdata->wheelspeed[2])
{
play++;
}
play += simdata->wheelspeed[2];
}
if (this->tyre == REARRIGHT || this->tyre == REARS || this->tyre == ALLFOUR)
{
if(simdata->wheelspeed[3])
{
play++;
}
}
}
//if (simdata->velocity > 0)
//{
// if (this->tyre == FRONTLEFT || this->tyre == FRONTS || this->tyre == ALLFOUR)
// {
// if(simdata->wheelspeed[0])
// {
// play++;
// }
// }
// if (this->tyre == FRONTRIGHT || this->tyre == FRONTS || this->tyre == ALLFOUR)
// {
// if(simdata->wheelspeed[1])
// {
// play++;
// }
// play += simdata->wheelspeed[1];
// }
// if (this->tyre == REARLEFT || this->tyre == REARS || this->tyre == ALLFOUR)
// {
// if(simdata->wheelspeed[2])
// {
// play++;
// }
// play += simdata->wheelspeed[2];
// }
// if (this->tyre == REARRIGHT || this->tyre == REARS || this->tyre == ALLFOUR)
// {
// if(simdata->wheelspeed[3])
// {
// play++;
// }
// }
//}
if (play > 0)
{

View File

@ -8,67 +8,144 @@
#include "../../simulatorapi/simapi/simapi/simdata.h"
#include "../../slog/slog.h"
bool hasTyreDiameter(SimData* simdata)
{
if (simdata->tyrediameter[0] == -1 || simdata->tyrediameter[1] == -1 || simdata->tyrediameter[2] == -1 || simdata->tyrediameter[3] == -1)
{
return false;
}
return true;
}
void getTyreDiameter(SimData* simdata)
{
if(simdata->velocity > 50 && simdata->brake <= 0 && simdata->gas <= 0)
{
if (simdata->velocityX/simdata->velocity < 0.001)
{
double Speedms = 0.277778 * simdata->velocity;
for(int i = 0; i < 4; i++)
{
simdata->tyrediameter[i] = Speedms / simdata->tyreRPS[i] * 2;
}
slogi("Successfully set tyre diameters for wheel slip effects.");
}
}
}
int usbhapticdev_update(USBGenericHapticDevice* usbhapticdevice, SimData* simdata)
{
double play = 0;
double playthreshhold = 0;
double wheelslip[4];
wheelslip[0] = 0;
wheelslip[1] = 0;
wheelslip[2] = 0;
wheelslip[3] = 0;
switch (usbhapticdevice->effecttype)
{
case (EFFECT_TYRESLIP):
playthreshhold = .4;
case (EFFECT_TYRELOCK):
case (EFFECT_ABSBRAKES):
if(hasTyreDiameter(simdata)==false)
{
getTyreDiameter(simdata);
}
if(hasTyreDiameter(simdata)==true)
{
double Speedms = 0.277778 * simdata->velocity;
if (Speedms > 0.5)
{
for(int i = 0; i < 4; i++)
{
wheelslip[i] = (Speedms - simdata->tyrediameter[i] * simdata->tyreRPS[i] / 2) / Speedms;
}
}
else
{
for(int i = 0; i < 4; i++)
{
wheelslip[i] = 0;
}
}
}
break;
}
switch (usbhapticdevice->effecttype)
{
case (EFFECT_TYRESLIP):
if (usbhapticdevice->tyre == FRONTLEFT || usbhapticdevice->tyre == FRONTS || usbhapticdevice->tyre == ALLFOUR)
{
play += (1.0 - simdata->wheelslip[0]);
if(wheelslip[0] < -.5)
{
play++;
}
}
if (usbhapticdevice->tyre == FRONTRIGHT || usbhapticdevice->tyre == FRONTS || usbhapticdevice->tyre == ALLFOUR)
{
play += (1.0 - simdata->wheelslip[1]);
if(wheelslip[1] < -.5)
{
play++;
}
}
if (usbhapticdevice->tyre == REARLEFT || usbhapticdevice->tyre == REARS || usbhapticdevice->tyre == ALLFOUR)
{
play += (1.0 - simdata->wheelslip[2]);
if(wheelslip[2] < -.5)
{
play++;
}
}
if (usbhapticdevice->tyre == REARRIGHT || usbhapticdevice->tyre == REARS || usbhapticdevice->tyre == ALLFOUR)
{
play += (1.0 - simdata->wheelslip[3]);
if(wheelslip[3] < -.5)
{
play++;
}
}
break;
case (EFFECT_TYRELOCK):
if (simdata->velocity > 0)
{
if (usbhapticdevice->tyre == FRONTLEFT || usbhapticdevice->tyre == FRONTS || usbhapticdevice->tyre == ALLFOUR)
{
if(simdata->wheelspeed[0])
if(wheelslip[0] > .75)
{
play++;
}
}
if (usbhapticdevice->tyre == FRONTRIGHT || usbhapticdevice->tyre == FRONTS || usbhapticdevice->tyre == ALLFOUR)
{
if(simdata->wheelspeed[1])
if(wheelslip[1] > .75)
{
play++;
}
}
if (usbhapticdevice->tyre == REARLEFT || usbhapticdevice->tyre == REARS || usbhapticdevice->tyre == ALLFOUR)
{
if(simdata->wheelspeed[2])
if(wheelslip[2] > .75)
{
play++;
}
}
if (usbhapticdevice->tyre == REARRIGHT || usbhapticdevice->tyre == REARS || usbhapticdevice->tyre == ALLFOUR)
{
if(simdata->wheelspeed[3])
if(wheelslip[3] > .75)
{
play++;
}
}
}
break;
case (EFFECT_ABSBRAKES):
play += simdata->abs;
break;
}

View File

@ -200,6 +200,7 @@ int clilooper(SimDevice* devices, int numdevices, Parameters* p, SimData* simdat
{
simdata->rpms=100;
}
for (int x = 0; x < numdevices; x++)
{
devices[x].update(&devices[x], simdata);
@ -238,6 +239,10 @@ int looper(SimDevice* devices, int numdevices, Parameters* p)
SimData* simdata = malloc(sizeof(SimData));
SimMap* simmap = malloc(sizeof(SimMap));
simdata->tyrediameter[0] = -1;
simdata->tyrediameter[1] = -1;
simdata->tyrediameter[2] = -1;
simdata->tyrediameter[3] = -1;
struct termios newsettings, canonicalmode;
tcgetattr(0, &canonicalmode);
@ -324,14 +329,6 @@ int tester(SimDevice* devices, int numdevices)
simdata->rpms = 100;
simdata->maxrpm = 8000;
simdata->abs = 0;
simdata->wheelslip[0] = 1;
simdata->wheelslip[1] = 1;
simdata->wheelslip[2] = 1;
simdata->wheelslip[3] = 1;
simdata->wheelspeed[0] = 100;
simdata->wheelspeed[1] = 100;
simdata->wheelspeed[2] = 100;
simdata->wheelspeed[3] = 100;
sleep(3);
fprintf(stdout, "Setting rpms to 1000\n");
@ -342,30 +339,6 @@ int tester(SimDevice* devices, int numdevices)
}
sleep(3);
fprintf(stdout, "Setting ABS to 1\n");
simdata->abs = 1;
for (int x = 0; x < numdevices; x++)
{
devices[x].update(&devices[x], simdata);
}
sleep(3);
simdata->abs = 0;
fprintf(stdout, "Setting Wheelslip to 0, no traction\n");
simdata->wheelslip[0] = 0;
simdata->wheelslip[1] = 0;
simdata->wheelslip[2] = 0;
simdata->wheelslip[3] = 0;
for (int x = 0; x < numdevices; x++)
{
devices[x].update(&devices[x], simdata);
}
sleep(3);
simdata->wheelslip[0] = 1;
simdata->wheelslip[1] = 1;
simdata->wheelslip[2] = 1;
simdata->wheelslip[3] = 1;
fprintf(stdout, "Shifting into first gear\n");
simdata->gear = 2;
for (int x = 0; x < numdevices; x++)
@ -398,22 +371,6 @@ int tester(SimDevice* devices, int numdevices)
}
sleep(3);
fprintf(stdout, "Setting Wheelspeed to 0, wheels locked at speed.\n");
simdata->wheelspeed[0] = 0;
simdata->wheelspeed[1] = 0;
simdata->wheelspeed[2] = 0;
simdata->wheelspeed[3] = 0;
for (int x = 0; x < numdevices; x++)
{
devices[x].update(&devices[x], simdata);
}
sleep(3);
simdata->wheelspeed[0] = 100;
simdata->wheelspeed[1] = 100;
simdata->wheelspeed[2] = 100;
simdata->wheelspeed[3] = 100;
fprintf(stdout, "Shifting into third gear\n");
simdata->gear = 4;
for (int x = 0; x < numdevices; x++)