comparison trafficintelligence/events.py @ 1149:392db62ea1da

major bug in categorization, added option for method
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Wed, 13 May 2020 00:29:34 -0400
parents eb88d2984637
children 14140b55e580
comparison
equal deleted inserted replaced
1148:eb88d2984637 1149:392db62ea1da
217 minDistances={} 217 minDistances={}
218 for instant in self.timeInterval: 218 for instant in self.timeInterval:
219 minDistances[instant] = moving.MovingObject.minDistance(self.roadUser1, self.roadUser2, instant) 219 minDistances[instant] = moving.MovingObject.minDistance(self.roadUser1, self.roadUser2, instant)
220 self.addIndicator(indicators.SeverityIndicator(Interaction.indicatorNames[3], minDistances, mostSevereIsMax = False)) 220 self.addIndicator(indicators.SeverityIndicator(Interaction.indicatorNames[3], minDistances, mostSevereIsMax = False))
221 221
222 def categorize(self, velocityAngleTolerance, parallelAngleTolerance): 222 def categorize(self, velocityAngleTolerance, parallelAngleTolerance, headonCollisionCourseAngleTolerance = None):
223 '''Computes the interaction category by instant 223 '''Computes the interaction category by instant
224 velocityAngleTolerance and parallelAngleTolerance in radian 224 velocityAngleTolerance and parallelAngleTolerance in radian
225 velocityAngleTolerance: indicates the angle threshold for rear and head on (180-velocityAngleTolerance), as well as the maximum collision course angle for head on 225 velocityAngleTolerance: indicates the angle threshold for rear and head on (180-velocityAngleTolerance), as well as the maximum collision course angle for head on
226 velocityAngleTolerance: indicates the angle between velocity vector (average for parallel) and position vector''' 226 velocityAngleTolerance: indicates the angle between velocity vector (average for parallel) and position vector'''
227 parallelAngleToleranceCosine = np.cos(parallelAngleTolerance) 227 parallelAngleToleranceCosine = np.cos(parallelAngleTolerance)
228 if headonCollisionCourseAngleTolerance is None:
229 headonCollisionCourseAngleTolerance = velocityAngleTolerance
230
228 self.categories = {} 231 self.categories = {}
229 collisionCourseDotProducts = self.getIndicator(Interaction.indicatorNames[0]) 232 collisionCourseDotProducts = self.getIndicator(Interaction.indicatorNames[0])
230 collisionCourseAngles = self.getIndicator(Interaction.indicatorNames[1]) 233 collisionCourseAngles = self.getIndicator(Interaction.indicatorNames[1])
234 distances = self.getIndicator(Interaction.indicatorNames[2])
231 velocityAngles = self.getIndicator(Interaction.indicatorNames[4]) 235 velocityAngles = self.getIndicator(Interaction.indicatorNames[4])
232 for instant in self.timeInterval: 236 for instant in self.timeInterval:
233 if velocityAngles[instant] < velocityAngleTolerance: # parallel or rear end 237 if velocityAngles[instant] < velocityAngleTolerance: # parallel or rear end
234 midVelocity = self.roadUser1.getVelocityAtInstant(instant) + self.roadUser2.getVelocityAtInstant(instant) 238 midVelocity = self.roadUser1.getVelocityAtInstant(instant) + self.roadUser2.getVelocityAtInstant(instant)
235 deltap = self.roadUser1.getPositionAtInstant(instant)-self.roadUser2.getPositionAtInstant(instant) 239 deltap = self.roadUser1.getPositionAtInstant(instant)-self.roadUser2.getPositionAtInstant(instant)
236 if moving.Point.dot(midVelocity, deltap) < parallelAngleToleranceCosine: 240 if abs(moving.Point.dot(midVelocity, deltap)/(midVelocity.norm2()*distances[instant])) < parallelAngleToleranceCosine:
237 self.categories[instant] = Interaction.categories["parallel"] 241 self.categories[instant] = Interaction.categories["parallel"]
238 else: 242 else:
239 self.categories[instant] = Interaction.categories["rearend"] 243 self.categories[instant] = Interaction.categories["rearend"]
240 elif velocityAngles[instant] > np.pi - velocityAngleTolerance and collisionCourseAngles[instant] < velocityAngleTolerance: # head on 244 elif velocityAngles[instant] > np.pi - velocityAngleTolerance and collisionCourseAngles[instant] < headonCollisionCourseAngleTolerance: # head on
241 self.categories[instant] = Interaction.categories["headon"] 245 self.categories[instant] = Interaction.categories["headon"]
242 elif collisionCourseDotProducts[instant] > 0: 246 elif collisionCourseDotProducts[instant] > 0:
243 self.categories[instant] = Interaction.categories["side"] 247 self.categories[instant] = Interaction.categories["side"]
244 248
245 def computeCrossingsCollisions(self, predictionParameters, collisionDistanceThreshold, timeHorizon, computeCZ = False, debug = False, timeInterval = None): 249 def computeCrossingsCollisions(self, predictionParameters, collisionDistanceThreshold, timeHorizon, computeCZ = False, debug = False, timeInterval = None):