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