Made simplix able to use tyreCondition and new gear shifting option

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

Former-commit-id: 85c796e1fd2c08d28aeb52cb4e5c111186d53e11
Former-commit-id: 398e13e3cb290304bd8bb9c4267b37f3689006a7
This commit is contained in:
wdbee 2014-11-19 06:57:47 +00:00
parent 4ac70c32a0
commit 1980d202f5
7 changed files with 154 additions and 33 deletions

View file

@ -10,7 +10,7 @@
// File : unitclothoid.cpp
// Created : 2007.11.25
// Last changed : 2013.03.02
// Copyright : © 2007-2013 Wolf-Dieter Beelitz
// Copyright : 2007-2013 Wolf-Dieter Beelitz
// eMail : wdb@wdbee.de
// Version : 4.00.000
//--------------------------------------------------------------------------*

View file

@ -90,6 +90,7 @@ const char* TDriver::MyBotName = "simplix"; // Name of this bot
const char* TDriver::ROBOT_DIR = "drivers/simplix";// Sub path to dll
const char* TDriver::SECT_PRIV = "simplix private";// Private section
const char* TDriver::DEFAULTCARTYPE = "car1-trb1";// Default car type
int TDriver::RobotType = 0;
bool TDriver::AdvancedParameters = false; // Advanced parameters
bool TDriver::UseOldSkilling = false; // Use old skilling
bool TDriver::UseSCSkilling = false; // Use supercar skilling
@ -293,6 +294,7 @@ TDriver::TDriver(int Index):
oCarHasABS(false),
oCarHasESP(false),
oCarHasTCL(false),
oCarHasTYC(false),
oTclRange(10.0),
oTclSlip(1.6),
oTclFactor(1.0),
@ -380,6 +382,7 @@ TDriver::TDriver(int Index):
oSideScaleMu(0.97f),
oSideScaleBrake(0.97f),
oSideBorderOuter(0.2f),
oSideBorderInner(0.2f),
oXXX(1.0),
oRain(false),
oRainIntensity(0.0),
@ -423,6 +426,8 @@ TDriver::TDriver(int Index):
TDriver::LengthMargin = LENGTH_MARGIN; // Initialize safty margin
// oLastUsedGear = 0;
LogSimplix.debug("\n#<<< TDriver::TDriver()\n\n");
}
//==========================================================================*
@ -732,9 +737,9 @@ void TDriver::AdjustDriving(
LogSimplix.debug("#oInitialBrakeCoeff %g\n",oInitialBrakeCoeff);
}
oLookAheadFactor =
oLookAheadFactor = MIN(0.2,
GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_LOOKAHEADFACTOR,0,
(float)oLookAheadFactor);
(float)oLookAheadFactor));
LogSimplix.debug("#LookAheadFactor %g\n",oLookAheadFactor);
oScaleSteer =
@ -755,35 +760,45 @@ void TDriver::AdjustDriving(
const char *enabling;
oCarHasTYC = false;
enabling = GfParmGetStr(Handle, SECT_FEATURES, PRM_TIRETEMPDEG, VAL_NO);
if (strcmp(enabling, VAL_YES) == 0)
{
oCarHasTYC = true;
LogSimplix.warning("#Car has TYC yes\n");
}
else
LogSimplix.warning("#Car has TYC no\n");
oCarHasABS = false;
enabling = GfParmGetStr(Handle, SECT_FEATURES, PRM_ABSINSIMU, VAL_NO);
if (strcmp(enabling, VAL_YES) == 0)
{
oCarHasABS = true;
LogSimplix.info("#Car has ABS yes\n");
LogSimplix.warning("#Car has ABS yes\n");
}
else
LogSimplix.info("#Car has ABS no\n");
LogSimplix.warning("#Car has ABS no\n");
oCarHasESP = false;
enabling = GfParmGetStr(Handle, SECT_FEATURES, PRM_ESPINSIMU, VAL_NO);
if (strcmp(enabling, VAL_YES) == 0)
{
oCarHasESP = true;
LogSimplix.info("#Car has ESP yes\n");
LogSimplix.warning("#Car has ESP yes\n");
}
else
LogSimplix.info("#Car has ESP no\n");
LogSimplix.warning("#Car has ESP no\n");
oCarHasTCL = false;
enabling = GfParmGetStr(Handle, SECT_FEATURES, PRM_TCLINSIMU, VAL_NO);
if (strcmp(enabling, VAL_YES) == 0)
{
oCarHasABS = true;
LogSimplix.info("#Car has TCL yes\n");
LogSimplix.warning("#Car has TCL yes\n");
}
else
LogSimplix.info("#Car has TCL no\n");
LogSimplix.warning("#Car has TCL no\n");
// For test of simu options override switches here
/*
@ -1575,6 +1590,7 @@ void TDriver::Drive()
oBrake = FilterBrakeSpeed(oBrake);
if (!oCarHasABS)
oBrake = FilterABS(oBrake);
oBrake = FilterSkillBrake(oBrake);
//if (oBrake > 0.10)
// oClutch = 0.4;
@ -1612,9 +1628,14 @@ void TDriver::Drive()
CarGearCmd = oGear;
CarSteerCmd = (float) oSteer;
CarSteerTelemetrie = oTelemetrieMode;
//oLastUsedGear = MIN(1,oGear);
if (oTelemetrieMode == 4)
fprintf(stderr,"A%+7.2f%% B%+7.2f%% C%+7.2f%% S%+7.2f%% G:%d\n",100*oAccel,100*oBrake,100*oClutch,100*oSteer,oGear);
/*
double Radius = 1/oLanePoint.Crv;
fprintf(stderr,"R:%+7.2f\n",Radius);
*/
// SIMUV4 ...
if (oWingControl)
@ -1846,6 +1867,7 @@ void TDriver::FindRacinglines()
Param.oCarParam2.oScaleBrake = // Adjust brake scale
oSideScaleBrake*Param.oCarParam.oScaleBrake; // to be able to avoid
Param.Fix.oBorderOuter += oSideBorderOuter;
Param.Fix.oBorderInner += oSideBorderInner;
if (oGeneticOpti ||
!oRacingLine[oRL_LEFT].LoadSmoothPath // Load a smooth path
@ -2555,7 +2577,7 @@ void TDriver::InitCw()
//--------------------------------------------------------------------------*
double TDriver::GearRatio()
{
return CarGearRatio[UsedGear + CarGearOffset];
return CarGearRatio[oUsedGear + CarGearOffset];
}
//==========================================================================*
@ -2564,7 +2586,7 @@ double TDriver::GearRatio()
//--------------------------------------------------------------------------*
double TDriver::PrevGearRatio()
{
return CarGearRatio[UsedGear + CarGearOffset-1];
return CarGearRatio[oUsedGear + CarGearOffset-1];
}
//==========================================================================*
@ -2573,7 +2595,7 @@ double TDriver::PrevGearRatio()
//--------------------------------------------------------------------------*
double TDriver::NextGearRatio()
{
return CarGearRatio[UsedGear + CarGearOffset+1];
return CarGearRatio[oUsedGear + CarGearOffset+1];
}
//==========================================================================*
@ -2924,26 +2946,32 @@ bool TDriver::EcoShift()
//--------------------------------------------------------------------------*
void TDriver::GearTronic()
{
if ((oJumping > 0.0) && (UsedGear > 0))
oUsedGear = oCar->_gear;
if (oCar->_gearNext != 0)
oUsedGear = oCar->_gearNext;
if ((oJumping > 0.0) && (oUsedGear > 0))
return;
if (IsTickover)
if (oUsedGear <= 0)
{
oGear = 1;
// if (oLastUsedGear <= 0)
oGear = 1;
}
else
{
if((UsedGear < oLastGear)
if((oUsedGear < oLastGear)
&& (EcoShift() || (GearRatio() * CarSpeedLong / oWheelRadius > NextRpm)))
{
oUnstucking = false;
TreadClutch;
oGear = NextGear;
}
else if(UsedGear > 1)
else if(oUsedGear > 1)
{
double PrevRpm =
oShift[UsedGear-1] * oShiftMargin
oShift[oUsedGear-1] * oShiftMargin
* GearRatio() / PrevGearRatio();
if(GearRatio() * CarSpeedLong / oWheelRadius < PrevRpm)
@ -3138,10 +3166,12 @@ double TDriver::SteerAngle(TLanePoint& AheadPointInfo)
AheadDist = 1.5 + oCurrSpeed * 0.04;
if (oGoToPit)
AheadDist = 2.0;
/*
if (AheadDist < oLastAheadDist - 0.05)
AheadDist = oLastAheadDist - 0.05;
else if (AheadDist > oLastAheadDist + 0.05)
AheadDist = oLastAheadDist + 0.05;
*/
oLastAheadDist = AheadDist;
double AheadPos = oTrackDesc.CalcPos(oCar, AheadDist);
@ -4009,7 +4039,22 @@ double TDriver::FilterBrake(double Brake)
double TDriver::FilterSkillBrake(double Brake)
{
//Brake *= oBrakeAdjustPerc;
if (RobotType != RTYPE_SIMPLIX_SRW)
return Brake;
// fprintf(stderr,"wc: %g wemy: %g\n",oCar->_tyreCondition(0),oCar->_tyreEffMu(0));
return Brake;
/*
oCar->priv.wheel[0].condition;
oCar->priv.wheel[0].effectiveMu;
oCar->priv.wheel[0].slipAccel;
oCar->priv.wheel[0].slipNorm;
oCar->priv.wheel[0].slipSide;
oCar->priv.wheel[0].spinVel;
oCar->priv.wheel[0].state;
*/
}
//==========================================================================*
@ -4268,6 +4313,7 @@ void TDriver::Unstuck()
CarAccelCmd = 1.0; // Open the throttle
CarClutchCmd = 0.0; // Release clutch
oUnstucking = true; // Set flag
// oLastUsedGear = CarGearCmd;
}
//==========================================================================*
@ -4346,6 +4392,33 @@ void TDriver::SideBorderOuter(float Factor)
}
//==========================================================================*
//==========================================================================*
// Set additional border to inner side
//--------------------------------------------------------------------------*
void TDriver::SideBorderInner(float Factor)
{
oSideBorderInner = Factor;
}
//==========================================================================*
//==========================================================================*
// Calculate the skilling
//--------------------------------------------------------------------------*
double TDriver::WheelConditionFront()
{
return MIN(oCar->_tyreCondition(0),oCar->_tyreCondition(1));
}
//==========================================================================*
//==========================================================================*
// Calculate the skilling
//--------------------------------------------------------------------------*
double TDriver::WheelConditionRear()
{
return MIN(oCar->_tyreCondition(2),oCar->_tyreCondition(3));
}
//==========================================================================*
//==========================================================================*
// Calculate the skilling
//--------------------------------------------------------------------------*

View file

@ -264,6 +264,7 @@ private:
int oLastLap; // Last lap
double oClutch; // Clutching
int oGear; // Gear
int oUsedGear; // Gear
double oSteer; // Steering
double oLastSteer; // Steering
@ -309,6 +310,7 @@ private:
double oGearEff[MAX_GEARS]; // Efficiency of gears
int oExtended; // Information if this robot is extended (oExtended = 1) or not (oExtended = 0).
int oLastGear; // Last gear
int oLastUsedGear; // Last used gear
bool oLetPass; // Let opoonent pass
double oLookAhead; // Look ahead base value
double oLookAheadFactor; // Look ahead factor
@ -434,6 +436,7 @@ private:
float oSideScaleMu;
float oSideScaleBrake;
float oSideBorderOuter;
float oSideBorderInner;
double oXXX;
bool oRain;
double oRainIntensity;
@ -445,6 +448,7 @@ private:
double oJumpOffset; // Offset for calculation of jumps
bool oFirstJump;
double oStartSteerFactor;
bool oCarHasTYC; // Flag: Car has tyre condition in simu enabled
static int NBBOTS; // Nbr of cars
double CurrSimTime; // Current simulation time
@ -453,6 +457,7 @@ private:
static const char* SECT_PRIV; // Private section
static const char* DEFAULTCARTYPE; // Default car type
static int RobotType;
static bool AdvancedParameters;
static bool UseOldSkilling;
static bool UseSCSkilling;
@ -472,6 +477,7 @@ private:
void ScaleSide(float FactorMu, float FactorBrake);
void SideBorderOuter(float Factor);
void SideBorderInner(float Factor);
void AdjustBrakes(PCarHandle Handle);
void AdjustDriving(PCarHandle Handle, double ScaleBrake, double ScaleMu);
@ -482,6 +488,8 @@ private:
void Meteorology();
int GetWeather();
double WheelConditionFront();
double WheelConditionRear();
void CalcSkilling();
double CalcFriction(const double Crv);
double CalcCrv(double Crv);

View file

@ -112,6 +112,13 @@ double TFixCarParam::CalcAcceleration(
double TrackTiltAngle) const // Track tilt angle
{
double MU = Friction * oTyreMu;
if (oDriver->oCarHasTYC)
{
double WcF = oDriver->WheelConditionFront();
double WcR = oDriver->WheelConditionRear();
MU = MIN(WcF*MU,WcR*MU);
}
double CD = oCdBody *
(1.0 + oTmpCarParam->oDamage / 10000.0) + oCdWing;
@ -186,12 +193,19 @@ double TFixCarParam::CalcBraking
Friction *= oDriver->CalcFriction(Crv);
double Mu = Friction * oTyreMu;
double Mu_F = Mu;
double Mu_R = Mu;
double MuF = Mu;
double MuR = Mu;
Mu_F = Friction * oTyreMuFront;
Mu_R = Friction * oTyreMuRear;
Mu = MIN(Mu_F,Mu_R);
MuF = Friction * oTyreMuFront;
MuR = Friction * oTyreMuRear;
if (oDriver->oCarHasTYC)
{
double WcF = oDriver->WheelConditionFront();
double WcR = oDriver->WheelConditionRear();
Mu = MIN(WcF*MuF,WcR*MuR);
}
else
Mu = MIN(MuF,MuR);
// From SD:
double Cd = oCdBody *
@ -221,7 +235,7 @@ double TFixCarParam::CalcBraking
double Ffrnt = oCaFrontWing * AvgV2;
double Frear = oCaRearWing * AvgV2;
Froad = 0.95 * Fdown * Mu + Ffrnt * Mu_F + Frear * Mu_R;
Froad = 0.95 * Fdown * Mu + Ffrnt * MuF + Frear * MuR;
double Flat = oTmpCarParam->oMass * Glat;
double Ftan = oTmpCarParam->oMass * Gtan - Cd * AvgV2;
@ -291,12 +305,19 @@ double TFixCarParam::CalcBrakingPit
Friction *= oDriver->CalcFriction(Crv);
double Mu = Friction * oTyreMu;
double Mu_F = Mu;
double Mu_R = Mu;
double MuF = Mu;
double MuR = Mu;
Mu_F = Friction * oTyreMuFront;
Mu_R = Friction * oTyreMuRear;
Mu = MIN(Mu_F,Mu_R);
MuF = Friction * oTyreMuFront;
MuR = Friction * oTyreMuRear;
if (oDriver->oCarHasTYC)
{
double WcF = oDriver->WheelConditionFront();
double WcR = oDriver->WheelConditionRear();
Mu = MIN(WcF*MuF,WcR*MuR);
}
else
Mu = MIN(MuF,MuR);
// From TORCS:
double Cd = oCdBody *
@ -325,7 +346,7 @@ double TFixCarParam::CalcBrakingPit
double Ffrnt = oCaFrontWing * AvgV2;
double Frear = oCaRearWing * AvgV2;
Froad = Fdown * Mu + Ffrnt * Mu_F + Frear * Mu_R;
Froad = Fdown * Mu + Ffrnt * MuF + Frear * MuR;
double Flat = oTmpCarParam->oMass * Glat;
double Ftan = oTmpCarParam->oMass * Gtan - Cd * AvgV2;
@ -423,7 +444,14 @@ double TFixCarParam::CalcMaxSpeed
double MuF = Friction * oTyreMuFront * CarParam.oScaleMu;
double MuR = Friction * oTyreMuRear * CarParam.oScaleMu;
Mu = MIN(MuF,MuR) / oTmpCarParam->oSkill;
if (oDriver->oCarHasTYC)
{
double WcF = oDriver->WheelConditionFront();
double WcR = oDriver->WheelConditionRear();
Mu = MIN(WcF*MuF,WcR*MuR) / oTmpCarParam->oSkill;
}
else
Mu = MIN(MuF,MuR) / oTmpCarParam->oSkill;
Den = (AbsCrv - ScaleBump * CrvZ)
- (oCaFrontWing * MuF + oCaRearWing * MuR

View file

@ -344,7 +344,6 @@ enum
#define WheelSegFriction(x) (oCar->_wheelSeg(x)->surface->kFriction)
#define WheelSegRoughness(x) (oCar->_wheelSeg(x)->surface->kRoughness)
#define WheelSegRollRes(x) (oCar->_wheelSeg(x)->surface->kRollRes)
#define UsedGear (oCar->_gear)
// ... Shortcuts for TORCS
// Shortcuts for this robot ...

View file

@ -342,6 +342,7 @@ void SetUpSimplix_sc()
void SetUpSimplix_srw()
{
cRobotType = RTYPE_SIMPLIX_SRW;
TDriver::RobotType = cRobotType;
SetParameters(NBBOTS, "srw-sector-p4");
TDriver::AdvancedParameters = true;
TDriver::UseSCSkilling = true; // Use supercar skilling
@ -539,6 +540,8 @@ int moduleWelcomeV1_00
SetUpSimplix_trb1();
else if (strncmp(RobName,"simplix_sc",strlen("simplix_sc")) == 0)
SetUpSimplix_sc();
else if (strncmp(RobName,"simplix_srw",strlen("simplix_srw")) == 0)
SetUpSimplix_srw();
else if (strncmp(RobName,"simplix_36GP",strlen("simplix_36GP")) == 0)
SetUpSimplix_36GP();
else if (strncmp(RobName,"simplix_mpa1",strlen("simplix_mpa1")) == 0)
@ -801,7 +804,8 @@ static int InitFuncPt(int Index, void *Pt)
cInstances[Index-IndexOffset].cRobot->CalcCrvFoo = &TDriver::CalcCrv_simplix_Identity;
cInstances[Index-IndexOffset].cRobot->CalcHairpinFoo = &TDriver::CalcHairpin_simplix_Identity;
cInstances[Index-IndexOffset].cRobot->ScaleSide(0.95f,0.95f);
cInstances[Index-IndexOffset].cRobot->SideBorderOuter(0.10f);
cInstances[Index-IndexOffset].cRobot->SideBorderOuter(0.30f);
cInstances[Index-IndexOffset].cRobot->SideBorderInner(0.00f);
}
else if (cRobotType == RTYPE_SIMPLIX_36GP)
{

View file

@ -493,6 +493,15 @@ void TTrackDescription::InitTrack
bool PitOnly = false; // Reset flag
while(PSide) // Loop all side-segments
{
/*
if (S == TR_SIDE_LFT)
{
fprintf(stderr,"%s %d r:%.3f kfr:%.3f krh:%.3f krr:%.3f kkw:%.3f \n",Seg->name,Seg->id,Seg->radius,PSide->surface->kFriction,PSide->surface->kRoughness,PSide->surface->kRollRes,PSide->Kzw);
if (Seg->id == 565)
fprintf(stderr,"Now!\n");
}
*/
double Wpit = 0.0; // Initialize
double WCurb = 0.0; // additional with
double W = PSide->startWidth + T * // Estimate width of section