- Update Shadow's driver

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

Former-commit-id: 2c0640e3e8d8b49c60fd1d2737e90fa2502753a4
Former-commit-id: 7cabae81b5b25895baf86b72a7059a5eb5a50eac
This commit is contained in:
torcs-ng 2015-07-04 23:41:03 +00:00
parent 4b8603b787
commit 30148cff87
2 changed files with 57 additions and 1 deletions

View file

@ -35,6 +35,11 @@
#define STEER_SPD_IDX(x) (int(floor((x) / 5))) #define STEER_SPD_IDX(x) (int(floor((x) / 5)))
#define STEER_K_IDX(k) (MX(0, MN(int(20 + floor((k) * 500 + 0.5)), 40))) #define STEER_K_IDX(k) (MX(0, MN(int(20 + floor((k) * 500 + 0.5)), 40)))
#define DOUBLE_NORM_PI_PI(x) \
{ \
while ((x) > PI) { (x) -= 2*PI; } \
while ((x) < -PI) { (x) += 2*PI; } \
}
//==========================================================================* //==========================================================================*
// Statics // Statics
@ -157,6 +162,12 @@ TDriver::TDriver(int Index, const int robot_type):
m_TclSlip(1.6), m_TclSlip(1.6),
m_TclFactor(1.0), m_TclFactor(1.0),
m_DriftAngle(0.0),
m_AbsDriftAngle(0.0),
m_LastAbsDriftAngle(0.0),
m_CosDriftAngle2(1.0),
m_DriftFactor(1.0),
m_ClutchMax(0.5), m_ClutchMax(0.5),
m_ClutchDelta(0.009), m_ClutchDelta(0.009),
m_ClutchRange(0.82), m_ClutchRange(0.82),
@ -475,6 +486,9 @@ void TDriver::InitTrack( tTrack* pTrack, void* pCarHandle, void** ppCarParmHandl
m_cm.AERO = (int)GfParmGetNum(hCarParm, SECT_PRIV, PRV_AERO_MOD, 0, 0); m_cm.AERO = (int)GfParmGetNum(hCarParm, SECT_PRIV, PRV_AERO_MOD, 0, 0);
m_cm.MU_SCALE = GfParmGetNum(hCarParm, SECT_PRIV, PRV_MU_SCALE, NULL, 0.9f); m_cm.MU_SCALE = GfParmGetNum(hCarParm, SECT_PRIV, PRV_MU_SCALE, NULL, 0.9f);
if (raceType[pS->_raceType] == "qualify")
m_cm.MU_SCALE = m_cm.MU_SCALE + 0.02;
m_cm.KZ_SCALE = GfParmGetNum(hCarParm, SECT_PRIV, PRV_KZ_SCALE, NULL, 0.43f); m_cm.KZ_SCALE = GfParmGetNum(hCarParm, SECT_PRIV, PRV_KZ_SCALE, NULL, 0.43f);
m_cm.BUMP_FACTOR = GfParmGetNum(hCarParm, SECT_PRIV, PRV_BUMP_FACTOR, NULL, 1.0); m_cm.BUMP_FACTOR = GfParmGetNum(hCarParm, SECT_PRIV, PRV_BUMP_FACTOR, NULL, 1.0);
m_cm.NEEDSINLONG = GfParmGetNum(hCarParm, SECT_PRIV, PRV_NEED_SIN, NULL, 0); m_cm.NEEDSINLONG = GfParmGetNum(hCarParm, SECT_PRIV, PRV_NEED_SIN, NULL, 0);
@ -657,7 +671,7 @@ void TDriver::NewRace( tCarElt* pCar, tSituation* pS )
m_cm.WIDTH = car->_dimension_y; m_cm.WIDTH = car->_dimension_y;
m_cm2 = m_cm; m_cm2 = m_cm;
m_cm2.MU_SCALE = MN(1.0, m_cm.MU_SCALE); m_cm2.MU_SCALE = MN(1.5, m_cm.MU_SCALE);
LogSHADOW.debug( "SPDC N %d SPDC T %d\n", SPDC_NORMAL, SPDC_TRAFFIC ); LogSHADOW.debug( "SPDC N %d SPDC T %d\n", SPDC_NORMAL, SPDC_TRAFFIC );
@ -1478,6 +1492,11 @@ void TDriver::Drive( tSituation* s )
double steer = angle / car->_steerLock; double steer = angle / car->_steerLock;
m_DriftAngle = atan2(car->_speed_Y, car->_speed_X) - car->_yaw;
DOUBLE_NORM_PI_PI(m_DriftAngle);
m_AbsDriftAngle = fabs(m_DriftAngle);
m_CosDriftAngle2 = (float) cos(MAX(MIN(m_AbsDriftAngle * 2, PI),-PI));
// work out current car speed. // work out current car speed.
double spd0 = hypot(car->_speed_x, car->_speed_y); double spd0 = hypot(car->_speed_x, car->_speed_y);
@ -1688,6 +1707,8 @@ void TDriver::Drive( tSituation* s )
//brk = ApplyAbs(car, brk); //brk = ApplyAbs(car, brk);
steer = FlightControl(steer); steer = FlightControl(steer);
acc = filterDrifting(acc);
if (!HasTCL) if (!HasTCL)
acc = filterTCL(acc); acc = filterTCL(acc);
//acc = filterTCL(acc); //acc = filterTCL(acc);
@ -1700,6 +1721,7 @@ void TDriver::Drive( tSituation* s )
car->ctrl.brakeCmd = brk; car->ctrl.brakeCmd = brk;
m_LastBrake = brk; m_LastBrake = brk;
m_LastAccel = acc; m_LastAccel = acc;
m_LastAbsDriftAngle = m_AbsDriftAngle;
m_pitControl.Process( car ); m_pitControl.Process( car );
} }
@ -2750,6 +2772,33 @@ double TDriver::filterTCL(double Accel) // T
return MIN(1.0, Accel); return MIN(1.0, Accel);
} }
//==========================================================================*
// Filter Drifting
//--------------------------------------------------------------------------*
double TDriver::filterDrifting(double Acc)
{
if(car->_speed_x < 5.0)
return Acc;
double Drifting = m_AbsDriftAngle;
double DriftFactor = m_DriftFactor;
if (m_Rain)
{
Drifting *= 1.5;
DriftFactor *= 2;
}
// Decrease accelleration while drifting
double DriftAngle = MAX(MIN(Drifting * 1.75, PI - 0.01),-PI + 0.01);
if (m_AbsDriftAngle > m_LastAbsDriftAngle)
Acc /= MAX(1.0,(DriftFactor * 150 * ( 1 - cos(DriftAngle))));
else
Acc /= MAX(1.0,(DriftFactor * 50 * ( 1 - cos(DriftAngle))));
return MIN(1.0, Acc);
}
//==========================================================================* //==========================================================================*
// Learn brake at current speed // Learn brake at current speed
//--------------------------------------------------------------------------* //--------------------------------------------------------------------------*

View file

@ -291,6 +291,7 @@ private:
float startAutomatic(); float startAutomatic();
double ApplyAbs( tCarElt* car, double brake ); double ApplyAbs( tCarElt* car, double brake );
double filterBrake(double Brake); double filterBrake(double Brake);
double filterDrifting(double Acc);
void Meteorology(); void Meteorology();
int GetWeather(); int GetWeather();
bool CheckPitSharing(); bool CheckPitSharing();
@ -373,6 +374,12 @@ private:
double m_TclSlip; // Max TCL slip double m_TclSlip; // Max TCL slip
double m_TclFactor; // TCL scale double m_TclFactor; // TCL scale
double m_DriftAngle; // Drifting angle
double m_AbsDriftAngle; // fabs(Drifting angle)
double m_LastAbsDriftAngle; // Historie
double m_CosDriftAngle2;
double m_DriftFactor; // Drifting acceleration factor
double m_ClutchMax; double m_ClutchMax;
double m_ClutchDelta; double m_ClutchDelta;
double m_ClutchRange; double m_ClutchRange;