annotate python/events.py @ 731:b02431a8234c dev

made prototypecluster generic, in ml module, and added randominitialization
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Tue, 11 Aug 2015 11:38:05 -0400
parents 4e89341edd29
children 0e875a7f5759
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
56
61fe73df2d36 created new package, moved Interaction class and created Crossing class
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
1 #! /usr/bin/env python
61fe73df2d36 created new package, moved Interaction class and created Crossing class
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
2 '''Libraries for events
61fe73df2d36 created new package, moved Interaction class and created Crossing class
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
3 Interactions, pedestrian crossing...'''
61fe73df2d36 created new package, moved Interaction class and created Crossing class
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
4
731
b02431a8234c made prototypecluster generic, in ml module, and added randominitialization
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 728
diff changeset
5 import moving, prediction, indicators, utils, cvutils, ml
665
15e244d2a1b5 corrected bug with circular import for VideoFilenameAddable, moved to base module
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 664
diff changeset
6 from base import VideoFilenameAddable
15e244d2a1b5 corrected bug with circular import for VideoFilenameAddable, moved to base module
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 664
diff changeset
7
293
ee3302528cdc rearranged new code by Paul (works now)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 292
diff changeset
8 import numpy as np
ee3302528cdc rearranged new code by Paul (works now)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 292
diff changeset
9
292
8b2c8a4015f1 class VehPairs updated. Now supports primitive multithreading.
Paul@BEAST-III
parents: 291
diff changeset
10 import multiprocessing
8b2c8a4015f1 class VehPairs updated. Now supports primitive multithreading.
Paul@BEAST-III
parents: 291
diff changeset
11 import itertools
293
ee3302528cdc rearranged new code by Paul (works now)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 292
diff changeset
12
56
61fe73df2d36 created new package, moved Interaction class and created Crossing class
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
13
613
306db0f3c7a2 move 4 functions from trajLearning file
MohamedGomaa
parents: 610
diff changeset
14 def findRoute(prototypes,objects,i,j,noiseEntryNums,noiseExitNums,minSimilarity= 0.3, spatialThreshold=1.0, delta=180):
619
dc2d0a0d7fe1 merged code from Mohamed Gomaa Mohamed for the use of points of interests in mation pattern learning and motion prediction (TRB 2015)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 613
diff changeset
15 if i[0] not in noiseEntryNums:
dc2d0a0d7fe1 merged code from Mohamed Gomaa Mohamed for the use of points of interests in mation pattern learning and motion prediction (TRB 2015)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 613
diff changeset
16 prototypesRoutes= [ x for x in sorted(prototypes.keys()) if i[0]==x[0]]
dc2d0a0d7fe1 merged code from Mohamed Gomaa Mohamed for the use of points of interests in mation pattern learning and motion prediction (TRB 2015)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 613
diff changeset
17 elif i[1] not in noiseExitNums:
dc2d0a0d7fe1 merged code from Mohamed Gomaa Mohamed for the use of points of interests in mation pattern learning and motion prediction (TRB 2015)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 613
diff changeset
18 prototypesRoutes=[ x for x in sorted(prototypes.keys()) if i[1]==x[1]]
dc2d0a0d7fe1 merged code from Mohamed Gomaa Mohamed for the use of points of interests in mation pattern learning and motion prediction (TRB 2015)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 613
diff changeset
19 else:
dc2d0a0d7fe1 merged code from Mohamed Gomaa Mohamed for the use of points of interests in mation pattern learning and motion prediction (TRB 2015)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 613
diff changeset
20 prototypesRoutes=[x for x in sorted(prototypes.keys())]
dc2d0a0d7fe1 merged code from Mohamed Gomaa Mohamed for the use of points of interests in mation pattern learning and motion prediction (TRB 2015)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 613
diff changeset
21 routeSim={}
dc2d0a0d7fe1 merged code from Mohamed Gomaa Mohamed for the use of points of interests in mation pattern learning and motion prediction (TRB 2015)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 613
diff changeset
22 lcss = utils.LCSS(similarityFunc=lambda x,y: (distanceForLCSS(x,y) <= spatialThreshold),delta=delta)
dc2d0a0d7fe1 merged code from Mohamed Gomaa Mohamed for the use of points of interests in mation pattern learning and motion prediction (TRB 2015)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 613
diff changeset
23 for y in prototypesRoutes:
dc2d0a0d7fe1 merged code from Mohamed Gomaa Mohamed for the use of points of interests in mation pattern learning and motion prediction (TRB 2015)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 613
diff changeset
24 if y in prototypes.keys():
dc2d0a0d7fe1 merged code from Mohamed Gomaa Mohamed for the use of points of interests in mation pattern learning and motion prediction (TRB 2015)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 613
diff changeset
25 prototypesIDs=prototypes[y]
dc2d0a0d7fe1 merged code from Mohamed Gomaa Mohamed for the use of points of interests in mation pattern learning and motion prediction (TRB 2015)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 613
diff changeset
26 similarity=[]
dc2d0a0d7fe1 merged code from Mohamed Gomaa Mohamed for the use of points of interests in mation pattern learning and motion prediction (TRB 2015)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 613
diff changeset
27 for x in prototypesIDs:
dc2d0a0d7fe1 merged code from Mohamed Gomaa Mohamed for the use of points of interests in mation pattern learning and motion prediction (TRB 2015)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 613
diff changeset
28 s=lcss.computeNormalized(objects[j].positions, objects[x].positions)
dc2d0a0d7fe1 merged code from Mohamed Gomaa Mohamed for the use of points of interests in mation pattern learning and motion prediction (TRB 2015)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 613
diff changeset
29 similarity.append(s)
dc2d0a0d7fe1 merged code from Mohamed Gomaa Mohamed for the use of points of interests in mation pattern learning and motion prediction (TRB 2015)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 613
diff changeset
30 routeSim[y]=max(similarity)
dc2d0a0d7fe1 merged code from Mohamed Gomaa Mohamed for the use of points of interests in mation pattern learning and motion prediction (TRB 2015)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 613
diff changeset
31 route=max(routeSim, key=routeSim.get)
dc2d0a0d7fe1 merged code from Mohamed Gomaa Mohamed for the use of points of interests in mation pattern learning and motion prediction (TRB 2015)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 613
diff changeset
32 if routeSim[route]>=minSimilarity:
dc2d0a0d7fe1 merged code from Mohamed Gomaa Mohamed for the use of points of interests in mation pattern learning and motion prediction (TRB 2015)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 613
diff changeset
33 return route
dc2d0a0d7fe1 merged code from Mohamed Gomaa Mohamed for the use of points of interests in mation pattern learning and motion prediction (TRB 2015)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 613
diff changeset
34 else:
dc2d0a0d7fe1 merged code from Mohamed Gomaa Mohamed for the use of points of interests in mation pattern learning and motion prediction (TRB 2015)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 613
diff changeset
35 return i
613
306db0f3c7a2 move 4 functions from trajLearning file
MohamedGomaa
parents: 610
diff changeset
36
610
0dc36203973d remove dublicated code for collision/crossing computations
MohamedGomaa
parents: 607
diff changeset
37 def getRoute(obj,prototypes,objects,noiseEntryNums,noiseExitNums,useDestination=True):
0dc36203973d remove dublicated code for collision/crossing computations
MohamedGomaa
parents: 607
diff changeset
38 route=(obj.startRouteID,obj.endRouteID)
0dc36203973d remove dublicated code for collision/crossing computations
MohamedGomaa
parents: 607
diff changeset
39 if useDestination:
0dc36203973d remove dublicated code for collision/crossing computations
MohamedGomaa
parents: 607
diff changeset
40 if route not in prototypes.keys():
613
306db0f3c7a2 move 4 functions from trajLearning file
MohamedGomaa
parents: 610
diff changeset
41 route= findRoute(prototypes,objects,route,obj.getNum(),noiseEntryNums,noiseExitNums)
610
0dc36203973d remove dublicated code for collision/crossing computations
MohamedGomaa
parents: 607
diff changeset
42 return route
0dc36203973d remove dublicated code for collision/crossing computations
MohamedGomaa
parents: 607
diff changeset
43
664
455f9b93819c added capability to set a videofilename to movingobject and interaction, renames interactiontype to collision in interaction
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 662
diff changeset
44 class Interaction(moving.STObject, VideoFilenameAddable):
293
ee3302528cdc rearranged new code by Paul (works now)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 292
diff changeset
45 '''Class for an interaction between two road users
ee3302528cdc rearranged new code by Paul (works now)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 292
diff changeset
46 or a road user and an obstacle
ee3302528cdc rearranged new code by Paul (works now)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 292
diff changeset
47
ee3302528cdc rearranged new code by Paul (works now)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 292
diff changeset
48 link to the moving objects
294
1f253f218b9f evolution of indicators and their computation in interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 293
diff changeset
49 contains the indicators in a dictionary with the names as keys
293
ee3302528cdc rearranged new code by Paul (works now)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 292
diff changeset
50 '''
ee3302528cdc rearranged new code by Paul (works now)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 292
diff changeset
51
320
419f30491a4b renamed fields movingObject to roadUser, etc
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 317
diff changeset
52 categories = {'Head On': 0,
293
ee3302528cdc rearranged new code by Paul (works now)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 292
diff changeset
53 'rearend': 1,
ee3302528cdc rearranged new code by Paul (works now)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 292
diff changeset
54 'side': 2,
ee3302528cdc rearranged new code by Paul (works now)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 292
diff changeset
55 'parallel': 3}
ee3302528cdc rearranged new code by Paul (works now)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 292
diff changeset
56
320
419f30491a4b renamed fields movingObject to roadUser, etc
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 317
diff changeset
57 indicatorNames = ['Collision Course Dot Product',
419f30491a4b renamed fields movingObject to roadUser, etc
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 317
diff changeset
58 'Collision Course Angle',
419f30491a4b renamed fields movingObject to roadUser, etc
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 317
diff changeset
59 'Distance',
419f30491a4b renamed fields movingObject to roadUser, etc
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 317
diff changeset
60 'Minimum Distance',
341
2f39c4ed0b62 first version of indicator saving to sqlite
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 340
diff changeset
61 'Velocity Angle',
2f39c4ed0b62 first version of indicator saving to sqlite
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 340
diff changeset
62 'Speed Differential',
2f39c4ed0b62 first version of indicator saving to sqlite
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 340
diff changeset
63 'Collision Probability',
628
977407c9f815 corrected bugs in loading interactions (index shifted) and added functionalities to play/plot interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 627
diff changeset
64 'Time to Collision', # 7
341
2f39c4ed0b62 first version of indicator saving to sqlite
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 340
diff changeset
65 'Probability of Successful Evasive Action',
2f39c4ed0b62 first version of indicator saving to sqlite
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 340
diff changeset
66 'predicted Post Encroachment Time']
2f39c4ed0b62 first version of indicator saving to sqlite
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 340
diff changeset
67
2f39c4ed0b62 first version of indicator saving to sqlite
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 340
diff changeset
68 indicatorNameToIndices = utils.inverseEnumeration(indicatorNames)
2f39c4ed0b62 first version of indicator saving to sqlite
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 340
diff changeset
69
388
6e0dedd34920 minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 387
diff changeset
70 indicatorShortNames = ['CCDP',
408
365d8dee44f3 last changes for TRB14
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 388
diff changeset
71 'CCA',
341
2f39c4ed0b62 first version of indicator saving to sqlite
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 340
diff changeset
72 'Dist',
2f39c4ed0b62 first version of indicator saving to sqlite
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 340
diff changeset
73 'MinDist',
2f39c4ed0b62 first version of indicator saving to sqlite
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 340
diff changeset
74 'VA',
2f39c4ed0b62 first version of indicator saving to sqlite
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 340
diff changeset
75 'SD',
2f39c4ed0b62 first version of indicator saving to sqlite
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 340
diff changeset
76 'PoC',
2f39c4ed0b62 first version of indicator saving to sqlite
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 340
diff changeset
77 'TTC',
2f39c4ed0b62 first version of indicator saving to sqlite
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 340
diff changeset
78 'P(SEA)',
2f39c4ed0b62 first version of indicator saving to sqlite
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 340
diff changeset
79 'pPET']
320
419f30491a4b renamed fields movingObject to roadUser, etc
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 317
diff changeset
80
408
365d8dee44f3 last changes for TRB14
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 388
diff changeset
81 indicatorUnits = ['',
365d8dee44f3 last changes for TRB14
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 388
diff changeset
82 'rad',
365d8dee44f3 last changes for TRB14
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 388
diff changeset
83 'm',
365d8dee44f3 last changes for TRB14
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 388
diff changeset
84 'm',
365d8dee44f3 last changes for TRB14
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 388
diff changeset
85 'rad',
365d8dee44f3 last changes for TRB14
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 388
diff changeset
86 'm/s',
365d8dee44f3 last changes for TRB14
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 388
diff changeset
87 '',
365d8dee44f3 last changes for TRB14
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 388
diff changeset
88 's',
365d8dee44f3 last changes for TRB14
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 388
diff changeset
89 '',
365d8dee44f3 last changes for TRB14
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 388
diff changeset
90 '']
365d8dee44f3 last changes for TRB14
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 388
diff changeset
91
695
957126bfb456 corrected bug with indicator loading(also now correctly loading mostsevereismax)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 694
diff changeset
92 timeIndicators = ['Time to Collision', 'predicted Post Encroachment Time']
957126bfb456 corrected bug with indicator loading(also now correctly loading mostsevereismax)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 694
diff changeset
93
320
419f30491a4b renamed fields movingObject to roadUser, etc
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 317
diff changeset
94 def __init__(self, num = None, timeInterval = None, roaduserNum1 = None, roaduserNum2 = None, roadUser1 = None, roadUser2 = None, categoryNum = None):
293
ee3302528cdc rearranged new code by Paul (works now)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 292
diff changeset
95 moving.STObject.__init__(self, num, timeInterval)
636
3058e00887bc removed all issues because of tests with None, using is instead of == or !=
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 632
diff changeset
96 if timeInterval is None and roadUser1 is not None and roadUser2 is not None:
566
07b1bd0785cd simplifications to interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 559
diff changeset
97 self.timeInterval = roadUser1.commonTimeInterval(roadUser2)
320
419f30491a4b renamed fields movingObject to roadUser, etc
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 317
diff changeset
98 self.roadUser1 = roadUser1
419f30491a4b renamed fields movingObject to roadUser, etc
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 317
diff changeset
99 self.roadUser2 = roadUser2
636
3058e00887bc removed all issues because of tests with None, using is instead of == or !=
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 632
diff changeset
100 if roaduserNum1 is not None and roaduserNum2 is not None:
566
07b1bd0785cd simplifications to interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 559
diff changeset
101 self.roadUserNumbers = set([roaduserNum1, roaduserNum2])
636
3058e00887bc removed all issues because of tests with None, using is instead of == or !=
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 632
diff changeset
102 elif roadUser1 is not None and roadUser2 is not None:
662
72174e66aba5 corrected bug that increased TTC by 1 frame and structure to store collision points and crossing zones
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 661
diff changeset
103 self.roadUserNumbers = set([roadUser1.getNum(), roadUser2.getNum()])
566
07b1bd0785cd simplifications to interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 559
diff changeset
104 else:
07b1bd0785cd simplifications to interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 559
diff changeset
105 self.roadUserNumbers = None
293
ee3302528cdc rearranged new code by Paul (works now)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 292
diff changeset
106 self.categoryNum = categoryNum
294
1f253f218b9f evolution of indicators and their computation in interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 293
diff changeset
107 self.indicators = {}
451
cd342a774806 Point/CurvilinearTrajectory/Interaction utiles
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 436
diff changeset
108 self.interactionInterval = None
662
72174e66aba5 corrected bug that increased TTC by 1 frame and structure to store collision points and crossing zones
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 661
diff changeset
109 # list for collison points and crossing zones
72174e66aba5 corrected bug that increased TTC by 1 frame and structure to store collision points and crossing zones
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 661
diff changeset
110 self.collisionPoints = None
72174e66aba5 corrected bug that increased TTC by 1 frame and structure to store collision points and crossing zones
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 661
diff changeset
111 self.crossingZones = None
293
ee3302528cdc rearranged new code by Paul (works now)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 292
diff changeset
112
340
1046b7346886 work in progress on storing indicator values
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 339
diff changeset
113 def getRoadUserNumbers(self):
1046b7346886 work in progress on storing indicator values
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 339
diff changeset
114 return self.roadUserNumbers
1046b7346886 work in progress on storing indicator values
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 339
diff changeset
115
628
977407c9f815 corrected bugs in loading interactions (index shifted) and added functionalities to play/plot interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 627
diff changeset
116 def setRoadUsers(self, objects):
694
c4363aa6f0e5 updated function to find road users for interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 692
diff changeset
117 nums = sorted(list(self.getRoadUserNumbers()))
c4363aa6f0e5 updated function to find road users for interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 692
diff changeset
118 if nums[0]<len(objects) and objects[nums[0]].getNum() == nums[0]:
628
977407c9f815 corrected bugs in loading interactions (index shifted) and added functionalities to play/plot interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 627
diff changeset
119 self.roadUser1 = objects[nums[0]]
694
c4363aa6f0e5 updated function to find road users for interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 692
diff changeset
120 if nums[1]<len(objects) and objects[nums[1]].getNum() == nums[1]:
628
977407c9f815 corrected bugs in loading interactions (index shifted) and added functionalities to play/plot interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 627
diff changeset
121 self.roadUser2 = objects[nums[1]]
977407c9f815 corrected bugs in loading interactions (index shifted) and added functionalities to play/plot interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 627
diff changeset
122
694
c4363aa6f0e5 updated function to find road users for interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 692
diff changeset
123 if self.roadUser1 is None or self.roadUser2 is None:
c4363aa6f0e5 updated function to find road users for interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 692
diff changeset
124 self.roadUser1 = None
c4363aa6f0e5 updated function to find road users for interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 692
diff changeset
125 self.roadUser2 = None
c4363aa6f0e5 updated function to find road users for interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 692
diff changeset
126 i = 0
c4363aa6f0e5 updated function to find road users for interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 692
diff changeset
127 while i < len(objects) and self.roadUser2 is None:
c4363aa6f0e5 updated function to find road users for interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 692
diff changeset
128 if objects[i].getNum() in nums:
c4363aa6f0e5 updated function to find road users for interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 692
diff changeset
129 if self.roadUser1 is None:
c4363aa6f0e5 updated function to find road users for interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 692
diff changeset
130 self.roadUser1 = objects[i]
c4363aa6f0e5 updated function to find road users for interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 692
diff changeset
131 else:
c4363aa6f0e5 updated function to find road users for interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 692
diff changeset
132 self.roadUser2 = objects[i]
c4363aa6f0e5 updated function to find road users for interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 692
diff changeset
133 i += 1
628
977407c9f815 corrected bugs in loading interactions (index shifted) and added functionalities to play/plot interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 627
diff changeset
134
293
ee3302528cdc rearranged new code by Paul (works now)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 292
diff changeset
135 def getIndicator(self, indicatorName):
321
a5e40bd04cf4 rearranged LCSS indicator functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 320
diff changeset
136 return self.indicators.get(indicatorName, None)
294
1f253f218b9f evolution of indicators and their computation in interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 293
diff changeset
137
1f253f218b9f evolution of indicators and their computation in interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 293
diff changeset
138 def addIndicator(self, indicator):
661
dc70d9e711f5 some method name change and new methods for features in objects (MovingObject) and methods to access indicator values in interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 636
diff changeset
139 if indicator is not None:
321
a5e40bd04cf4 rearranged LCSS indicator functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 320
diff changeset
140 self.indicators[indicator.name] = indicator
293
ee3302528cdc rearranged new code by Paul (works now)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 292
diff changeset
141
661
dc70d9e711f5 some method name change and new methods for features in objects (MovingObject) and methods to access indicator values in interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 636
diff changeset
142 def getIndicatorValueAtInstant(self, indicatorName, instant):
dc70d9e711f5 some method name change and new methods for features in objects (MovingObject) and methods to access indicator values in interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 636
diff changeset
143 indicator = self.getIndicator(indicatorName)
dc70d9e711f5 some method name change and new methods for features in objects (MovingObject) and methods to access indicator values in interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 636
diff changeset
144 if indicator is not None:
dc70d9e711f5 some method name change and new methods for features in objects (MovingObject) and methods to access indicator values in interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 636
diff changeset
145 return indicator[instant]
dc70d9e711f5 some method name change and new methods for features in objects (MovingObject) and methods to access indicator values in interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 636
diff changeset
146 else:
dc70d9e711f5 some method name change and new methods for features in objects (MovingObject) and methods to access indicator values in interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 636
diff changeset
147 return None
dc70d9e711f5 some method name change and new methods for features in objects (MovingObject) and methods to access indicator values in interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 636
diff changeset
148
dc70d9e711f5 some method name change and new methods for features in objects (MovingObject) and methods to access indicator values in interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 636
diff changeset
149 def getIndicatorValuesAtInstant(self, instant):
dc70d9e711f5 some method name change and new methods for features in objects (MovingObject) and methods to access indicator values in interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 636
diff changeset
150 '''Returns list of indicator values at instant
dc70d9e711f5 some method name change and new methods for features in objects (MovingObject) and methods to access indicator values in interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 636
diff changeset
151 as dict (with keys from indicators dict)'''
dc70d9e711f5 some method name change and new methods for features in objects (MovingObject) and methods to access indicator values in interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 636
diff changeset
152 values = {}
dc70d9e711f5 some method name change and new methods for features in objects (MovingObject) and methods to access indicator values in interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 636
diff changeset
153 for k, indicator in self.indicators.iteritems():
dc70d9e711f5 some method name change and new methods for features in objects (MovingObject) and methods to access indicator values in interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 636
diff changeset
154 values[k] = indicator[instant]
dc70d9e711f5 some method name change and new methods for features in objects (MovingObject) and methods to access indicator values in interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 636
diff changeset
155 return values
dc70d9e711f5 some method name change and new methods for features in objects (MovingObject) and methods to access indicator values in interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 636
diff changeset
156
628
977407c9f815 corrected bugs in loading interactions (index shifted) and added functionalities to play/plot interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 627
diff changeset
157 def plot(self, options = '', withOrigin = False, timeStep = 1, withFeatures = False, **kwargs):
977407c9f815 corrected bugs in loading interactions (index shifted) and added functionalities to play/plot interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 627
diff changeset
158 self.roadUser1.plot(options, withOrigin, timeStep, withFeatures, **kwargs)
977407c9f815 corrected bugs in loading interactions (index shifted) and added functionalities to play/plot interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 627
diff changeset
159 self.roadUser2.plot(options, withOrigin, timeStep, withFeatures, **kwargs)
977407c9f815 corrected bugs in loading interactions (index shifted) and added functionalities to play/plot interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 627
diff changeset
160
977407c9f815 corrected bugs in loading interactions (index shifted) and added functionalities to play/plot interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 627
diff changeset
161 def plotOnWorldImage(self, nPixelsPerUnitDistance, options = '', withOrigin = False, timeStep = 1, **kwargs):
977407c9f815 corrected bugs in loading interactions (index shifted) and added functionalities to play/plot interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 627
diff changeset
162 self.roadUser1.plotOnWorldImage(nPixelsPerUnitDistance, options, withOrigin, timeStep, **kwargs)
977407c9f815 corrected bugs in loading interactions (index shifted) and added functionalities to play/plot interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 627
diff changeset
163 self.roadUser2.plotOnWorldImage(nPixelsPerUnitDistance, options, withOrigin, timeStep, **kwargs)
977407c9f815 corrected bugs in loading interactions (index shifted) and added functionalities to play/plot interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 627
diff changeset
164
977407c9f815 corrected bugs in loading interactions (index shifted) and added functionalities to play/plot interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 627
diff changeset
165 def play(self, videoFilename, homography = None, undistort = False, intrinsicCameraMatrix = None, distortionCoefficients = None, undistortedImageMultiplication = 1.):
636
3058e00887bc removed all issues because of tests with None, using is instead of == or !=
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 632
diff changeset
166 if self.roadUser1 is not None and self.roadUser2 is not None:
628
977407c9f815 corrected bugs in loading interactions (index shifted) and added functionalities to play/plot interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 627
diff changeset
167 cvutils.displayTrajectories(videoFilename, [self.roadUser1, self.roadUser2], homography = homography, firstFrameNum = self.getFirstInstant(), lastFrameNumArg = self.getLastInstant(), undistort = undistort, intrinsicCameraMatrix = intrinsicCameraMatrix, distortionCoefficients = distortionCoefficients, undistortedImageMultiplication = undistortedImageMultiplication)
977407c9f815 corrected bugs in loading interactions (index shifted) and added functionalities to play/plot interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 627
diff changeset
168 else:
977407c9f815 corrected bugs in loading interactions (index shifted) and added functionalities to play/plot interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 627
diff changeset
169 print('Please set the interaction road user attributes roadUser1 and roadUser1 through the method setRoadUsers')
977407c9f815 corrected bugs in loading interactions (index shifted) and added functionalities to play/plot interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 627
diff changeset
170
293
ee3302528cdc rearranged new code by Paul (works now)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 292
diff changeset
171 def computeIndicators(self):
ee3302528cdc rearranged new code by Paul (works now)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 292
diff changeset
172 '''Computes the collision course cosine only if the cosine is positive'''
294
1f253f218b9f evolution of indicators and their computation in interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 293
diff changeset
173 collisionCourseDotProducts = {}#[0]*int(self.timeInterval.length())
320
419f30491a4b renamed fields movingObject to roadUser, etc
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 317
diff changeset
174 collisionCourseAngles = {}
325
6c9c7c956926 added velocity angle in indicators
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 321
diff changeset
175 velocityAngles = {}
294
1f253f218b9f evolution of indicators and their computation in interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 293
diff changeset
176 distances = {}#[0]*int(self.timeInterval.length())
1f253f218b9f evolution of indicators and their computation in interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 293
diff changeset
177 speedDifferentials = {}
452
c59a47ce0209 reorganized interactioninterval (in compute indicators) and comments
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 451
diff changeset
178 interactionInstants = []
294
1f253f218b9f evolution of indicators and their computation in interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 293
diff changeset
179 for instant in self.timeInterval:
320
419f30491a4b renamed fields movingObject to roadUser, etc
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 317
diff changeset
180 deltap = self.roadUser1.getPositionAtInstant(instant)-self.roadUser2.getPositionAtInstant(instant)
325
6c9c7c956926 added velocity angle in indicators
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 321
diff changeset
181 v1 = self.roadUser1.getVelocityAtInstant(instant)
6c9c7c956926 added velocity angle in indicators
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 321
diff changeset
182 v2 = self.roadUser2.getVelocityAtInstant(instant)
6c9c7c956926 added velocity angle in indicators
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 321
diff changeset
183 deltav = v2-v1
705
0ceee3b1a96d cleanup crossing collisions and crossing zones in Interaction (not stored per type of prediction method)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 695
diff changeset
184 velocityAngles[instant] = np.arccos(moving.Point.dot(v1, v2)/(v1.norm2()*v2.norm2()))
299
7e5fb4abd070 renaming event to events and correcting errors in indicator computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 294
diff changeset
185 collisionCourseDotProducts[instant] = moving.Point.dot(deltap, deltav)
317
d280b881e860 added indicator min distance
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 310
diff changeset
186 distances[instant] = deltap.norm2()
294
1f253f218b9f evolution of indicators and their computation in interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 293
diff changeset
187 speedDifferentials[instant] = deltav.norm2()
452
c59a47ce0209 reorganized interactioninterval (in compute indicators) and comments
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 451
diff changeset
188 if collisionCourseDotProducts[instant] > 0:
c59a47ce0209 reorganized interactioninterval (in compute indicators) and comments
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 451
diff changeset
189 interactionInstants.append(instant)
662
72174e66aba5 corrected bug that increased TTC by 1 frame and structure to store collision points and crossing zones
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 661
diff changeset
190 if distances[instant] != 0 and speedDifferentials[instant] != 0:
705
0ceee3b1a96d cleanup crossing collisions and crossing zones in Interaction (not stored per type of prediction method)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 695
diff changeset
191 collisionCourseAngles[instant] = np.arccos(collisionCourseDotProducts[instant]/(distances[instant]*speedDifferentials[instant]))
306
93d851d0d21e bug correction, minor work on indicators
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 299
diff changeset
192
452
c59a47ce0209 reorganized interactioninterval (in compute indicators) and comments
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 451
diff changeset
193 if len(interactionInstants) >= 2:
c59a47ce0209 reorganized interactioninterval (in compute indicators) and comments
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 451
diff changeset
194 self.interactionInterval = moving.TimeInterval(interactionInstants[0], interactionInstants[-1])
c59a47ce0209 reorganized interactioninterval (in compute indicators) and comments
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 451
diff changeset
195 else:
c59a47ce0209 reorganized interactioninterval (in compute indicators) and comments
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 451
diff changeset
196 self.interactionInterval = moving.TimeInterval()
387
91679eb2ff2c cleaning up safety analysis and the new traditional constant velocity method
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 382
diff changeset
197 self.addIndicator(indicators.SeverityIndicator(Interaction.indicatorNames[0], collisionCourseDotProducts))
91679eb2ff2c cleaning up safety analysis and the new traditional constant velocity method
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 382
diff changeset
198 self.addIndicator(indicators.SeverityIndicator(Interaction.indicatorNames[1], collisionCourseAngles))
691
fa9aa5f08210 cleaned imports in indicators.py
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 665
diff changeset
199 self.addIndicator(indicators.SeverityIndicator(Interaction.indicatorNames[2], distances, mostSevereIsMax = False))
387
91679eb2ff2c cleaning up safety analysis and the new traditional constant velocity method
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 382
diff changeset
200 self.addIndicator(indicators.SeverityIndicator(Interaction.indicatorNames[4], velocityAngles))
91679eb2ff2c cleaning up safety analysis and the new traditional constant velocity method
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 382
diff changeset
201 self.addIndicator(indicators.SeverityIndicator(Interaction.indicatorNames[5], speedDifferentials))
293
ee3302528cdc rearranged new code by Paul (works now)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 292
diff changeset
202
317
d280b881e860 added indicator min distance
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 310
diff changeset
203 # if we have features, compute other indicators
661
dc70d9e711f5 some method name change and new methods for features in objects (MovingObject) and methods to access indicator values in interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 636
diff changeset
204 if self.roadUser1.hasFeatures() and self.roadUser2.hasFeatures():
691
fa9aa5f08210 cleaned imports in indicators.py
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 665
diff changeset
205 minDistances={}
317
d280b881e860 added indicator min distance
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 310
diff changeset
206 for instant in self.timeInterval:
691
fa9aa5f08210 cleaned imports in indicators.py
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 665
diff changeset
207 minDistances[instant] = moving.MovingObject.minDistance(self.roadUser1, self.roadUser2, instant)
fa9aa5f08210 cleaned imports in indicators.py
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 665
diff changeset
208 self.addIndicator(indicators.SeverityIndicator(Interaction.indicatorNames[3], minDistances, mostSevereIsMax = False))
317
d280b881e860 added indicator min distance
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 310
diff changeset
209
627
82e9f78a4714 added test for location for trajectories
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 619
diff changeset
210 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):
338
f3aceea2afbb first safety analysis script
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 325
diff changeset
211 '''Computes all crossing and collision points at each common instant for two road users. '''
f3aceea2afbb first safety analysis script
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 325
diff changeset
212 TTCs = {}
610
0dc36203973d remove dublicated code for collision/crossing computations
MohamedGomaa
parents: 607
diff changeset
213 if usePrototypes:
0dc36203973d remove dublicated code for collision/crossing computations
MohamedGomaa
parents: 607
diff changeset
214 route1= getRoute(self.roadUser1,prototypes,objects,noiseEntryNums,noiseExitNums,useDestination)
0dc36203973d remove dublicated code for collision/crossing computations
MohamedGomaa
parents: 607
diff changeset
215 route2= getRoute(self.roadUser2,prototypes,objects,noiseEntryNums,noiseExitNums,useDestination)
338
f3aceea2afbb first safety analysis script
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 325
diff changeset
216
636
3058e00887bc removed all issues because of tests with None, using is instead of == or !=
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 632
diff changeset
217 if timeInterval is not None:
338
f3aceea2afbb first safety analysis script
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 325
diff changeset
218 commonTimeInterval = timeInterval
317
d280b881e860 added indicator min distance
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 310
diff changeset
219 else:
338
f3aceea2afbb first safety analysis script
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 325
diff changeset
220 commonTimeInterval = self.timeInterval
662
72174e66aba5 corrected bug that increased TTC by 1 frame and structure to store collision points and crossing zones
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 661
diff changeset
221 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)
558
a80ef6931fd8 updated safety-analysis to test multiprocessing
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 526
diff changeset
222 for i, cp in self.collisionPoints.iteritems():
a80ef6931fd8 updated safety-analysis to test multiprocessing
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 526
diff changeset
223 TTCs[i] = prediction.SafetyPoint.computeExpectedIndicator(cp)
692
9a258687af4c corrected some errors for ttc
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 691
diff changeset
224 if len(TTCs) > 0:
9a258687af4c corrected some errors for ttc
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 691
diff changeset
225 self.addIndicator(indicators.SeverityIndicator(Interaction.indicatorNames[7], TTCs, mostSevereIsMax=False))
338
f3aceea2afbb first safety analysis script
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 325
diff changeset
226
662
72174e66aba5 corrected bug that increased TTC by 1 frame and structure to store collision points and crossing zones
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 661
diff changeset
227 # crossing zones and pPET
338
f3aceea2afbb first safety analysis script
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 325
diff changeset
228 if computeCZ:
705
0ceee3b1a96d cleanup crossing collisions and crossing zones in Interaction (not stored per type of prediction method)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 695
diff changeset
229 self.crossingZones = crossingZones
338
f3aceea2afbb first safety analysis script
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 325
diff changeset
230 pPETs = {}
610
0dc36203973d remove dublicated code for collision/crossing computations
MohamedGomaa
parents: 607
diff changeset
231 for i, cz in self.crossingZones.iteritems():
0dc36203973d remove dublicated code for collision/crossing computations
MohamedGomaa
parents: 607
diff changeset
232 pPETs[i] = prediction.SafetyPoint.computeExpectedIndicator(cz)
631
2d1d33ae1c69 major work on pPET and pet, issues remain for pPET computed with predicted trajectories
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 630
diff changeset
233 self.addIndicator(indicators.SeverityIndicator(Interaction.indicatorNames[9], pPETs, mostSevereIsMax=False))
662
72174e66aba5 corrected bug that increased TTC by 1 frame and structure to store collision points and crossing zones
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 661
diff changeset
234 # TODO add probability of collision, and probability of successful evasive action
631
2d1d33ae1c69 major work on pPET and pet, issues remain for pPET computed with predicted trajectories
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 630
diff changeset
235
2d1d33ae1c69 major work on pPET and pet, issues remain for pPET computed with predicted trajectories
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 630
diff changeset
236 def computePET(self, collisionDistanceThreshold):
2d1d33ae1c69 major work on pPET and pet, issues remain for pPET computed with predicted trajectories
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 630
diff changeset
237 # TODO add crossing zone
2d1d33ae1c69 major work on pPET and pet, issues remain for pPET computed with predicted trajectories
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 630
diff changeset
238 self.pet = moving.MovingObject.computePET(self.roadUser1, self.roadUser2, collisionDistanceThreshold)
619
dc2d0a0d7fe1 merged code from Mohamed Gomaa Mohamed for the use of points of interests in mation pattern learning and motion prediction (TRB 2015)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 613
diff changeset
239
664
455f9b93819c added capability to set a videofilename to movingobject and interaction, renames interactiontype to collision in interaction
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 662
diff changeset
240 def setCollision(self, collision):
455f9b93819c added capability to set a videofilename to movingobject and interaction, renames interactiontype to collision in interaction
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 662
diff changeset
241 '''indicates if it is a collision: argument should be boolean'''
455f9b93819c added capability to set a videofilename to movingobject and interaction, renames interactiontype to collision in interaction
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 662
diff changeset
242 self.collision = collision
310
f7ca78a11ea6 add functions to add videofilename and interaction type in Interaction class
Mohamed Gomaa
parents: 306
diff changeset
243
664
455f9b93819c added capability to set a videofilename to movingobject and interaction, renames interactiontype to collision in interaction
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 662
diff changeset
244 def isCollision(self):
455f9b93819c added capability to set a videofilename to movingobject and interaction, renames interactiontype to collision in interaction
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 662
diff changeset
245 if hasattr(self, 'collision'):
455f9b93819c added capability to set a videofilename to movingobject and interaction, renames interactiontype to collision in interaction
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 662
diff changeset
246 return self.collision
455f9b93819c added capability to set a videofilename to movingobject and interaction, renames interactiontype to collision in interaction
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 662
diff changeset
247 else:
455f9b93819c added capability to set a videofilename to movingobject and interaction, renames interactiontype to collision in interaction
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 662
diff changeset
248 return None
661
dc70d9e711f5 some method name change and new methods for features in objects (MovingObject) and methods to access indicator values in interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 636
diff changeset
249
705
0ceee3b1a96d cleanup crossing collisions and crossing zones in Interaction (not stored per type of prediction method)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 695
diff changeset
250 def getCollisionPoints(self):
0ceee3b1a96d cleanup crossing collisions and crossing zones in Interaction (not stored per type of prediction method)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 695
diff changeset
251 return self.collisionPoints
661
dc70d9e711f5 some method name change and new methods for features in objects (MovingObject) and methods to access indicator values in interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 636
diff changeset
252
705
0ceee3b1a96d cleanup crossing collisions and crossing zones in Interaction (not stored per type of prediction method)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 695
diff changeset
253 def getCrossingZones(self):
0ceee3b1a96d cleanup crossing collisions and crossing zones in Interaction (not stored per type of prediction method)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 695
diff changeset
254 return self.crossingZones
451
cd342a774806 Point/CurvilinearTrajectory/Interaction utiles
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 436
diff changeset
255
487
e04b22ce2fcd generalized createInteractions to 2 lists of objects (for cars and pedestrians for example)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 454
diff changeset
256 def createInteractions(objects, _others = None):
e04b22ce2fcd generalized createInteractions to 2 lists of objects (for cars and pedestrians for example)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 454
diff changeset
257 '''Create all interactions of two co-existing road users'''
636
3058e00887bc removed all issues because of tests with None, using is instead of == or !=
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 632
diff changeset
258 if _others is not None:
487
e04b22ce2fcd generalized createInteractions to 2 lists of objects (for cars and pedestrians for example)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 454
diff changeset
259 others = _others
293
ee3302528cdc rearranged new code by Paul (works now)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 292
diff changeset
260
ee3302528cdc rearranged new code by Paul (works now)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 292
diff changeset
261 interactions = []
ee3302528cdc rearranged new code by Paul (works now)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 292
diff changeset
262 num = 0
ee3302528cdc rearranged new code by Paul (works now)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 292
diff changeset
263 for i in xrange(len(objects)):
636
3058e00887bc removed all issues because of tests with None, using is instead of == or !=
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 632
diff changeset
264 if _others is None:
487
e04b22ce2fcd generalized createInteractions to 2 lists of objects (for cars and pedestrians for example)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 454
diff changeset
265 others = objects[:i]
e04b22ce2fcd generalized createInteractions to 2 lists of objects (for cars and pedestrians for example)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 454
diff changeset
266 for j in xrange(len(others)):
489
000bddf84ad0 corrected bugs in safety analysis
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 487
diff changeset
267 commonTimeInterval = objects[i].commonTimeInterval(others[j])
293
ee3302528cdc rearranged new code by Paul (works now)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 292
diff changeset
268 if not commonTimeInterval.empty():
489
000bddf84ad0 corrected bugs in safety analysis
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 487
diff changeset
269 interactions.append(Interaction(num, commonTimeInterval, objects[i].num, others[j].num, objects[i], others[j]))
293
ee3302528cdc rearranged new code by Paul (works now)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 292
diff changeset
270 num += 1
ee3302528cdc rearranged new code by Paul (works now)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 292
diff changeset
271 return interactions
ee3302528cdc rearranged new code by Paul (works now)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 292
diff changeset
272
628
977407c9f815 corrected bugs in loading interactions (index shifted) and added functionalities to play/plot interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 627
diff changeset
273 def findInteraction(interactions, roadUserNum1, roadUserNum2):
977407c9f815 corrected bugs in loading interactions (index shifted) and added functionalities to play/plot interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 627
diff changeset
274 'Returns the right interaction in the set'
977407c9f815 corrected bugs in loading interactions (index shifted) and added functionalities to play/plot interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 627
diff changeset
275 i=0
977407c9f815 corrected bugs in loading interactions (index shifted) and added functionalities to play/plot interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 627
diff changeset
276 while i<len(interactions) and set([roadUserNum1, roadUserNum2]) != interactions[i].getRoadUserNumbers():
977407c9f815 corrected bugs in loading interactions (index shifted) and added functionalities to play/plot interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 627
diff changeset
277 i+=1
977407c9f815 corrected bugs in loading interactions (index shifted) and added functionalities to play/plot interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 627
diff changeset
278 if i<len(interactions):
977407c9f815 corrected bugs in loading interactions (index shifted) and added functionalities to play/plot interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 627
diff changeset
279 return interactions[i]
977407c9f815 corrected bugs in loading interactions (index shifted) and added functionalities to play/plot interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 627
diff changeset
280 else:
977407c9f815 corrected bugs in loading interactions (index shifted) and added functionalities to play/plot interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 627
diff changeset
281 return None
977407c9f815 corrected bugs in loading interactions (index shifted) and added functionalities to play/plot interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 627
diff changeset
282
705
0ceee3b1a96d cleanup crossing collisions and crossing zones in Interaction (not stored per type of prediction method)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 695
diff changeset
283 def aggregateSafetyPoints(interactions, pointType = 'collision'):
632
2f1a583bfd20 added utility for safety points
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 631
diff changeset
284 '''Put all collision points or crossing zones in a list for display'''
2f1a583bfd20 added utility for safety points
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 631
diff changeset
285 allPoints = []
2f1a583bfd20 added utility for safety points
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 631
diff changeset
286 if pointType == 'collision':
2f1a583bfd20 added utility for safety points
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 631
diff changeset
287 for i in interactions:
705
0ceee3b1a96d cleanup crossing collisions and crossing zones in Interaction (not stored per type of prediction method)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 695
diff changeset
288 for points in i.collisionPoints.values():
632
2f1a583bfd20 added utility for safety points
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 631
diff changeset
289 allPoints += points
2f1a583bfd20 added utility for safety points
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 631
diff changeset
290 elif pointType == 'crossing':
2f1a583bfd20 added utility for safety points
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 631
diff changeset
291 for i in interactions:
705
0ceee3b1a96d cleanup crossing collisions and crossing zones in Interaction (not stored per type of prediction method)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 695
diff changeset
292 for points in i.crossingZones.values():
632
2f1a583bfd20 added utility for safety points
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 631
diff changeset
293 allPoints += points
2f1a583bfd20 added utility for safety points
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 631
diff changeset
294 else:
705
0ceee3b1a96d cleanup crossing collisions and crossing zones in Interaction (not stored per type of prediction method)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 695
diff changeset
295 print('unknown type of point: '+pointType)
632
2f1a583bfd20 added utility for safety points
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 631
diff changeset
296 return allPoints
2f1a583bfd20 added utility for safety points
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 631
diff changeset
297
731
b02431a8234c made prototypecluster generic, in ml module, and added randominitialization
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 728
diff changeset
298 def prototypeCluster(interactions, similarityMatrix, indicatorName, minSimilarity, minClusterSize = None, randomInitialization = False):
b02431a8234c made prototypecluster generic, in ml module, and added randominitialization
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 728
diff changeset
299 return ml.prototypeCluster([inter.getIndicator(indicatorName) for inter in interactions], similarityMatrix, minSimilarity, minClusterSize, randomInitialization)
291
9f81218e497a class VehPairs subsumes createInteractions(objects); legacy code remains
Paul@BEAST-III
parents: 283
diff changeset
300
59
f955e83da499 developed indicators in interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 56
diff changeset
301 class Crossing(moving.STObject):
56
61fe73df2d36 created new package, moved Interaction class and created Crossing class
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
302 '''Class for the event of a street crossing
61fe73df2d36 created new package, moved Interaction class and created Crossing class
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
303
61fe73df2d36 created new package, moved Interaction class and created Crossing class
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
304 TODO: detecter passage sur la chaussee
61fe73df2d36 created new package, moved Interaction class and created Crossing class
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
305 identifier origines et destination (ou uniquement chaussee dans FOV)
61fe73df2d36 created new package, moved Interaction class and created Crossing class
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
306 carac traversee
61fe73df2d36 created new package, moved Interaction class and created Crossing class
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
307 detecter proximite veh (retirer si trop similaire simultanement
61fe73df2d36 created new package, moved Interaction class and created Crossing class
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
308 carac interaction'''
61fe73df2d36 created new package, moved Interaction class and created Crossing class
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
309
61fe73df2d36 created new package, moved Interaction class and created Crossing class
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
310 def __init__(self, roaduserNum = None, num = None, timeInterval = None):
59
f955e83da499 developed indicators in interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 56
diff changeset
311 moving.STObject.__init__(self, num, timeInterval)
56
61fe73df2d36 created new package, moved Interaction class and created Crossing class
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
312 self.roaduserNum = roaduserNum
61fe73df2d36 created new package, moved Interaction class and created Crossing class
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
313
61fe73df2d36 created new package, moved Interaction class and created Crossing class
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
314
61fe73df2d36 created new package, moved Interaction class and created Crossing class
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
315
61fe73df2d36 created new package, moved Interaction class and created Crossing class
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
316 if __name__ == "__main__":
61fe73df2d36 created new package, moved Interaction class and created Crossing class
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
317 import doctest
61fe73df2d36 created new package, moved Interaction class and created Crossing class
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
318 import unittest
489
000bddf84ad0 corrected bugs in safety analysis
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 487
diff changeset
319 suite = doctest.DocFileSuite('tests/events.txt')
000bddf84ad0 corrected bugs in safety analysis
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 487
diff changeset
320 #suite = doctest.DocTestSuite()
56
61fe73df2d36 created new package, moved Interaction class and created Crossing class
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
321 unittest.TextTestRunner().run(suite)
61fe73df2d36 created new package, moved Interaction class and created Crossing class
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
322