// Brake filter for pit stop. float Driver::filterBPit(float brake) { if (pit->getPitstop() && !pit->getInPit()) { float dl, dw; RtDistToPit(car, track, &dl, &dw); if (dl < PIT_BRAKE_AHEAD) { float mu = car->_trkPos.seg->surface->kFriction*TIREMU*PIT_MU; if (brakedist(0.0f, mu) > dl) { return 1.0f; } } } if (pit->getInPit()) { float s = pit->toSplineCoord(car->_distFromStartLine); // Pit entry. if (pit->getPitstop()) { float mu = car->_trkPos.seg->surface->kFriction*TIREMU*PIT_MU; if (s < pit->getNPitStart()) { // Brake to pit speed limit. float dist = pit->getNPitStart() - s; if (brakedist(pit->getSpeedlimit(), mu) > dist) { return 1.0f; } } else { // Hold speed limit. if (currentspeedsqr > pit->getSpeedlimitSqr()) { return pit->getSpeedLimitBrake(currentspeedsqr); } } // Brake into pit (speed limit 0.0 to stop) float dist = pit->getNPitLoc() - s; if (pit->isTimeout(dist)) { pit->setPitstop(false); return 0.0f; } else { if (brakedist(0.0f, mu) > dist) { return 1.0f; } else if (s > pit->getNPitLoc()) { // Stop in the pit. return 1.0f; } } } else { // Pit exit. if (s < pit->getNPitEnd()) { // Pit speed limit. if (currentspeedsqr > pit->getSpeedlimitSqr()) { return pit->getSpeedLimitBrake(currentspeedsqr); } } } } return brake; }
// Compute initial brake value. float Driver::getBrake() { // Car drives backward? if (car->_speed_x < -MAX_UNSTUCK_SPEED) { // Yes, brake. return 1.0; } else { // We drive forward, normal braking. tTrackSeg *segptr = car->_trkPos.seg; float mu = segptr->surface->kFriction; float maxlookaheaddist = currentspeedsqr/(2.0f*mu*G); float lookaheaddist = getDistToSegEnd(); float allowedspeed = getAllowedSpeed(segptr); if (allowedspeed < car->_speed_x) { return MIN(1.0f, (car->_speed_x-allowedspeed)/(FULL_ACCEL_MARGIN)); } segptr = segptr->next; while (lookaheaddist < maxlookaheaddist) { allowedspeed = getAllowedSpeed(segptr); if (allowedspeed < car->_speed_x) { if (brakedist(allowedspeed, mu) > lookaheaddist) { return 1.0f; } } lookaheaddist += segptr->length; segptr = segptr->next; } return 0.0f; } }
float Driver::getBrake() { tTrackSeg *segptr = car->_trkPos.seg; float mu = segptr->surface->kFriction;//*TIREMU*MU_FACTOR; float maxlookaheaddist = currentspeedsqr/(2.0*mu*G); float lookaheaddist = getDistToSegEnd(); float allowedspeed = getAllowedSpeed(segptr); if (allowedspeed < car->_speed_x) { return MIN(1.0, (car->_speed_x-allowedspeed)/(FULL_ACCEL_MARGIN)); } segptr = segptr->next; while (lookaheaddist < maxlookaheaddist) { allowedspeed = getAllowedSpeed(segptr); if (allowedspeed < car->_speed_x) { if (brakedist(allowedspeed, mu) > lookaheaddist) { return 1.0; } } lookaheaddist += segptr->length; segptr = segptr->next; } return 0.0; }
float Driver::filterBPit(float brake) { if (pit->getPitstop() && !pit->getInPit()) { float dl, dw; RtDistToPit(car, track, &dl, &dw); if (dl < PIT_BRAKE_AHEAD) { float mu = car->_trkPos.seg->surface->kFriction*TIREMU*PIT_MU; if (brakedist(0.0, mu) > dl) return 1.0; } } if (pit->getInPit()) { float s = pit->toSplineCoord(car->_distFromStartLine); /* pit entry */ if (pit->getPitstop()) { float mu = car->_trkPos.seg->surface->kFriction*TIREMU*PIT_MU; if (s < pit->getNPitStart()) { /* brake to pit speed limit */ float dist = pit->getNPitStart() - s; if (brakedist(pit->getSpeedlimit(), mu) > dist) return 1.0; } else { /* hold speed limit */ if (currentspeedsqr > pit->getSpeedlimitSqr()) { return pit->getSpeedLimitBrake(currentspeedsqr); } } /* brake into pit (speed limit 0.0 to stop ) */ float dist = pit->getNPitLoc() - s; if (brakedist(0.0, mu) > dist) return 1.0; /* hold in the pit */ if (s > pit->getNPitLoc()) return 1.0; } else { /* pit exit */ if (s < pit->getNPitEnd()) { /* pit speed limit */ if (currentspeedsqr > pit->getSpeedlimitSqr()) { return pit->getSpeedLimitBrake(currentspeedsqr); } } } } return brake; }
// Brake filter for collision avoidance. float Driver::filterBColl(float brake) { float mu = car->_trkPos.seg->surface->kFriction; int i; for (i = 0; i < opponents->getNOpponents(); i++) { if (opponent[i].getState() & OPP_COLL) { if (brakedist(opponent[i].getSpeed(), mu) > opponent[i].getDistance()) { return 1.0f; } } } return brake; }