From d5ae0cd2b50e51fc82e3bda601020417eae72a34 Mon Sep 17 00:00:00 2001 From: kakukri Date: Sun, 22 Nov 2015 23:58:40 +0000 Subject: [PATCH] add color gauges to the G-graph to represent each tires slip git-svn-id: https://svn.code.sf.net/p/speed-dreams/code/trunk@6254 30fe4595-0a0c-4342-8851-515496e4dcbd Former-commit-id: 2723ae7daf8fef96a3380a1b1cfb6a5a15073899 Former-commit-id: 9d8a79441e9cbcecd11c661e9498c139a1addb3a --- src/interfaces/car.h | 2 + src/modules/graphic/ssggraph/grboard.cpp | 53 +++++++++++++++++++++++- src/modules/simu/simuv4/wheel.cpp | 23 ++++++++++ 3 files changed, 77 insertions(+), 1 deletion(-) diff --git a/src/interfaces/car.h b/src/interfaces/car.h index eaa7c0906..aa20fde8d 100644 --- a/src/interfaces/car.h +++ b/src/interfaces/car.h @@ -303,6 +303,7 @@ typedef struct { tdble treadDepth; /**< tread depth, between 0 and 1 */ tdble critTreadDepth; /**< critical tread depth, when grip falls off suddenly, between 0 and treadDepth */ tdble slipNorm; /* normalized slip, the variable of Magic Formula */ + tdble slipOpt; /* the value of slipNorm giving maximal grip */ tdble slipSide; tdble slipAccel; tdble Fx; @@ -316,6 +317,7 @@ typedef struct { #define _wheelSpinVel(i) priv.wheel[i].spinVel #define _wheelSeg(i) priv.wheel[i].seg #define _wheelSlipNorm(i) priv.wheel[i].slipNorm +#define _wheelSlipOpt(i) priv.wheel[i].slipOpt #define _wheelSlipSide(i) priv.wheel[i].slipSide #define _wheelSlipAccel(i) priv.wheel[i].slipAccel #define _wheelFx(i) priv.wheel[i].Fx diff --git a/src/modules/graphic/ssggraph/grboard.cpp b/src/modules/graphic/ssggraph/grboard.cpp index 2680a93e0..3f8434602 100644 --- a/src/modules/graphic/ssggraph/grboard.cpp +++ b/src/modules/graphic/ssggraph/grboard.cpp @@ -40,6 +40,7 @@ static const string rgba[4] = static const int NB_BOARDS = 3; static const int NB_LBOARDS = 5; // # of leaderboard states +static const int NB_GFLAG = 3; static const int NB_DEBUG = 4; // Boards work on a OrthoCam with fixed height of 600, width flows @@ -184,7 +185,7 @@ cGrBoard::selectBoard(int val) GfParmSetNum(grHandle, path, GR_ATT_DEBUG, (char*)NULL, (tdble)debugFlag); break; case 4: - GFlag = 1 - GFlag; + GFlag = (GFlag + 1) % NB_GFLAG; GfParmSetNum(grHandle, path, GR_ATT_GGRAPH, (char*)NULL, (tdble)GFlag); break; case 5: @@ -362,6 +363,55 @@ cGrBoard::grDispGGraph() glVertex2f(XC + THNSS, YC); glVertex2f(XC + THNSS, YC + car_->ctrl.clutchCmd * 100.0f); glVertex2f(XC - THNSS, YC + car_->ctrl.clutchCmd * 100.0f); + + // Draw the tire slip color gauges + if (GFlag == 2) { + tdble s; + // FR wheel + s = car_->_wheelSlipNorm(0)/car_->_wheelSlipOpt(0); + if (s > 1.0) { + glColor4f(1.0f, 0.0f, MIN(1.0f, s - 1.0), 0.9f); + } else { + glColor4f(s, s, 1.0f - s, 0.9f); + } + glVertex2f(X1 + 40.0f, Y1 + 30.0f); + glVertex2f(X1 + 50.0f, Y1 + 30.0f); + glVertex2f(X1 + 50.0f, Y1 + 50.0f); + glVertex2f(X1 + 40.0f, Y1 + 50.0f); + // FL wheel + s = car_->_wheelSlipNorm(1)/car_->_wheelSlipOpt(1); + if (s > 1.0) { + glColor4f(1.0f, 0.0f, MIN(1.0f, s - 1.0), 0.9f); + } else { + glColor4f(s, s, 1.0f - s, 0.9f); + } + glVertex2f(X1 - 50.0f, Y1 + 30.0f); + glVertex2f(X1 - 40.0f, Y1 + 30.0f); + glVertex2f(X1 - 40.0f, Y1 + 50.0f); + glVertex2f(X1 - 50.0f, Y1 + 50.0f); + // RR wheel + s = car_->_wheelSlipNorm(2)/car_->_wheelSlipOpt(2); + if (s > 1.0) { + glColor4f(1.0f, 0.0f, MIN(1.0f, s - 1.0), 0.9f); + } else { + glColor4f(s, s, 1.0f - s, 0.9f); + } + glVertex2f(X1 + 40.0f, Y1 - 50.0f); + glVertex2f(X1 + 50.0f, Y1 - 50.0f); + glVertex2f(X1 + 50.0f, Y1 - 30.0f); + glVertex2f(X1 + 40.0f, Y1 - 30.0f); + // RL wheel + s = car_->_wheelSlipNorm(3)/car_->_wheelSlipOpt(3); + if (s > 1.0) { + glColor4f(1.0f, 0.0f, MIN(1.0f, s - 1.0), 0.9f); + } else { + glColor4f(s, s, 1.0f - s, 0.9f); + } + glVertex2f(X1 - 50.0f, Y1 - 50.0f); + glVertex2f(X1 - 40.0f, Y1 - 50.0f); + glVertex2f(X1 - 40.0f, Y1 - 30.0f); + glVertex2f(X1 - 50.0f, Y1 - 30.0f); + } glEnd(); @@ -374,6 +424,7 @@ cGrBoard::grDispGGraph() glColor4fv(emphasized_color_); glVertex2f(X1, Y1); glVertex2f(X2, Y2); + glEnd(); } diff --git a/src/modules/simu/simuv4/wheel.cpp b/src/modules/simu/simuv4/wheel.cpp index 6730c7f4c..765d22d84 100644 --- a/src/modules/simu/simuv4/wheel.cpp +++ b/src/modules/simu/simuv4/wheel.cpp @@ -151,6 +151,29 @@ SimWheelConfig(tCar *car, int index) wheel->feedBack.Tq = 0.0f; wheel->feedBack.brkTq = 0.0f; wheel->torques.x = wheel->torques.y = wheel->torques.z = 0.0f; + + /* calculate optimal slip value */ + tdble s, Bx, low, high; + int i; + //wheel->mfC * atan(Bx * (1.0f - wheel->mfE) + wheel->mfE * atan(Bx)) + Bx = PI_2 / wheel->mfC; + low = high = Bx; + while (wheel->mfC * atan(low * (1.0f - wheel->mfE) + wheel->mfE * atan(low)) > PI_2) { + low *= 0.9; + } + while (wheel->mfC * atan(high * (1.0f - wheel->mfE) + wheel->mfE * atan(high)) < PI_2) { + high *=1.1; + } + for (i = 0; i < 32; i++) { + Bx = 0.5 * (low + high); + if (wheel->mfC * atan(Bx * (1.0f - wheel->mfE) + wheel->mfE * atan(Bx)) < PI_2) { + low = Bx; + } else { + high = Bx; + } + } + s = 0.5 * (low + high) / wheel->mfB; + car->carElt->_wheelSlipOpt(index) = s; }