Update shadow's driver
git-svn-id: https://svn.code.sf.net/p/speed-dreams/code/trunk@6680 30fe4595-0a0c-4342-8851-515496e4dcbd Former-commit-id: 8490e7825f5296f16a182f1964e7ee4fb63afe9b Former-commit-id: 2dd6c43f41c904e26658b6d175dd9545ed86d9ff
This commit is contained in:
parent
3b1b16cbcb
commit
9dda55e873
6 changed files with 120 additions and 78 deletions
|
@ -156,8 +156,7 @@ double CarModel::CalcMaxSpeed(double k, double k1, double kz, double kFriction,
|
|||
LogSHADOW.debug("MU = %.f\n", Mu);
|
||||
}
|
||||
|
||||
Den = (AbsCrv - ScaleBump * kz) - (CA_FW * MuF + CA_RW * MuR
|
||||
+ CA_GE_F * MuF + CA_GE_R * MuR) / MASS;
|
||||
Den = (AbsCrv - ScaleBump * kz) - (CA_FW * MuF + CA_RW * MuR + CA_GE_F * MuF + CA_GE_R * MuR) / MASS;
|
||||
|
||||
if (Den < 0.00001)
|
||||
Den = 0.00001;
|
||||
|
@ -329,7 +328,7 @@ double CarModel::CalcAcceleration(double k0, double kz0, double k1, double kz1,
|
|||
// 3m/ss @ 60m/s
|
||||
// 1m/ss @ 75m/s
|
||||
// 0m/ss @ 85m/s
|
||||
//Quadratic accFromSpd(0.001852, -0.35, 17.7); // approx. clkdtm
|
||||
//Quadratic accFromSpd(0.001852, -0.35, 17.7); // approx. clkdtm
|
||||
Quadratic accFromSpd(21.0/5400, -43.0/60, 30); // approx. clkdtm
|
||||
double OldV = 0.0;
|
||||
// Power (kW) = Torque (Nm) x Speed (RPM) / 9.5488
|
||||
|
@ -348,8 +347,8 @@ double CarModel::CalcAcceleration(double k0, double kz0, double k1, double kz1,
|
|||
|
||||
if( Flatroad > Froad )
|
||||
Flatroad = Froad;
|
||||
double Ftanroad = sqrt(Froad * Froad - Flatroad * Flatroad) + Ftan;
|
||||
|
||||
double Ftanroad = sqrt(Froad * Froad - Flatroad * Flatroad) + Ftan;
|
||||
double acc = Ftanroad / M;
|
||||
double maxAcc = MIN(11.5, accFromSpd.CalcY(avgV));
|
||||
|
||||
|
@ -398,6 +397,7 @@ double CarModel::CalcMaxLateralF( double spd, double kFriction, double kz ) cons
|
|||
double CarModel::CalcMaxSpeedCrv() const
|
||||
{
|
||||
const double MAX_SPD = 112; // 400 km/h
|
||||
|
||||
return GRAVITY * TYRE_MU / (MAX_SPD * MAX_SPD);
|
||||
}
|
||||
|
||||
|
@ -488,4 +488,4 @@ void CarModel::CalcSimuSpeedRanges( double spd0, double dist, double kFriction,
|
|||
// t = dist / spd0;
|
||||
double turnT = dist / spd0;
|
||||
maxDY = 0.5 * max_acc * turnT * turnT;
|
||||
}
|
||||
}
|
|
@ -76,7 +76,7 @@ public:
|
|||
double lftOH;
|
||||
double rgtOH;
|
||||
double AVOID_KZ_SCALE; // bump sensitivity.
|
||||
double WIDTH; // width of car (m).
|
||||
double WIDTH; // width of car (m).
|
||||
double BRAKE_FACTOR; // higher number = slower braking
|
||||
double CT_FACTOR;
|
||||
|
||||
|
@ -85,4 +85,4 @@ public:
|
|||
double TYRECONDITIONREAR;
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif
|
|
@ -1318,36 +1318,54 @@ void TDriver::SpeedControl1( double targetSpd, double spd0, double& acc, double&
|
|||
|
||||
void TDriver::SpeedControl2( double targetSpd, double spd0, double& acc, double& brk )
|
||||
{
|
||||
if( m_lastBrk && m_lastTargV )
|
||||
{
|
||||
if( m_lastBrk > 0 )
|
||||
{
|
||||
double err = m_lastTargV - spd0;
|
||||
m_accBrkCoeff.Sample( err, m_lastBrk );
|
||||
}
|
||||
m_lastBrk = 0;
|
||||
m_lastTargV = 0;
|
||||
}
|
||||
if (m_lastBrk && m_lastTargV)
|
||||
{
|
||||
if (m_lastBrk > 0)//|| (car->ctrl.accelCmd == -m_lastBrk) )
|
||||
{
|
||||
double err = m_lastTargV - spd0;
|
||||
m_accBrkCoeff.Sample(err, m_lastBrk);
|
||||
// GfOut( "accbrk sample %g -> %g\n", err, m_lastBrk );
|
||||
}
|
||||
m_lastBrk = 0;
|
||||
m_lastTargV = 0;
|
||||
}
|
||||
|
||||
if( spd0 > targetSpd )
|
||||
{
|
||||
{
|
||||
double MAX_BRK = 0.5;
|
||||
double err = spd0 - targetSpd;
|
||||
brk = MX(0, MN(m_accBrkCoeff.CalcY(err), MAX_BRK));
|
||||
acc = 0;
|
||||
if (spd0 > targetSpd)
|
||||
// if( targetSpd < 100 )
|
||||
{
|
||||
// if( spd0 - 1 > targetSpd )
|
||||
{
|
||||
double MAX_BRK = 0.9;
|
||||
// double MAX_BRK = 0.75;
|
||||
double err = spd0 - targetSpd;
|
||||
brk = MX(0, MN(m_accBrkCoeff.CalcY(err), MAX_BRK));
|
||||
// GfOut( "accbrk calcy %g -> %g\n", err, t );
|
||||
acc = 0;
|
||||
|
||||
m_lastBrk = brk;
|
||||
m_lastTargV = 0;
|
||||
m_lastBrk = brk;
|
||||
m_lastTargV = 0;
|
||||
|
||||
if( brk > 0 )
|
||||
{
|
||||
if( targetSpd > 0 )
|
||||
m_lastTargV = spd0;
|
||||
}
|
||||
if (brk > 0)
|
||||
{
|
||||
if (targetSpd > 0)
|
||||
m_lastTargV = spd0;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
// GfOut( "*** brake *** spd0 %g targ %g brk %g acc %g\n",
|
||||
// spd0, targetSpd, brk, acc );
|
||||
}
|
||||
// else
|
||||
// acc = MN(acc, 0.1);
|
||||
}
|
||||
#if 1
|
||||
else
|
||||
{
|
||||
double x = (0 + spd0) * (targetSpd - spd0) / 200;
|
||||
|
||||
if (x > 0)
|
||||
acc = x;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void TDriver::SpeedControl3( double targetSpd, double spd0, double& acc, double& brk )
|
||||
|
@ -1546,15 +1564,38 @@ void TDriver::Drive( tSituation* s )
|
|||
PtInfo pi, aheadPi;
|
||||
double angle = 0.0;
|
||||
|
||||
#if 1
|
||||
/*if (m_Strategy->WantToPit())
|
||||
angle = SteerAngle2(car, pi, aheadPi);
|
||||
else*/
|
||||
{
|
||||
int steerControl = ((MN(car->_trkPos.toLeft, car->_trkPos.toRight) < 0.0 && car->_speed_x < MN(20.0f, m_lastTargV - 10.0f)) ? STEERCONTROL_RECOVERY : STEERCONTROL);
|
||||
|
||||
switch (steerControl)
|
||||
{
|
||||
case 0:
|
||||
angle = SteerAngle0(car, pi, aheadPi); break;
|
||||
case 1:
|
||||
angle = SteerAngle1(car, pi, aheadPi); break;
|
||||
case 2:
|
||||
angle = SteerAngle2(car, pi, aheadPi); break;
|
||||
case 3:
|
||||
angle = SteerAngle3(car, pi, aheadPi); break;
|
||||
case 4:
|
||||
angle = SteerAngle4(car, pi, aheadPi); break;
|
||||
}
|
||||
}
|
||||
#else
|
||||
switch (STEER_CTRL)
|
||||
{
|
||||
case 0: angle = SteerAngle0(car, pi, aheadPi); break;
|
||||
case 1: angle = SteerAngle1(car, pi, aheadPi); break;
|
||||
case 2: angle = SteerAngle2(car, pi, aheadPi); break;
|
||||
case 3: angle = SteerAngle3(car, pi, aheadPi); break;
|
||||
case 4: angle = SteerAngle4(car, pi, aheadPi); break;
|
||||
default: angle = SteerAngle0(car, pi, aheadPi); break;
|
||||
case 4: angle = SteerAngle4(car, pi, aheadPi); break;
|
||||
default: angle = SteerAngle0(car, pi, aheadPi); break;
|
||||
}
|
||||
#endif
|
||||
|
||||
double steer = angle / car->_steerLock;
|
||||
|
||||
|
|
|
@ -183,35 +183,35 @@ public:
|
|||
TDriver(int index); // Constructor
|
||||
~TDriver(); // Destructor
|
||||
|
||||
void InitTrack(tTrack* track, void* carHandle, void** carParmHandle, tSituation* s);
|
||||
void NewRace(tCarElt* car, tSituation* s );
|
||||
void InitTrack(tTrack* track, void* carHandle, void** carParmHandle, tSituation* s);
|
||||
void NewRace(tCarElt* car, tSituation* s );
|
||||
|
||||
void GetPtInfo( int path, double pos, PtInfo& pi ) const;
|
||||
void GetPosInfo( double pos, PtInfo& pi, double u, double v ) const;
|
||||
void GetPosInfo( double pos, PtInfo& pi ) const;
|
||||
void GetPtInfo( int path, double pos, PtInfo& pi ) const;
|
||||
void GetPosInfo( double pos, PtInfo& pi, double u, double v ) const;
|
||||
void GetPosInfo( double pos, PtInfo& pi ) const;
|
||||
double CalcPathTarget( double pos, double offs, double s ) const;
|
||||
double CalcPathTarget( double pos, double offs ) const;
|
||||
Vec2d CalcPathTarget2( double pos, double offs ) const;
|
||||
Vec2d CalcPathTarget2( double pos, double offs ) const;
|
||||
double CalcPathOffset( double pos, double s, double t ) const;
|
||||
void CalcBestPathUV( double pos, double offs, double& u, double& v ) const;
|
||||
void CalcBestPathUV( double pos, double offs, double& u, double& v ) const;
|
||||
double CalcBestSpeed( double pos, double offs ) const;
|
||||
void GetPathToLeftAndRight( const CarElt* pCar, double& toL, double& toR ) const;
|
||||
void GetPathToLeftAndRight( const CarElt* pCar, double& toL, double& toR ) const;
|
||||
|
||||
double filterTCL(double accel);
|
||||
double filterTrk(double accel);
|
||||
double filterAccel(double Accel);
|
||||
double filterTCL(double accel);
|
||||
double filterTrk(double accel);
|
||||
double filterAccel(double Accel);
|
||||
|
||||
void initCa();
|
||||
void initCa();
|
||||
//void initCa_MPA1();
|
||||
//void initCa_MPA11();
|
||||
void initCw();
|
||||
void initCR();
|
||||
void initCw();
|
||||
void initCR();
|
||||
|
||||
void initDriveTrain();
|
||||
void initWheelRadius();
|
||||
void initTireMu();
|
||||
void initWheelPos();
|
||||
void initBrake();
|
||||
void initDriveTrain();
|
||||
void initWheelRadius();
|
||||
void initTireMu();
|
||||
void initWheelPos();
|
||||
void initBrake();
|
||||
|
||||
double SteerAngle0( tCarElt* car, PtInfo& pi, PtInfo& aheadPi );
|
||||
double SteerAngle1( tCarElt* car, PtInfo& pi, PtInfo& aheadPi );
|
||||
|
@ -219,21 +219,21 @@ public:
|
|||
double SteerAngle3( tCarElt* car, PtInfo& pi, PtInfo& aheadPi );
|
||||
double SteerAngle4( tCarElt* car, PtInfo& pi, PtInfo& aheadPi );
|
||||
|
||||
void SpeedControl0( double targetSpd, double spd0, double& acc, double& brk );
|
||||
void SpeedControl1( double targetSpd, double spd0, double& acc, double& brk );
|
||||
void SpeedControl2( double targetSpd, double spd0, double& acc, double& brk );
|
||||
void SpeedControl3( double targetSpd, double spd0, double& acc, double& brk );
|
||||
void SpeedControl4( double targetSpd, double spd0, CarElt* car, double& acc, double& brk );
|
||||
void SpeedControl5(double targetSpd, double spd0, CarElt* car, double& acc, double& brk );
|
||||
void SpeedControl6(double targetSpd, double spd0, CarElt* car, double& acc, double& brk );
|
||||
void SpeedControl( int which, double targetSpd, double spd0, CarElt* car, double& acc, double& brk );
|
||||
void SpeedControl0( double targetSpd, double spd0, double& acc, double& brk );
|
||||
void SpeedControl1( double targetSpd, double spd0, double& acc, double& brk );
|
||||
void SpeedControl2( double targetSpd, double spd0, double& acc, double& brk );
|
||||
void SpeedControl3( double targetSpd, double spd0, double& acc, double& brk );
|
||||
void SpeedControl4( double targetSpd, double spd0, CarElt* car, double& acc, double& brk );
|
||||
void SpeedControl5(double targetSpd, double spd0, CarElt* car, double& acc, double& brk );
|
||||
void SpeedControl6(double targetSpd, double spd0, CarElt* car, double& acc, double& brk );
|
||||
void SpeedControl( int which, double targetSpd, double spd0, CarElt* car, double& acc, double& brk );
|
||||
|
||||
void Drive(tSituation* s );
|
||||
int PitCmd(tSituation* s );
|
||||
void EndRace(tSituation* s );
|
||||
void Shutdown();
|
||||
void Drive(tSituation* s );
|
||||
int PitCmd(tSituation* s );
|
||||
void EndRace(tSituation* s );
|
||||
void Shutdown();
|
||||
|
||||
double CurrSimTime; // Current simulation time
|
||||
double CurrSimTime; // Current simulation time
|
||||
double Frc; // Friction coefficient
|
||||
//bool UseBrakeLimit; // Enable/disable brakelimit
|
||||
|
||||
|
@ -470,15 +470,15 @@ private:
|
|||
PidController m_speedController; // controller for speed.
|
||||
double m_prevYawError;
|
||||
double m_prevLineError;
|
||||
double m_Jumping; // Car is jumping
|
||||
double m_JumpOffset; // Offset for calculation of jumps
|
||||
bool m_FirstJump;
|
||||
int m_Flying; // Flag prepare landing
|
||||
double m_Jumping; // Car is jumping
|
||||
double m_JumpOffset; // Offset for calculation of jumps
|
||||
bool m_FirstJump;
|
||||
int m_Flying; // Flag prepare landing
|
||||
int m_nCars;
|
||||
int m_myOppIdx;
|
||||
Opponent *m_opp; // info about other cars.
|
||||
double m_avgAY;
|
||||
bool m_raceStart;
|
||||
bool m_raceStart;
|
||||
double m_avoidS; // where we are LR->T (0..1).
|
||||
double m_avoidSVel;
|
||||
double m_avoidT; // where we are L->R (-1..1).
|
||||
|
@ -495,7 +495,7 @@ private:
|
|||
int m_lastB;
|
||||
double m_lastBrk;
|
||||
double m_lastTargV;
|
||||
double m_maxbrkPressRatio;
|
||||
double m_maxbrkPressRatio;
|
||||
|
||||
LearnedGraph m_maxAccel;
|
||||
double m_angle[SPD_N][K_N];
|
||||
|
|
|
@ -55,6 +55,7 @@ SimpleStrategy::SimpleStrategy()
|
|||
m_expectedfuelperlap = 0; // [Kg] Expected fuel per lap
|
||||
TrackLength = 0;
|
||||
RaceDistance = 0;
|
||||
m_timeOfPitExit = -30;
|
||||
}
|
||||
|
||||
|
||||
|
@ -521,7 +522,4 @@ double SimpleStrategy::getRefuel2(int laps)
|
|||
double refuelforrace = laps * avgFuelPerLap;
|
||||
|
||||
return refuelforrace;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -57,6 +57,7 @@ protected:
|
|||
PIT_EXIT,
|
||||
PIT_GONE
|
||||
};
|
||||
|
||||
int m_State; // Current pitting state
|
||||
bool m_GoToPit; // Pit stop needed
|
||||
|
||||
|
@ -65,7 +66,7 @@ protected:
|
|||
|
||||
public:
|
||||
AbstractStrategy()
|
||||
:m_State(PIT_NONE), m_GoToPit(false), Car(NULL), Track(NULL), pitPath(NULL), Driver(NULL), DistToSwitch(100), StartFuel(-1){};
|
||||
:m_State(PIT_NONE), m_GoToPit(false), Car(NULL), Track(NULL), pitPath(NULL), Driver(NULL), DistToSwitch(100), StartFuel(-1) {};
|
||||
// Need this empty constructor... do not remove.
|
||||
virtual ~AbstractStrategy() {}
|
||||
// Set Initial fuel at race start.
|
||||
|
@ -116,6 +117,7 @@ public:
|
|||
int pitRepair(tCarElt* car, tSituation *s);
|
||||
bool isPitFree(tCarElt* car);
|
||||
int pitStopPenalty() { return m_stopPenalty; }
|
||||
double TimeSincePit(double simtime) { return simtime - m_timeOfPitExit; }
|
||||
|
||||
protected:
|
||||
bool test_Pitstop;
|
||||
|
@ -145,6 +147,7 @@ protected:
|
|||
float calcFuel(double totalFuel);
|
||||
double getRefuel1(int laps); // How much fuel it takes to reach the finish line.
|
||||
double getRefuel2(int laps);
|
||||
double m_timeOfPitExit;
|
||||
|
||||
float MAX_FUEL_PER_METER; // max fuel consumtion.
|
||||
double MAX_FUEL_TANK; // max fuel for this car(fuel tank capacity).
|
||||
|
|
Loading…
Reference in a new issue