Skip to content

Commit

Permalink
e3Detector can now detect persons. refs #5252
Browse files Browse the repository at this point in the history
  • Loading branch information
namdre committed Sep 28, 2021
1 parent 1a5f8b1 commit a76cd51
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 9 deletions.
83 changes: 75 additions & 8 deletions src/microsim/output/MSE3Collector.cpp
Expand Up @@ -26,8 +26,11 @@
#include <algorithm>

#include <microsim/MSLane.h>
#include <microsim/MSEdge.h>
#include <microsim/MSNet.h>
#include <microsim/MSVehicle.h>
#include <microsim/transportables/MSTransportable.h>
#include <microsim/transportables/MSPModel.h>
#include "MSE3Collector.h"

//#define DEBUG_E3_NOTIFY_MOVE
Expand Down Expand Up @@ -334,6 +337,14 @@ MSE3Collector::reset() {

void
MSE3Collector::enter(const SUMOTrafficObject& veh, const double entryTimestep, const double fractionTimeOnDet, MSE3EntryReminder* entryReminder) {
if (myDetectPersons > (int)PersonMode::WALK && !veh.isPerson()) {
bool keep = false;
const MSBaseVehicle& v = dynamic_cast<const MSBaseVehicle&>(veh);
for (MSTransportable* p : v.getPersons()) {
enter(*p, entryTimestep, fractionTimeOnDet, entryReminder);
}
return;
}
if (!vehicleApplies(veh)) {
return;
}
Expand All @@ -358,8 +369,8 @@ MSE3Collector::enter(const SUMOTrafficObject& veh, const double entryTimestep, c
}
}
v.hadUpdate = false;
if (!MSGlobals::gUseMesoSim) {
v.timeLoss = static_cast<const MSVehicle&>(veh).getTimeLoss();
if (!MSGlobals::gUseMesoSim && veh.isVehicle()) {
v.timeLoss = dynamic_cast<const MSVehicle&>(veh).getTimeLoss();
v.intervalTimeLoss = v.timeLoss;
}
v.entryReminder = entryReminder;
Expand All @@ -369,11 +380,19 @@ MSE3Collector::enter(const SUMOTrafficObject& veh, const double entryTimestep, c

void
MSE3Collector::leaveFront(const SUMOTrafficObject& veh, const double leaveTimestep) {
if (myDetectPersons > (int)PersonMode::WALK && !veh.isPerson()) {
bool keep = false;
const MSBaseVehicle& v = dynamic_cast<const MSBaseVehicle&>(veh);
for (MSTransportable* p : v.getPersons()) {
leaveFront(*p, leaveTimestep);
}
return;
}
if (!vehicleApplies(veh)) {
return;
}
if (myEnteredContainer.find(&veh) == myEnteredContainer.end()) {
if (!myOpenEntry) {
if (!myOpenEntry && veh.isVehicle()) {
WRITE_WARNING("Vehicle '" + veh.getID() + "' left " + toString(SUMO_TAG_E3DETECTOR) + " '" + getID() + "' without entering it.");
}
} else {
Expand All @@ -384,11 +403,19 @@ MSE3Collector::leaveFront(const SUMOTrafficObject& veh, const double leaveTimest

void
MSE3Collector::leave(const SUMOTrafficObject& veh, const double leaveTimestep, const double fractionTimeOnDet) {
if (myDetectPersons > (int)PersonMode::WALK && !veh.isPerson()) {
bool keep = false;
const MSBaseVehicle& v = dynamic_cast<const MSBaseVehicle&>(veh);
for (MSTransportable* p : v.getPersons()) {
leave(*p, leaveTimestep, fractionTimeOnDet);
}
return;
}
if (!vehicleApplies(veh)) {
return;
}
if (myEnteredContainer.find(&veh) == myEnteredContainer.end()) {
if (!myOpenEntry) {
if (!myOpenEntry && veh.isVehicle()) {
WRITE_WARNING("Vehicle '" + veh.getID() + "' left " + toString(SUMO_TAG_E3DETECTOR) + " '" + getID() + "' without entering it.");
}
} else {
Expand All @@ -397,12 +424,12 @@ MSE3Collector::leave(const SUMOTrafficObject& veh, const double leaveTimestep, c
const double speedFraction = veh.getSpeed() * (TS - fractionTimeOnDet);
values.speedSum -= speedFraction;
values.intervalSpeedSum -= speedFraction;
if (MSGlobals::gUseMesoSim) {
if (MSGlobals::gUseMesoSim || !veh.isVehicle()) {
// not yet supported
values.timeLoss = 0;
} else {
// timeLoss was initialized when entering
values.timeLoss = static_cast<const MSVehicle&>(veh).getTimeLoss() - values.timeLoss;
values.timeLoss = dynamic_cast<const MSVehicle&>(veh).getTimeLoss() - values.timeLoss;
}
myEnteredContainer.erase(&veh);
myLeftContainer.push_back(values);
Expand Down Expand Up @@ -464,8 +491,8 @@ MSE3Collector::writeXMLOutput(OutputDevice& dev,
(*i).second.intervalHaltings = 0;
(*i).second.intervalSpeedSum = 0;

if (!MSGlobals::gUseMesoSim) {
const SUMOTime currentTimeLoss = static_cast<const MSVehicle*>(i->first)->getTimeLoss();
if (!MSGlobals::gUseMesoSim && i->first->isVehicle()) {
const SUMOTime currentTimeLoss = dynamic_cast<const MSVehicle*>(i->first)->getTimeLoss();
meanTimeLossWithin += STEPS2TIME(currentTimeLoss - (*i).second.intervalTimeLoss);
(*i).second.intervalTimeLoss = currentTimeLoss;
}
Expand Down Expand Up @@ -504,8 +531,48 @@ MSE3Collector::writeXMLDetectorProlog(OutputDevice& dev) const {
}


void
MSE3Collector::notifyMovePerson(MSTransportable* p, MSMoveReminder* rem, double detPos, int dir, double pos) {
if (personApplies(*p, dir)) {
const double newSpeed = p->getSpeed();
const double newPos = (dir == MSPModel::FORWARD
? pos
// position relative to detector end position
: detPos - (pos - detPos));
const double oldPos = newPos - SPEED2DIST(newSpeed);
if (oldPos - p->getVehicleType().getLength() <= detPos) {
rem->notifyMove(*p, oldPos, newPos, newSpeed);
}
}
}


void
MSE3Collector::detectorUpdate(const SUMOTime step) {

if (myDetectPersons != (int)PersonMode::NONE) {
for (auto rem : myEntryReminders) {
const MSLane* lane = rem->getLane();
if (lane->hasPedestrians()) {
for (MSTransportable* p : lane->getEdge().getPersons()) {
if (p->getLane() == lane) {
notifyMovePerson(p, rem, rem->getPosition(), p->getDirection(), p->getPositionOnLane());
}
}
}
}
for (auto rem : myLeaveReminders) {
const MSLane* lane = rem->getLane();
if (lane->hasPedestrians()) {
for (MSTransportable* p : lane->getEdge().getPersons()) {
if (p->getLane() == lane) {
notifyMovePerson(p, rem, rem->getPosition(), p->getDirection(), p->getPositionOnLane());
}
}
}
}
}

myCurrentMeanSpeed = 0;
myCurrentHaltingsNumber = 0;
for (std::map<const SUMOTrafficObject*, E3Values>::iterator pair = myEnteredContainer.begin(); pair != myEnteredContainer.end(); ++pair) {
Expand Down
13 changes: 12 additions & 1 deletion src/microsim/output/MSE3Collector.h
Expand Up @@ -41,6 +41,7 @@
// ===========================================================================
class SUMOTrafficObject;
class OutputDevice;
class MSTransportable;


// ===========================================================================
Expand Down Expand Up @@ -117,6 +118,10 @@ class MSE3Collector : public MSDetectorFileOutput, public Parameterised {
/// @}


double getPosition() const {
return myPosition;
}

private:
/// @brief The parent collector
MSE3Collector& myCollector;
Expand Down Expand Up @@ -192,6 +197,10 @@ class MSE3Collector : public MSDetectorFileOutput, public Parameterised {
bool notifyLeave(SUMOTrafficObject& veh, double lastPos, MSMoveReminder::Notification reason, const MSLane* enteredLane = 0);
//@}

double getPosition() const {
return myPosition;
}


private:
/// @brief The parent collector
Expand Down Expand Up @@ -342,7 +351,9 @@ class MSE3Collector : public MSDetectorFileOutput, public Parameterised {
virtual void clearState();

protected:
/// @brief The detector's entries
void notifyMovePerson(MSTransportable* p, MSMoveReminder* rem, double detPos, int dir, double pos);

protected:
CrossSectionVector myEntries;

/// @brief The detector's exits
Expand Down

0 comments on commit a76cd51

Please sign in to comment.