std::pair<MSVehicle * const, SUMOReal> MSLane::getLeaderOnConsecutive(SUMOReal dist, SUMOReal seen, SUMOReal speed, const MSVehicle &veh, const std::vector<MSLane*> &bestLaneConts) const { if (seen>dist) { return std::pair<MSVehicle * const, SUMOReal>(0, -1); } unsigned int view = 1; // loop over following lanes const MSLane * targetLane = this; MSVehicle *leader = targetLane->getPartialOccupator(); if (leader!=0) { return std::pair<MSVehicle * const, SUMOReal>(leader, seen-targetLane->getPartialOccupatorEnd()); } const MSLane * nextLane = targetLane; while (true) { // get the next link used MSLinkCont::const_iterator link = targetLane->succLinkSec(veh, view, *nextLane, bestLaneConts); if (nextLane->isLinkEnd(link) || !(*link)->havePriority() || (*link)->getState()==MSLink::LINKSTATE_TL_RED) { return std::pair<MSVehicle * const, SUMOReal>(0, -1); } #ifdef HAVE_INTERNAL_LANES bool nextInternal = false; nextLane = (*link)->getViaLane(); if (nextLane==0) { nextLane = (*link)->getLane(); } else { nextInternal = true; } #else nextLane = (*link)->getLane(); #endif if (nextLane==0) { return std::pair<MSVehicle * const, SUMOReal>(0, -1); } MSVehicle * leader = nextLane->getLastVehicle(veh.getStrips()); if (leader!=0) { return std::pair<MSVehicle * const, SUMOReal>(leader, seen+leader->getPositionOnLane()-leader->getVehicleType().getLength()); } else { leader = nextLane->getPartialOccupator(); if (leader!=0) { return std::pair<MSVehicle * const, SUMOReal>(leader, seen+nextLane->getPartialOccupatorEnd()); } } if (nextLane->getMaxSpeed()<speed) { dist = veh.getCarFollowModel().brakeGap(nextLane->getMaxSpeed()); } seen += nextLane->getLength(); if (seen>dist) { return std::pair<MSVehicle * const, SUMOReal>(0, -1); } #ifdef HAVE_INTERNAL_LANES if (!nextInternal) { view++; } #else view++; #endif } }
// ------ Vehicle emission ------ bool MSLane::freeEmit(MSVehicle& veh, SUMOReal mspeed) throw() { size_t stripId = getEmptyStartStripID(veh.getWidth()); bool adaptableSpeed = true; if (getVehicleNumber()==0) { if (isEmissionSuccess(&veh, mspeed, 0, adaptableSpeed,stripId)) { return true; } } else { // check whether the vehicle can be put behind the last one if there is such MSVehicle *leader = getLastVehicle(veh.getStrips()); if (leader != 0) { SUMOReal leaderPos = leader->getPositionOnLane() - leader->getVehicleType().getLength(); SUMOReal speed = mspeed; if (adaptableSpeed) { speed = leader->getSpeed(); } SUMOReal frontGapNeeded = veh.getCarFollowModel().getSecureGap(speed, leader->getCarFollowModel().getSpeedAfterMaxDecel(leader->getSpeed())); if (leaderPos-frontGapNeeded>=0) { SUMOReal tspeed = MIN2(veh.getCarFollowModel().ffeV(&veh, mspeed, frontGapNeeded, leader->getSpeed()), mspeed); // check whether we can emit in behind the last vehicle on the lane if (isEmissionSuccess(&veh, tspeed, 0, adaptableSpeed, stripId)) { return true; } else std::cerr << "not successful emission 1" ; } } else { if (isEmissionSuccess(&veh, mspeed, 0, adaptableSpeed, stripId)) { return true; } else std::cerr << "not successful emission 2" ; } } /* ashu StripCont strips =getMyStrips(); for (StripContConstIter it=strips.begin(); it != strips.end(); ++it) {if ((*it)->freeEmitCheck(veh, mspeed)) return true;} //TODO: Uncomment and fix // go through the lane, look for free positions (starting after the last vehicle) MSLane::VehCont::iterator predIt = myVehicles.begin(); while (predIt!=myVehicles.end()) { // get leader (may be zero) and follower const MSVehicle *leader = predIt!=myVehicles.end()-1 ? *(predIt+1) : getPartialOccupator(); const MSVehicle *follower = *predIt; // patch speed if allowed SUMOReal speed = mspeed; if (adaptableSpeed&&leader!=0) { speed = MIN2(leader->getSpeed(), mspeed); } // compute the space needed to not collide with leader SUMOReal frontMax = getLength(); if (leader!=0) { SUMOReal leaderRearPos = leader->getPositionOnLane() - leader->getVehicleType().getLength(); if (leader == getPartialOccupator()) { leaderRearPos = getPartialOccupatorEnd(); } frontMax = leaderRearPos - veh.getCarFollowModel().getSecureGap(speed, leader->getCarFollowModel().getSpeedAfterMaxDecel(leader->getSpeed())); } // compute the space needed to not let the follower collide const SUMOReal followPos = follower->getPositionOnLane(); const SUMOReal backGapNeeded = follower->getCarFollowModel().getSecureGap(follower->getSpeed(), veh.getCarFollowModel().getSpeedAfterMaxDecel(speed)); const SUMOReal backMin = followPos + backGapNeeded + veh.getVehicleType().getLength(); // check whether there is enough room (given some extra space for rounding errors) if (frontMax>0 && backMin+POSITION_EPS<frontMax) { // try emit vehicle (should be always ok) if (isEmissionSuccess(&veh, speed, backMin+POSITION_EPS, adaptableSpeed)) { std::cerr << "FIX working" ; return true; } } ++predIt; } */ //TODO: Recheck01 ___AB oct 2011 StripCont strips =getMyStrips(); for (StripContConstIter it=strips.begin(); it != strips.end(); ++it) { // go through the lane, look for free positions (starting after the last vehicle) MSLane::VehCont::iterator predIt = (*it)->myVehicles.begin(); while (predIt!=(*it)->myVehicles.end()) { // get leader (may be zero) and follower const MSVehicle *leader = predIt!=(*it)->myVehicles.end()-1 ? *(predIt+1) : (*it)->getPartialOccupator(); const MSVehicle *follower = *predIt; // patch speed if allowed SUMOReal speed = mspeed; if (adaptableSpeed&&leader!=0) { speed = MIN2(leader->getSpeed(), mspeed); } // compute the space needed to not collide with leader SUMOReal frontMax = getLength(); if (leader!=0) { SUMOReal leaderRearPos = leader->getPositionOnLane() - leader->getVehicleType().getLength(); if (leader == (*it)->getPartialOccupator()) { leaderRearPos = (*it)->getPartialOccupatorEnd(); } frontMax = leaderRearPos - veh.getCarFollowModel().getSecureGap(speed, leader->getCarFollowModel().getSpeedAfterMaxDecel(leader->getSpeed())); } // compute the space needed to not let the follower collide const SUMOReal followPos = follower->getPositionOnLane(); const SUMOReal backGapNeeded = follower->getCarFollowModel().getSecureGap(follower->getSpeed(), veh.getCarFollowModel().getSpeedAfterMaxDecel(speed)); const SUMOReal backMin = followPos + backGapNeeded + veh.getVehicleType().getLength(); // check whether there is enough room (given some extra space for rounding errors) if (frontMax>0 && backMin+POSITION_EPS<frontMax) { // try emit vehicle (should be always ok) if (isEmissionSuccess(&veh, speed, backMin+POSITION_EPS, adaptableSpeed, stripId)) { std::cerr << "FIX working" ; return true; } } ++predIt; } }//for // first check at lane's begin std::cerr << "not successful emission last" ; return false; }