- update USR's driver for better strategy

git-svn-id: https://svn.code.sf.net/p/speed-dreams/code/trunk@9028 30fe4595-0a0c-4342-8851-515496e4dcbd

Former-commit-id: 7b588bb97b0c6f9443943f5a2d3057a707668d42
Former-commit-id: 78f78c095cbde58ca7888fae75988720b4462b4f
This commit is contained in:
torcs-ng 2023-06-22 15:07:55 +00:00
parent 3dde9201fa
commit 8a88659075
6 changed files with 88 additions and 10 deletions

View file

@ -138,6 +138,75 @@ void MyCar::readConstSpecs(void* CarHandle)
double tiremufront = MIN(tiremuFL, tiremuFR);
double tiremurear = MIN(tiremuRL, tiremuRR);
mTireMu = MIN(tiremufront, tiremurear);
if (HASCPD)
{
char path[256];
sprintf(path, "%s/%s/%s", SECT_FRNTRGTWHEEL, SECT_COMPOUNDS, SECT_SOFT);
tiremuFR = GfParmGetNum(CarHandle, path, PRM_MU, (char*)NULL, mTireMu);
sprintf(path, "%s/%s/%s", SECT_FRNTLFTWHEEL, SECT_COMPOUNDS, SECT_SOFT);
tiremuFL = GfParmGetNum(CarHandle, path, PRM_MU, (char*)NULL, mTireMu);
sprintf(path, "%s/%s/%s", SECT_REARRGTWHEEL, SECT_COMPOUNDS, SECT_SOFT);
tiremuRR = GfParmGetNum(CarHandle, path, PRM_MU, (char*)NULL, mTireMu);
sprintf(path, "%s/%s/%s", SECT_REARLFTWHEEL, SECT_COMPOUNDS, SECT_SOFT);
tiremuRL = GfParmGetNum(CarHandle, path, PRM_MU, (char*)NULL, mTireMu);
tiremufront = MIN(tiremuFL, tiremuFR);
tiremurear = MIN(tiremuRL, tiremuRR);
mTireMuC[1] = MIN(tiremufront, tiremurear);
sprintf(path, "%s/%s/%s", SECT_FRNTRGTWHEEL, SECT_COMPOUNDS, SECT_MEDIUM);
tiremuFR = GfParmGetNum(CarHandle, path, PRM_MU, (char*)NULL, mTireMu);
sprintf(path, "%s/%s/%s", SECT_FRNTLFTWHEEL, SECT_COMPOUNDS, SECT_MEDIUM);
tiremuFL = GfParmGetNum(CarHandle, path, PRM_MU, (char*)NULL, mTireMu);
sprintf(path, "%s/%s/%s", SECT_REARRGTWHEEL, SECT_COMPOUNDS, SECT_MEDIUM);
tiremuRR = GfParmGetNum(CarHandle, path, PRM_MU, (char*)NULL, mTireMu);
sprintf(path, "%s/%s/%s", SECT_REARLFTWHEEL, SECT_COMPOUNDS, SECT_MEDIUM);
tiremuRL = GfParmGetNum(CarHandle, path, PRM_MU, (char*)NULL, mTireMu);
tiremufront = MIN(tiremuFL, tiremuFR);
tiremurear = MIN(tiremuRL, tiremuRR);
mTireMuC[2] = MIN(tiremufront, tiremurear);
sprintf(path, "%s/%s/%s", SECT_FRNTRGTWHEEL, SECT_COMPOUNDS, SECT_HARD);
tiremuFR = GfParmGetNum(CarHandle, path, PRM_MU, (char*)NULL, mTireMu);
sprintf(path, "%s/%s/%s", SECT_FRNTLFTWHEEL, SECT_COMPOUNDS, SECT_HARD);
tiremuFL = GfParmGetNum(CarHandle, path, PRM_MU, (char*)NULL, mTireMu);
sprintf(path, "%s/%s/%s", SECT_REARRGTWHEEL, SECT_COMPOUNDS, SECT_HARD);
tiremuRR = GfParmGetNum(CarHandle, path, PRM_MU, (char*)NULL, mTireMu);
sprintf(path, "%s/%s/%s", SECT_REARLFTWHEEL, SECT_COMPOUNDS, SECT_HARD);
tiremuRL = GfParmGetNum(CarHandle, path, PRM_MU, (char*)NULL, mTireMu);
tiremufront = MIN(tiremuFL, tiremuFR);
tiremurear = MIN(tiremuRL, tiremuRR);
mTireMuC[3] = MIN(tiremufront, tiremurear);
sprintf(path, "%s/%s/%s", SECT_FRNTRGTWHEEL, SECT_COMPOUNDS, SECT_WET);
tiremuFR = GfParmGetNum(CarHandle, path, PRM_MU, (char*)NULL, mTireMu);
sprintf(path, "%s/%s/%s", SECT_FRNTLFTWHEEL, SECT_COMPOUNDS, SECT_WET);
tiremuFL = GfParmGetNum(CarHandle, path, PRM_MU, (char*)NULL, mTireMu);
sprintf(path, "%s/%s/%s", SECT_REARRGTWHEEL, SECT_COMPOUNDS, SECT_WET);
tiremuRR = GfParmGetNum(CarHandle, path, PRM_MU, (char*)NULL, mTireMu);
sprintf(path, "%s/%s/%s", SECT_REARLFTWHEEL, SECT_COMPOUNDS, SECT_WET);
tiremuRL = GfParmGetNum(CarHandle, path, PRM_MU, (char*)NULL, mTireMu);
tiremufront = MIN(tiremuFL, tiremuFR);
tiremurear = MIN(tiremuRL, tiremuRR);
mTireMuC[4] = MIN(tiremufront, tiremurear);
sprintf(path, "%s/%s/%s", SECT_FRNTRGTWHEEL, SECT_COMPOUNDS, SECT_EXTREM_WET);
tiremuFR = GfParmGetNum(CarHandle, path, PRM_MU, (char*)NULL, mTireMu);
sprintf(path, "%s/%s/%s", SECT_FRNTLFTWHEEL, SECT_COMPOUNDS, SECT_EXTREM_WET);
tiremuFL = GfParmGetNum(CarHandle, path, PRM_MU, (char*)NULL, mTireMu);
sprintf(path, "%s/%s/%s", SECT_REARRGTWHEEL, SECT_COMPOUNDS, SECT_EXTREM_WET);
tiremuRR = GfParmGetNum(CarHandle, path, PRM_MU, (char*)NULL, mTireMu);
sprintf(path, "%s/%s/%s", SECT_REARLFTWHEEL, SECT_COMPOUNDS, SECT_EXTREM_WET);
tiremuRL = GfParmGetNum(CarHandle, path, PRM_MU, (char*)NULL, mTireMu);
tiremufront = MIN(tiremuFL, tiremuFR);
tiremurear = MIN(tiremuRL, tiremuRR);
mTireMuC[5] = MIN(tiremufront, tiremurear);
int compounds = GfParmGetNum(CarHandle, SECT_TIRESET, PRM_COMPOUNDS_SET, NULL, 1);
mTireMu = mTireMuC[compounds];
LogUSR.debug("# USR tire mu = %.2f\n", mTireMu);
}
mBrakePressMax = GfParmGetNum(CarHandle, SECT_BRKSYST, PRM_BRKPRESS, (char*)NULL, 0);
mBrakeRepartition = GfParmGetNum(CarHandle, SECT_BRKSYST, PRM_BRKREP, (char*)NULL, 0);
mFrontWingAngle = GfParmGetNum(CarHandle, SECT_FRNTWING, PRM_WINGANGLE, (char*)NULL, 0);
@ -229,6 +298,7 @@ void MyCar::update(double dt)
}
mSegMu = mTires.gripFactor() * mTireMu * mCar->_trkPos.seg->surface->kFriction;
LogUSR.debug("# USR CarModel Tire Mu = %.3f - SegMu = %.3f\n", mTireMu, mSegMu);
mCW = mBodyCW * (1.0 + mCar->_dammage / 10000.0) + mWingCW;
mToMiddle = mCar->_trkPos.toMiddle;
double yawdiff = Utils::normPiPi(mCar->_yaw - mYaw);

View file

@ -46,6 +46,7 @@ public:
double bumpSpeed(double curv_z) const;
void driveForward() { mGearDirection = 1; }
void driveBackwards() { mGearDirection = -1; }
void setTireMu(int c) { mTireMu = mTireMuC[c]; }
double v() const { return mSpeed; }
double vX() const { return mSpeedX; }
double accelFiltered() const { return mAccelFilter.get(); }
@ -154,6 +155,7 @@ private:
double mCarMass;
double mTankVol;
double mTireMu;
double mTireMuC[6];
// Aerodynamic constants
double mFrontCA;

View file

@ -182,16 +182,19 @@ void Driver::InitTrack(tTrack* Track, void* carHandle, void** carParmHandle, tSi
if (temp < 13.0 || situation->_totLaps * (double)track->length < 57800.0)
{
param.setNum(SECT_TIRESET, PRM_COMPOUNDS_SET, 1);
mCar.setTireMu(1);
LogUSR.info("Compounds choice SOFT !!!\n");
}
else if (temp < 25.0 || situation->_totLaps * (double)track->length < 171000.0)
{
param.setNum(SECT_TIRESET, PRM_COMPOUNDS_SET, 2);
mCar.setTireMu(2);
LogUSR.info("Compounds choice MEDIUM !!!\n");
}
else
{
param.setNum(SECT_TIRESET, PRM_COMPOUNDS_SET, 3);
mCar.setTireMu(3);
LogUSR.info("Compounds choice HARD !!!\n");
}
@ -200,11 +203,13 @@ void Driver::InitTrack(tTrack* Track, void* carHandle, void** carParmHandle, tSi
if (mRain > 0 && mRain < 3)
{
param.setNum(SECT_TIRESET, PRM_COMPOUNDS_SET, 4);
mCar.setTireMu(4);
LogUSR.info("Compounds choice WET !!!\n");
}
else if (mRain > 2)
{
param.setNum(SECT_TIRESET, PRM_COMPOUNDS_SET, 5);
mCar.setTireMu(5);
LogUSR.info("Compounds choice EXTREM WET !!!\n");
}
}

View file

@ -317,7 +317,7 @@ void Pit::update()
if(mMyCar->HASTYC)
{
pittyres = (mMyCar->tires()->TyreTreadDepth() < 10.00 && remaininglaps > 5.0);
pittyres = (mMyCar->tires()->TyreTreadDepth() < 15.00 && remaininglaps > 5.0);
LogUSR.debug(" # Tyre depth = %.2f Pit Tyres change = %i\n", mMyCar->tires()->TyreTreadDepth(), pittyres);
}
else
@ -491,8 +491,6 @@ double Pit::calcRefuel()
LogUSR.info("USR Fuel per meter %.7f\n", mAvgFuelPerLap / mTrack->length);
LogUSR.info("USR Tire pitstops %i\n", tirespitstops);
LogUSR.info("USR Tire wear per meter %.7f\n", mMyCar->tires()->avgWearPerMeter());
LogUSR.info("USR Tire distance = %.2f - Tire Laps = %.2f\n", mMyCar->tires()->TyreTreadDepth() / mCar->_remainingLaps * mTrack->length,
mMyCar->tires()->distLeft() / mTrack->length);
return stintfuel - mCar->_fuel;
}
@ -545,26 +543,31 @@ void Pit::pitCommand()
if (remainingLaps <= 10 && mRain < 2)
{
mCar->pitcmd.tiresetChange = tCarPitCmd::SOFT;
mMyCar->setTireMu(1);
LogUSR.info("Change Tire SOFT !\n");
}
else if (remainingLaps <= 25 && mRain < 2)
{
mCar->pitcmd.tiresetChange = tCarPitCmd::MEDIUM;
mMyCar->setTireMu(2);
LogUSR.info("Change Tire MEDIUM !\n");
}
else if(mRain < 2)
{
mCar->pitcmd.tiresetChange = tCarPitCmd::HARD;
mMyCar->setTireMu(3);
LogUSR.info("Change Tire HARD !\n");
}
else if (mRain < 3)
{
mCar->pitcmd.tiresetChange = tCarPitCmd::WET;
mMyCar->setTireMu(4);
LogUSR.info("Change Tire WET !\n");
}
else
{
mCar->pitcmd.tiresetChange = tCarPitCmd::EXTREM_WET;
mMyCar->setTireMu(5);
LogUSR.info("Change Tire EXTREM WET !\n");
}
}

View file

@ -58,7 +58,7 @@ private:
double calcRefuel();
const tTrack* mTrack;
const MyCar* mMyCar;
MyCar* mMyCar;
tCarElt* mCar;
const tCarElt* mTeamCar;
const tTrackOwnPit* mPit; // pointer to my pit

View file

@ -29,7 +29,7 @@ void Tires::init(const tCarElt* car)
{
mCar = car;
mDistWhenNew = 0;
mWear = 100.0;
mWear = 0.0;
mHotTemp = 273.15 + GfParmGetNum(mCar->_carHandle, "private", "hottemp", (char*)NULL, 120.0);
mMuScale = GfParmGetNum(mCar->_carHandle, "private", "mu scale", (char*)NULL, 1.0);
}
@ -56,16 +56,14 @@ void Tires::update()
}
// Calc dist to tire change
double distused = mCar->_distRaced;//- mDistWhenNew;
double distused = mCar->_distRaced - mDistWhenNew;
if (distused > 1000.0)
{
mAvgWearPerMeter = mWear / distused;
//GfLogInfo("USR Tires AvgWear = %.9f\n", mAvgWearPerMeter);
}
//double wearuntilchange = mWear / mAvgWearPerMeter;
mDistLeft = mWear / mAvgWearPerMeter;
//GfLogInfo("USR Tires mDistleft = %.8f\n", mDistLeft);
double wearuntilchange = 100.0 - mWear;
mDistLeft = wearuntilchange / mAvgWearPerMeter;
mGripFactor = updateGripFactor();
}