Mercurial Hosting > traffic-intelligence
changeset 1099:4ab5c63c13a3
first working version of newell model
author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
---|---|
date | Wed, 20 Feb 2019 00:08:20 -0500 |
parents | 469e36eea158 |
children | 1e833fd8490d |
files | trafficintelligence/moving.py |
diffstat | 1 files changed, 16 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- a/trafficintelligence/moving.py Tue Feb 19 17:22:48 2019 -0500 +++ b/trafficintelligence/moving.py Wed Feb 20 00:08:20 2019 -0500 @@ -1262,21 +1262,22 @@ if method == 'newell': if self.curvilinearPositions is None: # vehicle without positions, all vehicles should have leader (?) - if self.leader is None: - s = (timeStep*instant-self.initialHeadway)*self.desiredSpeed - self.timeInterval = TimeInterval(instant, instant) - self.curvilinearPositions = CurvilinearTrajectory([s], [0.], [self.initialAlignmentIdx]) - self.curvilinearVelocities = CurvilinearTrajectory() - self.instantAtX0 = self.initialHeadway - elif self.leader.curvilinearPositions is not None and self.leader.curvilinearPositions.getSCoordAt(-1) > self.d and len(self.leader.curvilinearPositions) >=2: - firstInstantAfterD = self.leader.getLastInstant() - while self.leader.existsAtInstant(firstInstantAfterD) and self.leader.getCurvilinearPositionAtInstant(firstInstantAfterD-1)[0] > self.d:# find first instant after d - firstInstantAfterD -= 1 # if not recorded position before self.d, we extrapolate linearly from first known position - leaderSpeed = self.leader.getCurvilinearVelocityAtInstant(firstInstantAfterD)[0] - self.instantAtX0 = self.tau + instant*timeStep - (self.leader.getCurvilinearPositionAtInstant(firstInstantAfterD)[0]-self.d)/leaderSpeed # second part is the time at which leader is at self.d - if self.instantAtX0 < self.initialHeadway: #obj appears at instant initialHeadway at x=0 with desiredSpeed - self.instantAtX0 = self.initialHeadway - if self.instantAtX0 is not None and instant >= self.instantAtX0: + if self.instantAtX0 is None: + if self.leader is None: + s = (timeStep*instant-self.initialHeadway)*self.desiredSpeed + self.timeInterval = TimeInterval(instant, instant) + self.curvilinearPositions = CurvilinearTrajectory([s], [0.], [self.initialAlignmentIdx]) + self.curvilinearVelocities = CurvilinearTrajectory() + self.instantAtX0 = self.initialHeadway# to avoid next test + elif self.leader.curvilinearPositions is not None and self.leader.curvilinearPositions.getSCoordAt(-1) > self.d and len(self.leader.curvilinearPositions) >=2: + firstInstantAfterD = self.leader.getLastInstant() + while self.leader.existsAtInstant(firstInstantAfterD) and self.leader.getCurvilinearPositionAtInstant(firstInstantAfterD-1)[0] > self.d:# find first instant after d + firstInstantAfterD -= 1 # if not recorded position before self.d, we extrapolate linearly from first known position + leaderSpeed = self.leader.getCurvilinearVelocityAtInstant(firstInstantAfterD-1)[0] + self.instantAtX0 = self.tau + instant*timeStep - (self.leader.getCurvilinearPositionAtInstant(firstInstantAfterD)[0]-self.d)/leaderSpeed # second part is the time at which leader is at self.d + if self.instantAtX0 < self.initialHeadway: #obj appears at instant initialHeadway at x=0 with desiredSpeed + self.instantAtX0 = self.initialHeadway + elif instant*timeStep >= self.instantAtX0: firstInstant = int(ceil(self.instantAtX0/timeStep)) self.timeInterval = TimeInterval(firstInstant, firstInstant) freeFlowCoord = (firstInstant*timeStep - self.instantAtX0)*self.desiredSpeed @@ -1287,7 +1288,6 @@ constrainedCoord = self.leader.getCurvilinearPositionAtInstant(i)[0]+leaderSpeed*(t-i*timeStep)-self.d self.curvilinearPositions = CurvilinearTrajectory([min(freeFlowCoord, constrainedCoord)], [0.], [self.initialAlignmentIdx]) self.curvilinearVelocities = CurvilinearTrajectory() - print(firstInstant+1, instant+1) for i in range(firstInstant+1, instant+1): s1 = self.curvilinearPositions.getSCoordAt(-1) freeFlowCoord = s1 + timeStep*self.desiredSpeed