From 8a88659075ce8911bec970a7f53d338e2b3866c1 Mon Sep 17 00:00:00 2001 From: torcs-ng Date: Thu, 22 Jun 2023 15:07:55 +0000 Subject: [PATCH] - 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 --- src/drivers/usr/src/MyCar.cpp | 70 ++++++++++++++++++++++++++++++++++ src/drivers/usr/src/MyCar.h | 2 + src/drivers/usr/src/driver.cpp | 5 +++ src/drivers/usr/src/pit.cpp | 9 +++-- src/drivers/usr/src/pit.h | 2 +- src/drivers/usr/src/tires.cpp | 10 ++--- 6 files changed, 88 insertions(+), 10 deletions(-) diff --git a/src/drivers/usr/src/MyCar.cpp b/src/drivers/usr/src/MyCar.cpp index 6a0332d91..d0db2c144 100755 --- a/src/drivers/usr/src/MyCar.cpp +++ b/src/drivers/usr/src/MyCar.cpp @@ -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); diff --git a/src/drivers/usr/src/MyCar.h b/src/drivers/usr/src/MyCar.h index 286f88e52..12f75269f 100755 --- a/src/drivers/usr/src/MyCar.h +++ b/src/drivers/usr/src/MyCar.h @@ -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; diff --git a/src/drivers/usr/src/driver.cpp b/src/drivers/usr/src/driver.cpp index 2aefdcfa3..f6fc113bb 100755 --- a/src/drivers/usr/src/driver.cpp +++ b/src/drivers/usr/src/driver.cpp @@ -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"); } } diff --git a/src/drivers/usr/src/pit.cpp b/src/drivers/usr/src/pit.cpp index 68bf47d71..1fb04bd9b 100755 --- a/src/drivers/usr/src/pit.cpp +++ b/src/drivers/usr/src/pit.cpp @@ -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"); } } diff --git a/src/drivers/usr/src/pit.h b/src/drivers/usr/src/pit.h index 96b8197b0..ea188db8e 100755 --- a/src/drivers/usr/src/pit.h +++ b/src/drivers/usr/src/pit.h @@ -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 diff --git a/src/drivers/usr/src/tires.cpp b/src/drivers/usr/src/tires.cpp index ee7367838..0771d26db 100755 --- a/src/drivers/usr/src/tires.cpp +++ b/src/drivers/usr/src/tires.cpp @@ -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(); }