annotate trafficintelligence/traffic_engineering.py @ 1212:af329f3330ba

work in progress on 3D safety analysis
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Tue, 02 May 2023 17:11:24 -0400
parents 770306fef827
children 3bfdb2ffd29d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
1 #! /usr/bin/env python
73
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
2 ''' Traffic Engineering Tools and Examples'''
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
3
665
15e244d2a1b5 corrected bug with circular import for VideoFilenameAddable, moved to base module
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 652
diff changeset
4 from math import ceil
1176
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
5 from numpy import e, log, arange
1206
770306fef827 moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1198
diff changeset
6 from scipy import stats
1176
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
7
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
8 from matplotlib.pyplot import figure,plot,xlabel,ylabel, xlim, ylim
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
9
1029
c6cf75a2ed08 reorganization of imports
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1028
diff changeset
10 from trafficintelligence import prediction
73
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
11
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
12 #########################
198
c91c8fd8bf1e simple vehicle model with constant acceleration
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 116
diff changeset
13 # Simulation
c91c8fd8bf1e simple vehicle model with constant acceleration
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 116
diff changeset
14 #########################
c91c8fd8bf1e simple vehicle model with constant acceleration
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 116
diff changeset
15
479
7828fec8bbd2 added function to generate headways based on flow or mean headway over some simulation period
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 314
diff changeset
16 def generateTimeHeadways(meanTimeHeadway, simulationTime):
7828fec8bbd2 added function to generate headways based on flow or mean headway over some simulation period
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 314
diff changeset
17 '''Generates the time headways between arrivals
7828fec8bbd2 added function to generate headways based on flow or mean headway over some simulation period
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 314
diff changeset
18 given the meanTimeHeadway and the negative exponential distribution
7828fec8bbd2 added function to generate headways based on flow or mean headway over some simulation period
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 314
diff changeset
19 over a time interval of length simulationTime (assumed to be in same time unit as headway'''
7828fec8bbd2 added function to generate headways based on flow or mean headway over some simulation period
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 314
diff changeset
20 from random import expovariate
7828fec8bbd2 added function to generate headways based on flow or mean headway over some simulation period
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 314
diff changeset
21 headways = []
7828fec8bbd2 added function to generate headways based on flow or mean headway over some simulation period
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 314
diff changeset
22 totalTime = 0
7828fec8bbd2 added function to generate headways based on flow or mean headway over some simulation period
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 314
diff changeset
23 flow = 1/meanTimeHeadway
7828fec8bbd2 added function to generate headways based on flow or mean headway over some simulation period
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 314
diff changeset
24 while totalTime < simulationTime:
7828fec8bbd2 added function to generate headways based on flow or mean headway over some simulation period
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 314
diff changeset
25 h = expovariate(flow)
7828fec8bbd2 added function to generate headways based on flow or mean headway over some simulation period
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 314
diff changeset
26 headways.append(h)
7828fec8bbd2 added function to generate headways based on flow or mean headway over some simulation period
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 314
diff changeset
27 totalTime += h
7828fec8bbd2 added function to generate headways based on flow or mean headway over some simulation period
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 314
diff changeset
28 return headways
7828fec8bbd2 added function to generate headways based on flow or mean headway over some simulation period
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 314
diff changeset
29
665
15e244d2a1b5 corrected bug with circular import for VideoFilenameAddable, moved to base module
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 652
diff changeset
30 class RoadUser(object):
652
3b13ec964476 removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 493
diff changeset
31 '''Simple example of inheritance to plot different road users '''
3b13ec964476 removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 493
diff changeset
32 def __init__(self, position, velocity):
3b13ec964476 removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 493
diff changeset
33 'Both fields are 2D numpy arrays'
3b13ec964476 removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 493
diff changeset
34 self.position = position.astype(float)
3b13ec964476 removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 493
diff changeset
35 self.velocity = velocity.astype(float)
3b13ec964476 removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 493
diff changeset
36
3b13ec964476 removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 493
diff changeset
37 def move(self, deltaT):
3b13ec964476 removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 493
diff changeset
38 self.position += deltaT*self.velocity
3b13ec964476 removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 493
diff changeset
39
3b13ec964476 removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 493
diff changeset
40 def draw(self, init = False):
3b13ec964476 removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 493
diff changeset
41 from matplotlib.pyplot import plot
3b13ec964476 removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 493
diff changeset
42 if init:
3b13ec964476 removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 493
diff changeset
43 self.plotLine = plot(self.position[0], self.position[1], self.getDescriptor())[0]
3b13ec964476 removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 493
diff changeset
44 else:
3b13ec964476 removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 493
diff changeset
45 self.plotLine.set_data(self.position[0], self.position[1])
300
f65b828e5521 working on trajectory simulation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 206
diff changeset
46
f65b828e5521 working on trajectory simulation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 206
diff changeset
47
652
3b13ec964476 removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 493
diff changeset
48 class PassengerVehicle(RoadUser):
3b13ec964476 removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 493
diff changeset
49 def getDescriptor(self):
3b13ec964476 removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 493
diff changeset
50 return 'dr'
300
f65b828e5521 working on trajectory simulation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 206
diff changeset
51
652
3b13ec964476 removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 493
diff changeset
52 class Pedestrian(RoadUser):
3b13ec964476 removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 493
diff changeset
53 def getDescriptor(self):
3b13ec964476 removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 493
diff changeset
54 return 'xb'
198
c91c8fd8bf1e simple vehicle model with constant acceleration
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 116
diff changeset
55
652
3b13ec964476 removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 493
diff changeset
56 class Cyclist(RoadUser):
3b13ec964476 removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 493
diff changeset
57 def getDescriptor(self):
3b13ec964476 removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 493
diff changeset
58 return 'og'
198
c91c8fd8bf1e simple vehicle model with constant acceleration
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 116
diff changeset
59
790
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
60 #########################
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
61 # queueing models
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
62 #########################
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
63
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
64 class CapacityReduction(object):
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
65 def __init__(self, beta, reductionDuration, demandCapacityRatio = None, demand = None, capacity = None):
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
66 '''reduction duration should be positive
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
67 demandCapacityRatio is demand/capacity (q/s)'''
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
68 if demandCapacityRatio is None and demand is None and capacity is None:
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
69 print('Missing too much information (demand, capacity and ratio)')
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
70 import sys
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
71 sys.exit()
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
72 if 0 <= beta < 1:
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
73 self.beta = beta
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
74 self.reductionDuration = reductionDuration
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
75
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
76 if demandCapacityRatio is not None:
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
77 self.demandCapacityRatio = demandCapacityRatio
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
78 if demand is not None:
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
79 self.demand = demand
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
80 if capacity is not None:
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
81 self.capacity = capacity
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
82 if capacity is not None and demand is not None:
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
83 self.demandCapacityRatio = float(self.demand)/self.capacity
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
84 if demand <= beta*capacity:
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
85 print('There is no queueing as the demand {} is inferior to the reduced capacity {}'.format(demand, beta*capacity))
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
86 else:
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
87 print('reduction coefficient (beta={}) is not in [0, 1['.format(beta))
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
88
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
89 def queueingDuration(self):
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
90 return self.reductionDuration*(1-self.beta)/(1-self.demandCapacityRatio)
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
91
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
92 def nArrived(self, t):
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
93 if self.demand is None:
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
94 print('Missing demand field')
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
95 return None
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
96 return self.demand*t
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
97
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
98 def nServed(self, t):
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
99 if self.capacity is None:
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
100 print('Missing capacity field')
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
101 return None
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
102 if 0<=t<=self.reductionDuration:
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
103 return self.beta*self.capacity*t
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
104 elif self.reductionDuration < t <= self.queueingDuration():
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
105 return self.beta*self.capacity*self.reductionDuration+self.capacity*(t-self.reductionDuration)
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
106
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
107 def nQueued(self, t):
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
108 return self.nArrived(t)-self.nServed(t)
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
109
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
110 def maxNQueued(self):
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
111 return self.nQueued(self.reductionDuration)
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
112
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
113 def totalDelay(self):
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
114 if self.capacity is None:
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
115 print('Missing capacity field')
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
116 return None
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
117 return self.capacity*self.reductionDuration**2*(1-self.beta)*(self.demandCapacityRatio-self.beta)/(2*(1-self.demandCapacityRatio))
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
118
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
119 def averageDelay(self):
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
120 return self.reductionDuration*(self.demandCapacityRatio-self.beta)/(2*self.demandCapacityRatio)
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
121
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
122 def averageNQueued(self):
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
123 return self.totalDelay()/self.queueingDuration()
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
124
198
c91c8fd8bf1e simple vehicle model with constant acceleration
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 116
diff changeset
125
c91c8fd8bf1e simple vehicle model with constant acceleration
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 116
diff changeset
126 #########################
1176
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
127 # fundamental diagrams
73
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
128 #########################
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
129
665
15e244d2a1b5 corrected bug with circular import for VideoFilenameAddable, moved to base module
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 652
diff changeset
130 class FundamentalDiagram(object):
73
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
131 ''' '''
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
132 def __init__(self, name):
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
133 self.name = name
1176
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
134 self.kj = None
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
135 self.kc = None
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
136 self.vf = None
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
137 self.qmax = None
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
138
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
139 def getJamDensity(self):
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
140 return self.kj
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
141
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
142 def getCriticalDensity(self):
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
143 return self.kc
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
144
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
145 def getCapacity(self):
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
146 return self.qmax
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
147
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
148 def getFreeFlowSpeed(self):
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
149 return self.vf
73
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
150
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
151 def q(self, k):
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
152 return k*self.v(k)
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
153
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
154 @staticmethod
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
155 def meanHeadway(k):
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
156 return 1/k
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
157
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
158 @staticmethod
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
159 def meanSpacing(q):
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
160 return 1/q
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
161
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
162 def plotVK(self, language='fr', units={}):
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
163 densities = [k for k in arange(1, self.kj+1)]
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
164 figure()
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
165 plot(densities, [self.v(k) for k in densities])
1176
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
166 xlim(xmin=0)
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
167 ylim(ymin=0)
73
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
168 xlabel('Densite (veh/km)') # todo other languages and adapt to units
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
169 ylabel('Vitesse (km/h)')
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
170
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
171 def plotQK(self, language='fr', units={}):
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
172 densities = [k for k in arange(1, self.kj+1)]
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
173 figure()
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
174 plot(densities, [self.q(k) for k in densities])
1176
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
175 xlim(xmin=0)
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
176 ylim(ymin=0)
73
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
177 xlabel('Densite (veh/km)') # todo other languages and adapt to units
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
178 ylabel('Debit (km/h)')
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
179
1176
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
180 class GreenshieldsFD(FundamentalDiagram):
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
181 '''Speed is a linear function of density'''
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
182 def __init__(self, vf, kj):
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
183 FundamentalDiagram.__init__(self,'Greenshields')
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
184 self.vf=vf
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
185 self.kj=kj
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
186 self.kc=kj/2
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
187 self.qmax=vf*kj/4
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
188
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
189 def v(self,k):
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
190 from numpy import log
1198
fa07a78b29f6 minor modif, change to makefile for repo opencv installation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1176
diff changeset
191 return self.vf*(1-k/self.kj)
1176
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
192
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
193
73
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
194 class GreenbergFD(FundamentalDiagram):
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
195 '''Speed is the logarithm of density'''
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
196 def __init__(self, vc, kj):
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
197 FundamentalDiagram.__init__(self,'Greenberg')
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
198 self.vc=vc
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
199 self.kj=kj
1176
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
200 self.qmax = self.kc*self.vc
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
201 self.kc = self.kj/e
73
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
202
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
203 def v(self,k):
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
204 return self.vc*log(self.kj/k)
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
205
1176
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
206 class TriangularFD(FundamentalDiagram):
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
207 def __init__(self, vf = None, kc = None, kj = None, qmax = None, w = None):
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
208 FundamentalDiagram.__init__(self,'Triangular')
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
209 if vf is not None and qmax is not None and kj is not None:
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
210 self.vf=vf
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
211 self.qmax = qmax
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
212 self.kj = kj
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
213 self.kc = qmax/vf
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
214 self.w = qmax/(self.kc-kj)
73
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
215
1176
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
216 def v(self, k):
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
217 if k<self.kc:
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
218 return self.vf
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
219 else:
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
220 return self.vf*self.kc*(self.kj/k-1)/(self.kj-self.kc)
1206
770306fef827 moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1198
diff changeset
221
770306fef827 moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1198
diff changeset
222 def generateDensities(n, maxDensity):
770306fef827 moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1198
diff changeset
223 return stats.uniform.rvs(size=n)*maxDensity
770306fef827 moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1198
diff changeset
224
770306fef827 moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1198
diff changeset
225 def generateSpeedVolumes(fd, n, maxDensity, maxHGVProportion = 0, etrucks = 2.5):
770306fef827 moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1198
diff changeset
226 densities = generateDensities(n, maxDensity)
770306fef827 moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1198
diff changeset
227 speeds = [fd.v(k) for k in densities]
770306fef827 moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1198
diff changeset
228 volumes = [fd.q(k) for k in densities]
770306fef827 moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1198
diff changeset
229 if maxHGVProportion > 0:
770306fef827 moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1198
diff changeset
230 hgvProportions = stats.uniform.rvs(size=n)*maxHGVProportion # en pourcent
770306fef827 moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1198
diff changeset
231 volumes = [v/(1+(etrucks-1)*p/100) for v,p in zip(volumes, hgvProportions)]
770306fef827 moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1198
diff changeset
232 else:
770306fef827 moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1198
diff changeset
233 hgvProportions = None
770306fef827 moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1198
diff changeset
234 return speeds, volumes, hgvProportions
770306fef827 moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1198
diff changeset
235
770306fef827 moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1198
diff changeset
236 def highwayLOS(k):
770306fef827 moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1198
diff changeset
237 'returns the highway level of service for density k in veh/km'
770306fef827 moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1198
diff changeset
238 if k>=28: return 'F'
770306fef827 moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1198
diff changeset
239 elif k>=22: return 'E'
770306fef827 moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1198
diff changeset
240 elif k>=16: return 'D'
770306fef827 moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1198
diff changeset
241 elif k>=11: return 'C'
770306fef827 moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1198
diff changeset
242 elif k>=7: return 'B'
770306fef827 moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1198
diff changeset
243 else: return 'A'
770306fef827 moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1198
diff changeset
244
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
245 #########################
116
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
246 # intersection
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
247 #########################
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
248
665
15e244d2a1b5 corrected bug with circular import for VideoFilenameAddable, moved to base module
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 652
diff changeset
249 class FourWayIntersection(object):
116
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
250 '''Simple class for simple intersection outline'''
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
251 def __init__(self, dimension, coordX, coordY):
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
252 self.dimension = dimension
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
253 self.coordX = coordX
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
254 self.coordY = coordY
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
255
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
256 def plot(self, options = 'k'):
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
257 from matplotlib.pyplot import plot, axis
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
258
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
259 minX = min(self.dimension[0])
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
260 maxX = max(self.dimension[0])
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
261 minY = min(self.dimension[1])
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
262 maxY = max(self.dimension[1])
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
263
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
264 plot([minX, self.coordX[0], self.coordX[0]], [self.coordY[0], self.coordY[0], minY],options)
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
265 plot([self.coordX[1], self.coordX[1], maxX], [minY, self.coordY[0], self.coordY[0]],options)
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
266 plot([minX, self.coordX[0], self.coordX[0]], [self.coordY[1], self.coordY[1], maxY],options)
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
267 plot([self.coordX[1], self.coordX[1], maxX], [maxY, self.coordY[1], self.coordY[1]],options)
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
268 axis('equal')
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
269
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
270 #########################
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
271 # traffic signals
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
272 #########################
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
273
665
15e244d2a1b5 corrected bug with circular import for VideoFilenameAddable, moved to base module
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 652
diff changeset
274 class Volume(object):
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
275 '''Class to represent volumes with varied vehicule types '''
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
276 def __init__(self, volume, types = ['pc'], proportions = [1], equivalents = [1], nLanes = 1):
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
277 '''mvtEquivalent is the equivalent if the movement is right of left turn'''
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
278
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
279 # check the sizes of the lists
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
280 if sum(proportions) == 1:
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
281 self.volume = volume
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
282 self.types = types
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
283 self.proportions = proportions
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
284 self.equivalents = equivalents
314
539e2b4cfaa3 modified for 4740 tps
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 302
diff changeset
285 self.nLanes = nLanes
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
286 else:
302
9d88a4d97473 corrected bug in compute-homography
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 300
diff changeset
287 print('Proportions do not sum to 1')
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
288 pass
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
289
314
539e2b4cfaa3 modified for 4740 tps
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 302
diff changeset
290 def checkProtected(self, opposedThroughMvt):
539e2b4cfaa3 modified for 4740 tps
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 302
diff changeset
291 '''Checks if this left movement should be protected,
539e2b4cfaa3 modified for 4740 tps
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 302
diff changeset
292 ie if one of the main two conditions on left turn is verified'''
539e2b4cfaa3 modified for 4740 tps
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 302
diff changeset
293 return self.volume >= 200 or self.volume*opposedThroughMvt.volume/opposedThroughMvt.nLanes > 50000
539e2b4cfaa3 modified for 4740 tps
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 302
diff changeset
294
205
aeaaf5579b46 minor changes to traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 198
diff changeset
295 def getPCUVolume(self):
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
296 '''Returns the passenger-car equivalent for the input volume'''
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
297 v = 0
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
298 for p, e in zip(self.proportions, self.equivalents):
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
299 v += p*e
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
300 return v*self.volume
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
301
665
15e244d2a1b5 corrected bug with circular import for VideoFilenameAddable, moved to base module
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 652
diff changeset
302 class IntersectionMovement(object):
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
303 '''Represents an intersection movement
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
304 with a volume, a type (through, left or right)
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
305 and an equivalent for movement type'''
205
aeaaf5579b46 minor changes to traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 198
diff changeset
306 def __init__(self, volume, mvtEquivalent = 1):
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
307 self.volume = volume
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
308 self.mvtEquivalent = mvtEquivalent
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
309
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
310 def getTVUVolume(self):
205
aeaaf5579b46 minor changes to traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 198
diff changeset
311 return self.mvtEquivalent*self.volume.getPCUVolume()
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
312
665
15e244d2a1b5 corrected bug with circular import for VideoFilenameAddable, moved to base module
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 652
diff changeset
313 class LaneGroup(object):
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
314 '''Class that represents a group of mouvements'''
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
315
34
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
316 def __init__(self, movements, nLanes):
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
317 self.movements = movements
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
318 self.nLanes = nLanes
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
319
34
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
320 def getTVUVolume(self):
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
321 return sum([mvt.getTVUVolume() for mvt in self.movements])
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
322
206
82b4101d9a2f re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 205
diff changeset
323 def getCharge(self, saturationVolume):
82b4101d9a2f re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 205
diff changeset
324 return self.getTVUVolume()/(self.nLanes*saturationVolume)
82b4101d9a2f re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 205
diff changeset
325
82b4101d9a2f re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 205
diff changeset
326 def optimalCycle(lostTime, criticalCharge):
82b4101d9a2f re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 205
diff changeset
327 return (1.5*lostTime+5)/(1-criticalCharge)
82b4101d9a2f re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 205
diff changeset
328
82b4101d9a2f re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 205
diff changeset
329 def minimumCycle(lostTime, criticalCharge, degreeSaturation=1.):
82b4101d9a2f re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 205
diff changeset
330 'degree of saturation can be used as the peak hour factor too'
82b4101d9a2f re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 205
diff changeset
331 return lostTime/(1-criticalCharge/degreeSaturation)
34
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
332
665
15e244d2a1b5 corrected bug with circular import for VideoFilenameAddable, moved to base module
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 652
diff changeset
333 class Cycle(object):
34
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
334 '''Class to compute optimal cycle and the split of effective green times'''
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
335 def __init__(self, phases, lostTime, saturationVolume):
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
336 '''phases is a list of phases
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
337 a phase is a list of lanegroups'''
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
338 self.phases = phases
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
339 self.lostTime = lostTime
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
340 self.saturationVolume = saturationVolume
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
341
206
82b4101d9a2f re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 205
diff changeset
342 def computeCriticalCharges(self):
314
539e2b4cfaa3 modified for 4740 tps
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 302
diff changeset
343 self.criticalCharges = [max([lg.getCharge(self.saturationVolume) for lg in phase]) for phase in self.phases]
34
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
344 self.criticalCharge = sum(self.criticalCharges)
206
82b4101d9a2f re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 205
diff changeset
345
82b4101d9a2f re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 205
diff changeset
346 def computeOptimalCycle(self):
82b4101d9a2f re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 205
diff changeset
347 self.computeCriticalCharges()
82b4101d9a2f re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 205
diff changeset
348 self.C = optimalCycle(self.lostTime, self.criticalCharge)
82b4101d9a2f re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 205
diff changeset
349 return self.C
82b4101d9a2f re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 205
diff changeset
350
82b4101d9a2f re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 205
diff changeset
351 def computeMinimumCycle(self, degreeSaturation=1.):
82b4101d9a2f re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 205
diff changeset
352 self.computeCriticalCharges()
82b4101d9a2f re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 205
diff changeset
353 self.C = minimumCycle(self.lostTime, self.criticalCharge, degreeSaturation)
82b4101d9a2f re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 205
diff changeset
354 return self.C
34
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
355
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
356 def computeEffectiveGreen(self):
314
539e2b4cfaa3 modified for 4740 tps
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 302
diff changeset
357 #from numpy import round
206
82b4101d9a2f re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 205
diff changeset
358 #self.computeCycle() # in case it was not done before
82b4101d9a2f re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 205
diff changeset
359 effectiveGreenTime = self.C-self.lostTime
34
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
360 self.effectiveGreens = [round(c*effectiveGreenTime/self.criticalCharge,1) for c in self.criticalCharges]
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
361 return self.effectiveGreens
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
362
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
363
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
364 def computeInterGreen(perceptionReactionTime, initialSpeed, intersectionLength, vehicleAverageLength = 6, deceleration = 3):
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
365 '''Computes the intergreen time (yellow/amber plus all red time)
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
366 Deceleration is positive
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
367 All variables should be in the same units'''
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
368 if deceleration > 0:
36
571b11304ec9 corrected bug
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 34
diff changeset
369 return [perceptionReactionTime+float(initialSpeed)/(2*deceleration), float(intersectionLength+vehicleAverageLength)/initialSpeed]
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
370 else:
992
2cd1ce245024 update to python 3
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 796
diff changeset
371 print('Issue deceleration should be strictly positive')
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
372 return None
37
911b52744ceb added uniform delay function
Nicolas Saunier <nico@confins.net>
parents: 36
diff changeset
373
911b52744ceb added uniform delay function
Nicolas Saunier <nico@confins.net>
parents: 36
diff changeset
374 def uniformDelay(cycleLength, effectiveGreen, saturationDegree):
911b52744ceb added uniform delay function
Nicolas Saunier <nico@confins.net>
parents: 36
diff changeset
375 '''Computes the uniform delay'''
796
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 790
diff changeset
376 return 0.5*cycleLength*(1-float(effectiveGreen)/cycleLength)**2/(1-float(effectiveGreen*saturationDegree)/cycleLength)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 790
diff changeset
377
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 790
diff changeset
378 def randomDelay(volume, saturationDegree):
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 790
diff changeset
379 '''Computes the random delay = queueing time for M/D/1'''
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 790
diff changeset
380 return saturationDegree**2/(2*volume*(1-saturationDegree))
87
f234154207d4 distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 73
diff changeset
381
790
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
382 def incrementalDelay(T, X, c, k=0.5, I=1):
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
383 '''Computes the incremental delay (HCM)
493
850ed17c7b2f added some computation of delay
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 479
diff changeset
384 T in hours
850ed17c7b2f added some computation of delay
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 479
diff changeset
385 c capacity of the lane group
850ed17c7b2f added some computation of delay
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 479
diff changeset
386 k default for fixed time signal
850ed17c7b2f added some computation of delay
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 479
diff changeset
387 I=1 for isolated intersection (Poisson arrival)'''
850ed17c7b2f added some computation of delay
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 479
diff changeset
388 from math import sqrt
850ed17c7b2f added some computation of delay
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 479
diff changeset
389 return 900*T*(X - 1 + sqrt((X - 1)**2 + 8*k*I*X/(c*T)))
850ed17c7b2f added some computation of delay
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 479
diff changeset
390
87
f234154207d4 distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 73
diff changeset
391 #########################
f234154207d4 distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 73
diff changeset
392 # misc
f234154207d4 distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 73
diff changeset
393 #########################
f234154207d4 distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 73
diff changeset
394
f234154207d4 distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 73
diff changeset
395 def timeChangingSpeed(v0, vf, a, TPR):
789
3666342dabe2 minor changes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 665
diff changeset
396 'for decelerations, a < 0'
3666342dabe2 minor changes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 665
diff changeset
397 return TPR-(vf-v0)/a
87
f234154207d4 distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 73
diff changeset
398
f234154207d4 distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 73
diff changeset
399 def distanceChangingSpeed(v0, vf, a, TPR):
789
3666342dabe2 minor changes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 665
diff changeset
400 'for decelerations, a < 0'
1165
c5863e04d302 corrected bug
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1029
diff changeset
401 return TPR*v0+(vf**2-v0**2)/(2*a)