16
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-07-22 23:19:19 +02:00

AI z hamulcem co 0,25 pozycji

This commit is contained in:
Królik Uszasty
2017-07-31 17:31:29 +02:00
parent d51a4ea985
commit e88b85e725
6 changed files with 169 additions and 40 deletions

View File

@@ -1679,6 +1679,44 @@ void TController::AutoRewident()
} }
d = d->Next(); // kolejny pojazd, podłączony od tyłu (licząc od czoła) d = d->Next(); // kolejny pojazd, podłączony od tyłu (licząc od czoła)
} }
//teraz zerujemy tabelkę opóźnienia hamowania
for (int i = 0; i < BrakeAccTableSize; i++)
{
fBrake_a0[i+1] = 0;
fBrake_a1[i+1] = 0;
}
d = pVehicles[0]; // pojazd na czele składu
float velstep = (mvOccupied->Vmax*0.5) / BrakeAccTableSize;
while (d)
{ // 4. Przeliczanie siły hamowania
for (int i = 0; i < BrakeAccTableSize; i++)
{
fBrake_a0[i+1] += d->MoverParameters->BrakeForceR(0.25, velstep*(1 + 2 * i));
fBrake_a1[i+1] += d->MoverParameters->BrakeForceR(1.00, velstep*(1 + 2 * i));
}
d = d->Next(); // kolejny pojazd, podłączony od tyłu (licząc od czoła)
}
for (int i = 0; i < BrakeAccTableSize; i++)
{
fBrake_a1[i+1] -= fBrake_a0[i+1];
fBrake_a0[i+1] /= fMass;
fBrake_a1[i+1] /= (12*fMass);
}
if (mvOccupied->TrainType == dt_EZT)
{
fAccThreshold = -fBrake_a0[BrakeAccTableSize] - 10 * fBrake_a1[BrakeAccTableSize];
fBrakeReaction = 0.25;
}
else if (ustaw > 16)
{
fAccThreshold = -fBrake_a0[BrakeAccTableSize] - 6 * fBrake_a1[BrakeAccTableSize];
fBrakeReaction = 0.5;
}
else
{
fAccThreshold = -fBrake_a0[BrakeAccTableSize] - 2 * fBrake_a1[BrakeAccTableSize];
fBrakeReaction = 2.0;
}
}; };
int TController::CheckDirection() { int TController::CheckDirection() {
@@ -1951,6 +1989,12 @@ bool TController::SetProximityVelocity(double NewDist,double NewVelNext)
} }
*/ */
double TController::BrakeAccFactor()
{
double Factor = 1 + fBrakeReaction*mvOccupied->Vel / (std::max(0.0, ActualProximityDist) + 1);
return Factor;
}
void TController::SetDriverPsyche() void TController::SetDriverPsyche()
{ {
// double maxdist=0.5; //skalowanie dystansu od innego pojazdu, zmienic to!!! // double maxdist=0.5; //skalowanie dystansu od innego pojazdu, zmienic to!!!
@@ -2295,16 +2339,19 @@ bool TController::IncBrake()
else { else {
if( mvOccupied->BrakeCtrlPos + 1 == mvOccupied->BrakeCtrlPosNo ) { if( mvOccupied->BrakeCtrlPos + 1 == mvOccupied->BrakeCtrlPosNo ) {
if (AccDesired < -1.5) // hamowanie nagle if (AccDesired < -1.5) // hamowanie nagle
OK = mvOccupied->IncBrakeLevel(); OK = mvOccupied->BrakeLevelAdd(1.0);
else else
OK = false; OK = false;
} }
else { else {
// dodane dla towarowego // dodane dla towarowego
if( mvOccupied->BrakeDelayFlag == bdelay_G ? double deltaAcc = -AccDesired*BrakeAccFactor() - (fBrake_a0[0] + 4 * (mvOccupied->BrakeCtrlPosR - 1)*fBrake_a1[0]);
-AccDesired * 6.6 > std::min( 2, mvOccupied->BrakeCtrlPos ) :
true ) { if( deltaAcc > 0)
OK = mvOccupied->IncBrakeLevel(); {
OK = mvOccupied->BrakeLevelAdd(mvOccupied->BrakeCtrlPosR>0?0.25:1.0);
if ((deltaAcc > 5 * fBrake_a1[0])&&(mvOccupied->BrakeCtrlPosR<=3.0))
mvOccupied->BrakeLevelAdd(1.0);
} }
else else
OK = false; OK = false;
@@ -2337,6 +2384,7 @@ bool TController::IncBrake()
bool TController::DecBrake() bool TController::DecBrake()
{ // zmniejszenie siły hamowania { // zmniejszenie siły hamowania
bool OK = false; bool OK = false;
double deltaAcc = 0;
switch (mvOccupied->BrakeSystem) switch (mvOccupied->BrakeSystem)
{ {
case Individual: case Individual:
@@ -2346,8 +2394,18 @@ bool TController::DecBrake()
OK = mvOccupied->DecLocalBrakeLevel(1 + floor(0.5 + fabs(AccDesired))); OK = mvOccupied->DecLocalBrakeLevel(1 + floor(0.5 + fabs(AccDesired)));
break; break;
case Pneumatic: case Pneumatic:
if (mvOccupied->BrakeCtrlPos > 0) deltaAcc = -AccDesired*BrakeAccFactor() - (fBrake_a0[0] + 4 * (mvOccupied->BrakeCtrlPosR - 0.75)*fBrake_a1[0]);
OK = mvOccupied->DecBrakeLevel(); if (deltaAcc < 0)
{
if (mvOccupied->BrakeCtrlPosR > 0)
{
OK = mvOccupied->BrakeLevelAdd(-0.25);
//if ((deltaAcc < 5 * fBrake_a1[0]) && (mvOccupied->BrakeCtrlPosR >= 1.2))
// mvOccupied->BrakeLevelAdd(-1.0);
if (mvOccupied->BrakeCtrlPosR < 0.74)
mvOccupied->BrakeLevelSet(0.0);
}
}
if (!OK) if (!OK)
OK = mvOccupied->DecLocalBrakeLevel(2); OK = mvOccupied->DecLocalBrakeLevel(2);
if (mvOccupied->PipePress < 3.0) if (mvOccupied->PipePress < 3.0)
@@ -3243,6 +3301,10 @@ bool TController::UpdateSituation(double dt)
// ABu-160305 testowanie gotowości do jazdy // ABu-160305 testowanie gotowości do jazdy
// Ra: przeniesione z DynObj, skład użytkownika też jest testowany, żeby mu przekazać, że ma // Ra: przeniesione z DynObj, skład użytkownika też jest testowany, żeby mu przekazać, że ma
// odhamować // odhamować
int index = double(BrakeAccTableSize) * (mvOccupied->Vel / mvOccupied->Vmax);
index = std::min(BrakeAccTableSize, std::max(1, index));
fBrake_a0[0] = fBrake_a0[index];
fBrake_a1[0] = fBrake_a1[index];
Ready = true; // wstępnie gotowy Ready = true; // wstępnie gotowy
fReady = 0.0; // założenie, że odhamowany fReady = 0.0; // założenie, że odhamowany
fAccGravity = 0.0; // przyspieszenie wynikające z pochylenia fAccGravity = 0.0; // przyspieszenie wynikające z pochylenia
@@ -4227,7 +4289,17 @@ bool TController::UpdateSituation(double dt)
AbsAccS = fAccGravity; // Ra 2014-03: jesli skład stoi, to działa na niego AbsAccS = fAccGravity; // Ra 2014-03: jesli skład stoi, to działa na niego
// składowa styczna grawitacji // składowa styczna grawitacji
else else
AbsAccS = iDirection * mvOccupied->AccS; // przyspieszenie chwilowe, liczone {
AbsAccS = 0;
TDynamicObject *d = pVehicles[0]; // pojazd na czele składu
while (d)
{
AbsAccS += d->MoverParameters->TotalMass * d->MoverParameters->AccS * iDirection;
d = d->Next(); // kolejny pojazd, podłączony od tyłu (licząc od czoła)
}
AbsAccS /= fMass;
//AbsAccS = iDirection * mvOccupied->AccS; // przyspieszenie chwilowe, liczone
}
// jako różnica skierowanej prędkości w // jako różnica skierowanej prędkości w
// czasie // czasie
// if (mvOccupied->V<0.0) AbsAccS=-AbsAccS; //Ra 2014-03: to trzeba przemyśleć // if (mvOccupied->V<0.0) AbsAccS=-AbsAccS; //Ra 2014-03: to trzeba przemyśleć
@@ -4333,9 +4405,9 @@ bool TController::UpdateSituation(double dt)
// krytycznym przedziale // krytycznym przedziale
} }
} }
else // przy dużej różnicy wysoki stopień (1,25 potrzebnego opoznienia) else // przy dużej różnicy wysoki stopień (1,00 potrzebnego opoznienia)
AccDesired = (VelNext * VelNext - vel * vel) / AccDesired = (VelNext * VelNext - vel * vel) /
(20.73 * ActualProximityDist + (25.92 * ActualProximityDist +
0.1); // najpierw hamuje mocniej, potem zluzuje 0.1); // najpierw hamuje mocniej, potem zluzuje
if (AccPreferred < AccDesired) if (AccPreferred < AccDesired)
AccDesired = AccPreferred; //(1+abs(AccDesired)) AccDesired = AccPreferred; //(1+abs(AccDesired))
@@ -4389,6 +4461,7 @@ bool TController::UpdateSituation(double dt)
else else
AccDesired = fAccThreshold; // hamuj tak średnio AccDesired = fAccThreshold; // hamuj tak średnio
// koniec predkosci aktualnej // koniec predkosci aktualnej
#ifdef DEBUGFAC
if (fAccThreshold > -0.3) // bez sensu, ale dla towarowych korzystnie if (fAccThreshold > -0.3) // bez sensu, ale dla towarowych korzystnie
{ // Ra 2014-03: to nie uwzględnia odległości i zaczyna hamować, jak tylko zobaczy { // Ra 2014-03: to nie uwzględnia odległości i zaczyna hamować, jak tylko zobaczy
// W4 // W4
@@ -4400,6 +4473,8 @@ bool TController::UpdateSituation(double dt)
AccDesired = 0.0; // nie spiesz się, bo będzie hamowanie AccDesired = 0.0; // nie spiesz się, bo będzie hamowanie
// koniec wybiegu i hamowania // koniec wybiegu i hamowania
} }
#endif // DEBUGFAC
if (AIControllFlag) if (AIControllFlag)
{ // część wykonawcza tylko dla AI, dla człowieka jedynie napisy { // część wykonawcza tylko dla AI, dla człowieka jedynie napisy
if (mvControlling->ConvOvldFlag || if (mvControlling->ConvOvldFlag ||
@@ -4434,6 +4509,8 @@ bool TController::UpdateSituation(double dt)
SetDriverPsyche(); SetDriverPsyche();
} }
} }
if (-AccDesired * BrakeAccFactor() < (fReady > 0.4 ? fBrake_a0[0] : -fAccThreshold))
AccDesired = std::max(-0.01, AccDesired);
if (mvOccupied->BrakeSystem == Pneumatic) // napełnianie uderzeniowe if (mvOccupied->BrakeSystem == Pneumatic) // napełnianie uderzeniowe
if (mvOccupied->BrakeHandle == FV4a) if (mvOccupied->BrakeHandle == FV4a)
{ {
@@ -4469,7 +4546,7 @@ bool TController::UpdateSituation(double dt)
(fReady < 0.25 ? (fReady < 0.25 ?
5.1 : 5.1 :
5.2))) //{(CntrlPipePress-(Volume/BrakeVVolume/10)<0.01)}) 5.2))) //{(CntrlPipePress-(Volume/BrakeVVolume/10)<0.01)})
mvOccupied->IncBrakeLevel(); mvOccupied->BrakeLevelSet(mvOccupied->Handle->GetPos(bh_RP));
} }
#if LOGVELOCITY #if LOGVELOCITY
WriteLog("Dist=" + FloatToStrF(ActualProximityDist, ffFixed, 7, 1) + WriteLog("Dist=" + FloatToStrF(ActualProximityDist, ffFixed, 7, 1) +
@@ -4503,9 +4580,11 @@ bool TController::UpdateSituation(double dt)
{ {
while (DecBrake()) while (DecBrake())
; // jeśli przyspieszamy, to nie hamujemy ; // jeśli przyspieszamy, to nie hamujemy
if (mvOccupied->BrakePress > 0.4) if ((mvOccupied->BrakePress > 0.4) && (mvOccupied->Hamulec->GetCRP() > 4.9))
mvOccupied->BrakeReleaser( mvOccupied->BrakeReleaser(
1); // wyluzuj lokomotywę, to szybciej ruszymy 1); // wyluzuj lokomotywę, to szybciej ruszymy
else
mvOccupied->BrakeReleaser(0);
} }
// margines dla prędkości jest doliczany tylko jeśli oczekiwana prędkość jest // margines dla prędkości jest doliczany tylko jeśli oczekiwana prędkość jest
// większa od 5km/h // większa od 5km/h
@@ -4585,7 +4664,7 @@ bool TController::UpdateSituation(double dt)
if (((fAccGravity < -0.05) && (vel < 0)) || if (((fAccGravity < -0.05) && (vel < 0)) ||
((AccDesired < fAccGravity - 0.1) && ((AccDesired < fAccGravity - 0.1) &&
(AbsAccS > (AbsAccS >
AccDesired + 0.05))) // u góry ustawia się hamowanie na fAccThreshold AccDesired + fBrake_a1[0]))) // u góry ustawia się hamowanie na fAccThreshold
// if not MinVelFlag) // if not MinVelFlag)
if (fBrakeTime < 0 ? true : (AccDesired < fAccGravity - 0.3) || if (fBrakeTime < 0 ? true : (AccDesired < fAccGravity - 0.3) ||
(mvOccupied->BrakeCtrlPos <= 0)) (mvOccupied->BrakeCtrlPos <= 0))
@@ -4605,7 +4684,7 @@ bool TController::UpdateSituation(double dt)
// zatrzymania jest mniejszy // zatrzymania jest mniejszy
fBrakeTime *= 0.5; // Ra: tymczasowo, bo przeżyna S1 fBrakeTime *= 0.5; // Ra: tymczasowo, bo przeżyna S1
} }
if ((AccDesired < fAccGravity - 0.05) && (AbsAccS < AccDesired - 0.2)) if ((AccDesired < fAccGravity - 0.05) && (AbsAccS < AccDesired - fBrake_a1[0]))
// if ((AccDesired<0.0)&&(AbsAccS<AccDesired-0.1)) //ST44 nie hamuje na // if ((AccDesired<0.0)&&(AbsAccS<AccDesired-0.1)) //ST44 nie hamuje na
// czas, 2-4km/h po minięciu tarczy // czas, 2-4km/h po minięciu tarczy
// if (fBrakeTime<0) // if (fBrakeTime<0)
@@ -4648,6 +4727,7 @@ bool TController::UpdateSituation(double dt)
mvControlling->DecMainCtrl(1); mvControlling->DecMainCtrl(1);
if (mvOccupied->BrakeCtrlPos == if (mvOccupied->BrakeCtrlPos ==
mvOccupied->BrakeCtrlPosNo) // jeśli ostatnia pozycja hamowania mvOccupied->BrakeCtrlPosNo) // jeśli ostatnia pozycja hamowania
//yB: ten warunek wyżej nie ma sensu
mvOccupied->DecBrakeLevel(); // to cofnij hamulec mvOccupied->DecBrakeLevel(); // to cofnij hamulec
else else
mvControlling->AntiSlippingButton(); mvControlling->AntiSlippingButton();
@@ -4682,8 +4762,10 @@ bool TController::UpdateSituation(double dt)
if ((OrderList[OrderPos] & (Disconnect | Connect)) == if ((OrderList[OrderPos] & (Disconnect | Connect)) ==
0) // przy (p)odłączaniu nie zwalniamy tu hamulca 0) // przy (p)odłączaniu nie zwalniamy tu hamulca
if ((mvOccupied->V == 0.0) && ((VelDesired == 0.0) || (AccDesired == 0.0))) if ((mvOccupied->V == 0.0) && ((VelDesired == 0.0) || (AccDesired == 0.0)))
if ((mvOccupied->BrakeCtrlPos < 1) || !mvOccupied->DecBrakeLevel()) if (mvOccupied->BrakeCtrlPos == mvOccupied->Handle->GetPos(bh_RP))
mvOccupied->IncLocalBrakeLevel(1); // dodatkowy na pozycję 1 mvOccupied->IncLocalBrakeLevel(1); // dodatkowy na pozycję 1
else
mvOccupied->BrakeLevelSet(mvOccupied->Handle->GetPos(bh_RP));
} }
break; // rzeczy robione przy jezdzie break; // rzeczy robione przy jezdzie
} // switch (OrderList[OrderPos]) } // switch (OrderList[OrderPos])

View File

@@ -162,6 +162,7 @@ static const bool Humandriver = false;
static const int maxorders = 32; // ilość rozkazów w tabelce static const int maxorders = 32; // ilość rozkazów w tabelce
static const int maxdriverfails = 4; // ile błędów może zrobić AI zanim zmieni nastawienie static const int maxdriverfails = 4; // ile błędów może zrobić AI zanim zmieni nastawienie
extern bool WriteLogFlag; // logowanie parametrów fizycznych extern bool WriteLogFlag; // logowanie parametrów fizycznych
static const int BrakeAccTableSize = 20;
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
class TController class TController
@@ -197,7 +198,12 @@ class TController
double fDriverDist = 0.0; // dopuszczalna odległość podjechania do przeszkody double fDriverDist = 0.0; // dopuszczalna odległość podjechania do przeszkody
double fVelMax = -1.0; // maksymalna prędkość składu (sprawdzany każdy pojazd) double fVelMax = -1.0; // maksymalna prędkość składu (sprawdzany każdy pojazd)
double fBrakeDist = 0.0; // przybliżona droga hamowania double fBrakeDist = 0.0; // przybliżona droga hamowania
public:
double BrakeAccFactor();
double fBrakeReaction = 1.0; //opóźnienie zadziałania hamulca - czas w s / (km/h)
double fAccThreshold = 0.0; // próg opóźnienia dla zadziałania hamulca double fAccThreshold = 0.0; // próg opóźnienia dla zadziałania hamulca
double fBrake_a0[BrakeAccTableSize+1] = { 0.0 }; // próg opóźnienia dla zadziałania hamulca
double fBrake_a1[BrakeAccTableSize+1] = { 0.0 }; // próg opóźnienia dla zadziałania hamulca
public: public:
double fLastStopExpDist = -1.0; // odległość wygasania ostateniego przystanku double fLastStopExpDist = -1.0; // odległość wygasania ostateniego przystanku
double ReactionTime = 0.0; // czas reakcji Ra: czego i na co? świadomości AI double ReactionTime = 0.0; // czas reakcji Ra: czego i na co? świadomości AI

View File

@@ -1109,6 +1109,8 @@ public:
double Adhesive(double staticfriction); double Adhesive(double staticfriction);
double TractionForce(double dt); double TractionForce(double dt);
double FrictionForce(double R, int TDamage); double FrictionForce(double R, int TDamage);
double BrakeForceR(double ratio, double velocity);
double BrakeForceP(double press, double velocity);
double BrakeForce(const TTrackParam &Track); double BrakeForce(const TTrackParam &Track);
double CouplerForce(int CouplerN, double dt); double CouplerForce(int CouplerN, double dt);
void CollisionDetect(int CouplerN, double dt); void CollisionDetect(int CouplerN, double dt);

View File

@@ -3766,6 +3766,39 @@ void TMoverParameters::ComputeTotalForce(double dt, double dt1, bool FullVer)
//}; //};
} }
double TMoverParameters::BrakeForceR(double ratio, double velocity)
{
double press = 0;
if (MBPM>2)
{
press = MaxBrakePress[1] + (MaxBrakePress[3] - MaxBrakePress[1]) * std::min(1.0, (TotalMass - Mass) / (MBPM - Mass));
}
else
{
if (MaxBrakePress[1] > 0.1)
{
press = MaxBrakePress[LoadFlag];
}
else
{
press = MaxBrakePress[3];
if (DynamicBrakeType == dbrake_automatic)
ratio = ratio + (1.5 - ratio)*std::min(1.0, Vel*0.02);
}
}
return BrakeForceP(press*ratio, velocity);
}
double TMoverParameters::BrakeForceP(double press, double velocity)
{
double BFP = 0;
double K = (((press * P2FTrans) - BrakeCylSpring) * BrakeCylMult[0] - BrakeSlckAdj) * BrakeRigEff;
K *= static_cast<double>(BrakeCylNo) / (NAxles * std::max(1, NBpA));
BFP = Hamulec->GetFC(velocity, K)*K*(NAxles * std::max(1, NBpA)) * 1000;
return BFP;
}
// ************************************************************************************************* // *************************************************************************************************
// Q: 20160713 // Q: 20160713
// oblicza siłę na styku koła i szyny // oblicza siłę na styku koła i szyny
@@ -3863,6 +3896,9 @@ double TMoverParameters::FrictionForce(double R, int TDamage)
return FF; return FF;
} }
// ************************************************************************************************* // *************************************************************************************************
// Q: 20160713 // Q: 20160713
// Oblicza przyczepność // Oblicza przyczepność

View File

@@ -1544,6 +1544,9 @@ TWorld::Update_UI() {
uitextline4 += uitextline4 +=
"Driver: Vd=" + to_string( tmp->Mechanik->VelDesired, 0 ) "Driver: Vd=" + to_string( tmp->Mechanik->VelDesired, 0 )
+ " ad=" + to_string( tmp->Mechanik->AccDesired, 2 ) + " ad=" + to_string( tmp->Mechanik->AccDesired, 2 )
+ " ah=" + to_string(tmp->Mechanik->fAccThreshold, 2)
+ "@" + to_string(tmp->Mechanik->fBrake_a0[0], 2)
+ "+" + to_string(tmp->Mechanik->fBrake_a1[0], 2)
+ " Pd=" + to_string( tmp->Mechanik->ActualProximityDist, 0 ) + " Pd=" + to_string( tmp->Mechanik->ActualProximityDist, 0 )
+ " Vn=" + to_string( tmp->Mechanik->VelNext, 0 ) + " Vn=" + to_string( tmp->Mechanik->VelNext, 0 )
+ " VSm=" + to_string( tmp->Mechanik->VelSignalLast, 0 ) + " VSm=" + to_string( tmp->Mechanik->VelSignalLast, 0 )

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LocalDebuggerWorkingDirectory>..\..\..\development\maszyna</LocalDebuggerWorkingDirectory> <LocalDebuggerWorkingDirectory>D:\MaSzyna</LocalDebuggerWorkingDirectory>
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor> <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
<LocalDebuggerCommandArguments> <LocalDebuggerCommandArguments>
</LocalDebuggerCommandArguments> </LocalDebuggerCommandArguments>