12#ifndef XWSFOSMTRAFFIC_HPP
13#define XWSFOSMTRAFFIC_HPP
15#include "wsf_export.h"
18#include <unordered_map>
19#include <unordered_set>
23#include "UtCallbackHolder.hpp"
135 RoutePair(
const std::string& aSource,
const std::string& aDestination,
const std::string& aNodeId)
159 (std::hash<std::string>()(aNode.
mNodeId) << 1);
174 mutable std::vector<WeightedRouteEdge>
mEdges;
232 static std::unique_ptr<UtScriptClass>
CreateScriptClass(
const std::string& aClassName, UtScriptTypes* aScriptTypesPtr);
239 const std::string& aBaseName,
241 bool aDirection =
true,
242 int aSegmentNumber = 1);
243 std::vector<WsfPlatform*>
GetPlatformsAlongRoute(
const std::string& aNetworkName,
const std::string& aRouteName);
245 std::string
GetTrafficFlow(
double aSimTime,
const std::string& aNetworkName,
const std::string& aNodeId);
246 std::string
GetNodeOnRoute(
const std::string& aNetworkName,
const std::string& aRouteName,
bool aFirstOrLast);
247 std::vector<WsfRoute*>
GetConnectedRoutes(
const std::string& aNetworkName,
const std::string& aNodeId);
252 const std::string& aNetworkName,
254 double aInitialSpacing);
266 struct TrafficInformation
269 std::vector<std::unique_ptr<WsfRoute>> mRoadRoutes;
273 std::unordered_set<WeightedRouteNode, WeightedRouteNodeHash> mRoadGraphs;
276 std::unordered_map<std::string, std::unordered_set<unsigned int>> mRouteVehicleTracker;
277 std::unordered_map<std::string, std::unordered_set<unsigned int>> mAdjacentLanes;
278 std::unordered_map<RoutePair, std::deque<QueuedOperation>,
RoutePairHash> mQueuedOperations;
281 std::unordered_map<int, std::deque<QueuedOperation>> mQueuedConvoys;
282 std::unordered_map<int, std::deque<QueuedSpeedChange>> mQueuedConvoySpeeds;
287 std::unordered_map<std::string, unsigned int> mIntersectionsInUse;
293 std::unordered_map<std::string, std::unordered_map<unsigned int, double>>
297 std::unordered_set<std::string> mReservedRoads;
299 std::deque<QueuedRoadRelease> mQueuedRoadRelease;
302 void AddPlatformToSimulation(
double aSimTime,
int aVehicleNumber);
306 void ClearVehicleList();
307 bool CreateVehicle(
const RoadTrafficNetworkInput& aNetworkInput,
310 bool aAtSource =
false);
312 bool CreateConvoyVehicles(
const RoadTrafficNetworkInput& aNetworkInput,
double aCreateTime);
314 void DeletePlatformFromSimulation(
double aSimTime,
int aVehicleNumber);
316 bool ValidateVehicleTypes(RoadTrafficNetworkInput& aNetwork);
318 void BuildSplitRoads(
unsigned int aNetIndex, RoadTrafficNetworkInput& aNetwork);
319 void BuildWeightedGraph(
unsigned int aNetIndex, RoadTrafficNetworkInput& aNetwork);
320 bool ValidateAuxData(RoadTrafficNetworkInput& aNetwork);
321 bool CheckNetworkValidity(
unsigned int aNetIndex)
const;
322 void CreateInitialPathForVehicle(
const RoadTrafficNetworkInput& aNetwork,
324 const std::string& aRoute =
"",
325 double aDistance = 0.0);
327 double GetRandomSpeed(
const WsfRoute& aRoute,
328 const RouteAuxMapping& aRouteAuxMap,
329 double aVehicleSpeed,
330 bool aIgnoreSpeedLimit);
331 void AssignRandomSpeeds(
WsfRoute& aRoute,
332 const RouteAuxMapping& aRouteAuxMap,
333 double aVehicleSpeed,
334 bool aIgnoreSpeedLimit,
335 bool aConvoy =
false);
336 std::string GetRandomSourceRoute(
unsigned int aNetworkId)
const;
337 void VehiclePathEndedHandler(
double aSimTime,
WsfMover* aMover);
338 void PlatformDeletedHandler(
double aSimTime,
WsfPlatform* aPlatform);
339 void CatchUpHandler(
double aSimTime,
int aVehicleNumber,
double aCatchupSpeed);
340 void ConvoyCatchUpHandler(
double aSimTime,
int aConvoyNumber,
unsigned int aIndex,
double aCatchupSpeed);
342 void TrackerCreationHelper(std::vector<TrackerDetails>& aTracker,
unsigned int aVehicleNumber);
345 bool CheckLaneAvailability(
int aVehicleNumber,
346 unsigned int aLaneIndex,
347 const std::vector<TrackerDetails>& aTracker,
350 void ChangeLane(
int aVehicleNumber,
unsigned int aLaneIndex,
double aDistance,
const double* aNextPoint);
352 WsfRoute CopyOriginalRoute(
unsigned int aNetworkId,
unsigned int aRouteIndex,
unsigned int aWaypointIndex);
358 const double cSPACING = 4.0;
359 void HandleRegularOperations(
double aSimTime);
360 void HandleRoadRelease(
double aSimTime);
365 void HandleQueuedConvoy(
double aSimTime);
366 void HandleConvoySpeedChange(
double aSimTime);
369 void GoToSpeedHelper(
double aSimTime,
374 TrafficInformation& aNetworkTraffic);
375 bool ApproachIntersectionDecelerate(
double aSimTime,
379 double aCurrentDistance,
380 const std::vector<TrackerDetails>& aVehiclesOnRoute,
382 TrafficInformation& aNetworkTraffic);
383 bool HandleStoppedVehicles(
double aSimTime,
387 double aCurrentDistance,
388 const std::vector<TrackerDetails>& aVehiclesOnRoute,
390 TrafficInformation& aNetworkTraffic);
391 bool HandleCollisions(
double aSimTime,
392 bool aHandleCollisions,
395 double aCurrentDistance,
396 const std::unordered_map<std::string, std::vector<TrackerDetails>>& aDetailedTracker,
397 const std::vector<TrackerDetails>& aVehiclesOnRoute,
399 TrafficInformation& aNetworkTraffic);
400 void ModifyVehicleSpeed(
double aSimTime,
402 RoadTrafficNetworkInput* aNetworkPtr,
405 const std::vector<TrackerDetails>& aVehiclesOnRoute,
407 TrafficInformation& aNetworkTraffic);
409 std::vector<SGroundTraffic> mTraffic;
410 UtCallbackHolder mCallbacks;
411 int mNextVehicleIdentifier{0};
412 int mNumVehiclesActive{0};
413 int mMaxVehiclesActive{0};
414 double mNextUpdateTime{0.0};
415 double mNextConvoyUpdateTime{std::numeric_limits<double>::max()};
416 double mNextConvoySpeedTime{std::numeric_limits<double>::max()};
417 double mNextConvoyCatchUpTime{std::numeric_limits<double>::max()};
418 double mNextRoadReleaseTime{std::numeric_limits<double>::max()};
420 std::deque<QueuedSpeedChange> mQueuedCatchUp;
421 std::unordered_map<int, std::vector<int>> mConvoyIndices;
422 std::unordered_set<int> mCatchUpVehicles;
423 std::unordered_set<unsigned int> mStoppedVehicles;
424 std::unordered_map<std::string, unsigned int> mNetworkToIndex;
425 std::unordered_map<unsigned int, TrafficInformation> mRoadInfo;
429#include "UtScriptClass.hpp"
430#include "UtScriptClassDefine.hpp"
UtStringId WsfStringId
WsfStringId – the same thing as UtStringId.
Definition WsfStringId.hpp:23
#define WSF_EXPORT
Definition WsfXIO_Export.hpp:35
Definition WsfGeoPoint.hpp:29
Definition WsfMover.hpp:37
Definition WsfRoadMover.hpp:32
A collection of WsfRoute object that represents a connected network (such as a road network).
Definition WsfRouteNetwork.hpp:40
A collection of WsfWaypoint objects that represent a path to be followed.
Definition WsfRoute.hpp:40
UT_DECLARE_SCRIPT_METHOD(NextPointInRoute)
UT_DECLARE_SCRIPT_METHOD(IntersectionOnRoute)
UT_DECLARE_SCRIPT_METHOD(UnlockIntersection)
UT_DECLARE_SCRIPT_METHOD(IntersectionFlow)
UT_DECLARE_SCRIPT_METHOD(AddConvoyToTraffic)
UT_DECLARE_SCRIPT_METHOD(FollowRoute_2)
UT_DECLARE_SCRIPT_METHOD(AddVehicleToTraffic)
UT_DECLARE_SCRIPT_METHOD(TrafficRoutes)
UT_DECLARE_SCRIPT_METHOD(IndividualRoute)
UT_DECLARE_SCRIPT_METHOD(VehiclesAlongRoute)
UT_DECLARE_SCRIPT_METHOD(LockIntersection)
UT_DECLARE_SCRIPT_METHOD(FollowRoute_1)
UT_DECLARE_SCRIPT_METHOD(Traffic)
UT_DECLARE_SCRIPT_METHOD(GoOffroad)
WsfScriptOSM_TrafficClass(const std::string &aClassName, UtScriptTypes *aScriptTypesPtr)
Definition XWsfOSM_Traffic.cpp:3238
UT_DECLARE_SCRIPT_METHOD(GetConnectedRoads)
UT_DECLARE_SCRIPT_METHOD(ChangeLane)
WsfSimulationExtension()
Definition WsfSimulationExtension.cpp:23
friend class WsfSimulation
Definition WsfSimulationExtension.hpp:43
virtual bool Initialize()
Definition WsfSimulationExtension.cpp:49
virtual void AddedToSimulation()
Definition WsfSimulationExtension.cpp:41
Definition WsfWaypoint.hpp:57
double mPrecedingTime
Definition XWsfOSM_Traffic.hpp:97
QueuedConvoyOperation(double aPrecedingTime, int aVehicleId, WsfRoute &aNewRoute, double aTime, bool aJump=false)
Definition XWsfOSM_Traffic.hpp:91
double mAddedTime
Definition XWsfOSM_Traffic.hpp:84
WsfRoute mNewRoute
Definition XWsfOSM_Traffic.hpp:83
bool mJump
Definition XWsfOSM_Traffic.hpp:85
int mVehicleId
Definition XWsfOSM_Traffic.hpp:82
QueuedOperation(int aVehicleId, WsfRoute &aNewRoute, double aTime, bool aJump=false)
Definition XWsfOSM_Traffic.hpp:74
bool mRoad
Definition XWsfOSM_Traffic.hpp:219
double mTime
Definition XWsfOSM_Traffic.hpp:218
std::string mName
Definition XWsfOSM_Traffic.hpp:217
QueuedRoadRelease(const std::string &aName, double aTime, bool aRoad)
Definition XWsfOSM_Traffic.hpp:208
bool operator<(const QueuedRoadRelease &aDetail2) const
Definition XWsfOSM_Traffic.hpp:215
QueuedSpeedChange(int aVehicleId, unsigned int aIndex, double aSpeed, double aTime)
Definition XWsfOSM_Traffic.hpp:103
int mVehicleId
Definition XWsfOSM_Traffic.hpp:111
double mSpeed
Definition XWsfOSM_Traffic.hpp:113
double mTime
Definition XWsfOSM_Traffic.hpp:114
unsigned int mIndex
Definition XWsfOSM_Traffic.hpp:112
TrackerDetails(int aId, double aDistance)
Definition XWsfOSM_Traffic.hpp:188
bool operator<(const TrackerDetails &aDetail2) const
Definition XWsfOSM_Traffic.hpp:193
double mDistanceAlongRoute
Definition XWsfOSM_Traffic.hpp:202
int mVehicleId
Definition XWsfOSM_Traffic.hpp:201
unsigned int mWaypointIndex
Definition XWsfOSM_Traffic.hpp:129
int mWeight
Definition XWsfOSM_Traffic.hpp:127
unsigned int mRouteIndex
Definition XWsfOSM_Traffic.hpp:128
WeightedRouteEdge(int aWeight, unsigned int aRouteIndex, unsigned int aWaypointIndex)
Definition XWsfOSM_Traffic.hpp:120
Definition XWsfOSM_Traffic.hpp:164
std::vector< WeightedRouteEdge > mEdges
Definition XWsfOSM_Traffic.hpp:174
std::vector< std::string > mSourceRoutes
Definition XWsfOSM_Traffic.hpp:175
double mWaitTime
Definition XWsfOSM_Traffic.hpp:176
WeightedRouteNode(const std::string &aId)
Definition XWsfOSM_Traffic.hpp:166
IntersectionRestriction mIntersection
Definition XWsfOSM_Traffic.hpp:177
bool operator==(const WeightedRouteNode &aOther) const
Definition XWsfOSM_Traffic.hpp:171
std::string mId
Definition XWsfOSM_Traffic.hpp:173
bool AddScriptedConvoy(const std::vector< WsfPlatform * > aPlatformList, const std::string &aNetworkName, WsfRoute *aRoute, double aInitialSpacing)
Definition XWsfOSM_Traffic.cpp:774
std::vector< WsfRoute * > GetConnectedRoutes(const std::string &aNetworkName, const std::string &aNodeId)
Definition XWsfOSM_Traffic.cpp:696
XWsfOSM_Traffic(WsfOSM_TrafficInput &aData)
Definition XWsfOSM_Traffic.cpp:154
void ScriptGoOffroad(WsfPlatform *aVehicle, const WsfGeoPoint &aGeoPoint)
Definition XWsfOSM_Traffic.cpp:1013
IntersectionRestriction
Definition XWsfOSM_Traffic.hpp:65
@ cNONE
Definition XWsfOSM_Traffic.hpp:66
std::vector< WsfPlatform * > GetPlatformsAlongRoute(const std::string &aNetworkName, const std::string &aRouteName)
Definition XWsfOSM_Traffic.cpp:615
bool ScriptLockIntersection(const std::string &aNetworkName, const std::string &aNodeId)
Definition XWsfOSM_Traffic.cpp:963
bool ChangeScriptedLane(WsfPlatform *aPlatformPtr, bool aDirection)
Definition XWsfOSM_Traffic.cpp:886
void AdvanceTime(double aSimTime)
Definition XWsfOSM_Traffic.cpp:1042
void UpdateScriptedVehicleRoute(WsfPlatform *aPlatformPtr, WsfRoute *aRoute, int aWaypointIndex=0)
Definition XWsfOSM_Traffic.cpp:854
static std::unique_ptr< UtScriptClass > CreateScriptClass(const std::string &aClassName, UtScriptTypes *aScriptTypesPtr)
Definition XWsfOSM_Traffic.cpp:285
std::vector< WsfRoute * > GetRoutesOnNetwork(const std::string &aNetworkName)
Definition XWsfOSM_Traffic.cpp:576
std::string GetTrafficFlow(double aSimTime, const std::string &aNetworkName, const std::string &aNodeId)
Definition XWsfOSM_Traffic.cpp:657
XWsfOSM_Traffic(const XWsfOSM_Traffic &aRoadTraffic)=delete
bool AddScriptedVehicle(WsfPlatform *aPlatformPtr, const std::string &aNetworkName, WsfRoute *aRoute, int &aVehicleNumber)
Definition XWsfOSM_Traffic.cpp:723
XWsfOSM_Traffic & operator=(const XWsfOSM_Traffic &aRoadTraffic)=delete
std::string GetNodeOnRoute(const std::string &aNetworkName, const std::string &aRouteName, bool aFirstOrLast)
Definition XWsfOSM_Traffic.cpp:681
WsfWaypoint * GetNextWaypoint(const std::string &aNetworkname, const std::string &aRouteName, double aDistance)
Definition XWsfOSM_Traffic.cpp:633
static XWsfOSM_Traffic * Find(const WsfSimulation &aSimulation)
Definition XWsfOSM_Traffic.cpp:184
WsfRoute * GetIndividualRoute(const std::string &aNetworkName, const std::string &aBaseName, int aLaneNumber=1, bool aDirection=true, int aSegmentNumber=1)
Definition XWsfOSM_Traffic.cpp:591
bool ScriptUnlockIntersection(const std::string &aNetworkName, const std::string &aNodeId)
Definition XWsfOSM_Traffic.cpp:989
Definition XWsfOSM_Traffic.hpp:154
std::size_t operator()(const RoutePair &aNode) const
Definition XWsfOSM_Traffic.hpp:155
Definition XWsfOSM_Traffic.hpp:133
RoutePair(const std::string &aSource, const std::string &aDestination, const std::string &aNodeId)
Definition XWsfOSM_Traffic.hpp:135
std::string mDestinationRoute
Definition XWsfOSM_Traffic.hpp:149
bool operator==(const RoutePair &aOther) const
Definition XWsfOSM_Traffic.hpp:142
std::string mSourceRoute
Definition XWsfOSM_Traffic.hpp:148
std::string mNodeId
Definition XWsfOSM_Traffic.hpp:150
Definition XWsfOSM_Traffic.hpp:45
int mConvoyNumber
Definition XWsfOSM_Traffic.hpp:55
bool mScripted
Definition XWsfOSM_Traffic.hpp:61
int mNetwork
Is this vehicle alive?
Definition XWsfOSM_Traffic.hpp:49
bool mAtIntersection
Definition XWsfOSM_Traffic.hpp:57
double mSpeed
Index value of network vehicle is traveling on.
Definition XWsfOSM_Traffic.hpp:50
bool mConvoyVehicle
Definition XWsfOSM_Traffic.hpp:53
std::string mCurrentRouteName
Was this vehicle defined as a convoy vehicle?
Definition XWsfOSM_Traffic.hpp:54
int mIdentifier
Definition XWsfOSM_Traffic.hpp:46
size_t mRoadPlatformIndex
Definition XWsfOSM_Traffic.hpp:52
WsfPlatform * mRoadPlatform
Speed (meters/sec).
Definition XWsfOSM_Traffic.hpp:51
bool mAlive
Vehicle type.
Definition XWsfOSM_Traffic.hpp:48
bool mCatchUp
Definition XWsfOSM_Traffic.hpp:56
WsfStringId mVehicleTypeId
Unique identifier for ground vehicle.
Definition XWsfOSM_Traffic.hpp:47
Definition XWsfOSM_Traffic.hpp:181
std::size_t operator()(const WeightedRouteNode &aNode) const
Definition XWsfOSM_Traffic.hpp:182