add weather to USR and setup for corkscrew & espie

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

Former-commit-id: 81b65343e1ccebd7d8b72cf87b823e0f63848141
Former-commit-id: 3cbef248cab6fbd63a6ce512a73824234203e617
This commit is contained in:
torcs-ng 2013-05-28 20:36:14 +00:00
parent b24d454a21
commit e8b4fe1213
5 changed files with 155 additions and 89 deletions

View file

@ -140,48 +140,48 @@ float SingleCardata::getSpeed(tCarElt *car, float ltrackangle)
void SingleCardata::init( CarElt *pcar )
{
car = pcar;
for (int i=0; i<4; i++)
{
corner1[i].ax = corner2[i].ax = car->_corner_x(i);
corner1[i].ay = corner2[i].ay = car->_corner_y(i);
}
lastspeed[0].ax = lastspeed[1].ax = lastspeed[2].ax = car->_speed_X;
lastspeed[0].ay = lastspeed[1].ay = lastspeed[2].ay = car->_speed_Y;
car = pcar;
for (int i=0; i<4; i++)
{
corner1[i].ax = corner2[i].ax = car->_corner_x(i);
corner1[i].ay = corner2[i].ay = car->_corner_y(i);
}
lastspeed[0].ax = lastspeed[1].ax = lastspeed[2].ax = car->_speed_X;
lastspeed[0].ay = lastspeed[1].ay = lastspeed[2].ay = car->_speed_Y;
}
Cardata::Cardata(tSituation *s)
{
ncars = s->_ncars;
data = new SingleCardata[ncars];
int i;
for (i = 0; i < ncars; i++) {
for (i = 0; i < ncars; i++)
{
data[i].init(s->cars[i]);
}
}
Cardata::~Cardata()
{
delete [] data;
delete [] data;
}
void Cardata::update()
{
int i;
for (i = 0; i < ncars; i++) {
data[i].update();
}
int i;
for (i = 0; i < ncars; i++)
{
data[i].update();
}
}
SingleCardata *Cardata::findCar(tCarElt *car)
{
int i;
for (i = 0; i < ncars; i++) {
if (data[i].thisCar(car)) {
for (i = 0; i < ncars; i++)
{
if (data[i].thisCar(car))
{
return &data[i];
}
}

View file

@ -35,23 +35,24 @@
#include "linalg.h"
class SingleCardata {
public:
void init(CarElt *car);
class SingleCardata
{
public:
void init(CarElt *car);
inline float getSpeedInTrackDirection() { return speed; }
inline float getWidthOnTrack() { return width; }
inline float getLengthOnTrack() { return length; }
inline float getTrackangle() { return trackangle; }
inline float getCarAngle() { return angle; }
inline float getTrueSpeed() { return truespeed; }
inline float getSpeedInTrackDirection() { return speed; }
inline float getWidthOnTrack() { return width; }
inline float getLengthOnTrack() { return length; }
inline float getTrackangle() { return trackangle; }
inline float getCarAngle() { return angle; }
inline float getTrueSpeed() { return truespeed; }
inline bool thisCar(tCarElt *car) { return (car == this->car); }
inline tPosd *getCorner1() { return corner1; }
inline tPosd *getCorner2() { return corner2; }
inline tPosd *getLastSpeed() { return lastspeed; }
inline double getSpeedDeltaX() { return (car->_speed_X - lastspeed[1].ax)*0.7 + (lastspeed[1].ax-lastspeed[2].ax)/4; }
inline double getSpeedDeltaY() { return (car->_speed_Y - lastspeed[1].ay)*0.7 + (lastspeed[1].ay-lastspeed[2].ay)/4; }
inline bool thisCar(tCarElt *car) { return (car == this->car); }
inline tPosd *getCorner1() { return corner1; }
inline tPosd *getCorner2() { return corner2; }
inline tPosd *getLastSpeed() { return lastspeed; }
inline double getSpeedDeltaX() { return (car->_speed_X - lastspeed[1].ax)*0.7 + (lastspeed[1].ax-lastspeed[2].ax)/4; }
inline double getSpeedDeltaY() { return (car->_speed_Y - lastspeed[1].ay)*0.7 + (lastspeed[1].ay-lastspeed[2].ay)/4; }
inline float toLftWall() { return tolftwall; }
inline float toRgtWall() { return torgtwall; }
inline float getDistFromStart() { return car->_distFromStartLine; }
@ -72,9 +73,9 @@ class SingleCardata {
float tolftwall; // how far to the nearest left barrier
float torgtwall; // how far to the nearest Right barrier
tPosd corner1[4];
tPosd corner2[4];
tPosd lastspeed[3];
tPosd corner1[4];
tPosd corner2[4];
tPosd lastspeed[3];
tCarElt *car; // For identification.
};

View file

@ -200,7 +200,8 @@ Driver::Driver(int index, const int robot_type) :
cmd_steer(0.0f),
cmd_gear(0),
cmd_clutch(0.0f),
cmd_light(0.0f)
cmd_light(0.0f),
rain(0)
{
INDEX = index;
@ -289,14 +290,17 @@ void Driver::initTrack(tTrack* t, void *carHandle, void **carParmHandle, tSituat
// load the global skill level, range 0 - 10
snprintf(buffer, BUFSIZE, "%sconfig/raceman/extra/skill.xml", GetLocalDir());
void *skillHandle = GfParmReadFile(buffer, GFPARM_RMODE_REREAD);
if(!skillHandle) {
if(!skillHandle)
{
snprintf(buffer, BUFSIZE, "%sconfig/raceman/extra/skill.xml", GetDataDir());
skillHandle = GfParmReadFile(buffer, GFPARM_RMODE_REREAD);
}//if !skillHandle
if (skillHandle) {
if (skillHandle)
{
global_skill = GfParmGetNum(skillHandle, (char *)SECT_SKILL, (char *)PRV_SKILL_LEVEL, (char *) NULL, 10.0f);
}
global_skill = MAX(0.0f, MIN(10.0f, global_skill));
//load the driver skill level, range 0 - 1
@ -333,46 +337,57 @@ void Driver::initTrack(tTrack* t, void *carHandle, void **carParmHandle, tSituat
if (p) *p = '\0';
}
snprintf(buffer, BUFSIZE, "drivers/%s/%s/default.xml", robot_name, carName);
rain = getWeather();
if (rain == 0)
snprintf(buffer, BUFSIZE, "drivers/%s/%s/default.xml", robot_name, carName);
else if (rain == 1)
snprintf(buffer, BUFSIZE, "drivers/%s/%s/default-r1.xml", robot_name, carName);
else if (rain == 2)
snprintf(buffer, BUFSIZE, "drivers/%s/%s/default-r2.xml", robot_name, carName);
else if (rain == 3)
snprintf(buffer, BUFSIZE, "drivers/%s/%s/default-r3.xml", robot_name, carName);
*carParmHandle = GfParmReadFile(buffer, GFPARM_RMODE_STD);
void *newhandle;
#if 0
switch (s->_raceType) {
case RM_TYPE_PRACTICE:
snprintf(buffer, BUFSIZE, "drivers/%s/%s/practice/%s.xml", robot_name, carName, trackname);
break;
case RM_TYPE_QUALIF:
snprintf(buffer, BUFSIZE, "drivers/%s/%s/qualifying/%s.xml", robot_name, carName, trackname);
break;
case RM_TYPE_RACE:
snprintf(buffer, BUFSIZE, "drivers/%s/%s/race/%s.xml", robot_name, carName, trackname);
break;
default:
break;
}
#endif
snprintf(buffer, BUFSIZE, "drivers/%s/%s/%s.xml", robot_name, carName, trackname);
if (rain == 0)
snprintf(buffer, BUFSIZE, "drivers/%s/%s/%s.xml", robot_name, carName, trackname);
else if (rain == 1)
snprintf(buffer, BUFSIZE, "drivers/%s/%s/%s-r1.xml", robot_name, carName, trackname);
else if (rain == 2)
snprintf(buffer, BUFSIZE, "drivers/%s/%s/%s-r2.xml", robot_name, carName, trackname);
else if (rain == 3)
snprintf(buffer, BUFSIZE, "drivers/%s/%s/%s-r3.xml", robot_name, carName, trackname);
newhandle = GfParmReadFile(buffer, GFPARM_RMODE_STD);
if (newhandle)
{
if (*carParmHandle)
*carParmHandle = GfParmMergeHandles(*carParmHandle, newhandle, (GFPARM_MMODE_SRC|GFPARM_MMODE_DST|GFPARM_MMODE_RELSRC|GFPARM_MMODE_RELDST));
else
*carParmHandle = newhandle;
}
else
{
snprintf(buffer, BUFSIZE, "drivers/%s/%s/%s.xml", robot_name, carName, trackname);
newhandle = GfParmReadFile(buffer, GFPARM_RMODE_STD);
if (newhandle)
{
if (*carParmHandle)
*carParmHandle = GfParmMergeHandles(*carParmHandle, newhandle, (GFPARM_MMODE_SRC|GFPARM_MMODE_DST|GFPARM_MMODE_RELSRC|GFPARM_MMODE_RELDST));
else
*carParmHandle = newhandle;
}
}
else
{
if (rain == 0)
snprintf(buffer, BUFSIZE, "drivers/%s/%s/%s.xml", robot_name, carName, trackname);
else if (rain == 1)
snprintf(buffer, BUFSIZE, "drivers/%s/%s/%s-r1.xml", robot_name, carName, trackname);
else if (rain == 2)
snprintf(buffer, BUFSIZE, "drivers/%s/%s/%s-r2.xml", robot_name, carName, trackname);
else if (rain == 3)
snprintf(buffer, BUFSIZE, "drivers/%s/%s/%s-r3.xml", robot_name, carName, trackname);
//snprintf(buffer, BUFSIZE, "drivers/%s/%s/%s.xml", robot_name, carName, trackname);
newhandle = GfParmReadFile(buffer, GFPARM_RMODE_STD);
if (newhandle)
{
if (*carParmHandle)
*carParmHandle = GfParmMergeHandles(*carParmHandle, newhandle, (GFPARM_MMODE_SRC|GFPARM_MMODE_DST| GFPARM_MMODE_RELSRC|GFPARM_MMODE_RELDST));
else
*carParmHandle = newhandle;
}
}
// Create a pit stop strategy object.
@ -410,8 +425,9 @@ void Driver::initTrack(tTrack* t, void *carHandle, void **carParmHandle, tSituat
NoTeamWaiting = (int) GfParmGetNum( *carParmHandle, SECT_PRIVATE, PRV_NO_TEAM_WAITING, (char *)NULL, 1.0f );
TeamWaitTime = GfParmGetNum( *carParmHandle, SECT_PRIVATE, PRV_TEAM_WAIT_TIME, (char *)NULL, 0.0f);
YawRateAccel = GfParmGetNum( *carParmHandle, SECT_PRIVATE, PRV_YAW_RATE_ACCEL, (char *)NULL, 0.0f);
BrakeScale = GfParmGetNum( *carParmHandle, SECT_PRIVATE, PRV_BRAKE_SCALE, (char *)NULL, 1.0f);
double brkpressure = GfParmGetNum( *carParmHandle, SECT_BRKSYST, PRM_BRKPRESS, (char *) NULL, 0.0f ) / 1000;
double brkpressure = (GfParmGetNum( *carParmHandle, SECT_BRKSYST, PRM_BRKPRESS, (char *) NULL, 0.0f ) / 1000) * BrakeScale;
brakeratio -= MIN(0.5, MAX(0.0, brkpressure - 20000.0) / 100000);
for (i=0; i<6; i++)
@ -469,7 +485,8 @@ void Driver::LoadDAT( tSituation *s, char *carname, char *trackname )
FILE *fp;
char buffer[1024+1];
switch (s->_raceType) {
switch (s->_raceType)
{
case RM_TYPE_PRACTICE:
snprintf(buffer, 1024, "drivers/%s/%s/practice/%s.dat", robot_name, carname, trackname);
break;
@ -503,8 +520,8 @@ void Driver::LoadDAT( tSituation *s, char *carname, char *trackname )
char *p = buffer + (len-1);
while (p >= buffer && (*p == 10 || *p == 13))
{
*p = 0;
p--;
*p = 0;
p--;
}
if (p <= buffer)
continue;
@ -1015,14 +1032,12 @@ void Driver::shutdown()
#endif
}
/***************************************************************************
*
* utility functions
*
***************************************************************************/
void Driver::computeRadius(float *radius)
{
float lastturnarc = 0.0f;
@ -1032,44 +1047,52 @@ void Driver::computeRadius(float *radius)
currentseg = startseg;
do {
if (currentseg->type == TR_STR) {
if (currentseg->type == TR_STR)
{
lastsegtype = TR_STR;
radius[currentseg->id] = FLT_MAX;
} else {
if (currentseg->type != lastsegtype) {
} else
{
if (currentseg->type != lastsegtype)
{
float arc = 0.0f;
tTrackSeg *s = currentseg;
lastsegtype = currentseg->type;
while (s->type == lastsegtype && arc < PI/2.0f) {
while (s->type == lastsegtype && arc < PI/2.0f)
{
arc += s->arc;
s = s->next;
}
lastturnarc = (float) (arc/(PI/2.0f));
}
radius[currentseg->id] = (float) (currentseg->radius + currentseg->width/2.0)/lastturnarc;
}
currentseg = currentseg->next;
} while (currentseg != startseg);
}
// Compute the length to the end of the segment.
float Driver::getDistToSegEnd()
{
if (car->_trkPos.seg->type == TR_STR) {
if (car->_trkPos.seg->type == TR_STR)
{
return car->_trkPos.seg->length - car->_trkPos.toStart;
} else {
} else
{
return (car->_trkPos.seg->arc - car->_trkPos.toStart)*car->_trkPos.seg->radius;
}
}
// Compute fitting acceleration.
float Driver::getAccel()
{
if (car->_gear > 0) {
if (car->_gear > 0)
{
accelcmd = MIN(1.0f, accelcmd);
if (pit->getInPit() && car->_brakeCmd == 0.0f)
@ -1092,12 +1115,12 @@ float Driver::getAccel()
accelcmd = MAX(0.0f, MIN(accelcmd, 1.0f - currentspeed/100.0f * fabs(angle)));
return accelcmd;
} else {
} else
{
return 1.0;
}
}
// If we get lapped reduce accelerator.
float Driver::filterOverlap(float accel)
{
@ -1108,7 +1131,8 @@ float Driver::filterOverlap(float accel)
return accel;
}
for (i = 0; i < opponents->getNOpponents(); i++) {
for (i = 0; i < opponents->getNOpponents(); i++)
{
if (opponent[i].getState() & OPP_LETPASS)
{
return accel*0.4f;
@ -3660,7 +3684,6 @@ float Driver::filterTCL_4WD()
car->_wheelRadius(REAR_LFT)) / 4.0f;
}
// Hold car on the track.
float Driver::filterTrk(float accel)
{
@ -3712,3 +3735,38 @@ float Driver::brakedist(float allowedspeed, float mu)
return (float)((-log((c + v2sqr*d)/(c + v1sqr*d))/(2.0f*d)) + 1.0);
}
unsigned int Driver::getWeather()
{
// Detect Weather condition track
tTrackSeg *Seg;
tTrackSurface *Surf;
float mRainIntensity = 0.0f;
unsigned int mRain = 0;
Seg = track->seg;
for ( int I = 0; I < track->nseg; I++)
{
Surf = Seg->surface;
mRainIntensity = MAX(mRainIntensity, Surf->kFrictionDry / Surf->kFriction);
Seg = Seg->next;
}
mRainIntensity -= 1;
GfOut("#mRainIntensity BIPBIP: %g\n", mRainIntensity);
if (mRainIntensity > 0)
{
if (mRainIntensity > 0 && mRainIntensity < 0.2)
mRain = 1;
else if (mRainIntensity > 0.2 && mRainIntensity < 0.4)
mRain = 2;
else if (mRainIntensity > 0.4)
mRain = 3;
}
else
mRain = 0;
GfOut("#Rain BIPBIP: %d\n", mRain);
return mRain;
}

View file

@ -142,6 +142,7 @@ class Driver {
int isAlone();
void SetRandomSeed( unsigned int seed );
unsigned int getRandom();
unsigned int getWeather();
float stuckSteering( float steercmd );
// Per robot global data.
@ -157,6 +158,7 @@ class Driver {
float AbsRange;
float OversteerASR;
float BrakeMu;
float BrakeScale;
float YawRateAccel;
int AccelMod;
unsigned int random_seed;
@ -300,6 +302,8 @@ class Driver {
float cmd_clutch;
float cmd_light;
unsigned int rain;
float (Driver::*GET_DRIVEN_WHEEL_SPEED)();
static Cardata *cardata; // Data about all cars shared by all instances.

View file

@ -107,7 +107,9 @@
#define PRV_ABS_RANGE "abs range"
#define PRV_OVERSTEER_ASR "oversteer asr"
#define PRV_BRAKE_MU "brake mu"
#define PRV_BRAKE_SCALE "brake scale"
#define PRV_FUEL_PER_LAP "fuel per lap"
#define PRV_FUEL_PER_SECOND "fuel per second"
#define PRV_YAW_RATE_ACCEL "yaw rate accel"
#define PRV_MAX_FUEL "max fuel"
#define PRV_BRAKE_MARGIN "brake margin"
@ -119,6 +121,7 @@
#define BT_SECT_PRIV "private"
#define BT_ATT_FUELPERLAP "fuelperlap"
#define BT_ATT_FUELPERSECOND "fuelpersecond"
#define BT_ATT_MUFACTOR "mufactor"
#define BT_ATT_PITTIME "pittime"
#define BT_ATT_BESTLAP "bestlap"