comparison python/prediction.py @ 289:e56c34c1ebac

refactored and commented functions (saving data is now outside of the computation functions)
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Tue, 29 Jan 2013 11:21:42 -0500
parents bbd9c09e6869
children df58d361f19e
comparison
equal deleted inserted replaced
288:e0d41c7f53d4 289:e56c34c1ebac
165 self.x = p.x 165 self.x = p.x
166 self.y = p.y 166 self.y = p.y
167 self.probability = probability 167 self.probability = probability
168 self.indicator = indicator 168 self.indicator = indicator
169 169
170 def __str__(self):
171 return '{0} {1} {2} {3}'.format(self.x, self.y, self.probability, self.indicator)
172
170 @staticmethod 173 @staticmethod
171 def save(out, points, objNum1, objNum2, instant): 174 def save(out, points, predictionInstant, objNum1, objNum2):
172 for p in points: 175 for p in points:
173 out.write('{0} {1} {2} {3} {4} {5} {6}\n'.format(objNum1, objNum2, instant, p.x, p.y, p.probability, p.indicator)) 176 out.write('{0} {1} {2} {3}\n'.format(objNum1, objNum2, predictionInstant, p))
174 177
175 def computeExpectedIndicator(points): 178 def computeExpectedIndicator(points):
176 from numpy import sum 179 from numpy import sum
177 return sum([p.indicator*p.probability for p in points])/sum([p.probability for p in points]) 180 return sum([p.indicator*p.probability for p in points])/sum([p.probability for p in points])
178 181
179 def computeCollisionTime(predictedTrajectory1, predictedTrajectory2, collisionDistanceThreshold, timeHorizon): 182 def computeCollisionTime(predictedTrajectory1, predictedTrajectory2, collisionDistanceThreshold, timeHorizon):
183 '''Computes the first instant at which two predicted trajectories are within some distance threshold'''
180 t = 1 184 t = 1
181 p1 = predictedTrajectory1.predictPosition(t) 185 p1 = predictedTrajectory1.predictPosition(t)
182 p2 = predictedTrajectory2.predictPosition(t) 186 p2 = predictedTrajectory2.predictPosition(t)
183 while t <= timeHorizon and (p1-p2).norm2() > collisionDistanceThreshold: 187 while t <= timeHorizon and (p1-p2).norm2() > collisionDistanceThreshold:
184 p1 = predictedTrajectory1.predictPosition(t) 188 p1 = predictedTrajectory1.predictPosition(t)
185 p2 = predictedTrajectory2.predictPosition(t) 189 p2 = predictedTrajectory2.predictPosition(t)
186 t += 1 190 t += 1
187 return t, p1, p2 191 return t, p1, p2
188 192
189 def computeCrossingsCollisionsAtInstant(i, obj1, obj2, predictionParameters, collisionDistanceThreshold, timeHorizon, debug = False): 193 def computeCrossingsCollisionsAtInstant(currentInstant, obj1, obj2, predictionParameters, collisionDistanceThreshold, timeHorizon, debug = False):
190 '''returns the lists of collision points and crossing zones 194 '''returns the lists of collision points and crossing zones
191 195
192 Check: Predicting all the points together, as if they represent the whole vehicle''' 196 Check: Predicting all the points together, as if they represent the whole vehicle'''
193 predictedTrajectories1 = predictionParameters.generatePredictedTrajectories(obj1, i) 197 predictedTrajectories1 = predictionParameters.generatePredictedTrajectories(obj1, currentInstant)
194 predictedTrajectories2 = predictionParameters.generatePredictedTrajectories(obj2, i) 198 predictedTrajectories2 = predictionParameters.generatePredictedTrajectories(obj2, currentInstant)
195 199
196 collisionPoints = [] 200 collisionPoints = []
197 crossingZones = [] 201 crossingZones = []
198 for et1 in predictedTrajectories1: 202 for et1 in predictedTrajectories1:
199 for et2 in predictedTrajectories2: 203 for et2 in predictedTrajectories2:
200 t, p1, p2 = computeCollisionTime(et1, et2, collisionDistanceThreshold, timeHorizon) 204 t, p1, p2 = computeCollisionTime(et1, et2, collisionDistanceThreshold, timeHorizon)
201 205
202 if t <= timeHorizon: 206 if t <= timeHorizon:
203 collisionPoints.append(SafetyPoint((p1+p2).multiply(0.5), et1.probability*et2.probability, t)) 207 collisionPoints.append(SafetyPoint((p1+p2).multiply(0.5), currentInstant, et1.probability*et2.probability, t))
204 else: # check if there is a crossing zone 208 else: # check if there is a crossing zone
205 # TODO? zone should be around the points at which the traj are the closest 209 # TODO? zone should be around the points at which the traj are the closest
206 # look for CZ at different times, otherwise it would be a collision 210 # look for CZ at different times, otherwise it would be a collision
207 # an approximation would be to look for close points at different times, ie the complementary of collision points 211 # an approximation would be to look for close points at different times, ie the complementary of collision points
208 cz = None 212 cz = None
233 title('instant {0}'.format(i)) 237 title('instant {0}'.format(i))
234 axis('equal') 238 axis('equal')
235 239
236 return collisionPoints, crossingZones 240 return collisionPoints, crossingZones
237 241
238 def computeCrossingsCollisions(obj1, obj2, predictionParameters, collisionDistanceThreshold, timeHorizon, outCP, outCZ, debug = False, timeInterval = None): 242 def computeCrossingsCollisions(obj1, obj2, predictionParameters, collisionDistanceThreshold, timeHorizon, debug = False, timeInterval = None):
243 '''Computes all crossing and collision points at each common instant for two road users. '''
239 collisionPoints={} 244 collisionPoints={}
240 crossingZones={} 245 crossingZones={}
241 if timeInterval: 246 if timeInterval:
242 commonTimeInterval = timeInterval 247 commonTimeInterval = timeInterval
243 else: 248 else:
244 commonTimeInterval = obj1.commonTimeInterval(obj2) 249 commonTimeInterval = obj1.commonTimeInterval(obj2)
245 for i in list(commonTimeInterval)[:-1]: # do not look at the 1 last position/velocities, often with errors 250 for i in list(commonTimeInterval)[:-1]: # do not look at the 1 last position/velocities, often with errors
246 print(obj1.num, obj2.num, i) 251 print(obj1.num, obj2.num, i)
247 collisionPoints[i], crossingZones[i] = computeCrossingsCollisionsAtInstant(i, obj1, obj2, predictionParameters, collisionDistanceThreshold, timeHorizon, debug) 252 collisionPoints[i], crossingZones[i] = computeCrossingsCollisionsAtInstant(obj1, obj2, predictionParameters, collisionDistanceThreshold, timeHorizon, debug)
248 SafetyPoint.save(outCP, collisionPoints[i], obj1.num, obj2.num, i)
249 SafetyPoint.save(outCZ, crossingZones[i], obj1.num, obj2.num, i)
250 253
251 return collisionPoints, crossingZones 254 return collisionPoints, crossingZones
252 255
253 def computeCollisionProbability(obj1, obj2, predictionParameters, collisionDistanceThreshold, timeHorizon, out, debug = False, timeInterval = None): 256 def computeCollisionProbability(obj1, obj2, predictionParameters, collisionDistanceThreshold, timeHorizon, debug = False, timeInterval = None):
257 '''Computes only collision probabilities
258 Returns for each instant the collision probability and number of samples drawn'''
254 collisionProbabilities = {} 259 collisionProbabilities = {}
255 if timeInterval: 260 if timeInterval:
256 commonTimeInterval = timeInterval 261 commonTimeInterval = timeInterval
257 else: 262 else:
258 commonTimeInterval = obj1.commonTimeInterval(obj2) 263 commonTimeInterval = obj1.commonTimeInterval(obj2)
266 t, p1, p2 = computeCollisionTime(et1, et2, collisionDistanceThreshold, timeHorizon) 271 t, p1, p2 = computeCollisionTime(et1, et2, collisionDistanceThreshold, timeHorizon)
267 if t <= timeHorizon: 272 if t <= timeHorizon:
268 nCollisions += 1 273 nCollisions += 1
269 # take into account probabilities ?? 274 # take into account probabilities ??
270 nSamples = float(len(predictedTrajectories1)*len(predictedTrajectories2)) 275 nSamples = float(len(predictedTrajectories1)*len(predictedTrajectories2))
271 collisionProbabilities[i] = float(nCollisions)/nSamples 276 collisionProbabilities[i] = [nSamples, float(nCollisions)/nSamples]
272 out.write('{0} {1} {2} {3} {4}\n'.format(obj1.num, obj2.num, nSamples, i, collisionProbabilities[i]))
273 277
274 if debug: 278 if debug:
275 from matplotlib.pyplot import figure, axis, title 279 from matplotlib.pyplot import figure, axis, title
276 figure() 280 figure()
277 for et in predictedTrajectories1: 281 for et in predictedTrajectories1: