comparison python/prediction.py @ 556:dc58ad777a72

modified prediction for multiprocessing, not sure how beneficial it is (single thread with instance method seems much faster
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Mon, 14 Jul 2014 01:56:51 -0400
parents 727e3c529519
children b91f33e098ee
comparison
equal deleted inserted replaced
555:f13220f765e0 556:dc58ad777a72
122 p1 = predictedTrajectory1.predictPosition(t) 122 p1 = predictedTrajectory1.predictPosition(t)
123 p2 = predictedTrajectory2.predictPosition(t) 123 p2 = predictedTrajectory2.predictPosition(t)
124 t += 1 124 t += 1
125 return t, p1, p2 125 return t, p1, p2
126 126
127 def computeCrossingsCollisionsAtInstant(predictionParams, currentInstant, obj1, obj2, collisionDistanceThreshold, timeHorizon, computeCZ = False, debug = False):
128 '''returns the lists of collision points and crossing zones'''
129 predictedTrajectories1 = predictionParams.generatePredictedTrajectories(obj1, currentInstant)
130 predictedTrajectories2 = predictionParams.generatePredictedTrajectories(obj2, currentInstant)
131
132 collisionPoints = []
133 crossingZones = []
134 for et1 in predictedTrajectories1:
135 for et2 in predictedTrajectories2:
136 t, p1, p2 = computeCollisionTime(et1, et2, collisionDistanceThreshold, timeHorizon)
137
138 if t <= timeHorizon:
139 collisionPoints.append(SafetyPoint((p1+p2).multiply(0.5), et1.probability*et2.probability, t))
140 elif computeCZ: # check if there is a crossing zone
141 # TODO? zone should be around the points at which the traj are the closest
142 # look for CZ at different times, otherwise it would be a collision
143 # an approximation would be to look for close points at different times, ie the complementary of collision points
144 cz = None
145 t1 = 0
146 while not cz and t1 < timeHorizon: # t1 <= timeHorizon-1
147 t2 = 0
148 while not cz and t2 < timeHorizon:
149 #if (et1.predictPosition(t1)-et2.predictPosition(t2)).norm2() < collisionDistanceThreshold:
150 # cz = (et1.predictPosition(t1)+et2.predictPosition(t2)).multiply(0.5)
151 cz = moving.segmentIntersection(et1.predictPosition(t1), et1.predictPosition(t1+1), et2.predictPosition(t2), et2.predictPosition(t2+1))
152 if cz:
153 crossingZones.append(SafetyPoint(cz, et1.probability*et2.probability, abs(t1-t2)))
154 t2 += 1
155 t1 += 1
156
157 if debug:
158 from matplotlib.pyplot import figure, axis, title
159 figure()
160 for et in predictedTrajectories1:
161 et.predictPosition(timeHorizon)
162 et.plot('rx')
163
164 for et in predictedTrajectories2:
165 et.predictPosition(timeHorizon)
166 et.plot('bx')
167 obj1.plot('r')
168 obj2.plot('b')
169 title('instant {0}'.format(currentInstant))
170 axis('equal')
171
172 return currentInstant, collisionPoints, crossingZones
173
174 def computeCrossingsCollisions(predictionParams, obj1, obj2, collisionDistanceThreshold, timeHorizon, computeCZ = False, debug = False, timeInterval = None, nProcesses = 1):
175 '''Computes all crossing and collision points at each common instant for two road users. '''
176 collisionPoints={}
177 crossingZones={}
178 if timeInterval:
179 commonTimeInterval = timeInterval
180 else:
181 commonTimeInterval = obj1.commonTimeInterval(obj2)
182 if nProcesses == 1:
183 for i in list(commonTimeInterval)[:-1]: # do not look at the 1 last position/velocities, often with errors
184 i, collisionPoints[i], crossingZones[i] = computeCrossingsCollisionsAtInstant(predictionParams, i, obj1, obj2, collisionDistanceThreshold, timeHorizon, computeCZ, debug)
185 else:
186 from multiprocessing import Pool
187 pool = Pool(processes = nProcesses)
188 jobs = [pool.apply_async(computeCrossingsCollisionsAtInstant, args = (predictionParams, i, obj1, obj2, collisionDistanceThreshold, timeHorizon, computeCZ)) for i in list(commonTimeInterval)[:-1]]
189 #results = [j.get() for j in jobs]
190 #results.sort()
191 for j in jobs:
192 i, cp, cz = j.get()
193 #if len(cp) != 0 or len(cz) != 0:
194 collisionPoints[i] = cp
195 crossingZones[i] = cz
196 pool.close()
197 return collisionPoints, crossingZones
198
127 class PredictionParameters: 199 class PredictionParameters:
128 def __init__(self, name, maxSpeed): 200 def __init__(self, name, maxSpeed):
129 self.name = name 201 self.name = name
130 self.maxSpeed = maxSpeed 202 self.maxSpeed = maxSpeed
131 203
134 206
135 def generatePredictedTrajectories(self, obj, instant): 207 def generatePredictedTrajectories(self, obj, instant):
136 return [] 208 return []
137 209
138 def computeCrossingsCollisionsAtInstant(self, currentInstant, obj1, obj2, collisionDistanceThreshold, timeHorizon, computeCZ = False, debug = False): 210 def computeCrossingsCollisionsAtInstant(self, currentInstant, obj1, obj2, collisionDistanceThreshold, timeHorizon, computeCZ = False, debug = False):
139 '''returns the lists of collision points and crossing zones''' 211 return computeCrossingsCollisionsAtInstant(self, currentInstant, obj1, obj2, collisionDistanceThreshold, timeHorizon, computeCZ = False, debug = False)
140 predictedTrajectories1 = self.generatePredictedTrajectories(obj1, currentInstant) 212
141 predictedTrajectories2 = self.generatePredictedTrajectories(obj2, currentInstant) 213 def computeCrossingsCollisions(self, obj1, obj2, collisionDistanceThreshold, timeHorizon, computeCZ = False, debug = False, timeInterval = None, nProcesses = 1):
142 214 return computeCrossingsCollisions(self, obj1, obj2, collisionDistanceThreshold, timeHorizon, computeCZ = False, debug = False, timeInterval = None, nProcesses = 1)
143 collisionPoints = []
144 crossingZones = []
145 for et1 in predictedTrajectories1:
146 for et2 in predictedTrajectories2:
147 t, p1, p2 = computeCollisionTime(et1, et2, collisionDistanceThreshold, timeHorizon)
148
149 if t <= timeHorizon:
150 collisionPoints.append(SafetyPoint((p1+p2).multiply(0.5), et1.probability*et2.probability, t))
151 elif computeCZ: # check if there is a crossing zone
152 # TODO? zone should be around the points at which the traj are the closest
153 # look for CZ at different times, otherwise it would be a collision
154 # an approximation would be to look for close points at different times, ie the complementary of collision points
155 cz = None
156 t1 = 0
157 while not cz and t1 < timeHorizon: # t1 <= timeHorizon-1
158 t2 = 0
159 while not cz and t2 < timeHorizon:
160 #if (et1.predictPosition(t1)-et2.predictPosition(t2)).norm2() < collisionDistanceThreshold:
161 # cz = (et1.predictPosition(t1)+et2.predictPosition(t2)).multiply(0.5)
162 cz = moving.segmentIntersection(et1.predictPosition(t1), et1.predictPosition(t1+1), et2.predictPosition(t2), et2.predictPosition(t2+1))
163 if cz:
164 crossingZones.append(SafetyPoint(cz, et1.probability*et2.probability, abs(t1-t2)))
165 t2 += 1
166 t1 += 1
167
168 if debug:
169 from matplotlib.pyplot import figure, axis, title
170 figure()
171 for et in predictedTrajectories1:
172 et.predictPosition(timeHorizon)
173 et.plot('rx')
174
175 for et in predictedTrajectories2:
176 et.predictPosition(timeHorizon)
177 et.plot('bx')
178 obj1.plot('r')
179 obj2.plot('b')
180 title('instant {0}'.format(currentInstant))
181 axis('equal')
182
183 return collisionPoints, crossingZones
184
185 def computeCrossingsCollisions(self, obj1, obj2, collisionDistanceThreshold, timeHorizon, computeCZ = False, debug = False, timeInterval = None):
186 '''Computes all crossing and collision points at each common instant for two road users. '''
187 collisionPoints={}
188 crossingZones={}
189 if timeInterval:
190 commonTimeInterval = timeInterval
191 else:
192 commonTimeInterval = obj1.commonTimeInterval(obj2)
193 for i in list(commonTimeInterval)[:-1]: # do not look at the 1 last position/velocities, often with errors
194 collisionPoints[i], crossingZones[i] = self.computeCrossingsCollisionsAtInstant(i, obj1, obj2, collisionDistanceThreshold, timeHorizon, computeCZ, debug)
195
196 return collisionPoints, crossingZones
197 215
198 def computeCollisionProbability(self, obj1, obj2, collisionDistanceThreshold, timeHorizon, debug = False, timeInterval = None): 216 def computeCollisionProbability(self, obj1, obj2, collisionDistanceThreshold, timeHorizon, debug = False, timeInterval = None):
199 '''Computes only collision probabilities 217 '''Computes only collision probabilities
200 Returns for each instant the collision probability and number of samples drawn''' 218 Returns for each instant the collision probability and number of samples drawn'''
201 collisionProbabilities = {} 219 collisionProbabilities = {}