forked from speed-dreams/speed-dreams-code
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:
parent
b24d454a21
commit
e8b4fe1213
5 changed files with 155 additions and 89 deletions
|
@ -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];
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
Loading…
Reference in a new issue