Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
MSLane.h
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3// Copyright (C) 2001-2025 German Aerospace Center (DLR) and others.
4// This program and the accompanying materials are made available under the
5// terms of the Eclipse Public License 2.0 which is available at
6// https://www.eclipse.org/legal/epl-2.0/
7// This Source Code may also be made available under the following Secondary
8// Licenses when the conditions for such availability set forth in the Eclipse
9// Public License 2.0 are satisfied: GNU General Public License, version 2
10// or later which is available at
11// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13/****************************************************************************/
25// Representation of a lane in the micro simulation
26/****************************************************************************/
27#pragma once
28#include <config.h>
29
30#include <memory>
31#include <vector>
32#include <map>
33#include <deque>
34#include <cassert>
35#include <utils/common/Named.h>
42#include "MSGlobals.h"
43#include "MSLeaderInfo.h"
44#include "MSMoveReminder.h"
45#include "MSVehicle.h"
46
48#ifdef HAVE_FOX
50#endif
52
53
54// ===========================================================================
55// class declarations
56// ===========================================================================
57class MSEdge;
58class MSBaseVehicle;
59class MSLaneChanger;
60class MSLink;
63class OutputDevice;
64class MSLeaderInfo;
65class MSJunction;
66
67
68// ===========================================================================
69// type definitions
70// ===========================================================================
72typedef std::map<const MSLane*, std::pair<double, double> > LaneCoverageInfo;
73
74// ===========================================================================
75// class definitions
76// ===========================================================================
84class MSLane : public Named, public Parameterised {
85public:
87 public:
89 StoringVisitor(std::set<const Named*>& objects, const PositionVector& shape,
90 const double range, const int domain)
91 : myObjects(objects), myShape(shape), myRange(range), myDomain(domain) {}
92
94 void add(const MSLane* const l) const;
95
96 private:
98 std::set<const Named*>& myObjects;
100 const double myRange;
101 const int myDomain;
102
103 private:
106
109 };
110
112 friend class MSLaneChanger;
114
115 friend class MSQueueExport;
116 friend class AnyVehicleIterator;
117
119 typedef std::vector<MSVehicle*> VehCont;
120
121 // TODO: Better documentation
130 public:
132 const MSLane* lane,
133 int i1,
134 int i2,
135 int i3,
136 const int i1End,
137 const int i2End,
138 const int i3End,
139 bool downstream = true) :
140 myLane(lane),
141 myI1(i1),
142 myI2(i2),
143 myI3(i3),
144 myI1End(i1End),
145 myI2End(i2End),
146 myI3End(i3End),
147 myDownstream(downstream),
148 myDirection(downstream ? 1 : -1) {
149 }
150
151 bool operator== (AnyVehicleIterator const& other) const {
152 return (myI1 == other.myI1
153 && myI2 == other.myI2
154 && myI3 == other.myI3
155 && myI1End == other.myI1End
156 && myI2End == other.myI2End
157 && myI3End == other.myI3End);
158 }
159
160 bool operator!= (AnyVehicleIterator const& other) const {
161 return !(*this == other);
162 }
163
165 return **this;
166 }
167
168 const MSVehicle* operator*();
169
171
172 private:
173 bool nextIsMyVehicles() const;
174
178 int myI1;
180 int myI2;
182 int myI3;
193
194 };
195
196
197public:
207
223 MSLane(const std::string& id, double maxSpeed, double friction, double length, MSEdge* const edge,
224 int numericalID, const PositionVector& shape, double width,
225 SVCPermissions permissions,
226 SVCPermissions changeLeft, SVCPermissions changeRight,
227 int index, bool isRampAccel,
228 const std::string& type,
229 const PositionVector& outlineShape);
230
231
233 virtual ~MSLane();
234
236 inline int getThreadIndex() const {
238 }
239
241 inline int getRNGIndex() const {
242 return myRNGIndex;
243 }
244
246 SumoRNG* getRNG() const {
247 return &myRNGs[myRNGIndex];
248 }
249
251 static int getNumRNGs() {
252 return (int)myRNGs.size();
253 }
254
256 static void saveRNGStates(OutputDevice& out);
257
259 static void loadRNGState(int index, const std::string& state);
260
263
271 void addLink(MSLink* link);
272
277 void setOpposite(MSLane* oppositeLane);
278
283 void setBidiLane(MSLane* bidyLane);
285
288 virtual void addSecondaryShape(const PositionVector& /*shape*/) {}
289
290 virtual double getLengthGeometryFactor(bool /*secondaryShape*/) const {
292 }
293
294 virtual const PositionVector& getShape(bool /*secondaryShape*/) const {
295 return myShape;
296 }
298
299
302
309 virtual void addMoveReminder(MSMoveReminder* rem, bool addToVehicles = true);
310
311
317 virtual void removeMoveReminder(MSMoveReminder* rem);
318
319
323 inline const std::vector< MSMoveReminder* >& getMoveReminders() const {
324 return myMoveReminders;
325 }
327
328
329
332
348 bool insertVehicle(MSVehicle& v);
349
350
369 bool isInsertionSuccess(MSVehicle* vehicle, double speed, double pos, double posLat,
370 bool recheckNextLanes,
371 MSMoveReminder::Notification notification);
372
373 // XXX: Documentation?
374 bool checkFailure(const MSVehicle* aVehicle, double& speed, double& dist, const double nspeed, const bool patchSpeed, const std::string errorMsg, InsertionCheck check) const;
375
379 bool lastInsertion(MSVehicle& veh, double mspeed, double posLat, bool patchSpeed);
380
388 bool freeInsertion(MSVehicle& veh, double speed, double posLat,
390
391
401 void forceVehicleInsertion(MSVehicle* veh, double pos, MSMoveReminder::Notification notification, double posLat = 0);
403
404
405
409
416 virtual double setPartialOccupation(MSVehicle* v);
417
421 virtual void resetPartialOccupation(MSVehicle* v);
422
425 virtual void setManeuverReservation(MSVehicle* v);
426
430 virtual void resetManeuverReservation(MSVehicle* v);
431
442 const MSLeaderInfo getLastVehicleInformation(const MSVehicle* ego, double latOffset, double minPos = 0, bool allowCached = true) const;
443
445 const MSLeaderInfo getFirstVehicleInformation(const MSVehicle* ego, double latOffset, bool onlyFrontOnLane, double maxPos = std::numeric_limits<double>::max(), bool allowCached = true) const;
446
448
451
456 int getVehicleNumber() const {
457 return (int)myVehicles.size();
458 }
459
465 return (int)myVehicles.size() + (int)myPartialVehicles.size();
466 }
467
473 return (int)myPartialVehicles.size();
474 }
475
476
483 virtual const VehCont& getVehiclesSecure() const {
484 return myVehicles;
485 }
486
487
490 return AnyVehicleIterator(this, 0, 0, 0,
491 (int)myVehicles.size(), (int)myPartialVehicles.size(), (int)myTmpVehicles.size(), true);
492 }
493
496 return AnyVehicleIterator(this, (int)myVehicles.size(), (int)myPartialVehicles.size(), (int)myTmpVehicles.size(),
497 (int)myVehicles.size(), (int)myPartialVehicles.size(), (int)myTmpVehicles.size(), true);
498 }
499
502 return AnyVehicleIterator(this, (int)myVehicles.size() - 1, (int)myPartialVehicles.size() - 1, (int)myTmpVehicles.size() - 1,
503 -1, -1, -1, false);
504 }
505
508 return AnyVehicleIterator(this, -1, -1, -1, -1, -1, -1, false);
509 }
510
513 virtual void releaseVehicles() const { }
515
516
517
520
521
525 inline int getNumericalID() const {
526 return myNumericalID;
527 }
528
529
533 inline const PositionVector& getShape() const {
534 return myShape;
535 }
536
538 inline double getLengthGeometryFactor() const {
540 }
541
543 inline bool isAccelLane() const {
544 return myIsRampAccel;
545 }
546
548 const std::string& getLaneType() const {
549 return myLaneType;
550 }
551
552 /* @brief fit the given lane position to a visibly suitable geometry position
553 * (lane length might differ from geometry length) */
554 inline double interpolateLanePosToGeometryPos(double lanePos) const {
555 return lanePos * myLengthGeometryFactor;
556 }
557
558 /* @brief fit the given lane position to a visibly suitable geometry position
559 * and return the coordinates */
560 inline const Position geometryPositionAtOffset(double offset, double lateralOffset = 0) const {
561 return myShape.positionAtOffset(interpolateLanePosToGeometryPos(offset), lateralOffset);
562 }
563
564 /* @brief fit the given geometry position to a valid lane position
565 * (lane length might differ from geometry length) */
566 inline double interpolateGeometryPosToLanePos(double geometryPos) const {
567 return geometryPos / myLengthGeometryFactor;
568 }
569
574 inline double getVehicleMaxSpeed(const SUMOTrafficObject* const veh) const {
575 return getVehicleMaxSpeed(veh, veh->getMaxSpeed());
576 }
577
578
579 inline double getVehicleMaxSpeed(const SUMOTrafficObject* const veh, double vehMaxSpeed) const {
580 if (myRestrictions != nullptr) {
581 std::map<SUMOVehicleClass, double>::const_iterator r = myRestrictions->find(veh->getVClass());
582 if (r != myRestrictions->end()) {
584 return MIN2(myMaxSpeed, MIN2(vehMaxSpeed, r->second * veh->getChosenSpeedFactor()));
585 } else {
586 return MIN2(vehMaxSpeed, r->second * veh->getChosenSpeedFactor());
587 }
588 }
589 }
590 return MIN2(vehMaxSpeed, myMaxSpeed * veh->getChosenSpeedFactor());
591 }
592
593
597 inline double getSpeedLimit() const {
598 return myMaxSpeed;
599 }
600
604 inline double getFrictionCoefficient() const {
606 }
607
611 inline double getLength() const {
612 return myLength;
613 }
614
615
620 return myPermissions;
621 }
622
627 return myChangeLeft;
628 }
629
634 return myChangeRight;
635 }
636
640 double getWidth() const {
641 return myWidth;
642 }
643
647 int getIndex() const {
648 return myIndex;
649 }
651
653 int getCrossingIndex() const;
654
655
658
666 virtual void planMovements(const SUMOTime t);
667
673 virtual void setJunctionApproaches() const;
674
683 void updateLeaderInfo(const MSVehicle* veh, VehCont::reverse_iterator& vehPart, VehCont::reverse_iterator& vehRes, MSLeaderInfo& ahead) const;
684
695 virtual void executeMovements(const SUMOTime t);
696
698 virtual void integrateNewVehicles();
699
703
705 void updateLengthSum();
707
708
710 inline bool needsCollisionCheck() const {
712 }
713
715 inline void requireCollisionCheck() {
717 }
718
720 virtual void detectCollisions(SUMOTime timestep, const std::string& stage);
721
722
725 virtual bool appropriate(const MSVehicle* veh) const;
726
727
729 const std::vector<MSLink*>& getLinkCont() const {
730 return myLinks;
731 }
732
734 const MSLink* getLinkTo(const MSLane* const) const;
735
737 const MSLane* getInternalFollowingLane(const MSLane* const) const;
738
740 const MSLink* getEntryLink() const;
741
742
744 bool empty() const {
745 assert(myVehBuffer.size() == 0);
746 return myVehicles.empty();
747 }
748
754 void setMaxSpeed(double val, bool byVSS = false, bool byTraCI = false, double jamThreshold = -1);
755
759 void setFrictionCoefficient(double val);
760
764 void setLength(double val);
765
769 MSEdge& getEdge() const {
770 return *myEdge;
771 }
772
773 const MSJunction* getFromJunction() const;
774 const MSJunction* getToJunction() const;
775
779 const MSEdge* getNextNormal() const;
780
781
787 const MSLane* getFirstInternalInConnection(double& offset) const;
788
789
792
803 static bool dictionary(const std::string& id, MSLane* lane);
804
805
812 static MSLane* dictionary(const std::string& id);
813
814
816 static void clear();
817
818
822 static int dictSize() {
823 return (int)myDict.size();
824 }
825
826
830 static void insertIDs(std::vector<std::string>& into);
831
832
837 template<class RTREE>
838 static void fill(RTREE& into);
839
840
842 static void initRNGs(const OptionsCont& oc);
844
845
846
847 // XXX: succLink does not exist... Documentation?
852 static std::vector<MSLink*>::const_iterator succLinkSec(const SUMOVehicle& veh,
853 int nRouteSuccs,
854 const MSLane& succLinkSource,
855 const std::vector<MSLane*>& conts);
856
857
860 inline bool isLinkEnd(std::vector<MSLink*>::const_iterator& i) const {
861 return i == myLinks.end();
862 }
863
866 inline bool isLinkEnd(std::vector<MSLink*>::iterator& i) {
867 return i == myLinks.end();
868 }
869
872 inline bool isEmpty() const {
873 return myVehicles.empty() && myPartialVehicles.empty();
874 }
875
877 bool isInternal() const;
878
880 bool isNormal() const;
881
883 bool isCrossing() const;
884
886 bool isWalkingArea() const;
887
890
893
896
899
900 /* @brief remove the vehicle from this lane
901 * @param[notify] whether moveReminders of the vehicle shall be triggered
902 */
903 virtual MSVehicle* removeVehicle(MSVehicle* remVehicle, MSMoveReminder::Notification notification, bool notify = true);
904
907
911 MSLane* getParallelLane(int offset, bool includeOpposite = true) const;
912
913
918 void setPermissions(SVCPermissions permissions, long long transientID);
919 void resetPermissions(long long transientID);
920 bool hadPermissionChanges() const;
921
925 void setChangeLeft(SVCPermissions permissions);
926
930 void setChangeRight(SVCPermissions permissions);
931
932 inline bool allowsVehicleClass(SUMOVehicleClass vclass) const {
933 return (myPermissions & vclass) == vclass;
934 }
935
936 bool allowsVehicleClass(SUMOVehicleClass vclass, int routingMode) const;
937
939 inline bool allowsChangingLeft(SUMOVehicleClass vclass) const {
940 return (myChangeLeft & vclass) == vclass;
941 }
942
944 inline bool allowsChangingRight(SUMOVehicleClass vclass) const {
945 return (myChangeRight & vclass) == vclass;
946 }
947
948 void addIncomingLane(MSLane* lane, MSLink* viaLink);
949
950
956
957 const std::vector<IncomingLaneInfo>& getIncomingLanes() const {
958 return myIncomingLanes;
959 }
960
961
962 void addApproachingLane(MSLane* lane, bool warnMultiCon);
963 inline bool isApproachedFrom(MSEdge* const edge) {
964 return myApproachingLanes.find(edge) != myApproachingLanes.end();
965 }
966 bool isApproachedFrom(MSEdge* const edge, MSLane* const lane);
967
969 double getVehicleStopOffset(const MSVehicle* veh) const;
970
972 const StopOffset& getLaneStopOffsets() const;
973
975 void setLaneStopOffset(const StopOffset& stopOffset);
976
985
987 MSLeaderDistanceInfo getFollowersOnConsecutive(const MSVehicle* ego, double backOffset,
988 bool allSublanes, double searchDist = -1, MinorLinkMode mLinkMode = FOLLOW_ALWAYS) const;
989
991 double getMissingRearGap(const MSVehicle* leader, double backOffset, double leaderSpeed) const;
992
1005 std::pair<MSVehicle* const, double> getLeader(const MSVehicle* veh, const double vehPos, const std::vector<MSLane*>& bestLaneConts, double dist = -1, bool checkTmpVehicles = false) const;
1006
1030 std::pair<MSVehicle* const, double> getLeaderOnConsecutive(double dist, double seen,
1031 double speed, const MSVehicle& veh, const std::vector<MSLane*>& bestLaneConts, bool considerCrossingFoes = true) const;
1032
1034 void getLeadersOnConsecutive(double dist, double seen, double speed, const MSVehicle* ego,
1035 const std::vector<MSLane*>& bestLaneConts, MSLeaderDistanceInfo& result, bool oppositeDirection = false) const;
1036
1037
1039 void addLeaders(const MSVehicle* vehicle, double vehPos, MSLeaderDistanceInfo& result, bool oppositeDirection = false);
1040
1041
1059 std::pair<MSVehicle* const, double> getCriticalLeader(double dist, double seen, double speed, const MSVehicle& veh) const;
1060
1061 /* @brief return the partial vehicle closest behind ego or 0
1062 * if no such vehicle exists */
1063 MSVehicle* getPartialBehind(const MSVehicle* ego) const;
1064
1067
1078 std::set<MSVehicle*> getSurroundingVehicles(double startPos, double downstreamDist, double upstreamDist, std::shared_ptr<LaneCoverageInfo> checkedLanes) const;
1079
1082 std::set<MSVehicle*> getVehiclesInRange(const double a, const double b) const;
1083
1085 std::vector<const MSJunction*> getUpcomingJunctions(double pos, double range, const std::vector<MSLane*>& contLanes) const;
1086
1088 std::vector<const MSLink*> getUpcomingLinks(double pos, double range, const std::vector<MSLane*>& contLanes) const;
1089
1094
1098 const MSLane* getNormalPredecessorLane() const;
1099
1103 const MSLane* getNormalSuccessorLane() const;
1104
1107 MSLane* getLogicalPredecessorLane(const MSEdge& fromEdge) const;
1108
1109
1116
1117
1124
1127
1129 const std::vector<std::pair<const MSLane*, const MSEdge*> > getOutgoingViaLanes() const;
1130
1132 std::vector<const MSLane*> getNormalIncomingLanes() const;
1133
1135
1136
1140 double getMeanSpeed() const;
1141
1143 double getMeanSpeedBike() const;
1144
1148 double getWaitingSeconds() const;
1149
1150
1154 double getBruttoOccupancy() const;
1155
1156
1160 double getNettoOccupancy() const;
1161
1162
1166 inline double getBruttoVehLenSum() const {
1168 }
1169
1170
1175 template<PollutantsInterface::EmissionType ET>
1176 double getEmissions() const {
1177 double ret = 0;
1178 for (MSVehicle* const v : getVehiclesSecure()) {
1179 ret += v->getEmissions<ET>();
1180 }
1182 return ret;
1183 }
1184
1185
1189 double getHarmonoise_NoiseEmissions() const;
1191
1192 void setRightSideOnEdge(double value, int rightmostSublane) {
1193 myRightSideOnEdge = value;
1194 myRightmostSublane = rightmostSublane;
1195 }
1196
1198 void initRestrictions();
1199
1200 void checkBufferType();
1201
1202 double getRightSideOnEdge() const {
1203 return myRightSideOnEdge;
1204 }
1205
1207 return myRightmostSublane;
1208 }
1209
1210 double getCenterOnEdge() const {
1211 return myRightSideOnEdge + 0.5 * myWidth;
1212 }
1213
1215 void sortPartialVehicles();
1216
1219
1221 MSLane* getOpposite() const;
1222
1224 MSLane* getParallelOpposite() const;
1225
1227 double getOppositePos(double pos) const;
1228
1229 /* @brief find leader for a vehicle depending on the relative driving direction
1230 * @param[in] ego The ego vehicle
1231 * @param[in] dist The look-ahead distance when looking at consecutive lanes
1232 * @param[in] oppositeDir Whether the lane has the opposite driving direction of ego
1233 * @return the leader vehicle and its gap to ego
1234 */
1235 std::pair<MSVehicle* const, double> getOppositeLeader(const MSVehicle* ego, double dist, bool oppositeDir, MinorLinkMode mLinkMode = MinorLinkMode::FOLLOW_NEVER) const;
1236
1237 /* @brief find follower for a vehicle that is located on the opposite of this lane
1238 * @param[in] ego The ego vehicle
1239 * @return the follower vehicle and its gap to ego
1240 */
1241 std::pair<MSVehicle* const, double> getOppositeFollower(const MSVehicle* ego) const;
1242
1243
1251 std::pair<MSVehicle* const, double> getFollower(const MSVehicle* ego, double egoPos, double dist, MinorLinkMode mLinkMode) const;
1252
1253
1255 void addParking(MSBaseVehicle* veh);
1256
1258 virtual void removeParking(MSBaseVehicle* veh);
1259
1261 const std::set<const MSBaseVehicle*>& getParkingVehicles() const {
1262 return myParkingVehicles;
1263 }
1264
1266 virtual bool isSelected() const {
1267 return false;
1268 }
1269
1271 MSLane* getBidiLane() const;
1272
1274 bool mustCheckJunctionCollisions() const;
1275
1276#ifdef HAVE_FOX
1277 MFXWorkerThread::Task* getPlanMoveTask(const SUMOTime time) {
1278 mySimulationTask.init(&MSLane::planMovements, time);
1279 return &mySimulationTask;
1280 }
1281
1282 MFXWorkerThread::Task* getExecuteMoveTask(const SUMOTime time) {
1283 mySimulationTask.init(&MSLane::executeMovements, time);
1284 return &mySimulationTask;
1285 }
1286
1287 MFXWorkerThread::Task* getLaneChangeTask(const SUMOTime time) {
1288 mySimulationTask.init(&MSLane::changeLanes, time);
1289 return &mySimulationTask;
1290 }
1291#endif
1292
1293 std::vector<StopWatch<std::chrono::nanoseconds> >& getStopWatch() {
1294 return myStopWatch;
1295 }
1296
1297 void changeLanes(const SUMOTime time);
1298
1301
1309 void saveState(OutputDevice& out);
1310
1312 void clearState();
1313
1324 void loadState(const std::vector<SUMOVehicle*>& vehs);
1325
1326
1327 /* @brief helper function for state saving: checks whether any outgoing
1328 * links are being approached */
1329 bool hasApproaching() const;
1330
1332
1333
1341 void visit(const MSLane::StoringVisitor& cont) const {
1342 cont.add(this);
1343 }
1344
1346 bool hasPedestrians() const;
1347
1349 std::pair<const MSPerson*, double> nextBlocking(double minPos, double minRight, double maxLeft, double stopTime = 0, bool bidi = false) const;
1350
1352 double getSpaceTillLastStanding(const MSVehicle* ego, bool& foundStopped) const;
1353
1355 double getMaximumBrakeDist() const;
1356
1357 inline const PositionVector* getOutlineShape() const {
1358 return myOutlineShape;
1359 }
1360
1361 static void initCollisionOptions(const OptionsCont& oc);
1362 static void initCollisionAction(const OptionsCont& oc, const std::string& option, CollisionAction& myAction);
1363
1367
1371
1375
1376 static double& getDefaultDepartSpeed() {
1377 return myDefaultDepartSpeed;
1378 }
1379
1380
1381 static const long CHANGE_PERMISSIONS_PERMANENT = 0;
1382 static const long CHANGE_PERMISSIONS_GUI = 1;
1383
1384protected:
1386 virtual void swapAfterLaneChange(SUMOTime t);
1387
1399 virtual void incorporateVehicle(MSVehicle* veh, double pos, double speed, double posLat,
1400 const MSLane::VehCont::iterator& at,
1402
1404 void detectPedestrianJunctionCollision(const MSVehicle* collider, const PositionVector& colliderBoundary, const MSLane* foeLane,
1405 SUMOTime timestep, const std::string& stage,
1406 std::set<const MSVehicle*, ComparatorNumericalIdLess>& toRemove,
1407 std::set<const MSVehicle*, ComparatorNumericalIdLess>& toTeleport);
1408
1410 bool detectCollisionBetween(SUMOTime timestep, const std::string& stage, MSVehicle* collider, MSVehicle* victim,
1411 std::set<const MSVehicle*, ComparatorNumericalIdLess>& toRemove,
1412 std::set<const MSVehicle*, ComparatorNumericalIdLess>& toTeleport) const;
1413
1415 void handleCollisionBetween(SUMOTime timestep, const std::string& stage, const MSVehicle* collider, const MSVehicle* victim,
1416 double gap, double latGap,
1417 std::set<const MSVehicle*, ComparatorNumericalIdLess>& toRemove,
1418 std::set<const MSVehicle*, ComparatorNumericalIdLess>& toTeleport) const;
1419
1420 void handleIntermodalCollisionBetween(SUMOTime timestep, const std::string& stage, const MSVehicle* collider, const MSTransportable* victim,
1421 double gap, const std::string& collisionType,
1422 std::set<const MSVehicle*, ComparatorNumericalIdLess>& toRemove,
1423 std::set<const MSVehicle*, ComparatorNumericalIdLess>& toTeleport) const;
1424
1425 /* @brief determine depart speed and whether it may be patched
1426 * @param[in] veh The departing vehicle
1427 * @param[out] whether the speed may be patched to account for safety
1428 * @return the depart speed
1429 */
1430 double getDepartSpeed(const MSVehicle& veh, bool& patchSpeed);
1431
1432 /* @brief determine the lateral depart position
1433 * @param[in] veh The departing vehicle
1434 * @return the lateral depart position
1435 */
1436 double getDepartPosLat(const MSVehicle& veh);
1437
1440 double safeInsertionSpeed(const MSVehicle* veh, double seen, const MSLeaderInfo& leaders, double speed);
1441
1443 bool checkForPedestrians(const MSVehicle* aVehicle, double& speed, double& dist, double pos, bool patchSpeed) const;
1444
1446 bool hasApproaching(const std::vector<MSLink*>& links) const;
1447
1449 double getFractionalVehicleLength(bool brutto) const;
1450
1452 static bool isFrontalCollision(const MSVehicle* collider, const MSVehicle* victim);
1453
1456
1459
1462
1465
1478
1490
1494
1498
1506
1507 /* @brief list of vehicles that are parking near this lane
1508 * (not necessarily on the road but having reached their stop on this lane)
1509 * */
1510 std::set<const MSBaseVehicle*> myParkingVehicles;
1511
1513 double myLength;
1514
1516 const double myWidth;
1517
1522
1525
1530
1533
1536
1539
1543
1546
1548 const std::map<SUMOVehicleClass, double>* myRestrictions;
1549
1551 std::vector<IncomingLaneInfo> myIncomingLanes;
1552
1555
1558
1561
1564
1567
1570
1573
1576
1579 std::vector<MSLink*> myLinks;
1580
1582 std::map<MSEdge*, std::vector<MSLane*> > myApproachingLanes;
1583
1588
1593
1596
1598 const bool myIsRampAccel;
1599
1601 const std::string myLaneType;
1602
1607
1610
1611 // @brief the neighboring opposite direction or nullptr
1613
1614 // @brief bidi lane or nullptr
1616
1617 // @brief transient changes in permissions
1618 std::map<long long, SVCPermissions> myPermissionChanges;
1619
1620 // @brief index of the associated thread-rng
1622
1624 typedef std::map< std::string, MSLane* > DictType;
1625
1628
1629 static std::vector<SumoRNG> myRNGs;
1630
1631private:
1633 std::vector< MSMoveReminder* > myMoveReminders;
1634
1651 public:
1653 explicit vehicle_position_sorter(const MSLane* lane) :
1654 myLane(lane) {
1655 }
1656
1657
1663 int operator()(MSVehicle* v1, MSVehicle* v2) const;
1664
1666
1667 };
1668
1674 public:
1677 myLane(lane) {
1678 }
1679
1680
1686 int operator()(MSVehicle* v1, MSVehicle* v2) const;
1687
1689
1690 };
1691
1697 public:
1699 explicit by_connections_to_sorter(const MSEdge* const e);
1700
1702 int operator()(const MSEdge* const e1, const MSEdge* const e2) const;
1703
1704 private:
1705 const MSEdge* const myEdge;
1707 };
1708
1709
1710
1716 public:
1718 explicit incoming_lane_priority_sorter(const MSLane* targetLane);
1719
1721 int operator()(const IncomingLaneInfo& lane1, const IncomingLaneInfo& lane2) const;
1722
1723 private:
1724 const MSLane* const myLane;
1726 };
1727
1728
1734 public:
1736 explicit outgoing_lane_priority_sorter(const MSLane* sourceLane);
1737
1739 int operator()(const MSLink* link1, const MSLink* link2) const;
1740
1741 private:
1743 };
1744
1749 public:
1751 bool operator()(const IncomingLaneInfo& ili) const {
1752 return &(ili.lane->getEdge()) == myEdge;
1753 }
1754 private:
1755 const MSEdge* const myEdge;
1756 };
1757
1758#ifdef HAVE_FOX
1760 typedef void(MSLane::*Operation)(const SUMOTime);
1761
1766 class SimulationTask : public MFXWorkerThread::Task {
1767 public:
1768 SimulationTask(MSLane& l, const SUMOTime time)
1769 : myLane(l), myTime(time) {}
1770 void init(Operation operation, const SUMOTime time) {
1771 myOperation = operation;
1772 myTime = time;
1773 }
1774 void run(MFXWorkerThread* /*context*/) {
1775 try {
1776 (myLane.*(myOperation))(myTime);
1777 } catch (ProcessError& e) {
1778 WRITE_ERROR(e.what());
1779 }
1780 }
1781 private:
1782 Operation myOperation = nullptr;
1783 MSLane& myLane;
1784 SUMOTime myTime;
1785 private:
1787 SimulationTask& operator=(const SimulationTask&) = delete;
1788 };
1789
1790 SimulationTask mySimulationTask;
1792 mutable FXMutex myLeaderInfoMutex;
1794 mutable FXMutex myFollowerInfoMutex;
1796 mutable FXMutex myPartialOccupatorMutex;
1797#endif
1798 std::vector<StopWatch<std::chrono::nanoseconds> > myStopWatch;
1799
1800private:
1802 MSLane(const MSLane&) = delete;
1803
1805 MSLane& operator=(const MSLane&) = delete;
1806
1807
1808};
1809
1810// specialized implementation for speedup and avoiding warnings
1811#define LANE_RTREE_QUAL RTree<MSLane*, MSLane, float, 2, MSLane::StoringVisitor>
1812
1813template<>
1814inline float LANE_RTREE_QUAL::RectSphericalVolume(Rect* a_rect) {
1815 ASSERT(a_rect);
1816 const float extent0 = a_rect->m_max[0] - a_rect->m_min[0];
1817 const float extent1 = a_rect->m_max[1] - a_rect->m_min[1];
1818 return .78539816f * (extent0 * extent0 + extent1 * extent1);
1819}
1820
1821template<>
1822inline LANE_RTREE_QUAL::Rect LANE_RTREE_QUAL::CombineRect(Rect* a_rectA, Rect* a_rectB) {
1823 ASSERT(a_rectA && a_rectB);
1824 Rect newRect;
1825 newRect.m_min[0] = rtree_min(a_rectA->m_min[0], a_rectB->m_min[0]);
1826 newRect.m_max[0] = rtree_max(a_rectA->m_max[0], a_rectB->m_max[0]);
1827 newRect.m_min[1] = rtree_min(a_rectA->m_min[1], a_rectB->m_min[1]);
1828 newRect.m_max[1] = rtree_max(a_rectA->m_max[1], a_rectB->m_max[1]);
1829 return newRect;
1830}
long long int SUMOTime
Definition GUI.h:36
std::map< const MSLane *, std::pair< double, double > > LaneCoverageInfo
Coverage info.
Definition MSLane.h:72
#define WRITE_ERROR(msg)
Definition MsgHandler.h:295
#define rtree_min(a, b)
Definition RTree.h:20
#define rtree_max(a, b)
Definition RTree.h:21
#define ASSERT
Definition RTree.h:12
long long int SVCPermissions
bitset where each bit declares whether a certain SVC may use this edge/lane
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types.
DepartSpeedDefinition
Possible ways to choose the departure speed.
InsertionCheck
different checking levels for vehicle insertion
LinkState
The right-of-way state of a link between two lanes used when constructing a NBTrafficLightLogic,...
T MIN2(T a, T b)
Definition StdDefs.h:80
size_t size() const
Abstract superclass of a task to be run with an index to keep track of pending tasks.
A thread repeatingly calculating incoming tasks.
The base class for microscopic and mesoscopic vehicles.
A road/street connecting two junctions.
Definition MSEdge.h:77
static int gNumSimThreads
how many threads to use for simulation
Definition MSGlobals.h:146
The base class for an intersection.
Definition MSJunction.h:58
AnyVehicleIterator is a structure, which manages the iteration through all vehicles on the lane,...
Definition MSLane.h:129
bool operator!=(AnyVehicleIterator const &other) const
Definition MSLane.h:160
int myI2End
end index for myPartialVehicles
Definition MSLane.h:186
int myI2
index for myPartialVehicles
Definition MSLane.h:180
bool myDownstream
iteration direction
Definition MSLane.h:190
const MSVehicle * operator->()
Definition MSLane.h:164
bool nextIsMyVehicles() const
Definition MSLane.cpp:204
int myI3
index for myTmpVehicles
Definition MSLane.h:182
int myDirection
index delta
Definition MSLane.h:192
AnyVehicleIterator & operator++()
Definition MSLane.cpp:170
const MSLane * myLane
the lane that is being iterated
Definition MSLane.h:176
bool operator==(AnyVehicleIterator const &other) const
Definition MSLane.h:151
const MSVehicle * operator*()
Definition MSLane.cpp:187
int myI3End
end index for myTmpVehicles
Definition MSLane.h:188
AnyVehicleIterator(const MSLane *lane, int i1, int i2, int i3, const int i1End, const int i2End, const int i3End, bool downstream=true)
Definition MSLane.h:131
int myI1End
end index for myVehicles
Definition MSLane.h:184
int myI1
index for myVehicles
Definition MSLane.h:178
StoringVisitor(const StoringVisitor &src)
invalidated copy constructor
void add(const MSLane *const l) const
Adds the given object to the container.
Definition MSLane.cpp:123
StoringVisitor(std::set< const Named * > &objects, const PositionVector &shape, const double range, const int domain)
Constructor.
Definition MSLane.h:89
StoringVisitor & operator=(const StoringVisitor &src)
invalidated assignment operator
std::set< const Named * > & myObjects
The container.
Definition MSLane.h:98
const double myRange
Definition MSLane.h:100
const PositionVector & myShape
Definition MSLane.h:99
Sorts edges by their angle relative to the given edge (straight comes first)
Definition MSLane.h:1696
const MSEdge *const myEdge
Definition MSLane.h:1705
int operator()(const MSEdge *const e1, const MSEdge *const e2) const
comparing operator
Definition MSLane.cpp:3532
bool operator()(const IncomingLaneInfo &ili) const
Definition MSLane.h:1751
edge_finder(MSEdge *e)
Definition MSLane.h:1750
const MSEdge *const myEdge
Definition MSLane.h:1755
Sorts lanes (IncomingLaneInfos) by their priority or, if this doesn't apply, wrt. the angle differenc...
Definition MSLane.h:1715
int operator()(const IncomingLaneInfo &lane1, const IncomingLaneInfo &lane2) const
comparing operator
Definition MSLane.cpp:3571
Sorts lanes (their origin link) by the priority of their noninternal target edges or,...
Definition MSLane.h:1733
int operator()(const MSLink *link1, const MSLink *link2) const
comparing operator
Definition MSLane.cpp:3648
vehicle_natural_position_sorter(const MSLane *lane)
Constructor.
Definition MSLane.h:1676
int operator()(MSVehicle *v1, MSVehicle *v2) const
Comparing operator.
Definition MSLane.cpp:3514
Sorts vehicles by their position (descending)
Definition MSLane.h:1650
int operator()(MSVehicle *v1, MSVehicle *v2) const
Comparing operator.
Definition MSLane.cpp:3502
vehicle_position_sorter(const MSLane *lane)
Constructor.
Definition MSLane.h:1653
Performs lane changing of vehicles.
Performs lane changing of vehicles.
Representation of a lane in the micro simulation.
Definition MSLane.h:84
std::vector< StopWatch< std::chrono::nanoseconds > > & getStopWatch()
Definition MSLane.h:1293
void addApproachingLane(MSLane *lane, bool warnMultiCon)
Definition MSLane.cpp:2866
void loadState(const std::vector< SUMOVehicle * > &vehs)
Loads the state of this segment with the given parameters.
Definition MSLane.cpp:3763
bool detectCollisionBetween(SUMOTime timestep, const std::string &stage, MSVehicle *collider, MSVehicle *victim, std::set< const MSVehicle *, ComparatorNumericalIdLess > &toRemove, std::set< const MSVehicle *, ComparatorNumericalIdLess > &toTeleport) const
detect whether there is a collision between the two vehicles
Definition MSLane.cpp:1939
static SUMOTime myIntermodalCollisionStopTime
Definition MSLane.h:1641
MFXSynchQue< MSVehicle *, std::vector< MSVehicle * > > myVehBuffer
Buffer for vehicles that moved from their previous lane onto this one. Integrated after all vehicles ...
Definition MSLane.h:1497
SVCPermissions myPermissions
The vClass permissions for this lane.
Definition MSLane.h:1538
MSLane * myLogicalPredecessorLane
Definition MSLane.h:1554
static void initCollisionAction(const OptionsCont &oc, const std::string &option, CollisionAction &myAction)
Definition MSLane.cpp:4493
const std::vector< MSMoveReminder * > & getMoveReminders() const
Return the list of this lane's move reminders.
Definition MSLane.h:323
std::set< const MSBaseVehicle * > myParkingVehicles
Definition MSLane.h:1510
bool checkForPedestrians(const MSVehicle *aVehicle, double &speed, double &dist, double pos, bool patchSpeed) const
check whether pedestrians on this lane interfere with vehicle insertion
Definition MSLane.cpp:4580
std::pair< MSVehicle *const, double > getFollower(const MSVehicle *ego, double egoPos, double dist, MinorLinkMode mLinkMode) const
Find follower vehicle for the given ego vehicle (which may be on the opposite direction lane)
Definition MSLane.cpp:4400
static DepartSpeedDefinition & getDefaultDepartSpeedDefinition()
Definition MSLane.h:1372
static double myDefaultDepartSpeed
Definition MSLane.h:1645
std::pair< const MSPerson *, double > nextBlocking(double minPos, double minRight, double maxLeft, double stopTime=0, bool bidi=false) const
This is just a wrapper around MSPModel::nextBlocking. You should always check using hasPedestrians be...
Definition MSLane.cpp:4574
MSLane * getParallelLane(int offset, bool includeOpposite=true) const
Returns the lane with the given offset parallel to this one or 0 if it does not exist.
Definition MSLane.cpp:2850
double myRightSideOnEdge
the combined width of all lanes with lower index on myEdge
Definition MSLane.h:1604
const StopOffset & getLaneStopOffsets() const
Returns vehicle class specific stopOffsets.
Definition MSLane.cpp:3791
virtual void removeParking(MSBaseVehicle *veh)
remove parking vehicle. This must be syncrhonized when running with GUI
Definition MSLane.cpp:3689
virtual ~MSLane()
Destructor.
Definition MSLane.cpp:305
static CollisionAction getIntermodalCollisionAction()
Definition MSLane.h:1368
bool insertVehicle(MSVehicle &v)
Tries to insert the given vehicle.
Definition MSLane.cpp:690
const MSLeaderInfo getFirstVehicleInformation(const MSVehicle *ego, double latOffset, bool onlyFrontOnLane, double maxPos=std::numeric_limits< double >::max(), bool allowCached=true) const
analogue to getLastVehicleInformation but in the upstream direction
Definition MSLane.cpp:1501
virtual void integrateNewVehicles()
Insert buffered vehicle into the real lane.
Definition MSLane.cpp:2566
double myLength
Lane length [m].
Definition MSLane.h:1513
bool isApproachedFrom(MSEdge *const edge)
Definition MSLane.h:963
double getNettoOccupancy() const
Returns the netto (excluding minGaps) occupancy of this lane during the last step (including minGaps)
Definition MSLane.cpp:3411
virtual MSVehicle * removeVehicle(MSVehicle *remVehicle, MSMoveReminder::Notification notification, bool notify=true)
Definition MSLane.cpp:2832
int getCrossingIndex() const
return the index of the link to the next crossing if this is walkingArea, else -1
Definition MSLane.cpp:3366
PositionVector myShape
The shape of the lane.
Definition MSLane.h:1458
PositionVector * myOutlineShape
the outline of the lane (optional)
Definition MSLane.h:1461
std::map< long long, SVCPermissions > myPermissionChanges
Definition MSLane.h:1618
int getRNGIndex() const
returns the associated RNG index
Definition MSLane.h:241
double getFrictionCoefficient() const
Returns the lane's friction coefficient.
Definition MSLane.h:604
const std::map< SUMOVehicleClass, double > * myRestrictions
The vClass speed restrictions for this lane.
Definition MSLane.h:1548
virtual void incorporateVehicle(MSVehicle *veh, double pos, double speed, double posLat, const MSLane::VehCont::iterator &at, MSMoveReminder::Notification notification=MSMoveReminder::NOTIFICATION_DEPARTED)
Inserts the vehicle into this lane, and informs it about entering the network.
Definition MSLane.cpp:455
void initRestrictions()
initialized vClass-specific speed limits
Definition MSLane.cpp:314
std::vector< MSMoveReminder * > myMoveReminders
This lane's move reminder.
Definition MSLane.h:1633
MSLane & operator=(const MSLane &)=delete
invalidated assignment operator
bool hasApproaching() const
Definition MSLane.cpp:3694
SVCPermissions getChangeRight() const
Returns the vehicle class permissions for changing to the right neighbour lane.
Definition MSLane.h:633
void addParking(MSBaseVehicle *veh)
add parking vehicle. This should only used during state loading
Definition MSLane.cpp:3683
VehCont myTmpVehicles
Container for lane-changing vehicles. After completion of lane-change- process, the containers will b...
Definition MSLane.h:1493
static DepartSpeedDefinition myDefaultDepartSpeedDefinition
Definition MSLane.h:1644
double getDepartSpeed(const MSVehicle &veh, bool &patchSpeed)
Definition MSLane.cpp:605
MSLeaderInfo myFollowerInfo
followers on all sublanes as seen by vehicles on consecutive lanes (cached)
Definition MSLane.h:1587
const MSLane * getNormalSuccessorLane() const
get normal lane following this internal lane, for normal lanes, the lane itself is returned
Definition MSLane.cpp:3251
int getVehicleNumber() const
Returns the number of vehicles on this lane (for which this lane is responsible)
Definition MSLane.h:456
static SUMOTime myCollisionStopTime
Definition MSLane.h:1640
static CollisionAction myCollisionAction
the action to take on collisions
Definition MSLane.h:1636
MSLane * myCanonicalSuccessorLane
Main successor lane,.
Definition MSLane.h:1560
SVCPermissions myChangeLeft
The vClass permissions for changing from this lane.
Definition MSLane.h:1541
void getLeadersOnConsecutive(double dist, double seen, double speed, const MSVehicle *ego, const std::vector< MSLane * > &bestLaneConts, MSLeaderDistanceInfo &result, bool oppositeDirection=false) const
Returns the immediate leaders and the distance to them (as getLeaderOnConsecutive but for the sublane...
Definition MSLane.cpp:4037
std::vector< IncomingLaneInfo > myIncomingLanes
All direct predecessor lanes.
Definition MSLane.h:1551
AnyVehicleIterator anyVehiclesEnd() const
end iterator for iterating over all vehicles touching this lane in downstream direction
Definition MSLane.h:495
static void insertIDs(std::vector< std::string > &into)
Adds the ids of all stored lanes into the given vector.
Definition MSLane.cpp:2521
bool hadPermissionChanges() const
Definition MSLane.cpp:4549
void sortPartialVehicles()
sorts myPartialVehicles
Definition MSLane.cpp:2593
double myFrictionCoefficient
Lane-wide friction coefficient [0..1].
Definition MSLane.h:1529
MSVehicle * getFirstAnyVehicle() const
returns the first vehicle that is fully or partially on this lane
Definition MSLane.cpp:2680
MSLane(const MSLane &)=delete
invalidated copy constructor
const MSLink * getEntryLink() const
Returns the entry link if this is an internal lane, else nullptr.
Definition MSLane.cpp:2768
int getVehicleNumberWithPartials() const
Returns the number of vehicles on this lane (including partial occupators)
Definition MSLane.h:464
static bool myCheckJunctionCollisions
Definition MSLane.h:1638
static void clear()
Clears the dictionary.
Definition MSLane.cpp:2512
double getBruttoVehLenSum() const
Returns the sum of lengths of vehicles, including their minGaps, which were on the lane during the la...
Definition MSLane.h:1166
virtual void resetManeuverReservation(MSVehicle *v)
Unregisters a vehicle, which previously registered for maneuvering into this lane.
Definition MSLane.cpp:437
SVCPermissions myOriginalPermissions
The original vClass permissions for this lane (before temporary modifications)
Definition MSLane.h:1545
MSEdge *const myEdge
The lane's edge, for routing only.
Definition MSLane.h:1524
double myNettoVehicleLengthSum
The current length of all vehicles on this lane, excluding their minGaps.
Definition MSLane.h:1566
bool empty() const
Returns true if there is not a single vehicle on the lane.
Definition MSLane.h:744
bool allowsChangingRight(SUMOVehicleClass vclass) const
Returns whether the given vehicle class may change left from this lane.
Definition MSLane.h:944
static std::vector< MSLink * >::const_iterator succLinkSec(const SUMOVehicle &veh, int nRouteSuccs, const MSLane &succLinkSource, const std::vector< MSLane * > &conts)
Definition MSLane.cpp:2694
void detectPedestrianJunctionCollision(const MSVehicle *collider, const PositionVector &colliderBoundary, const MSLane *foeLane, SUMOTime timestep, const std::string &stage, std::set< const MSVehicle *, ComparatorNumericalIdLess > &toRemove, std::set< const MSVehicle *, ComparatorNumericalIdLess > &toTeleport)
detect whether a vehicle collids with pedestrians on the junction
Definition MSLane.cpp:1898
double getMissingRearGap(const MSVehicle *leader, double backOffset, double leaderSpeed) const
return by how much further the leader must be inserted to avoid rear end collisions
Definition MSLane.cpp:2891
double myMaxSpeed
Lane-wide speed limit [m/s].
Definition MSLane.h:1527
void saveState(OutputDevice &out)
Saves the state of this lane into the given stream.
Definition MSLane.cpp:3704
void markRecalculateBruttoSum()
Set a flag to recalculate the brutto (including minGaps) occupancy of this lane (used if mingap is ch...
Definition MSLane.cpp:2433
const MSLink * getLinkTo(const MSLane *const) const
returns the link to the given lane or nullptr, if it is not connected
Definition MSLane.cpp:2745
int myRightmostSublane
the index of the rightmost sublane of this lane on myEdge
Definition MSLane.h:1606
void setChangeRight(SVCPermissions permissions)
Sets the permissions for changing to the right neighbour lane.
Definition MSLane.cpp:4561
const bool myIsRampAccel
whether this lane is an acceleration lane
Definition MSLane.h:1598
virtual void planMovements(const SUMOTime t)
Compute safe velocities for all vehicles based on positions and speeds from the last time step....
Definition MSLane.cpp:1556
virtual double getLengthGeometryFactor(bool) const
Definition MSLane.h:290
static void saveRNGStates(OutputDevice &out)
save random number generator states to the given output device
Definition MSLane.cpp:4660
void visit(const MSLane::StoringVisitor &cont) const
Callback for visiting the lane when traversing an RTree.
Definition MSLane.h:1341
SUMOTime myFollowerInfoTime
time step for which myFollowerInfo was last updated
Definition MSLane.h:1592
MSLeaderInfo myLeaderInfo
leaders on all sublanes as seen by approaching vehicles (cached)
Definition MSLane.h:1585
bool isInsertionSuccess(MSVehicle *vehicle, double speed, double pos, double posLat, bool recheckNextLanes, MSMoveReminder::Notification notification)
Tries to insert the given vehicle with the given state (speed and pos)
Definition MSLane.cpp:850
void forceVehicleInsertion(MSVehicle *veh, double pos, MSMoveReminder::Notification notification, double posLat=0)
Inserts the given vehicle at the given position.
Definition MSLane.cpp:1392
double getVehicleStopOffset(const MSVehicle *veh) const
Returns vehicle class specific stopOffset for the vehicle.
Definition MSLane.cpp:3778
static void initCollisionOptions(const OptionsCont &oc)
Definition MSLane.cpp:4509
int myNumericalID
Unique numerical ID (set on reading by netload)
Definition MSLane.h:1455
bool isAccelLane() const
return whether this lane is an acceleration lane
Definition MSLane.h:543
VehCont myVehicles
The lane's vehicles. This container holds all vehicles that have their front (longitudinally) and the...
Definition MSLane.h:1477
double getSpeedLimit() const
Returns the lane's maximum allowed speed.
Definition MSLane.h:597
MSLeaderInfo getPartialBeyond() const
get all vehicles that are inlapping from consecutive edges
Definition MSLane.cpp:4237
std::vector< MSVehicle * > VehCont
Container for vehicles.
Definition MSLane.h:119
bool checkFailure(const MSVehicle *aVehicle, double &speed, double &dist, const double nspeed, const bool patchSpeed, const std::string errorMsg, InsertionCheck check) const
Definition MSLane.cpp:817
static DictType myDict
Static dictionary to associate string-ids with objects.
Definition MSLane.h:1627
static void fill(RTREE &into)
Fills the given RTree with lane instances.
Definition MSLane.cpp:2529
double safeInsertionSpeed(const MSVehicle *veh, double seen, const MSLeaderInfo &leaders, double speed)
return the maximum safe speed for insertion behind leaders (a negative value indicates that safe inse...
Definition MSLane.cpp:1403
MSLane * myBidiLane
Definition MSLane.h:1615
std::vector< const MSJunction * > getUpcomingJunctions(double pos, double range, const std::vector< MSLane * > &contLanes) const
Returns all upcoming junctions within given range along the given (non-internal) continuation lanes m...
Definition MSLane.cpp:4324
void addIncomingLane(MSLane *lane, MSLink *viaLink)
Definition MSLane.cpp:2856
bool isWalkingArea() const
Definition MSLane.cpp:2637
const MSEdge * getNextNormal() const
Returns the lane's follower if it is an internal lane, the edge of the lane otherwise.
Definition MSLane.cpp:2465
SVCPermissions getChangeLeft() const
Returns the vehicle class permissions for changing to the left neighbour lane.
Definition MSLane.h:626
void addLink(MSLink *link)
Delayed initialization.
Definition MSLane.cpp:333
std::set< MSVehicle * > getVehiclesInRange(const double a, const double b) const
Returns all vehicles on the lane overlapping with the interval [a,b].
Definition MSLane.cpp:4304
void enteredByLaneChange(MSVehicle *v)
Definition MSLane.cpp:3359
double getDepartPosLat(const MSVehicle &veh)
Definition MSLane.cpp:664
const std::string & getLaneType() const
return the type of this lane
Definition MSLane.h:548
std::pair< MSVehicle *const, double > getOppositeLeader(const MSVehicle *ego, double dist, bool oppositeDir, MinorLinkMode mLinkMode=MinorLinkMode::FOLLOW_NEVER) const
Definition MSLane.cpp:4423
int getThreadIndex() const
returns the associated thread index
Definition MSLane.h:236
SVCPermissions getPermissions() const
Returns the vehicle class permissions for this lane.
Definition MSLane.h:619
LinkState getIncomingLinkState() const
get the state of the link from the logical predecessor to this lane
Definition MSLane.cpp:3317
void updateLengthSum()
updated current vehicle length sum (delayed to avoid lane-order-dependency)
Definition MSLane.cpp:2439
const std::vector< IncomingLaneInfo > & getIncomingLanes() const
Definition MSLane.h:957
static const long CHANGE_PERMISSIONS_PERMANENT
Definition MSLane.h:1381
virtual void addMoveReminder(MSMoveReminder *rem, bool addToVehicles=true)
Add a move-reminder to move-reminder container.
Definition MSLane.cpp:360
MSLane * getCanonicalPredecessorLane() const
Definition MSLane.cpp:3272
void resetPermissions(long long transientID)
Definition MSLane.cpp:4534
MSVehicle * getLastFullVehicle() const
returns the last vehicle for which this lane is responsible or 0
Definition MSLane.cpp:2643
static void loadRNGState(int index, const std::string &state)
load random number generator state for the given rng index
Definition MSLane.cpp:4670
const std::string myLaneType
the type of this lane
Definition MSLane.h:1601
int myRNGIndex
Definition MSLane.h:1621
VehCont myManeuverReservations
The vehicles which registered maneuvering into the lane within their current action step....
Definition MSLane.h:1505
const MSJunction * getToJunction() const
Definition MSLane.cpp:4730
void addLeaders(const MSVehicle *vehicle, double vehPos, MSLeaderDistanceInfo &result, bool oppositeDirection=false)
get leaders for ego on the given lane
Definition MSLane.cpp:4148
bool needsCollisionCheck() const
short-circut collision check if nothing changed since the last check
Definition MSLane.h:710
static double myCheckJunctionCollisionMinGap
Definition MSLane.h:1639
double getLength() const
Returns the lane's length.
Definition MSLane.h:611
double myBruttoVehicleLengthSum
The current length of all vehicles on this lane, including their minGaps.
Definition MSLane.h:1563
const PositionVector & getShape() const
Returns this lane's shape.
Definition MSLane.h:533
static bool isFrontalCollision(const MSVehicle *collider, const MSVehicle *victim)
detect frontal collisions
Definition MSLane.cpp:2260
void setChangeLeft(SVCPermissions permissions)
Sets the permissions for changing to the left neighbour lane.
Definition MSLane.cpp:4555
std::vector< const MSLink * > getUpcomingLinks(double pos, double range, const std::vector< MSLane * > &contLanes) const
Returns all upcoming links within given range along the given (non-internal) continuation lanes measu...
Definition MSLane.cpp:4335
const MSLane * getFirstInternalInConnection(double &offset) const
Returns 0 if the lane is not internal. Otherwise the first part of the connection (sequence of intern...
Definition MSLane.cpp:2471
const MSJunction * getFromJunction() const
Definition MSLane.cpp:4724
static int getNumRNGs()
return the number of RNGs
Definition MSLane.h:251
void handleCollisionBetween(SUMOTime timestep, const std::string &stage, const MSVehicle *collider, const MSVehicle *victim, double gap, double latGap, std::set< const MSVehicle *, ComparatorNumericalIdLess > &toRemove, std::set< const MSVehicle *, ComparatorNumericalIdLess > &toTeleport) const
take action upon collision
Definition MSLane.cpp:2046
double getMaximumBrakeDist() const
compute maximum braking distance on this lane
Definition MSLane.cpp:2907
static CollisionAction myIntermodalCollisionAction
Definition MSLane.h:1637
const MSLane * getInternalFollowingLane(const MSLane *const) const
returns the internal lane leading to the given lane or nullptr, if there is none
Definition MSLane.cpp:2757
bool isLinkEnd(std::vector< MSLink * >::iterator &i)
Definition MSLane.h:866
static std::vector< SumoRNG > myRNGs
Definition MSLane.h:1629
bool allowsChangingLeft(SUMOVehicleClass vclass) const
Returns whether the given vehicle class may change left from this lane.
Definition MSLane.h:939
virtual void swapAfterLaneChange(SUMOTime t)
moves myTmpVehicles int myVehicles after a lane change procedure
Definition MSLane.cpp:2815
std::pair< MSVehicle *const, double > getCriticalLeader(double dist, double seen, double speed, const MSVehicle &veh) const
Returns the most dangerous leader and the distance to him.
Definition MSLane.cpp:3132
StopOffset myLaneStopOffset
Definition MSLane.h:1521
const MSLeaderInfo getLastVehicleInformation(const MSVehicle *ego, double latOffset, double minPos=0, bool allowCached=true) const
Returns the last vehicles on the lane.
Definition MSLane.cpp:1445
static void initRNGs(const OptionsCont &oc)
initialize rngs
Definition MSLane.cpp:4647
std::pair< MSVehicle *const, double > getLeaderOnConsecutive(double dist, double seen, double speed, const MSVehicle &veh, const std::vector< MSLane * > &bestLaneConts, bool considerCrossingFoes=true) const
Returns the immediate leader and the distance to him.
Definition MSLane.cpp:2991
std::set< MSVehicle * > getSurroundingVehicles(double startPos, double downstreamDist, double upstreamDist, std::shared_ptr< LaneCoverageInfo > checkedLanes) const
Returns all vehicles closer than downstreamDist along the road network starting on the given position...
Definition MSLane.cpp:4252
bool myRecalculateBruttoSum
Flag to recalculate the occupancy (including minGaps) after a change in minGap.
Definition MSLane.h:1575
virtual void removeMoveReminder(MSMoveReminder *rem)
Remove a move-reminder from move-reminder container.
Definition MSLane.cpp:372
void clearState()
Remove all vehicles before quick-loading state.
Definition MSLane.cpp:3746
MSLane * myCanonicalPredecessorLane
Similar to LogicalPredecessorLane,.
Definition MSLane.h:1557
bool myNeedsCollisionCheck
whether a collision check is currently needed
Definition MSLane.h:1609
bool isLinkEnd(std::vector< MSLink * >::const_iterator &i) const
Definition MSLane.h:860
bool allowsVehicleClass(SUMOVehicleClass vclass) const
Definition MSLane.h:932
virtual double setPartialOccupation(MSVehicle *v)
Sets the information about a vehicle lapping into this lane.
Definition MSLane.cpp:384
double getVehicleMaxSpeed(const SUMOTrafficObject *const veh) const
Returns the lane's maximum speed, given a vehicle's speed limit adaptation.
Definition MSLane.h:574
void setBidiLane(MSLane *bidyLane)
Adds the (overlapping) reverse direction lane to this lane.
Definition MSLane.cpp:347
double getRightSideOnEdge() const
Definition MSLane.h:1202
void checkBufferType()
Definition MSLane.cpp:321
std::pair< MSVehicle *const, double > getOppositeFollower(const MSVehicle *ego) const
Definition MSLane.cpp:4451
bool mySpeedByTraCI
Whether the current speed limit has been set through TraCI.
Definition MSLane.h:1535
bool hasPedestrians() const
whether the lane has pedestrians on it
Definition MSLane.cpp:4567
const std::vector< std::pair< const MSLane *, const MSEdge * > > getOutgoingViaLanes() const
get the list of outgoing lanes
Definition MSLane.cpp:3328
MSVehicle * getPartialBehind(const MSVehicle *ego) const
Definition MSLane.cpp:4214
int getIndex() const
Returns the lane's index.
Definition MSLane.h:647
void setLaneStopOffset(const StopOffset &stopOffset)
Set vehicle class specific stopOffsets.
Definition MSLane.cpp:3797
double myBruttoVehicleLengthSumToRemove
The length of all vehicles that have left this lane in the current step (this lane,...
Definition MSLane.h:1569
void leftByLaneChange(MSVehicle *v)
Definition MSLane.cpp:3352
MSLane * getCanonicalSuccessorLane() const
Definition MSLane.cpp:3296
void requireCollisionCheck()
require another collision check due to relevant changes in the simulation
Definition MSLane.h:715
std::vector< StopWatch< std::chrono::nanoseconds > > myStopWatch
Definition MSLane.h:1798
void setPermissions(SVCPermissions permissions, long long transientID)
Sets the permissions to the given value. If a transientID is given, the permissions are recored as te...
Definition MSLane.cpp:4522
const double myWidth
Lane width [m].
Definition MSLane.h:1516
bool lastInsertion(MSVehicle &veh, double mspeed, double posLat, bool patchSpeed)
inserts vehicle as close as possible to the last vehicle on this lane (or at the end of the lane if t...
Definition MSLane.cpp:480
virtual void addSecondaryShape(const PositionVector &)
Definition MSLane.h:288
void changeLanes(const SUMOTime time)
Definition MSLane.cpp:2459
double getOppositePos(double pos) const
return the corresponding position on the opposite lane
Definition MSLane.cpp:4395
SVCPermissions myChangeRight
Definition MSLane.h:1542
const double myLengthGeometryFactor
precomputed myShape.length / myLength
Definition MSLane.h:1595
virtual void executeMovements(const SUMOTime t)
Executes planned vehicle movements with regards to right-of-way.
Definition MSLane.cpp:2279
const std::set< const MSBaseVehicle * > & getParkingVehicles() const
retrieve the parking vehicles (see GUIParkingArea)
Definition MSLane.h:1261
MSLane * getLogicalPredecessorLane() const
get the most likely precedecessor lane (sorted using by_connections_to_sorter). The result is cached ...
Definition MSLane.cpp:3216
double getBruttoOccupancy() const
Returns the brutto (including minGaps) occupancy of this lane during the last step.
Definition MSLane.cpp:3396
AnyVehicleIterator anyVehiclesUpstreamEnd() const
end iterator for iterating over all vehicles touching this lane in upstream direction
Definition MSLane.h:507
int myIndex
The lane index.
Definition MSLane.h:1464
double getCenterOnEdge() const
Definition MSLane.h:1210
bool isNormal() const
Definition MSLane.cpp:2626
double getVehicleMaxSpeed(const SUMOTrafficObject *const veh, double vehMaxSpeed) const
Definition MSLane.h:579
static double & getDefaultDepartSpeed()
Definition MSLane.h:1376
bool isCrossing() const
Definition MSLane.cpp:2632
double getMeanSpeedBike() const
get the mean speed of all bicycles on this lane
Definition MSLane.cpp:3460
void updateLeaderInfo(const MSVehicle *veh, VehCont::reverse_iterator &vehPart, VehCont::reverse_iterator &vehRes, MSLeaderInfo &ahead) const
This updates the MSLeaderInfo argument with respect to the given MSVehicle. All leader-vehicles on th...
Definition MSLane.cpp:1604
double getWaitingSeconds() const
Returns the overall waiting time on this lane.
Definition MSLane.cpp:3426
static bool dictionary(const std::string &id, MSLane *lane)
Static (sic!) container methods {.
Definition MSLane.cpp:2489
virtual bool isSelected() const
whether this lane is selected in the GUI
Definition MSLane.h:1266
virtual void detectCollisions(SUMOTime timestep, const std::string &stage)
Check if vehicles are too close.
Definition MSLane.cpp:1657
std::vector< MSLink * > myLinks
Definition MSLane.h:1579
MSVehicle * getLastAnyVehicle() const
returns the last vehicle that is fully or partially on this lane
Definition MSLane.cpp:2661
bool isInternal() const
Definition MSLane.cpp:2620
static const long CHANGE_PERMISSIONS_GUI
Definition MSLane.h:1382
VehCont myPartialVehicles
The lane's partial vehicles. This container holds all vehicles that are partially on this lane but wh...
Definition MSLane.h:1489
void sortManeuverReservations()
sorts myManeuverReservations
Definition MSLane.cpp:2601
MinorLinkMode
determine whether/how getFollowers looks upstream beyond minor links
Definition MSLane.h:980
@ FOLLOW_ONCOMING
Definition MSLane.h:983
@ FOLLOW_ALWAYS
Definition MSLane.h:982
@ FOLLOW_NEVER
Definition MSLane.h:981
int getPartialVehicleNumber() const
Returns the number of vehicles partially on this lane (for which this lane is not responsible)
Definition MSLane.h:472
double interpolateGeometryPosToLanePos(double geometryPos) const
Definition MSLane.h:566
AnyVehicleIterator anyVehiclesUpstreamBegin() const
begin iterator for iterating over all vehicles touching this lane in upstream direction
Definition MSLane.h:501
std::vector< const MSLane * > getNormalIncomingLanes() const
get the list of all direct (disregarding internal predecessors) non-internal predecessor lanes of thi...
Definition MSLane.cpp:3338
bool mySpeedByVSS
Whether the current speed limit is set by a variable speed sign (VSS)
Definition MSLane.h:1532
virtual void resetPartialOccupation(MSVehicle *v)
Removes the information about a vehicle lapping into this lane.
Definition MSLane.cpp:403
SumoRNG * getRNG() const
return the associated RNG
Definition MSLane.h:246
void setOpposite(MSLane *oppositeLane)
Adds a neighbor to this lane.
Definition MSLane.cpp:339
static int dictSize()
Returns the number of stored lanes.
Definition MSLane.h:822
AnyVehicleIterator anyVehiclesBegin() const
begin iterator for iterating over all vehicles touching this lane in downstream direction
Definition MSLane.h:489
double getHarmonoise_NoiseEmissions() const
Returns the sum of last step noise emissions.
Definition MSLane.cpp:3485
std::pair< MSVehicle *const, double > getLeader(const MSVehicle *veh, const double vehPos, const std::vector< MSLane * > &bestLaneConts, double dist=-1, bool checkTmpVehicles=false) const
Returns the immediate leader of veh and the distance to veh starting on this lane.
Definition MSLane.cpp:2919
void handleIntermodalCollisionBetween(SUMOTime timestep, const std::string &stage, const MSVehicle *collider, const MSTransportable *victim, double gap, const std::string &collisionType, std::set< const MSVehicle *, ComparatorNumericalIdLess > &toRemove, std::set< const MSVehicle *, ComparatorNumericalIdLess > &toTeleport) const
Definition MSLane.cpp:2183
static bool myExtrapolateSubstepDepart
Definition MSLane.h:1643
MSLane * getOpposite() const
return the neighboring opposite direction lane for lane changing or nullptr
Definition MSLane.cpp:4383
void setLength(double val)
Sets a new length for the lane (used by TraCI only)
Definition MSLane.cpp:2808
std::map< MSEdge *, std::vector< MSLane * > > myApproachingLanes
All direct internal and direct (disregarding internal predecessors) non-internal predecessor lanes of...
Definition MSLane.h:1582
virtual const VehCont & getVehiclesSecure() const
Returns the vehicles container; locks it for microsimulation.
Definition MSLane.h:483
virtual void releaseVehicles() const
Allows to use the container for microsimulation again.
Definition MSLane.h:513
bool mustCheckJunctionCollisions() const
whether this lane must check for junction collisions
Definition MSLane.cpp:4685
double interpolateLanePosToGeometryPos(double lanePos) const
Definition MSLane.h:554
virtual void setManeuverReservation(MSVehicle *v)
Registers the lane change intentions (towards this lane) for the given vehicle.
Definition MSLane.cpp:426
virtual void setJunctionApproaches() const
Register junction approaches for all vehicles after velocities have been planned.
Definition MSLane.cpp:1596
MSLane * getBidiLane() const
retrieve bidirectional lane or nullptr
Definition MSLane.cpp:4679
static double myCollisionMinGapFactor
Definition MSLane.h:1642
bool isEmpty() const
Definition MSLane.h:872
bool hasApproaching(const std::vector< MSLink * > &links) const
check whether any of the outgoing links are being approached
double getLengthGeometryFactor() const
return shape.length() / myLength
Definition MSLane.h:538
SUMOTime myLeaderInfoTime
time step for which myLeaderInfo was last updated
Definition MSLane.h:1590
MSLane * myOpposite
Definition MSLane.h:1612
CollisionAction
Definition MSLane.h:201
@ COLLISION_ACTION_NONE
Definition MSLane.h:202
@ COLLISION_ACTION_WARN
Definition MSLane.h:203
@ COLLISION_ACTION_TELEPORT
Definition MSLane.h:204
@ COLLISION_ACTION_REMOVE
Definition MSLane.h:205
virtual const PositionVector & getShape(bool) const
Definition MSLane.h:294
MSLane * getParallelOpposite() const
return the opposite direction lane of this lanes edge or nullptr
Definition MSLane.cpp:4389
std::map< std::string, MSLane * > DictType
definition of the static dictionary type
Definition MSLane.h:1624
double getFractionalVehicleLength(bool brutto) const
return length of fractional vehicles on this lane
Definition MSLane.cpp:3377
MSEdge & getEdge() const
Returns the lane's edge.
Definition MSLane.h:769
const PositionVector * getOutlineShape() const
Definition MSLane.h:1357
double getSpaceTillLastStanding(const MSVehicle *ego, bool &foundStopped) const
return the empty space up to the last standing vehicle or the empty space on the whole lane if no veh...
Definition MSLane.cpp:4694
double getEmissions() const
Returns the sum of last step emissions The value is always per 1s, so multiply by step length if nece...
Definition MSLane.h:1176
const MSLane * getNormalPredecessorLane() const
get normal lane leading to this internal lane, for normal lanes, the lane itself is returned
Definition MSLane.cpp:3241
int getNumericalID() const
Returns this lane's numerical id.
Definition MSLane.h:525
void setRightSideOnEdge(double value, int rightmostSublane)
Definition MSLane.h:1192
virtual bool appropriate(const MSVehicle *veh) const
Definition MSLane.cpp:2545
MSLeaderDistanceInfo getFollowersOnConsecutive(const MSVehicle *ego, double backOffset, bool allSublanes, double searchDist=-1, MinorLinkMode mLinkMode=FOLLOW_ALWAYS) const
return the sublane followers with the largest missing rear gap among all predecessor lanes (within di...
Definition MSLane.cpp:3803
double getWidth() const
Returns the lane's width.
Definition MSLane.h:640
const std::vector< MSLink * > & getLinkCont() const
returns the container with all links !!!
Definition MSLane.h:729
bool freeInsertion(MSVehicle &veh, double speed, double posLat, MSMoveReminder::Notification notification=MSMoveReminder::NOTIFICATION_DEPARTED)
Tries to insert the given vehicle on any place.
Definition MSLane.cpp:515
void setMaxSpeed(double val, bool byVSS=false, bool byTraCI=false, double jamThreshold=-1)
Sets a new maximum speed for the lane (used by TraCI and MSCalibrator)
Definition MSLane.cpp:2785
MSVehicle * getFirstFullVehicle() const
returns the first vehicle for which this lane is responsible or 0
Definition MSLane.cpp:2652
int getRightmostSublane() const
Definition MSLane.h:1206
double getMeanSpeed() const
Returns the mean speed on this lane.
Definition MSLane.cpp:3439
double myNettoVehicleLengthSumToRemove
The length of all vehicles that have left this lane in the current step (this lane,...
Definition MSLane.h:1572
const Position geometryPositionAtOffset(double offset, double lateralOffset=0) const
Definition MSLane.h:560
void setFrictionCoefficient(double val)
Sets a new friction coefficient for the lane [to be later (used by TraCI and MSCalibrator)].
Definition MSLane.cpp:2801
static CollisionAction getCollisionAction()
Definition MSLane.h:1364
saves leader/follower vehicles and their distances relative to an ego vehicle
Something on a lane to be noticed about vehicle movement.
Notification
Definition of a vehicle state.
@ NOTIFICATION_DEPARTED
The vehicle has departed (was inserted into the network)
Export the queueing length in front of a junction (very experimental!)
The class responsible for building and deletion of vehicles.
Representation of a vehicle in the micro simulation.
Definition MSVehicle.h:77
Base class for objects which have an id.
Definition Named.h:54
A storage for options typed value containers)
Definition OptionsCont.h:89
Static storage of an output device and its base (abstract) implementation.
An upper class for objects with additional parameters.
A point in 2D or 3D with translation and scaling methods.
Definition Position.h:37
A list of positions.
Position positionAtOffset(double pos, double lateralOffset=0) const
Returns the position at the given length.
Representation of a vehicle, person, or container.
virtual double getChosenSpeedFactor() const =0
virtual double getMaxSpeed() const =0
Returns the object's maximum speed (minimum of technical and desired maximum speed)
virtual SUMOVehicleClass getVClass() const =0
Returns the object's access class.
Representation of a vehicle.
Definition SUMOVehicle.h:62
stop offset