Update shadow's driver

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

Former-commit-id: 8490e7825f5296f16a182f1964e7ee4fb63afe9b
Former-commit-id: 2dd6c43f41c904e26658b6d175dd9545ed86d9ff
This commit is contained in:
torcs-ng 2019-06-23 14:19:18 +00:00
parent 3b1b16cbcb
commit 9dda55e873
6 changed files with 120 additions and 78 deletions

View file

@ -156,8 +156,7 @@ double CarModel::CalcMaxSpeed(double k, double k1, double kz, double kFriction,
LogSHADOW.debug("MU = %.f\n", Mu); LogSHADOW.debug("MU = %.f\n", Mu);
} }
Den = (AbsCrv - ScaleBump * kz) - (CA_FW * MuF + CA_RW * MuR Den = (AbsCrv - ScaleBump * kz) - (CA_FW * MuF + CA_RW * MuR + CA_GE_F * MuF + CA_GE_R * MuR) / MASS;
+ CA_GE_F * MuF + CA_GE_R * MuR) / MASS;
if (Den < 0.00001) if (Den < 0.00001)
Den = 0.00001; Den = 0.00001;
@ -348,8 +347,8 @@ double CarModel::CalcAcceleration(double k0, double kz0, double k1, double kz1,
if( Flatroad > Froad ) if( Flatroad > Froad )
Flatroad = Froad; Flatroad = Froad;
double Ftanroad = sqrt(Froad * Froad - Flatroad * Flatroad) + Ftan;
double Ftanroad = sqrt(Froad * Froad - Flatroad * Flatroad) + Ftan;
double acc = Ftanroad / M; double acc = Ftanroad / M;
double maxAcc = MIN(11.5, accFromSpd.CalcY(avgV)); double maxAcc = MIN(11.5, accFromSpd.CalcY(avgV));
@ -398,6 +397,7 @@ double CarModel::CalcMaxLateralF( double spd, double kFriction, double kz ) cons
double CarModel::CalcMaxSpeedCrv() const double CarModel::CalcMaxSpeedCrv() const
{ {
const double MAX_SPD = 112; // 400 km/h const double MAX_SPD = 112; // 400 km/h
return GRAVITY * TYRE_MU / (MAX_SPD * MAX_SPD); return GRAVITY * TYRE_MU / (MAX_SPD * MAX_SPD);
} }

View file

@ -1320,21 +1320,26 @@ void TDriver::SpeedControl2( double targetSpd, double spd0, double& acc, double&
{ {
if (m_lastBrk && m_lastTargV) if (m_lastBrk && m_lastTargV)
{ {
if( m_lastBrk > 0 ) if (m_lastBrk > 0)//|| (car->ctrl.accelCmd == -m_lastBrk) )
{ {
double err = m_lastTargV - spd0; double err = m_lastTargV - spd0;
m_accBrkCoeff.Sample(err, m_lastBrk); m_accBrkCoeff.Sample(err, m_lastBrk);
// GfOut( "accbrk sample %g -> %g\n", err, m_lastBrk );
} }
m_lastBrk = 0; m_lastBrk = 0;
m_lastTargV = 0; m_lastTargV = 0;
} }
if (spd0 > targetSpd) if (spd0 > targetSpd)
// if( targetSpd < 100 )
{ {
// if( spd0 - 1 > targetSpd )
{ {
double MAX_BRK = 0.5; double MAX_BRK = 0.9;
// double MAX_BRK = 0.75;
double err = spd0 - targetSpd; double err = spd0 - targetSpd;
brk = MX(0, MN(m_accBrkCoeff.CalcY(err), MAX_BRK)); brk = MX(0, MN(m_accBrkCoeff.CalcY(err), MAX_BRK));
// GfOut( "accbrk calcy %g -> %g\n", err, t );
acc = 0; acc = 0;
m_lastBrk = brk; m_lastBrk = brk;
@ -1346,8 +1351,21 @@ void TDriver::SpeedControl2( double targetSpd, double spd0, double& acc, double&
m_lastTargV = spd0; m_lastTargV = spd0;
} }
// GfOut( "*** brake *** spd0 %g targ %g brk %g acc %g\n",
// spd0, targetSpd, brk, acc );
} }
// else
// acc = MN(acc, 0.1);
} }
#if 1
else
{
double x = (0 + spd0) * (targetSpd - spd0) / 200;
if (x > 0)
acc = x;
}
#endif
} }
void TDriver::SpeedControl3( double targetSpd, double spd0, double& acc, double& brk ) void TDriver::SpeedControl3( double targetSpd, double spd0, double& acc, double& brk )
@ -1546,6 +1564,28 @@ void TDriver::Drive( tSituation* s )
PtInfo pi, aheadPi; PtInfo pi, aheadPi;
double angle = 0.0; double angle = 0.0;
#if 1
/*if (m_Strategy->WantToPit())
angle = SteerAngle2(car, pi, aheadPi);
else*/
{
int steerControl = ((MN(car->_trkPos.toLeft, car->_trkPos.toRight) < 0.0 && car->_speed_x < MN(20.0f, m_lastTargV - 10.0f)) ? STEERCONTROL_RECOVERY : STEERCONTROL);
switch (steerControl)
{
case 0:
angle = SteerAngle0(car, pi, aheadPi); break;
case 1:
angle = SteerAngle1(car, pi, aheadPi); break;
case 2:
angle = SteerAngle2(car, pi, aheadPi); break;
case 3:
angle = SteerAngle3(car, pi, aheadPi); break;
case 4:
angle = SteerAngle4(car, pi, aheadPi); break;
}
}
#else
switch (STEER_CTRL) switch (STEER_CTRL)
{ {
case 0: angle = SteerAngle0(car, pi, aheadPi); break; case 0: angle = SteerAngle0(car, pi, aheadPi); break;
@ -1555,6 +1595,7 @@ void TDriver::Drive( tSituation* s )
case 4: angle = SteerAngle4(car, pi, aheadPi); break; case 4: angle = SteerAngle4(car, pi, aheadPi); break;
default: angle = SteerAngle0(car, pi, aheadPi); break; default: angle = SteerAngle0(car, pi, aheadPi); break;
} }
#endif
double steer = angle / car->_steerLock; double steer = angle / car->_steerLock;

View file

@ -55,6 +55,7 @@ SimpleStrategy::SimpleStrategy()
m_expectedfuelperlap = 0; // [Kg] Expected fuel per lap m_expectedfuelperlap = 0; // [Kg] Expected fuel per lap
TrackLength = 0; TrackLength = 0;
RaceDistance = 0; RaceDistance = 0;
m_timeOfPitExit = -30;
} }
@ -522,6 +523,3 @@ double SimpleStrategy::getRefuel2(int laps)
return refuelforrace; return refuelforrace;
} }

View file

@ -57,6 +57,7 @@ protected:
PIT_EXIT, PIT_EXIT,
PIT_GONE PIT_GONE
}; };
int m_State; // Current pitting state int m_State; // Current pitting state
bool m_GoToPit; // Pit stop needed bool m_GoToPit; // Pit stop needed
@ -116,6 +117,7 @@ public:
int pitRepair(tCarElt* car, tSituation *s); int pitRepair(tCarElt* car, tSituation *s);
bool isPitFree(tCarElt* car); bool isPitFree(tCarElt* car);
int pitStopPenalty() { return m_stopPenalty; } int pitStopPenalty() { return m_stopPenalty; }
double TimeSincePit(double simtime) { return simtime - m_timeOfPitExit; }
protected: protected:
bool test_Pitstop; bool test_Pitstop;
@ -145,6 +147,7 @@ protected:
float calcFuel(double totalFuel); float calcFuel(double totalFuel);
double getRefuel1(int laps); // How much fuel it takes to reach the finish line. double getRefuel1(int laps); // How much fuel it takes to reach the finish line.
double getRefuel2(int laps); double getRefuel2(int laps);
double m_timeOfPitExit;
float MAX_FUEL_PER_METER; // max fuel consumtion. float MAX_FUEL_PER_METER; // max fuel consumtion.
double MAX_FUEL_TANK; // max fuel for this car(fuel tank capacity). double MAX_FUEL_TANK; // max fuel for this car(fuel tank capacity).