- Update shadow's driver
git-svn-id: https://svn.code.sf.net/p/speed-dreams/code/trunk@6820 30fe4595-0a0c-4342-8851-515496e4dcbd Former-commit-id: 6667b9b15775e15dc89227d7772784ecf894e645 Former-commit-id: a19fd04516a2d2d7373bbc6fbeaa3f96c65bc41d
This commit is contained in:
parent
3df9c6a585
commit
30428f49e6
3 changed files with 307 additions and 131 deletions
|
@ -77,11 +77,19 @@ using namespace std;
|
|||
#define PRV_SAFETY_MULTIPLIER "safety multiplier"
|
||||
#define PRV_BRAKE_LIMIT "brake limit"
|
||||
|
||||
#define SECT_SKILL "skill"
|
||||
#define PRV_SKILL_LEVEL "level"
|
||||
#define PRV_SKILL_AGGRO "aggression"
|
||||
|
||||
#define FLY_COUNT 20
|
||||
|
||||
#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 RANDOM_SEED 0xfded
|
||||
#define RANDOM_A 1664525
|
||||
#define RANDOM_C 1013904223
|
||||
|
||||
static const double s_sgMin[] = { 0.00, 10 };
|
||||
static const double s_sgMax[] = { 0.03, 100 };
|
||||
static const int s_sgSteps[] = { 10, 18 };
|
||||
|
@ -131,17 +139,17 @@ Driver::Driver(int index)
|
|||
_lastSpd0(0)
|
||||
{
|
||||
for( int i = 0; i < 50; i++ )
|
||||
{
|
||||
m_brkCoeff[i] = 0.5;//0.12;
|
||||
}
|
||||
{
|
||||
m_brkCoeff[i] = 0.5;//0.12;
|
||||
}
|
||||
|
||||
for( int i = 0; i < STEER_SPD_MAX; i++ )
|
||||
{
|
||||
for( int j = 0; j < STEER_K_MAX; j++ )
|
||||
{
|
||||
for( int j = 0; j < STEER_K_MAX; j++ )
|
||||
{
|
||||
m_steerCoeff[i][j] = 0;
|
||||
}
|
||||
m_steerCoeff[i][j] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
memset( m_angle, 0, sizeof(m_angle) );
|
||||
}
|
||||
|
@ -249,6 +257,8 @@ void Driver::InitTrack(
|
|||
snprintf(buf, sizeof(buf), "drivers/%s", MyBotName);
|
||||
const char* baseParamPath = buf;
|
||||
|
||||
weathercode = GetWeather(pTrack);
|
||||
|
||||
//
|
||||
// ok, lets read/merge the car parms.
|
||||
//
|
||||
|
@ -345,44 +355,44 @@ void Driver::InitTrack(
|
|||
LogSHADOW.info( "*** KV_SCALE[%d] : %.3f\n\n", p, m_cm[p].KV_SCALE );
|
||||
|
||||
for( int i = 0; ; i++ )
|
||||
{
|
||||
snprintf( buf, sizeof(buf), "%s %d", PRV_FACTOR, i );
|
||||
double factor = SafeParmGetNum(hCarParm, sect.c_str(), buf, 0, -1);
|
||||
LogSHADOW.debug( "%s: %g\n", buf, factor );
|
||||
{
|
||||
snprintf( buf, sizeof(buf), "%s %d", PRV_FACTOR, i );
|
||||
double factor = SafeParmGetNum(hCarParm, sect.c_str(), buf, 0, -1);
|
||||
LogSHADOW.debug( "%s: %g\n", buf, factor );
|
||||
|
||||
if( factor == -1 )
|
||||
break;
|
||||
if( factor == -1 )
|
||||
break;
|
||||
|
||||
if( i == 0 )
|
||||
m_priv[p].FACTORS.clear();
|
||||
if( i == 0 )
|
||||
m_priv[p].FACTORS.clear();
|
||||
|
||||
m_priv[p].FACTORS.push_back( factor );
|
||||
}
|
||||
m_priv[p].FACTORS.push_back( factor );
|
||||
}
|
||||
|
||||
if( m_priv[p].FACTORS.size() == 0 )
|
||||
m_priv[p].FACTORS.push_back( 1.005 );
|
||||
|
||||
for( int bend = 0; bend < 100; bend++ )
|
||||
{
|
||||
snprintf( buf, sizeof(buf), "%s %d", PRV_INNER_MOD, bend );
|
||||
double innerModA = SafeParmGetNum(hCarParm, sect.c_str(), buf, 0, 999);
|
||||
double innerModB = innerModA;
|
||||
innerModA = SafeParmGetNum(hCarParm, sect.c_str(), (string(buf) + "a").c_str(), 0, innerModA);
|
||||
innerModB = SafeParmGetNum(hCarParm, sect.c_str(), (string(buf) + "b").c_str(), 0, innerModA);
|
||||
{
|
||||
snprintf( buf, sizeof(buf), "%s %d", PRV_INNER_MOD, bend );
|
||||
double innerModA = SafeParmGetNum(hCarParm, sect.c_str(), buf, 0, 999);
|
||||
double innerModB = innerModA;
|
||||
innerModA = SafeParmGetNum(hCarParm, sect.c_str(), (string(buf) + "a").c_str(), 0, innerModA);
|
||||
innerModB = SafeParmGetNum(hCarParm, sect.c_str(), (string(buf) + "b").c_str(), 0, innerModA);
|
||||
|
||||
if( innerModA == 999 && innerModB == 999 )
|
||||
continue;
|
||||
if( innerModA == 999 && innerModB == 999 )
|
||||
continue;
|
||||
|
||||
LogSHADOW.debug( "%s: %g, %g\n", buf, innerModA, innerModB );
|
||||
LogSHADOW.debug( "%s: %g, %g\n", buf, innerModA, innerModB );
|
||||
|
||||
while( m_priv[p].INNER_MOD.size() < bend * 2 + 2 )
|
||||
m_priv[p].INNER_MOD.push_back( 0 );
|
||||
while( m_priv[p].INNER_MOD.size() < bend * 2 + 2 )
|
||||
m_priv[p].INNER_MOD.push_back( 0 );
|
||||
|
||||
if( innerModA != 999 )
|
||||
m_priv[p].INNER_MOD[bend * 2] = innerModA;
|
||||
if( innerModB != 999 )
|
||||
m_priv[p].INNER_MOD[bend * 2 + 1] = innerModB;
|
||||
}
|
||||
if( innerModA != 999 )
|
||||
m_priv[p].INNER_MOD[bend * 2] = innerModA;
|
||||
if( innerModB != 999 )
|
||||
m_priv[p].INNER_MOD[bend * 2 + 1] = innerModB;
|
||||
}
|
||||
|
||||
if( m_priv[p].INNER_MOD.size() == 0 )
|
||||
m_priv[p].INNER_MOD.push_back( 0.0 );
|
||||
|
@ -464,12 +474,53 @@ void Driver::InitTrack(
|
|||
GfParmSetNum( hCarParm, SECT_CAR, PRM_FUEL, (char*) NULL, fuel );
|
||||
|
||||
m_Strategy.SetDamageLimits( m_priv[PATH_NORMAL].PIT_DAMAGE_WARN,
|
||||
m_priv[PATH_NORMAL].PIT_DAMAGE_DANGER );
|
||||
m_priv[PATH_NORMAL].PIT_DAMAGE_DANGER );
|
||||
|
||||
// override params for car type on track of specific race type.
|
||||
snprintf( buf, sizeof(buf), "%sdrivers/%s/%s/track-%s",
|
||||
GfDataDir(), MyBotName, m_carName, m_trackName );
|
||||
m_pathOffsets.setBaseFilename( buf );
|
||||
|
||||
// Get skill level
|
||||
|
||||
decel_adjust_perc = global_skill = skill = driver_aggression = 0.0;
|
||||
SetRandomSeed(10);
|
||||
|
||||
// load the global skill level, range 0 - 10
|
||||
snprintf(buf, sizeof(buf), "%sconfig/raceman/extra/skill.xml", GetLocalDir());
|
||||
void *skillHandle = GfParmReadFile(buf, GFPARM_RMODE_REREAD);
|
||||
|
||||
if(!skillHandle)
|
||||
{
|
||||
snprintf(buf, sizeof(buf), "%sconfig/raceman/extra/skill.xml", GetDataDir());
|
||||
skillHandle = GfParmReadFile(buf, GFPARM_RMODE_REREAD);
|
||||
}//if !skillHandle
|
||||
|
||||
if (skillHandle)
|
||||
{
|
||||
global_skill = GfParmGetNum(skillHandle, (char *)SECT_SKILL, (char *)PRV_SKILL_LEVEL, (char *) NULL, 30.0f);
|
||||
}
|
||||
|
||||
global_skill = MAX(0.0f, MIN(30.0f, global_skill));
|
||||
|
||||
LogSHADOW.info(" # Global Skill: %.3f\n", global_skill);
|
||||
|
||||
//load the driver skill level, range 0 - 1
|
||||
float driver_skill = 0.0f;
|
||||
snprintf(buf, sizeof(buf), "drivers/%s/%d/skill.xml", MyBotName, INDEX);
|
||||
LogSHADOW.info("Path skill driver: %s\n", buf);
|
||||
skillHandle = GfParmReadFile(buf, GFPARM_RMODE_STD);
|
||||
|
||||
if (skillHandle)
|
||||
{
|
||||
driver_skill = GfParmGetNum(skillHandle, SECT_SKILL, PRV_SKILL_LEVEL, (char *) NULL, 0.0);
|
||||
driver_aggression = GfParmGetNum(skillHandle, SECT_SKILL, PRV_SKILL_AGGRO, (char *)NULL, 0.0);
|
||||
driver_skill = (float)MIN(1.0, MAX(0.0, driver_skill));
|
||||
LogSHADOW.info(" # Global skill = %.2f - driver skill: %.2f - driver agression: %.2f\n", global_skill, driver_skill, driver_aggression);
|
||||
}
|
||||
|
||||
skill = (float)((global_skill + driver_skill * 2) * (1.0 + driver_skill));
|
||||
LogSHADOW.info(" # SHADOW Driver skill = %.2f\n", skill);
|
||||
}
|
||||
|
||||
// Start a new race.
|
||||
|
@ -481,12 +532,14 @@ void Driver::NewRace( int index, tCarElt* pCar, tSituation* pS )
|
|||
m_myOppIdx = -1;
|
||||
|
||||
for( int i = 0; i < m_nCars; i++ )
|
||||
{
|
||||
m_opp[i].Initialise( &m_track, pS->cars[i] );
|
||||
{
|
||||
m_opp[i].Initialise( &m_track, pS->cars[i] );
|
||||
|
||||
if( pS->cars[i] == pCar )
|
||||
m_myOppIdx = i;
|
||||
}
|
||||
if( pS->cars[i] == pCar )
|
||||
m_myOppIdx = i;
|
||||
}
|
||||
|
||||
pitsharing = CheckPitSharing(pCar);
|
||||
|
||||
m_cm[PATH_NORMAL].config( pCar );
|
||||
m_cm[PATH_LEFT] = m_cm[PATH_NORMAL];
|
||||
|
@ -967,7 +1020,7 @@ double Driver::SteerAngle0( tCarElt* car, PtInfo& pi, PtInfo& aheadPi, const Pri
|
|||
double frontSlipSide = (car->priv.wheel[0].slipSide + car->priv.wheel[1].slipSide) / 2;
|
||||
if( fabs(frontSlipSide) > 8 )
|
||||
LogSHADOW.debug( "slip: front(tan=%7.3f side=%7.3f) rear(tan=%7.3f side=%7.3f) acc(tan=%7.3f side=%7.3f) steer=%g\n",
|
||||
(car->priv.wheel[0].slipAccel + car->priv.wheel[1].slipAccel) / 2,
|
||||
(car->priv.wheel[0].slipAccel + car->priv.wheel[1].slipAccel) / 2,
|
||||
frontSlipSide,
|
||||
(car->priv.wheel[2].slipAccel + car->priv.wheel[3].slipAccel) / 2,
|
||||
(car->priv.wheel[2].slipSide + car->priv.wheel[3].slipSide) / 2,
|
||||
|
@ -984,8 +1037,8 @@ double Driver::SteerAngle0( tCarElt* car, PtInfo& pi, PtInfo& aheadPi, const Pri
|
|||
}
|
||||
|
||||
LogSHADOW.debug( "%4d o=%6.2f a=%6.3f ba=%6.3f oa=%6.3f oa2=%6.3f ada=%6.3f la=%6.3f %g,%g\n",
|
||||
pi.idx, delta, angle, basicAngle, omegaAngle, omegaAngle2, accDecAngle, lineAngle,
|
||||
m_avoidS, m_avoidT );
|
||||
pi.idx, delta, angle, basicAngle, omegaAngle, omegaAngle2, accDecAngle, lineAngle,
|
||||
m_avoidS, m_avoidT );
|
||||
|
||||
return angle;
|
||||
}
|
||||
|
@ -1195,7 +1248,7 @@ double Driver::SteerAngle3( tCarElt* car, PtInfo& pi, PtInfo& aheadPi )
|
|||
double frontSlipSide = (car->priv.wheel[0].slipSide + car->priv.wheel[1].slipSide) / 2;
|
||||
if( fabs(frontSlipSide) > 8 )
|
||||
LogSHADOW.debug( "slip: front(tan=%7.3f side=%7.3f) rear(tan=%7.3f side=%7.3f) acc(tan=%7.3f side=%7.3f) steer=%g\n",
|
||||
(car->priv.wheel[0].slipAccel + car->priv.wheel[1].slipAccel) / 2,
|
||||
(car->priv.wheel[0].slipAccel + car->priv.wheel[1].slipAccel) / 2,
|
||||
frontSlipSide,
|
||||
(car->priv.wheel[2].slipAccel + car->priv.wheel[3].slipAccel) / 2,
|
||||
(car->priv.wheel[2].slipSide + car->priv.wheel[3].slipSide) / 2,
|
||||
|
@ -1215,7 +1268,7 @@ double Driver::SteerAngle3( tCarElt* car, PtInfo& pi, PtInfo& aheadPi )
|
|||
|
||||
if( s > m_cm[PATH_NORMAL].TARGET_SLIP + 0.0004 )
|
||||
LogSHADOW.debug( "acc %6.2f zf %6.1f s %.6f v %6.2f sx %.6f sy %.6f\n",
|
||||
car->pub.DynGC.acc.x, zforce, s, v, sx, sy );
|
||||
car->pub.DynGC.acc.x, zforce, s, v, sx, sy );
|
||||
}
|
||||
|
||||
const double steerHardFactor = 0.3;
|
||||
|
@ -1841,15 +1894,15 @@ void Driver::launchControlClutch( tCarElt* car, tSituation* s )
|
|||
|
||||
static double lastSpd = 0;
|
||||
LogSHADOW.debug( "%1.3f,%d,%6.3f,%4.0f,%5.3f,%5.3f,%6.3f,%6.3f,%6.3f,%6.3f,%6.3f\n",
|
||||
s->currentTime,
|
||||
car->priv.gear,
|
||||
car->pub.speed,
|
||||
car->priv.enginerpm * 60 / (2 * PI),
|
||||
car->ctrl.accelCmd,
|
||||
car->ctrl.clutchCmd,
|
||||
(car->pub.DynGC.vel.x - lastSpd) / s->deltaTime,//car->pub.DynGC.acc.x,
|
||||
delta,
|
||||
car->priv.wheel[2].slipAccel,
|
||||
s->currentTime,
|
||||
car->priv.gear,
|
||||
car->pub.speed,
|
||||
car->priv.enginerpm * 60 / (2 * PI),
|
||||
car->ctrl.accelCmd,
|
||||
car->ctrl.clutchCmd,
|
||||
(car->pub.DynGC.vel.x - lastSpd) / s->deltaTime,//car->pub.DynGC.acc.x,
|
||||
delta,
|
||||
car->priv.wheel[2].slipAccel,
|
||||
(m_cm[PATH_NORMAL].wheel(2).slipX() + m_cm[PATH_NORMAL].wheel(3).slipX()) * 0.5,
|
||||
(wv - car->pub.DynGC.vel.x) / car->pub.DynGC.vel.x );
|
||||
lastSpd = car->pub.DynGC.vel.x;
|
||||
|
@ -1904,14 +1957,14 @@ void Driver::launchControlSimple( tCarElt* car, tSituation* s )
|
|||
_prevDelta = delta;
|
||||
|
||||
LogSHADOW.debug( "%1.3f,%d,%5.2f,%3.0f,%5.3f,%5.3f,%6.3f,%6.3f\n",
|
||||
s->currentTime,
|
||||
car->priv.gear,
|
||||
car->pub.speed,
|
||||
car->priv.enginerpm * 60 / (2 * PI),
|
||||
car->ctrl.accelCmd,
|
||||
car->ctrl.clutchCmd,
|
||||
car->pub.DynGC.acc.x,
|
||||
delta );
|
||||
s->currentTime,
|
||||
car->priv.gear,
|
||||
car->pub.speed,
|
||||
car->priv.enginerpm * 60 / (2 * PI),
|
||||
car->ctrl.accelCmd,
|
||||
car->ctrl.clutchCmd,
|
||||
car->pub.DynGC.acc.x,
|
||||
delta );
|
||||
}
|
||||
|
||||
void Driver::launchControlAcclerator( tCarElt* car, tSituation* s )
|
||||
|
@ -1979,7 +2032,7 @@ void Driver::launchControlAcclerator( tCarElt* car, tSituation* s )
|
|||
|
||||
if( accel )
|
||||
{
|
||||
if( s->currentTime >= 0.2 && car->priv.gear < 3 )
|
||||
if( s->currentTime >= 0.2 && car->priv.gear < 3 )
|
||||
{
|
||||
double slipErr = 4.0 - delta;
|
||||
car->ctrl.accelCmd = MX(0, MN(car->ctrl.accelCmd + 0.013 * slipErr - 0.05 * ddiff, 1.0));
|
||||
|
@ -2000,15 +2053,15 @@ void Driver::launchControlAcclerator( tCarElt* car, tSituation* s )
|
|||
|
||||
static double lastSpd = 0;
|
||||
LogSHADOW.debug( "%1.3f,%d,%6.3f,%4.0f,%5.3f,%5.3f,%6.3f,%6.3f,%6.3f,%6.3f,%6.3f\n",
|
||||
s->currentTime,
|
||||
car->priv.gear,
|
||||
car->pub.speed,
|
||||
car->priv.enginerpm * 60 / (2 * PI),
|
||||
car->ctrl.accelCmd,
|
||||
car->ctrl.clutchCmd,
|
||||
(car->pub.DynGC.vel.x - lastSpd) / s->deltaTime,//car->pub.DynGC.acc.x,
|
||||
delta,
|
||||
car->priv.wheel[2].slipAccel,
|
||||
s->currentTime,
|
||||
car->priv.gear,
|
||||
car->pub.speed,
|
||||
car->priv.enginerpm * 60 / (2 * PI),
|
||||
car->ctrl.accelCmd,
|
||||
car->ctrl.clutchCmd,
|
||||
(car->pub.DynGC.vel.x - lastSpd) / s->deltaTime,//car->pub.DynGC.acc.x,
|
||||
delta,
|
||||
car->priv.wheel[2].slipAccel,
|
||||
(m_cm[PATH_NORMAL].wheel(2).slipX() + m_cm[PATH_NORMAL].wheel(3).slipX()) * 0.5,
|
||||
(wv - car->pub.DynGC.vel.x) / car->pub.DynGC.vel.x );
|
||||
lastSpd = car->pub.DynGC.vel.x;
|
||||
|
@ -2080,7 +2133,7 @@ void Driver::launchControlAccSlip( tCarElt* car, tSituation* s )
|
|||
|
||||
if( accel )
|
||||
{
|
||||
if( s->currentTime >= 0.0 && car->priv.gear < 3 )
|
||||
if( s->currentTime >= 0.0 && car->priv.gear < 3 )
|
||||
{
|
||||
double targSpd = 0.195 * MX(5, car->pub.DynGC.vel.x);
|
||||
double slipErr = targSpd - delta;
|
||||
|
@ -2500,8 +2553,8 @@ void Driver::Drive( int index, tCarElt* car, tSituation* s )
|
|||
double load = cm.calcPredictedLoad(spd0, 1.0, cm.CA, pi.k, pp.kz, pp.kv, sin(pp.ar), cos(pp.ar), cos(pp.ap));
|
||||
double sysLoad = car->priv.reaction[0] + car->priv.reaction[1] + car->priv.reaction[2] + car->priv.reaction[3];
|
||||
LogSHADOW.debug( "[%d] load ratio %g %g path speed %g overspeed %g offset to path %g engine acc %g\n",
|
||||
pi.idx, load / opLoad, sysLoad / opLoad, pi.spd, spd0 - pi.spd, pi.offs + car->pub.trkPos.toMiddle,
|
||||
cm.AccForceFromSpeed(pp.accSpd) / (cm.MASS + cm.FUEL) );
|
||||
pi.idx, load / opLoad, sysLoad / opLoad, pi.spd, spd0 - pi.spd, pi.offs + car->pub.trkPos.toMiddle,
|
||||
cm.AccForceFromSpeed(pp.accSpd) / (cm.MASS + cm.FUEL) );
|
||||
}
|
||||
|
||||
double targetSpd = pi.spd;
|
||||
|
@ -2517,7 +2570,7 @@ void Driver::Drive( int index, tCarElt* car, tSituation* s )
|
|||
if( car->pub.speed > avoidTargetSpd && targetSpd > avoidTargetSpd )
|
||||
{
|
||||
LogSHADOW.debug( "[%d] slowing for avoidance. curr %g targ %g avoid spd %g, avoid acc %g, curr acc %g\n",
|
||||
car->index, car->pub.speed, targetSpd, avoidTargetSpd, avoidTargetAcc, car->pub.DynGC.acc.x );
|
||||
car->index, car->pub.speed, targetSpd, avoidTargetSpd, avoidTargetAcc, car->pub.DynGC.acc.x );
|
||||
slowing = true;
|
||||
}
|
||||
|
||||
|
@ -3335,3 +3388,116 @@ double Driver::ApplyTractionControl( tCarElt* car, double acc )
|
|||
|
||||
return acc;
|
||||
}
|
||||
|
||||
// Meteorology
|
||||
//--------------------------------------------------------------------------*
|
||||
void Driver::Meteorology(tTrack *t)
|
||||
{
|
||||
tTrackSeg *Seg;
|
||||
tTrackSurface *Surf;
|
||||
rainintensity = 0;
|
||||
weathercode = GetWeather(t);
|
||||
Seg = t->seg;
|
||||
|
||||
for ( int I = 0; I < t->nseg; I++)
|
||||
{
|
||||
Surf = Seg->surface;
|
||||
rainintensity = MAX(rainintensity, Surf->kFrictionDry / Surf->kFriction);
|
||||
LogSHADOW.debug("# %.4f, %.4f %s\n",Surf->kFriction, Surf->kRollRes, Surf->material);
|
||||
Seg = Seg->next;
|
||||
}
|
||||
|
||||
rainintensity -= 1;
|
||||
|
||||
if (rainintensity > 0)
|
||||
{
|
||||
rain = true;
|
||||
//mycardata->muscale *= 0.85;
|
||||
//mycardata->basebrake *= 0.75;
|
||||
//tcl_slip = MIN(tcl_slip, 2.0);
|
||||
}
|
||||
else
|
||||
rain = false;
|
||||
}
|
||||
|
||||
//==========================================================================*
|
||||
// Estimate weather
|
||||
//--------------------------------------------------------------------------*
|
||||
int Driver::GetWeather(tTrack *t)
|
||||
{
|
||||
return (t->local.rain << 4) + t->local.water;
|
||||
};
|
||||
|
||||
void Driver::calcSkill(tSituation *s)
|
||||
{
|
||||
//if (RM_TYPE_PRACTICE != racetype)
|
||||
if (skill_adjust_timer == -1.0 || s->currentTime - skill_adjust_timer > skill_adjust_limit)
|
||||
{
|
||||
double rand1 = (double) getRandom() / 65536.0; // how long we'll change speed for
|
||||
double rand2 = (double) getRandom() / 65536.0; // the actual speed change
|
||||
double rand3 = (double) getRandom() / 65536.0; // whether change is positive or negative
|
||||
|
||||
// acceleration to use in current time limit
|
||||
decel_adjust_targ = (skill/4 * rand1);
|
||||
|
||||
// brake to use - usually 1.0, sometimes less (more rarely on higher skill)
|
||||
brake_adjust_targ = MAX(0.85, 1.0 - MAX(0.0, skill/15 * (rand2-0.85)));
|
||||
|
||||
// how long this skill mode to last for
|
||||
skill_adjust_limit = 5.0 + rand3 * 50.0;
|
||||
skill_adjust_timer = simtime;
|
||||
}
|
||||
|
||||
/*if (decel_adjust_perc < decel_adjust_targ)
|
||||
decel_adjust_perc += MIN(deltaTime*4, decel_adjust_targ - decel_adjust_perc);
|
||||
else
|
||||
decel_adjust_perc -= MIN(deltaTime*4, decel_adjust_perc - decel_adjust_targ);
|
||||
|
||||
if (brake_adjust_perc < brake_adjust_targ)
|
||||
brake_adjust_perc += MIN(deltaTime*2, brake_adjust_targ - brake_adjust_perc);
|
||||
else
|
||||
brake_adjust_perc -= MIN(deltaTime*2, brake_adjust_perc - brake_adjust_targ);*/
|
||||
|
||||
LogSHADOW.debug("skill: decel %.3f - %.3f, brake %.3f - %.3f\n", decel_adjust_perc, decel_adjust_targ, brake_adjust_perc, brake_adjust_targ);
|
||||
}
|
||||
|
||||
void Driver::SetRandomSeed(unsigned int seed)
|
||||
{
|
||||
random_seed = seed ? seed : RANDOM_SEED;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
unsigned int Driver::getRandom()
|
||||
{
|
||||
random_seed = RANDOM_A * random_seed + RANDOM_C;
|
||||
LogSHADOW.debug("Random = %.3f\n", random_seed);
|
||||
|
||||
return (random_seed >> 16);
|
||||
}
|
||||
|
||||
//==========================================================================*
|
||||
// Check if pit sharing is activated
|
||||
//--------------------------------------------------------------------------*
|
||||
bool Driver::CheckPitSharing(tCarElt *car)
|
||||
{
|
||||
const tTrackOwnPit* OwnPit = car->_pit; // Get my pit
|
||||
|
||||
if (OwnPit == NULL) // If pit is NULL
|
||||
{ // nothing to do
|
||||
LogSHADOW.info(" #Pit = NULL\n\n"); // here
|
||||
return false;
|
||||
}
|
||||
|
||||
if (OwnPit->freeCarIndex > 1)
|
||||
{
|
||||
LogSHADOW.info(" #PitSharing = true\n\n");
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
LogSHADOW.info(" #PitSharing = false\n\n");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -158,6 +158,14 @@ private:
|
|||
double ApplyAbs( tCarElt* car, double brake );
|
||||
double ApplyTractionControl( tCarElt* car, double acc );
|
||||
|
||||
void Meteorology(tTrack *t);
|
||||
int GetWeather(tTrack *t);
|
||||
void calcSkill(tSituation *s);
|
||||
|
||||
void SetRandomSeed(unsigned int seed);
|
||||
unsigned int getRandom();
|
||||
bool CheckPitSharing(tCarElt *car);
|
||||
|
||||
private:
|
||||
enum // drive types
|
||||
{
|
||||
|
@ -429,30 +437,31 @@ private:
|
|||
}
|
||||
};
|
||||
|
||||
/*
|
||||
double FLY_HEIGHT;
|
||||
std::vector<double> FACTORS;
|
||||
int BUMP_MOD;
|
||||
int SPDC_NORMAL;
|
||||
int SPDC_TRAFFIC;
|
||||
double ACC_MAX_SPIN_SPEED;
|
||||
double DEC_MAX_SPIN_SPEED;
|
||||
double STEER_K_ACC;
|
||||
double STEER_K_DEC;
|
||||
double STAY_TOGETHER; // dist in m.
|
||||
double AVOID_WIDTH; // in m.
|
||||
double PIT_ENTRY_OFFSET; // dist in m.
|
||||
double PIT_EXIT_OFFSET; // dist in m.
|
||||
double SKID_FACTOR;
|
||||
double SKID_FACTOR_TRAFFIC;
|
||||
double TCL_TARGET_SPEED; // speed in m/s
|
||||
*/
|
||||
double START_HOLD_LINE_TIME; // hold inital line on track, in s.
|
||||
|
||||
Private m_priv[N_PATHS];
|
||||
|
||||
int m_driveType;
|
||||
double m_gearUpRpm; // for gear changing.
|
||||
|
||||
bool rain;
|
||||
double rainintensity;
|
||||
int weathercode; // Track specific weather
|
||||
|
||||
unsigned int random_seed;
|
||||
double simtime; // how long since the race started
|
||||
|
||||
double driver_aggression;
|
||||
double global_skill;
|
||||
double skill;
|
||||
double skill_adjust_limit;
|
||||
double skill_adjust_timer;
|
||||
double decel_adjust_targ;
|
||||
double decel_adjust_perc;
|
||||
double brake_adjust_targ;
|
||||
double brake_adjust_perc;
|
||||
bool pitsharing;
|
||||
|
||||
PidController m_lineControl; // controller for line error.
|
||||
PidController m_velAngControl; // controller for direction of car.
|
||||
PidController m_angControl; // controller for attack angle error.
|
||||
|
|
|
@ -264,35 +264,35 @@ void Driver::initTrack(tTrack* t, void *carHandle, void **carParmHandle, tSituat
|
|||
if (p)
|
||||
*p = '\0';
|
||||
|
||||
sprintf(buffer, "drivers/%s/%s/setup.xml", MyBotName, carName);
|
||||
//newParmHandle = GfParmReadFile(buffer, GFPARM_RMODE_STD);
|
||||
*carParmHandle = GfParmReadFile(buffer, GFPARM_RMODE_STD);
|
||||
sprintf(buffer, "drivers/%s/%s/setup.xml", MyBotName, carName);
|
||||
//newParmHandle = GfParmReadFile(buffer, GFPARM_RMODE_STD);
|
||||
*carParmHandle = GfParmReadFile(buffer, GFPARM_RMODE_STD);
|
||||
|
||||
if (*carParmHandle != NULL)
|
||||
{
|
||||
m_fuelPerMeter = GfParmGetNum(*carParmHandle, SECT_PRIVATE, BT_ATT_FUELPERMETER, (char*)NULL, 0.00068);
|
||||
modeVerbose = (int)GfParmGetNum(*carParmHandle, SECT_PRIVATE, PRV_VERBOSE, (char*)NULL, 0.0);
|
||||
displaySetting = (int)GfParmGetNum(*carParmHandle, SECT_PRIVATE, PRV_DISPLAYSETTING, (char*)NULL, 0.0);
|
||||
m_testPitstop = (int)GfParmGetNum(*carParmHandle, SECT_PRIVATE, PRV_PIT_TEST, (char*)NULL, 0.0);
|
||||
m_testQualifTime = (int)GfParmGetNum(*carParmHandle, SECT_PRIVATE, PRV_QUALIF_TEST, (char*)NULL, 0.0);
|
||||
m_lineIndex = (int)GfParmGetNum(*carParmHandle, SECT_PRIVATE, PRV_LINE_INDEX, (char*)NULL, 0.0);
|
||||
m_strategyverbose = (int)GfParmGetNum(*carParmHandle, SECT_PRIVATE, PRV_STRATEGY_VERBOSE, (char*)NULL, 0.0);
|
||||
m_steerverbose = (int)GfParmGetNum(*carParmHandle, SECT_PRIVATE, PRV_STEER_VERBOSE, (char*)NULL, 0.0);
|
||||
newParmHandle = *carParmHandle;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_fuelPerMeter = 0.00068;
|
||||
m_fuelStrat = 1;
|
||||
m_maxDammage = 5000;
|
||||
m_testPitstop = 0;
|
||||
m_testQualifTime = 0;
|
||||
m_lineIndex = 0;
|
||||
m_strategyverbose = 0;
|
||||
m_steerverbose = 0;
|
||||
modeVerbose = 0;
|
||||
displaySetting = 0;
|
||||
}
|
||||
if (*carParmHandle != NULL)
|
||||
{
|
||||
m_fuelPerMeter = GfParmGetNum(*carParmHandle, SECT_PRIVATE, BT_ATT_FUELPERMETER, (char*)NULL, 0.00068);
|
||||
modeVerbose = (int)GfParmGetNum(*carParmHandle, SECT_PRIVATE, PRV_VERBOSE, (char*)NULL, 0.0);
|
||||
displaySetting = (int)GfParmGetNum(*carParmHandle, SECT_PRIVATE, PRV_DISPLAYSETTING, (char*)NULL, 0.0);
|
||||
m_testPitstop = (int)GfParmGetNum(*carParmHandle, SECT_PRIVATE, PRV_PIT_TEST, (char*)NULL, 0.0);
|
||||
m_testQualifTime = (int)GfParmGetNum(*carParmHandle, SECT_PRIVATE, PRV_QUALIF_TEST, (char*)NULL, 0.0);
|
||||
m_lineIndex = (int)GfParmGetNum(*carParmHandle, SECT_PRIVATE, PRV_LINE_INDEX, (char*)NULL, 0.0);
|
||||
m_strategyverbose = (int)GfParmGetNum(*carParmHandle, SECT_PRIVATE, PRV_STRATEGY_VERBOSE, (char*)NULL, 0.0);
|
||||
m_steerverbose = (int)GfParmGetNum(*carParmHandle, SECT_PRIVATE, PRV_STEER_VERBOSE, (char*)NULL, 0.0);
|
||||
newParmHandle = *carParmHandle;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_fuelPerMeter = 0.00068;
|
||||
m_fuelStrat = 1;
|
||||
m_maxDammage = 5000;
|
||||
m_testPitstop = 0;
|
||||
m_testQualifTime = 0;
|
||||
m_lineIndex = 0;
|
||||
m_strategyverbose = 0;
|
||||
m_steerverbose = 0;
|
||||
modeVerbose = 0;
|
||||
displaySetting = 0;
|
||||
}
|
||||
|
||||
*carParmHandle = NULL;
|
||||
switch (s->_raceType)
|
||||
|
@ -326,9 +326,10 @@ void Driver::initTrack(tTrack* t, void *carHandle, void **carParmHandle, tSituat
|
|||
if (*carParmHandle == NULL)
|
||||
{
|
||||
std::cout << "Can't load the xml! " << buffer << std::endl;
|
||||
sprintf(buffer, "drivers/%s/%s/setup.xml", MyBotName, carName);
|
||||
sprintf(buffer, "drivers/%s/%s/default.xml", MyBotName, carName);
|
||||
LogUSR.info("Loading in defaut : %s\n", buffer);
|
||||
*carParmHandle = GfParmReadFile(buffer, GFPARM_RMODE_STD);
|
||||
|
||||
if (*carParmHandle)
|
||||
LogUSR.info("Default XML loaded in : %s\n", buffer);
|
||||
}
|
||||
|
@ -433,18 +434,18 @@ void Driver::initTrack(tTrack* t, void *carHandle, void **carParmHandle, tSituat
|
|||
raceline->setOverrides(overrideCollection);
|
||||
}
|
||||
|
||||
LogUSR.info("MU FACTOR = %.3f\n", MU_FACTOR);
|
||||
LogUSR.info("FUEL FACTOR = %.3f\n", FUEL_FACTOR);
|
||||
LogUSR.info("Max Damage = %.3f\n", m_maxDammage);
|
||||
LogUSR.info("Gear Shift = %.3f\n", gear_shift);
|
||||
LogUSR.info("MU FACTOR = %.3f\n", MU_FACTOR);
|
||||
LogUSR.info("FUEL FACTOR = %.3f\n", FUEL_FACTOR);
|
||||
LogUSR.info("Max Damage = %.3f\n", m_maxDammage);
|
||||
LogUSR.info("Gear Shift = %.3f\n", gear_shift);
|
||||
LogUSR.info("Brake Delay = %.3f\n", brakedelay);
|
||||
LogUSR.info("Corner Speed = %.3f\n", CornerSpeed);
|
||||
LogUSR.info("Corner Speed mid = %.3f\n", CornerSpeedMid);
|
||||
LogUSR.info("Corner Speed Low = %.3f\n", CornerSpeedSlow);
|
||||
LogUSR.info("TCL SLIP = %.3f\n", tcl_slip);
|
||||
LogUSR.info("TCL RANGE = %.3f\n", tcl_range);
|
||||
LogUSR.info("ABS SLIP = %.3f\n", abs_slip);
|
||||
LogUSR.info("ABS RANGE = %.3f\n", abs_range);
|
||||
LogUSR.info("TCL SLIP = %.3f\n", tcl_slip);
|
||||
LogUSR.info("TCL RANGE = %.3f\n", tcl_range);
|
||||
LogUSR.info("ABS SLIP = %.3f\n", abs_slip);
|
||||
LogUSR.info("ABS RANGE = %.3f\n", abs_range);
|
||||
|
||||
// Get skill level
|
||||
|
||||
|
@ -556,7 +557,7 @@ void Driver::newRace(tCarElt* car, tSituation *s)
|
|||
|
||||
strategy->setOpponents(opponents);
|
||||
strategy->setTrack(track);
|
||||
strategy->setCarData(mycardata);
|
||||
strategy->setCarData(mycardata);
|
||||
|
||||
// Set team mate.
|
||||
opponents->setTeamMate(car->_teamname);
|
||||
|
|
Loading…
Reference in a new issue