comparison python/events.py @ 662:72174e66aba5

corrected bug that increased TTC by 1 frame and structure to store collision points and crossing zones
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Mon, 18 May 2015 17:17:06 +0200
parents dc70d9e711f5
children 455f9b93819c
comparison
equal deleted inserted replaced
661:dc70d9e711f5 662:72174e66aba5
96 self.roadUser1 = roadUser1 96 self.roadUser1 = roadUser1
97 self.roadUser2 = roadUser2 97 self.roadUser2 = roadUser2
98 if roaduserNum1 is not None and roaduserNum2 is not None: 98 if roaduserNum1 is not None and roaduserNum2 is not None:
99 self.roadUserNumbers = set([roaduserNum1, roaduserNum2]) 99 self.roadUserNumbers = set([roaduserNum1, roaduserNum2])
100 elif roadUser1 is not None and roadUser2 is not None: 100 elif roadUser1 is not None and roadUser2 is not None:
101 self.roadUserNumbers = set(roadUser1.getNum(), roadUser2.getNum()) 101 self.roadUserNumbers = set([roadUser1.getNum(), roadUser2.getNum()])
102 else: 102 else:
103 self.roadUserNumbers = None 103 self.roadUserNumbers = None
104 self.categoryNum = categoryNum 104 self.categoryNum = categoryNum
105 self.indicators = {} 105 self.indicators = {}
106 self.interactionInterval = None 106 self.interactionInterval = None
107 self.collisionPoints = None # distionary for collison points with different prediction methods 107 # list for collison points and crossing zones
108 self.collisionPoints = None
109 self.crossingZones = None
108 110
109 def getRoadUserNumbers(self): 111 def getRoadUserNumbers(self):
110 return self.roadUserNumbers 112 return self.roadUserNumbers
111 113
112 def setRoadUsers(self, objects): 114 def setRoadUsers(self, objects):
178 collisionCourseDotProducts[instant] = moving.Point.dot(deltap, deltav) 180 collisionCourseDotProducts[instant] = moving.Point.dot(deltap, deltav)
179 distances[instant] = deltap.norm2() 181 distances[instant] = deltap.norm2()
180 speedDifferentials[instant] = deltav.norm2() 182 speedDifferentials[instant] = deltav.norm2()
181 if collisionCourseDotProducts[instant] > 0: 183 if collisionCourseDotProducts[instant] > 0:
182 interactionInstants.append(instant) 184 interactionInstants.append(instant)
183 collisionCourseAngles[instant] = arccos(collisionCourseDotProducts[instant]/(distances[instant]*speedDifferentials[instant])) 185 if distances[instant] != 0 and speedDifferentials[instant] != 0:
186 collisionCourseAngles[instant] = arccos(collisionCourseDotProducts[instant]/(distances[instant]*speedDifferentials[instant]))
184 187
185 if len(interactionInstants) >= 2: 188 if len(interactionInstants) >= 2:
186 self.interactionInterval = moving.TimeInterval(interactionInstants[0], interactionInstants[-1]) 189 self.interactionInterval = moving.TimeInterval(interactionInstants[0], interactionInstants[-1])
187 else: 190 else:
188 self.interactionInterval = moving.TimeInterval() 191 self.interactionInterval = moving.TimeInterval()
199 minDistance[instant] = moving.MovingObject.minDistance(self.roadUser1, self.roadUser2, instant) 202 minDistance[instant] = moving.MovingObject.minDistance(self.roadUser1, self.roadUser2, instant)
200 self.addIndicator(indicators.SeverityIndicator(Interaction.indicatorNames[3], minDistance)) 203 self.addIndicator(indicators.SeverityIndicator(Interaction.indicatorNames[3], minDistance))
201 204
202 def computeCrossingsCollisions(self, predictionParameters, collisionDistanceThreshold, timeHorizon, computeCZ = False, debug = False, timeInterval = None, nProcesses = 1, usePrototypes=False, route1= (-1,-1), route2=(-1,-1), prototypes={}, secondStepPrototypes={}, nMatching={}, objects=[], noiseEntryNums=[], noiseExitNums=[], minSimilarity=0.1, mostMatched=None, useDestination=True, useSpeedPrototype=True, acceptPartialLength=30, step=1): 205 def computeCrossingsCollisions(self, predictionParameters, collisionDistanceThreshold, timeHorizon, computeCZ = False, debug = False, timeInterval = None, nProcesses = 1, usePrototypes=False, route1= (-1,-1), route2=(-1,-1), prototypes={}, secondStepPrototypes={}, nMatching={}, objects=[], noiseEntryNums=[], noiseExitNums=[], minSimilarity=0.1, mostMatched=None, useDestination=True, useSpeedPrototype=True, acceptPartialLength=30, step=1):
203 '''Computes all crossing and collision points at each common instant for two road users. ''' 206 '''Computes all crossing and collision points at each common instant for two road users. '''
204 self.collisionPoints={}
205 self.crossingZones={}
206 TTCs = {} 207 TTCs = {}
207 if usePrototypes: 208 if usePrototypes:
208 route1= getRoute(self.roadUser1,prototypes,objects,noiseEntryNums,noiseExitNums,useDestination) 209 route1= getRoute(self.roadUser1,prototypes,objects,noiseEntryNums,noiseExitNums,useDestination)
209 route2= getRoute(self.roadUser2,prototypes,objects,noiseEntryNums,noiseExitNums,useDestination) 210 route2= getRoute(self.roadUser2,prototypes,objects,noiseEntryNums,noiseExitNums,useDestination)
210 211
211 if timeInterval is not None: 212 if timeInterval is not None:
212 commonTimeInterval = timeInterval 213 commonTimeInterval = timeInterval
213 else: 214 else:
214 commonTimeInterval = self.timeInterval 215 commonTimeInterval = self.timeInterval
215 self.collisionPoints[predictionParameters.name], crossingZones = predictionParameters.computeCrossingsCollisions(self.roadUser1, self.roadUser2, collisionDistanceThreshold, timeHorizon, computeCZ, debug, commonTimeInterval, nProcesses,usePrototypes,route1,route2,prototypes,secondStepPrototypes,nMatching,objects,noiseEntryNums,noiseExitNums,minSimilarity,mostMatched,useDestination,useSpeedPrototype,acceptPartialLength, step) 216 self.collisionPoints, crossingZones = predictionParameters.computeCrossingsCollisions(self.roadUser1, self.roadUser2, collisionDistanceThreshold, timeHorizon, computeCZ, debug, commonTimeInterval, nProcesses,usePrototypes,route1,route2,prototypes,secondStepPrototypes,nMatching,objects,noiseEntryNums,noiseExitNums,minSimilarity,mostMatched,useDestination,useSpeedPrototype,acceptPartialLength, step)
217 for i, cp in self.collisionPoints.iteritems():
218 TTCs[i] = prediction.SafetyPoint.computeExpectedIndicator(cp)
219 self.addIndicator(indicators.SeverityIndicator(Interaction.indicatorNames[7], TTCs, mostSevereIsMax=False))
220
221 # crossing zones and pPET
216 if computeCZ: 222 if computeCZ:
217 self.crossingZones[predictionParameters.name] = crossingZones 223 self.crossingZones[predictionParameters.name] = crossingZones
218 for i, cp in self.collisionPoints.iteritems():
219 TTCs[i] = prediction.SafetyPoint.computeExpectedIndicator(cp)
220 # add probability of collision, and probability of successful evasive action
221 self.addIndicator(indicators.SeverityIndicator(Interaction.indicatorNames[7], TTCs, mostSevereIsMax=False))
222
223 if computeCZ:
224 pPETs = {} 224 pPETs = {}
225 for i, cz in self.crossingZones.iteritems(): 225 for i, cz in self.crossingZones.iteritems():
226 pPETs[i] = prediction.SafetyPoint.computeExpectedIndicator(cz) 226 pPETs[i] = prediction.SafetyPoint.computeExpectedIndicator(cz)
227 self.addIndicator(indicators.SeverityIndicator(Interaction.indicatorNames[9], pPETs, mostSevereIsMax=False)) 227 self.addIndicator(indicators.SeverityIndicator(Interaction.indicatorNames[9], pPETs, mostSevereIsMax=False))
228 # TODO add probability of collision, and probability of successful evasive action
228 229
229 def computePET(self, collisionDistanceThreshold): 230 def computePET(self, collisionDistanceThreshold):
230 # TODO add crossing zone 231 # TODO add crossing zone
231 self.pet = moving.MovingObject.computePET(self.roadUser1, self.roadUser2, collisionDistanceThreshold) 232 self.pet = moving.MovingObject.computePET(self.roadUser1, self.roadUser2, collisionDistanceThreshold)
232 233
236 def addInteractionType(self,interactionType): 237 def addInteractionType(self,interactionType):
237 ''' interaction types: conflict or collision if they are known''' 238 ''' interaction types: conflict or collision if they are known'''
238 self.interactionType = interactionType 239 self.interactionType = interactionType
239 240
240 def getCrossingZones(self, predictionMethodName): 241 def getCrossingZones(self, predictionMethodName):
241 if self.hasattr(self, 'crossingZones'): 242 if self.crossingZones is not None:
242 return self.crossingZones[predictionMethodName] 243 return self.crossingZones[predictionMethodName]
243 else: 244 else:
244 return None 245 return None
245 246
246 def getCollisionPoints(self, predictionMethodName): 247 def getCollisionPoints(self, predictionMethodName):
275 if i<len(interactions): 276 if i<len(interactions):
276 return interactions[i] 277 return interactions[i]
277 else: 278 else:
278 return None 279 return None
279 280
280 def aggregateSafetyPoints(interactions, pointType = 'collision'): 281 def aggregateSafetyPoints(interactions, predictionMethodName = None, pointType = 'collision'):
281 '''Put all collision points or crossing zones in a list for display''' 282 '''Put all collision points or crossing zones in a list for display'''
283 if predictionMethodName is None and len(interactions)>0:
284 predictionMethodName = interactions[0].collisionPoints.keys()[0]
285
282 allPoints = [] 286 allPoints = []
283 if pointType == 'collision': 287 if pointType == 'collision':
284 for i in interactions: 288 for i in interactions:
285 for points in i.collisionPoints.values(): 289 for points in i.collisionPoints[predictionMethodName].values():
286 allPoints += points 290 allPoints += points
287 elif pointType == 'crossing': 291 elif pointType == 'crossing':
288 for i in interactions: 292 for i in interactions:
289 for points in i.crossingZones.values(): 293 for points in i.crossingZones[predictionMethodName].values():
290 allPoints += points 294 allPoints += points
291 else: 295 else:
292 print('unknown type of point '+pointType) 296 print('unknown type of point '+pointType)
293 return allPoints 297 return allPoints
294 298