From 14e3a2702672e5cdd6a4e1f197638be176dc2e9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=B3lik=20Uszasty?= Date: Fri, 22 Mar 2019 20:26:59 +0100 Subject: [PATCH] AI does not fear SlippingWheels when driving ElectricInductionMotor vehicle + fix for adhesion calculation when slipping --- Driver.cpp | 2 +- McZapkie/Mover.cpp | 26 +++++++++++++------------- driveruipanels.cpp | 3 ++- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/Driver.cpp b/Driver.cpp index 15c969e2..9c82e860 100644 --- a/Driver.cpp +++ b/Driver.cpp @@ -5542,7 +5542,7 @@ TController::UpdateSituation(double dt) { // część wykonawcza tylko dla AI, dla człowieka jedynie napisy // zapobieganie poslizgowi u nas - if (mvControlling->SlippingWheels) { + if (mvControlling->SlippingWheels && mvControlling->EngineType != TEngineType::ElectricInductionMotor) { if( false == mvControlling->DecScndCtrl( 2 ) ) { // bocznik na zero diff --git a/McZapkie/Mover.cpp b/McZapkie/Mover.cpp index acad6b49..2dfc3537 100644 --- a/McZapkie/Mover.cpp +++ b/McZapkie/Mover.cpp @@ -4001,12 +4001,18 @@ void TMoverParameters::ComputeTotalForce(double dt) { && ( std::abs(Fwheels) > TotalMassxg * Adhesive( RunningTrack.friction ) ) ) { SlippingWheels = true; } - if( true == SlippingWheels ) { + double temp_nrot = nrot; + if (true == SlippingWheels) { - double temp_nrot = ComputeRotatingWheel(Fwheels - - Sign(nrot * M_PI * WheelDiameter - V) * - Adhesive(RunningTrack.friction) * TotalMassxg, - dt, nrot); + temp_nrot = ComputeRotatingWheel(Fwheels - Sign(nrot * M_PI * WheelDiameter - V) * + Adhesive(RunningTrack.friction) * TotalMassxg, dt, nrot); + if (Sign(nrot * M_PI * WheelDiameter - V)*Sign(temp_nrot * M_PI * WheelDiameter - V) < 0) + { + SlippingWheels = false; + temp_nrot = V / M_PI / WheelDiameter; + } + } + if (true == SlippingWheels) { Fwheels = Sign(temp_nrot * M_PI * WheelDiameter - V) * TotalMassxg * Adhesive(RunningTrack.friction); if (Fwheels*Sign(V)>0) { @@ -4025,12 +4031,6 @@ void TMoverParameters::ComputeTotalForce(double dt) { { WheelFlat = sqrt(square(WheelFlat) + abs(Fwheels) / NAxles*Vel*0.000002); } - if (Sign(nrot * M_PI * WheelDiameter - V)*Sign(temp_nrot * M_PI * WheelDiameter - V) < 0) - { - SlippingWheels = false; - temp_nrot = V / M_PI / WheelDiameter; - } - nrot = temp_nrot; } @@ -5368,9 +5368,9 @@ double TMoverParameters::v2n(void) n = V / (M_PI * WheelDiameter); // predkosc obrotowa wynikajaca z liniowej [obr/s] deltan = n - nrot; //"pochodna" prędkości obrotowej - if (SlippingWheels) + /* if (SlippingWheels) if (std::abs(deltan) < 0.001) - SlippingWheels = false; // wygaszenie poslizgu + SlippingWheels = false; // wygaszenie poslizgu */ //poslizg jest w innym miejscu wygaszany też if (SlippingWheels) // nie ma zwiazku z predkoscia liniowa V { // McZapkie-221103: uszkodzenia kol podczas poslizgu if (deltan > dmgn) diff --git a/driveruipanels.cpp b/driveruipanels.cpp index f10ae4c9..bcd5c623 100644 --- a/driveruipanels.cpp +++ b/driveruipanels.cpp @@ -820,7 +820,8 @@ debug_panel::update_section_ai( std::vector &Output ) { + ", slope: " + to_string( mechanik.fAccGravity + 0.001f, 2 ) + " (" + ( mechanik.fAccGravity > 0.01 ? "\\" : ( mechanik.fAccGravity < -0.01 ? "/" : "-" ) ) + ")" + "\n brake threshold: " + to_string( mechanik.fAccThreshold, 2 ) + ", delays: " + to_string( mechanik.fBrake_a0[ 0 ], 2 ) - + "+" + to_string( mechanik.fBrake_a1[ 0 ], 2 ); + + "+" + to_string( mechanik.fBrake_a1[ 0 ], 2 ) + + "\n virtual brake position: " + to_string(mechanik.BrakeCtrlPosition, 2); Output.emplace_back( textline, Global.UITextColor );