Mercurial > hg > nsaunier > traffic-intelligence
comparison python/events.py @ 320:419f30491a4b
renamed fields movingObject to roadUser, etc
| author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
|---|---|
| date | Mon, 06 May 2013 17:20:07 +0200 |
| parents | d280b881e860 |
| children | a5e40bd04cf4 |
comparison
equal
deleted
inserted
replaced
| 319:6b65b26c1e46 | 320:419f30491a4b |
|---|---|
| 20 | 20 |
| 21 link to the moving objects | 21 link to the moving objects |
| 22 contains the indicators in a dictionary with the names as keys | 22 contains the indicators in a dictionary with the names as keys |
| 23 ''' | 23 ''' |
| 24 | 24 |
| 25 categories = {'headon': 0, | 25 categories = {'Head On': 0, |
| 26 'rearend': 1, | 26 'rearend': 1, |
| 27 'side': 2, | 27 'side': 2, |
| 28 'parallel': 3} | 28 'parallel': 3} |
| 29 | 29 |
| 30 def __init__(self, num = None, timeInterval = None, roaduserNum1 = None, roaduserNum2 = None, movingObject1 = None, movingObject2 = None, categoryNum = None): | 30 indicatorNames = ['Collision Course Dot Product', |
| 31 'Collision Course Angle', | |
| 32 'Distance', | |
| 33 'Minimum Distance', | |
| 34 'Speed Differential'] | |
| 35 | |
| 36 def __init__(self, num = None, timeInterval = None, roaduserNum1 = None, roaduserNum2 = None, roadUser1 = None, roadUser2 = None, categoryNum = None): | |
| 31 moving.STObject.__init__(self, num, timeInterval) | 37 moving.STObject.__init__(self, num, timeInterval) |
| 32 self.roaduserNumbers = set([roaduserNum1, roaduserNum2]) | 38 self.roaduserNumbers = set([roaduserNum1, roaduserNum2]) |
| 33 self.movingObject1 = movingObject1 | 39 self.roadUser1 = roadUser1 |
| 34 self.movingObject2 = movingObject2 | 40 self.roadUser2 = roadUser2 |
| 35 self.categoryNum = categoryNum | 41 self.categoryNum = categoryNum |
| 36 self.indicators = {} | 42 self.indicators = {} |
| 37 | 43 |
| 38 def getIndicator(self, indicatorName): | 44 def getIndicator(self, indicatorName): |
| 39 return self.indicators[indicatorName] | 45 return self.indicators[indicatorName] |
| 42 self.indicators[indicator.name] = indicator | 48 self.indicators[indicator.name] = indicator |
| 43 | 49 |
| 44 def computeIndicators(self): | 50 def computeIndicators(self): |
| 45 '''Computes the collision course cosine only if the cosine is positive''' | 51 '''Computes the collision course cosine only if the cosine is positive''' |
| 46 collisionCourseDotProducts = {}#[0]*int(self.timeInterval.length()) | 52 collisionCourseDotProducts = {}#[0]*int(self.timeInterval.length()) |
| 47 collisionCourseCosines = {} | 53 collisionCourseAngles = {} |
| 48 distances = {}#[0]*int(self.timeInterval.length()) | 54 distances = {}#[0]*int(self.timeInterval.length()) |
| 49 speedDifferentials = {} | 55 speedDifferentials = {} |
| 50 for instant in self.timeInterval: | 56 for instant in self.timeInterval: |
| 51 deltap = self.movingObject1.getPositionAtInstant(instant)-self.movingObject2.getPositionAtInstant(instant) | 57 deltap = self.roadUser1.getPositionAtInstant(instant)-self.roadUser2.getPositionAtInstant(instant) |
| 52 deltav = self.movingObject2.getVelocityAtInstant(instant)-self.movingObject1.getVelocityAtInstant(instant) | 58 deltav = self.roadUser2.getVelocityAtInstant(instant)-self.roadUser1.getVelocityAtInstant(instant) |
| 53 collisionCourseDotProducts[instant] = moving.Point.dot(deltap, deltav) | 59 collisionCourseDotProducts[instant] = moving.Point.dot(deltap, deltav) |
| 54 distances[instant] = deltap.norm2() | 60 distances[instant] = deltap.norm2() |
| 55 speedDifferentials[instant] = deltav.norm2() | 61 speedDifferentials[instant] = deltav.norm2() |
| 56 if collisionCourseDotProducts[instant] > 0: | 62 #if collisionCourseDotProducts[instant] > 0: |
| 57 collisionCourseAngles[instant] = arccos(collisionCourseDotProducts[instant]/(distances[instant]*speedDifferentials[instant])) | 63 collisionCourseAngles[instant] = arccos(collisionCourseDotProducts[instant]/(distances[instant]*speedDifferentials[instant])) |
| 58 | 64 |
| 59 # todo shorten the time intervals based on the interaction definition | 65 # todo shorten the time intervals based on the interaction definition |
| 60 self.addIndicator(indicators.SeverityIndicator('Collision Course Dot Product', collisionCourseDotProducts)) | 66 self.addIndicator(indicators.SeverityIndicator('Collision Course Dot Product', collisionCourseDotProducts)) |
| 67 self.addIndicator(indicators.SeverityIndicator('Collision Course Angle', collisionCourseAngles)) | |
| 61 self.addIndicator(indicators.SeverityIndicator('Distance', distances)) | 68 self.addIndicator(indicators.SeverityIndicator('Distance', distances)) |
| 62 self.addIndicator(indicators.SeverityIndicator('Speed Differential', speedDifferentials)) | 69 self.addIndicator(indicators.SeverityIndicator('Speed Differential', speedDifferentials)) |
| 63 self.addIndicator(indicators.SeverityIndicator('Collision Course Angle', collisionCourseAngles)) | |
| 64 | 70 |
| 65 # todo test for interaction instants and interval, compute indicators | 71 # todo test for interaction instants and interval, compute indicators |
| 66 | 72 |
| 67 # if we have features, compute other indicators | 73 # if we have features, compute other indicators |
| 68 if self.movingObject1.features and self.movingObject2.features: | 74 if self.roadUser1.features and self.roadUser2.features: |
| 69 from scipy.spatial.distance import cdist | 75 from scipy.spatial.distance import cdist |
| 70 minDistance={} | 76 minDistance={} |
| 71 for instant in self.timeInterval: | 77 for instant in self.timeInterval: |
| 72 positions1 = [f.getPositionAtInstant(instant).astuple() for f in self.movingObject1.features if f.existsAtInstant(instant)] | 78 positions1 = [f.getPositionAtInstant(instant).astuple() for f in self.roadUser1.features if f.existsAtInstant(instant)] |
| 73 positions2 = [f.getPositionAtInstant(instant).astuple() for f in self.movingObject2.features if f.existsAtInstant(instant)] | 79 positions2 = [f.getPositionAtInstant(instant).astuple() for f in self.roadUser2.features if f.existsAtInstant(instant)] |
| 74 distance = cdist(positions1, positions2, metric = 'euclidean') | 80 distance = cdist(positions1, positions2, metric = 'euclidean') |
| 75 minDistance[instant] = distance.min() | 81 minDistance[instant] = distance.min() |
| 76 self.addIndicator(indicators.SeverityIndicator('Minimum Distance', minDistance)) | 82 self.addIndicator(indicators.SeverityIndicator('Minimum Distance', minDistance)) |
| 77 | 83 |
| 78 def computeCollisionPoints(self, predictionParameters, collisionDistanceThreshold, timeHorizon): | 84 def computeCollisionPoints(self, predictionParameters, collisionDistanceThreshold, timeHorizon): |
| 79 if self.movingObject1.features and self.movingObject2.features: | 85 if self.roadUser1.features and self.roadUser2.features: |
| 80 collisionPoints = prediction.computeCollisions(self.movingObject1, self.movingObject2, predictionParameters, collisionDistanceThreshold, timeHorizon) | 86 collisionPoints = prediction.computeCollisions(self.roadUser1, self.roadUser2, predictionParameters, collisionDistanceThreshold, timeHorizon) |
| 81 self.addIndicator(indicators.SeverityIndicator('collisionPoints', collisionPoints)) | 87 self.addIndicator(indicators.SeverityIndicator('Collision Points', collisionPoints)) |
| 82 else: | 88 else: |
| 83 print('Features not associated with objects') | 89 print('Features not associated with objects') |
| 84 | 90 |
| 85 def addVideoFilename(self,videoFilename): | 91 def addVideoFilename(self,videoFilename): |
| 86 self.videoFilename= videoFilename | 92 self.videoFilename= videoFilename |
| 106 | 112 |
| 107 # TODO: | 113 # TODO: |
| 108 #http://stackoverflow.com/questions/3288595/multiprocessing-using-pool-map-on-a-function-defined-in-a-class | 114 #http://stackoverflow.com/questions/3288595/multiprocessing-using-pool-map-on-a-function-defined-in-a-class |
| 109 #http://www.rueckstiess.net/research/snippets/show/ca1d7d90 | 115 #http://www.rueckstiess.net/research/snippets/show/ca1d7d90 |
| 110 def calculateIndicatorPipe(pairs, predParam, timeHorizon=75,collisionDistanceThreshold=1.8): | 116 def calculateIndicatorPipe(pairs, predParam, timeHorizon=75,collisionDistanceThreshold=1.8): |
| 111 collisionPoints, crossingZones = prediction.computeCrossingsCollisions(pairs.movingObject1, pairs.movingObject2, predParam, collisionDistanceThreshold, timeHorizon) | 117 collisionPoints, crossingZones = prediction.computeCrossingsCollisions(pairs.roadUser1, pairs.roadUser2, predParam, collisionDistanceThreshold, timeHorizon) |
| 112 #print pairs.num | 118 #print pairs.num |
| 113 # Ignore empty collision points | 119 # Ignore empty collision points |
| 114 empty = 1 | 120 empty = 1 |
| 115 for i in collisionPoints: | 121 for i in collisionPoints: |
| 116 if(collisionPoints[i] != []): | 122 if(collisionPoints[i] != []): |
| 153 pool.close() | 159 pool.close() |
| 154 else: | 160 else: |
| 155 #prog = Tools.ProgressBar(0, len(self.pairs), 77) #Removed in traffic-intelligenc port | 161 #prog = Tools.ProgressBar(0, len(self.pairs), 77) #Removed in traffic-intelligenc port |
| 156 for j in xrange(len(self.pairs)): | 162 for j in xrange(len(self.pairs)): |
| 157 #prog.updateAmount(j) #Removed in traffic-intelligenc port | 163 #prog.updateAmount(j) #Removed in traffic-intelligenc port |
| 158 collisionPoints, crossingZones = prediction.computeCrossingsCollisions(self.pairs[j].movingObject1, self.pairs[j].movingObject2, predParam, collisionDistanceThreshold, timeHorizon) | 164 collisionPoints, crossingZones = prediction.computeCrossingsCollisions(self.pairs[j].roadUser1, self.pairs[j].roadUser2, predParam, collisionDistanceThreshold, timeHorizon) |
| 159 | 165 |
| 160 # Ignore empty collision points | 166 # Ignore empty collision points |
| 161 empty = 1 | 167 empty = 1 |
| 162 for i in collisionPoints: | 168 for i in collisionPoints: |
| 163 if(collisionPoints[i] != []): | 169 if(collisionPoints[i] != []): |
