comparison python/prediction.py @ 358:c41ff9f3c263

moved current method for collision points and crossing zones computation into prediction parameters (put expectedindicator in SafetyPoint)
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Thu, 11 Jul 2013 00:17:25 -0400
parents e5fe0e6d48a1
children 619ae9a9a788
comparison
equal deleted inserted replaced
357:e5fe0e6d48a1 358:c41ff9f3c263
61 self.predictedSpeedOrientations = {0: moving.NormAngle.fromPoint(initialVelocity)} 61 self.predictedSpeedOrientations = {0: moving.NormAngle.fromPoint(initialVelocity)}
62 62
63 def getControl(self): 63 def getControl(self):
64 return moving.NormAngle(self.accelerationDistribution(),self.steeringDistribution()) 64 return moving.NormAngle(self.accelerationDistribution(),self.steeringDistribution())
65 65
66 def computeCollisionTime(predictedTrajectory1, predictedTrajectory2, collisionDistanceThreshold, timeHorizon):
67 '''Computes the first instant at which two predicted trajectories are within some distance threshold'''
68 t = 1
69 p1 = predictedTrajectory1.predictPosition(t)
70 p2 = predictedTrajectory2.predictPosition(t)
71 while t <= timeHorizon and (p1-p2).norm2() > collisionDistanceThreshold:
72 p1 = predictedTrajectory1.predictPosition(t)
73 p2 = predictedTrajectory2.predictPosition(t)
74 t += 1
75 return t, p1, p2
76
66 class PredictionParameters: 77 class PredictionParameters:
67 def __init__(self, name, maxSpeed): 78 def __init__(self, name, maxSpeed):
68 self.name = name 79 self.name = name
69 self.maxSpeed = maxSpeed 80 self.maxSpeed = maxSpeed
70 81
71 def __str__(self): 82 def __str__(self):
72 return '{0} {1}'.format(self.name, self.maxSpeed) 83 return '{0} {1}'.format(self.name, self.maxSpeed)
84
85 def generatePredictedTrajectories(self, obj, instant):
86 return []
87
88 def computeCrossingsCollisionsAtInstant(self, currentInstant, obj1, obj2, collisionDistanceThreshold, timeHorizon, computeCZ = False, debug = False):
89 '''returns the lists of collision points and crossing zones
90
91 Check: Predicting all the points together, as if they represent the whole vehicle'''
92 predictedTrajectories1 = self.generatePredictedTrajectories(obj1, currentInstant)
93 predictedTrajectories2 = self.generatePredictedTrajectories(obj2, currentInstant)
94
95 collisionPoints = []
96 crossingZones = []
97 for et1 in predictedTrajectories1:
98 for et2 in predictedTrajectories2:
99 t, p1, p2 = computeCollisionTime(et1, et2, collisionDistanceThreshold, timeHorizon)
100
101 if t <= timeHorizon:
102 collisionPoints.append(SafetyPoint((p1+p2).multiply(0.5), et1.probability*et2.probability, t))
103 elif computeCZ: # check if there is a crossing zone
104 # TODO? zone should be around the points at which the traj are the closest
105 # look for CZ at different times, otherwise it would be a collision
106 # an approximation would be to look for close points at different times, ie the complementary of collision points
107 cz = None
108 t1 = 0
109 while not cz and t1 < timeHorizon: # t1 <= timeHorizon-1
110 t2 = 0
111 while not cz and t2 < timeHorizon:
112 #if (et1.predictPosition(t1)-et2.predictPosition(t2)).norm2() < collisionDistanceThreshold:
113 # cz = (et1.predictPosition(t1)+et2.predictPosition(t2)).multiply(0.5)
114 cz = moving.segmentIntersection(et1.predictPosition(t1), et1.predictPosition(t1+1), et2.predictPosition(t2), et2.predictPosition(t2+1))
115 if cz:
116 crossingZones.append(SafetyPoint(cz, et1.probability*et2.probability, abs(t1-t2)))
117 t2 += 1
118 t1 += 1
119
120 if debug:
121 from matplotlib.pyplot import figure, axis, title
122 figure()
123 for et in predictedTrajectories1:
124 et.predictPosition(timeHorizon)
125 et.draw('rx')
126
127 for et in predictedTrajectories2:
128 et.predictPosition(timeHorizon)
129 et.draw('bx')
130 obj1.draw('r')
131 obj2.draw('b')
132 title('instant {0}'.format(currentInstant))
133 axis('equal')
134
135 return collisionPoints, crossingZones
136
137 def computeCrossingsCollisions(self, obj1, obj2, collisionDistanceThreshold, timeHorizon, computeCZ = False, debug = False, timeInterval = None):
138 '''Computes all crossing and collision points at each common instant for two road users. '''
139 collisionPoints={}
140 crossingZones={}
141 if timeInterval:
142 commonTimeInterval = timeInterval
143 else:
144 commonTimeInterval = obj1.commonTimeInterval(obj2)
145 for i in list(commonTimeInterval)[:-1]: # do not look at the 1 last position/velocities, often with errors
146 collisionPoints[i], crossingZones[i] = self.computeCrossingsCollisionsAtInstant(i, obj1, obj2, collisionDistanceThreshold, timeHorizon, computeCZ, debug)
147
148 return collisionPoints, crossingZones
149
150 def computeCollisionProbability(self, obj1, obj2, collisionDistanceThreshold, timeHorizon, debug = False, timeInterval = None):
151 '''Computes only collision probabilities
152 Returns for each instant the collision probability and number of samples drawn'''
153 collisionProbabilities = {}
154 if timeInterval:
155 commonTimeInterval = timeInterval
156 else:
157 commonTimeInterval = obj1.commonTimeInterval(obj2)
158 for i in list(commonTimeInterval)[:-1]:
159 nCollisions = 0
160 print(obj1.num, obj2.num, i)
161 predictedTrajectories1 = self.generatePredictedTrajectories(obj1, i)
162 predictedTrajectories2 = self.generatePredictedTrajectories(obj2, i)
163 for et1 in predictedTrajectories1:
164 for et2 in predictedTrajectories2:
165 t, p1, p2 = computeCollisionTime(et1, et2, collisionDistanceThreshold, timeHorizon)
166 if t <= timeHorizon:
167 nCollisions += 1
168 # take into account probabilities ??
169 nSamples = float(len(predictedTrajectories1)*len(predictedTrajectories2))
170 collisionProbabilities[i] = [nSamples, float(nCollisions)/nSamples]
171
172 if debug:
173 from matplotlib.pyplot import figure, axis, title
174 figure()
175 for et in predictedTrajectories1:
176 et.predictPosition(timeHorizon)
177 et.draw('rx')
178
179 for et in predictedTrajectories2:
180 et.predictPosition(timeHorizon)
181 et.draw('bx')
182 obj1.draw('r')
183 obj2.draw('b')
184 title('instant {0}'.format(i))
185 axis('equal')
186
187 return collisionProbabilities
73 188
74 class ConstantPredictionParameters(PredictionParameters): 189 class ConstantPredictionParameters(PredictionParameters):
75 def __init__(self, maxSpeed): 190 def __init__(self, maxSpeed):
76 PredictionParameters.__init__(self, 'constant velocity', maxSpeed) 191 PredictionParameters.__init__(self, 'constant velocity', maxSpeed)
77 192
188 @staticmethod 303 @staticmethod
189 def save(out, points, predictionInstant, objNum1, objNum2): 304 def save(out, points, predictionInstant, objNum1, objNum2):
190 for p in points: 305 for p in points:
191 out.write('{0} {1} {2} {3}\n'.format(objNum1, objNum2, predictionInstant, p)) 306 out.write('{0} {1} {2} {3}\n'.format(objNum1, objNum2, predictionInstant, p))
192 307
193 def computeExpectedIndicator(points): 308 @staticmethod
194 from numpy import sum 309 def computeExpectedIndicator(points):
195 return sum([p.indicator*p.probability for p in points])/sum([p.probability for p in points]) 310 from numpy import sum
196 311 return sum([p.indicator*p.probability for p in points])/sum([p.probability for p in points])
197 def computeCollisionTime(predictedTrajectory1, predictedTrajectory2, collisionDistanceThreshold, timeHorizon): 312
198 '''Computes the first instant at which two predicted trajectories are within some distance threshold'''
199 t = 1
200 p1 = predictedTrajectory1.predictPosition(t)
201 p2 = predictedTrajectory2.predictPosition(t)
202 while t <= timeHorizon and (p1-p2).norm2() > collisionDistanceThreshold:
203 p1 = predictedTrajectory1.predictPosition(t)
204 p2 = predictedTrajectory2.predictPosition(t)
205 t += 1
206 return t, p1, p2
207
208 def computeCrossingsCollisionsAtInstant(currentInstant, obj1, obj2, predictionParameters, collisionDistanceThreshold, timeHorizon, computeCZ = False, debug = False):
209 '''returns the lists of collision points and crossing zones
210
211 Check: Predicting all the points together, as if they represent the whole vehicle'''
212 predictedTrajectories1 = predictionParameters.generatePredictedTrajectories(obj1, currentInstant)
213 predictedTrajectories2 = predictionParameters.generatePredictedTrajectories(obj2, currentInstant)
214
215 collisionPoints = []
216 crossingZones = []
217 for et1 in predictedTrajectories1:
218 for et2 in predictedTrajectories2:
219 t, p1, p2 = computeCollisionTime(et1, et2, collisionDistanceThreshold, timeHorizon)
220
221 if t <= timeHorizon:
222 collisionPoints.append(SafetyPoint((p1+p2).multiply(0.5), et1.probability*et2.probability, t))
223 elif computeCZ: # check if there is a crossing zone
224 # TODO? zone should be around the points at which the traj are the closest
225 # look for CZ at different times, otherwise it would be a collision
226 # an approximation would be to look for close points at different times, ie the complementary of collision points
227 cz = None
228 t1 = 0
229 while not cz and t1 < timeHorizon: # t1 <= timeHorizon-1
230 t2 = 0
231 while not cz and t2 < timeHorizon:
232 #if (et1.predictPosition(t1)-et2.predictPosition(t2)).norm2() < collisionDistanceThreshold:
233 # cz = (et1.predictPosition(t1)+et2.predictPosition(t2)).multiply(0.5)
234 cz = moving.segmentIntersection(et1.predictPosition(t1), et1.predictPosition(t1+1), et2.predictPosition(t2), et2.predictPosition(t2+1))
235 if cz:
236 crossingZones.append(SafetyPoint(cz, et1.probability*et2.probability, abs(t1-t2)))
237 t2 += 1
238 t1 += 1
239
240 if debug:
241 from matplotlib.pyplot import figure, axis, title
242 figure()
243 for et in predictedTrajectories1:
244 et.predictPosition(timeHorizon)
245 et.draw('rx')
246
247 for et in predictedTrajectories2:
248 et.predictPosition(timeHorizon)
249 et.draw('bx')
250 obj1.draw('r')
251 obj2.draw('b')
252 title('instant {0}'.format(currentInstant))
253 axis('equal')
254
255 return collisionPoints, crossingZones
256
257 def computeCrossingsCollisions(obj1, obj2, predictionParameters, collisionDistanceThreshold, timeHorizon, computeCZ = False, debug = False, timeInterval = None):
258 '''Computes all crossing and collision points at each common instant for two road users. '''
259 collisionPoints={}
260 crossingZones={}
261 if timeInterval:
262 commonTimeInterval = timeInterval
263 else:
264 commonTimeInterval = obj1.commonTimeInterval(obj2)
265 for i in list(commonTimeInterval)[:-1]: # do not look at the 1 last position/velocities, often with errors
266 collisionPoints[i], crossingZones[i] = computeCrossingsCollisionsAtInstant(i, obj1, obj2, predictionParameters, collisionDistanceThreshold, timeHorizon, computeCZ, debug)
267
268 return collisionPoints, crossingZones
269
270 def computeCollisionProbability(obj1, obj2, predictionParameters, collisionDistanceThreshold, timeHorizon, debug = False, timeInterval = None):
271 '''Computes only collision probabilities
272 Returns for each instant the collision probability and number of samples drawn'''
273 collisionProbabilities = {}
274 if timeInterval:
275 commonTimeInterval = timeInterval
276 else:
277 commonTimeInterval = obj1.commonTimeInterval(obj2)
278 for i in list(commonTimeInterval)[:-1]:
279 nCollisions = 0
280 print(obj1.num, obj2.num, i)
281 predictedTrajectories1 = predictionParameters.generatePredictedTrajectories(obj1, i)
282 predictedTrajectories2 = predictionParameters.generatePredictedTrajectories(obj2, i)
283 for et1 in predictedTrajectories1:
284 for et2 in predictedTrajectories2:
285 t, p1, p2 = computeCollisionTime(et1, et2, collisionDistanceThreshold, timeHorizon)
286 if t <= timeHorizon:
287 nCollisions += 1
288 # take into account probabilities ??
289 nSamples = float(len(predictedTrajectories1)*len(predictedTrajectories2))
290 collisionProbabilities[i] = [nSamples, float(nCollisions)/nSamples]
291
292 if debug:
293 from matplotlib.pyplot import figure, axis, title
294 figure()
295 for et in predictedTrajectories1:
296 et.predictPosition(timeHorizon)
297 et.draw('rx')
298
299 for et in predictedTrajectories2:
300 et.predictPosition(timeHorizon)
301 et.draw('bx')
302 obj1.draw('r')
303 obj2.draw('b')
304 title('instant {0}'.format(i))
305 axis('equal')
306
307 return collisionProbabilities
308 313
309 #### 314 ####
310 # Other Methods 315 # Other Methods
311 #### 316 ####
312 317