Mercurial > hg > nsaunier > traffic-intelligence
comparison python/extrapolation.py @ 244:5027c174ab90
moved indicators to new file, added ExtrapolatedTrajectory class to extrapolation file
| author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
|---|---|
| date | Tue, 17 Jul 2012 00:15:42 -0400 |
| parents | e0988a8ace0c |
| children | bd8ab323c198 |
comparison
equal
deleted
inserted
replaced
| 243:e0988a8ace0c | 244:5027c174ab90 |
|---|---|
| 1 #! /usr/bin/env python | 1 #! /usr/bin/env python |
| 2 '''Library for moving object extrapolation hypotheses''' | 2 '''Library for moving object extrapolation hypotheses''' |
| 3 | 3 |
| 4 import sys | 4 import moving |
| 5 | 5 |
| 6 import moving | 6 class ExtrapolatedTrajectory: |
| 7 '''Class for extrapolated trajectories with lazy evaluation | |
| 8 if the predicted position has not been already computed, compute it | |
| 9 | |
| 10 it should also have a probability''' | |
| 11 def predictPosition(self, nTimeSteps): | |
| 12 return None | |
| 13 | |
| 14 class ExtrapolatedTrajectoryConstant(ExtrapolatedTrajectory): | |
| 15 '''Extrapolated trajectory at constant speed or acceleration | |
| 16 TODO add limits if acceleration | |
| 17 TODO generalize by passing a series of velocities/accelerations''' | |
| 18 | |
| 19 def __init__(self, initialPosition, initialVelocity, initialAccleration = 0, probability = 1): | |
| 20 self.initialPosition = initialPosition | |
| 21 self.initialVelocity = initialVelocity | |
| 22 self.initialAccleration = initialAccleration | |
| 23 self.probability = probability | |
| 24 self.predictedPositions = {} | |
| 25 self.predictedVelocities = {} | |
| 26 | |
| 27 def predictPosition(self, nTimeSteps): | |
| 28 if not nTimeSteps in self.predictedPositions.keys(): | |
| 29 self.predictedPositions[nTimeSteps] = moving.Point.predictPosition(nTimeSteps, self.initialPosition, self.initialVelocity, self.initialAcceleration) | |
| 30 return self.predictedPositions[nTimeSteps] | |
| 7 | 31 |
| 8 # Default values: to remove because we cannot tweak that from a script where the value may be different | 32 # Default values: to remove because we cannot tweak that from a script where the value may be different |
| 9 FPS= 25 # No. of frame per second (FPS) | 33 FPS= 25 # No. of frame per second (FPS) |
| 10 vLimit= 25/FPS #assume limit speed is 90km/hr = 25 m/sec | 34 vLimit= 25/FPS #assume limit speed is 90km/hr = 25 m/sec |
| 11 deltaT= FPS*5 # extrapolatation time Horizon = 5 second | 35 deltaT= FPS*5 # extrapolatation time Horizon = 5 second |
| 12 | 36 |
| 13 def motion (position, velocity, acceleration): | 37 def motion (position, velocity, acceleration): |
| 14 ''' extrapolation hypothesis: constant acceleration''' | 38 ''' extrapolation hypothesis: constant acceleration''' |
| 15 from math import atan2,cos,sin | 39 from math import atan2,cos,sin |
| 16 vInit= velocity | 40 vInit= velocity |
| 17 vInitial= velocity.norm2() | 41 vInitial= velocity.norm2() |
| 18 theta= atan2(velocity.y,velocity.x) | 42 theta= atan2(velocity.y,velocity.x) |
| 19 vFinal= vInitial+acceleration | 43 vFinal= vInitial+acceleration |
| 20 | 44 |
| 21 if acceleration<= 0: | 45 if acceleration<= 0: |
| 22 v= max(0,vFinal) | 46 v= max(0,vFinal) |
| 23 velocity= moving.Point(v* cos(theta),v* sin(theta)) | 47 velocity= moving.Point(v* cos(theta),v* sin(theta)) |
| 24 position= position+ (velocity+vInit). multiply(0.5) | 48 position= position+ (velocity+vInit). multiply(0.5) |
| 25 else: | 49 else: |
| 26 v= min(vLimit,vFinal) | 50 v= min(vLimit,vFinal) |
| 27 velocity= moving.Point(v* cos(theta),v* sin(theta)) | 51 velocity= moving.Point(v* cos(theta),v* sin(theta)) |
| 28 position= position+ (velocity+vInit). multiply(0.5) | 52 position= position+ (velocity+vInit). multiply(0.5) |
| 29 return(position,velocity) | 53 return(position,velocity) |
| 30 | 54 |
| 31 def motionPET (position, velocity, acceleration, deltaT): | 55 def motionPET (position, velocity, acceleration, deltaT): |
| 32 ''' extrapolation hypothesis: constant acceleration for calculating pPET ''' | 56 ''' extrapolation hypothesis: constant acceleration for calculating pPET ''' |
| 33 from math import atan2,cos,sin,fabs | 57 from math import atan2,cos,sin,fabs |
| 34 vInit= velocity | 58 vInit= velocity |
| 35 vInitial= velocity.norm2() | 59 vInitial= velocity.norm2() |
| 36 theta= atan2(velocity.y,velocity.x) | 60 theta= atan2(velocity.y,velocity.x) |
| 37 vFinal= vInitial+acceleration * deltaT | 61 vFinal= vInitial+acceleration * deltaT |
| 38 if acceleration< 0: | 62 if acceleration< 0: |
| 39 if vFinal> 0: | 63 if vFinal> 0: |
| 40 velocity= moving.Point(vFinal* cos(theta),vFinal* sin(theta)) | 64 velocity= moving.Point(vFinal* cos(theta),vFinal* sin(theta)) |
| 41 position= position+ (vInit+ velocity). multiply(0.5*deltaT) | 65 position= position+ (vInit+ velocity). multiply(0.5*deltaT) |
| 42 else: | 66 else: |
| 43 T= fabs(vInitial/acceleration) | 67 T= fabs(vInitial/acceleration) |
| 44 position= position + vInit. multiply(0.5*T) | 68 position= position + vInit. multiply(0.5*T) |
| 45 elif acceleration> 0 : | 69 elif acceleration> 0 : |
| 46 if vFinal<= vLimit: | 70 if vFinal<= vLimit: |
| 47 velocity= moving.Point(vFinal* cos(theta),vFinal* sin(theta)) | 71 velocity= moving.Point(vFinal* cos(theta),vFinal* sin(theta)) |
| 48 position= position+ (vInit+ velocity). multiply(0.5*deltaT) | 72 position= position+ (vInit+ velocity). multiply(0.5*deltaT) |
| 49 else: | 73 else: |
| 50 time1= fabs((vLimit-vInitial)/acceleration) | 74 time1= fabs((vLimit-vInitial)/acceleration) |
| 51 velocity= moving.Point(vLimit* cos(theta),vLimit* sin(theta)) | 75 velocity= moving.Point(vLimit* cos(theta),vLimit* sin(theta)) |
| 52 position= (position+ (velocity+vInit). multiply(0.5*time1)) + (velocity.multiply (deltaT-time1)) | 76 position= (position+ (velocity+vInit). multiply(0.5*time1)) + (velocity.multiply (deltaT-time1)) |
| 53 elif acceleration == 0: | 77 elif acceleration == 0: |
| 54 position= position + velocity. multiply(deltaT) | 78 position= position + velocity. multiply(deltaT) |
| 55 | 79 |
| 56 return position | 80 return position |
| 57 | 81 |
| 58 def timePET (position, velocity, acceleration, intersectedPoint ): | 82 def timePET (position, velocity, acceleration, intersectedPoint ): |
| 59 ''' extrapolation hypothesis: constant acceleration for calculating pPET ''' | 83 ''' extrapolation hypothesis: constant acceleration for calculating pPET ''' |
| 60 from math import atan2,cos,sin,fabs | 84 from math import atan2,cos,sin,fabs |
| 61 vInit= velocity | 85 vInit= velocity |
| 62 vInitial= velocity.norm2() | 86 vInitial= velocity.norm2() |
| 63 theta= atan2(velocity.y,velocity.x) | 87 theta= atan2(velocity.y,velocity.x) |
| 64 vFinal= vInitial+acceleration * deltaT | 88 vFinal= vInitial+acceleration * deltaT |
| 65 if acceleration< 0: | 89 if acceleration< 0: |
| 66 if vFinal> 0: | 90 if vFinal> 0: |
| 67 velocity= moving.Point(vFinal* cos(theta),vFinal* sin(theta)) | 91 velocity= moving.Point(vFinal* cos(theta),vFinal* sin(theta)) |
| 68 time= fabs((intersectedPoint.x-position.x)/(0.5*(vInit.x+ velocity.x))) | 92 time= fabs((intersectedPoint.x-position.x)/(0.5*(vInit.x+ velocity.x))) |
| 69 else: | 93 else: |
| 70 time= fabs((intersectedPoint.x-position.x)/(0.5*(vInit.x))) | 94 time= fabs((intersectedPoint.x-position.x)/(0.5*(vInit.x))) |
| 71 elif acceleration> 0 : | 95 elif acceleration> 0 : |
| 72 if vFinal<= vLimit: | 96 if vFinal<= vLimit: |
| 73 velocity= moving.Point(vFinal* cos(theta),vFinal* sin(theta)) | 97 velocity= moving.Point(vFinal* cos(theta),vFinal* sin(theta)) |
| 74 time= fabs((intersectedPoint.x-position.x)/(0.5*(vInit.x+ velocity.x))) | 98 time= fabs((intersectedPoint.x-position.x)/(0.5*(vInit.x+ velocity.x))) |
| 75 else: | 99 else: |
| 76 time1= fabs((vLimit-vInitial)/acceleration) | 100 time1= fabs((vLimit-vInitial)/acceleration) |
| 77 velocity= moving.Point(vLimit* cos(theta),vLimit* sin(theta)) | 101 velocity= moving.Point(vLimit* cos(theta),vLimit* sin(theta)) |
| 78 time2= fabs((intersectedPoint.x-position.x)/(0.5*(vInit.x+ velocity.x))) | 102 time2= fabs((intersectedPoint.x-position.x)/(0.5*(vInit.x+ velocity.x))) |
| 79 if time2<=time1: | 103 if time2<=time1: |
| 80 time= time2 | 104 time= time2 |
| 81 else: | 105 else: |
| 82 position2= (position+ (velocity+vInit). multiply(0.5*time1)) | 106 position2= (position+ (velocity+vInit). multiply(0.5*time1)) |
| 83 time= time1+fabs((intersectedPoint.x-position2.x)/( velocity.x)) | 107 time= time1+fabs((intersectedPoint.x-position2.x)/( velocity.x)) |
| 84 elif acceleration == 0: | 108 elif acceleration == 0: |
| 85 time= fabs((intersectedPoint.x-position.x)/(velocity.x)) | 109 time= fabs((intersectedPoint.x-position.x)/(velocity.x)) |
| 86 | 110 |
| 87 return time | 111 return time |
| 88 | 112 |
| 89 def motionSteering (position, velocity, deltaTheta, deltaT ): | 113 def motionSteering (position, velocity, deltaTheta, deltaT ): |
| 90 ''' extrapolation hypothesis: steering with deltaTheta''' | 114 ''' extrapolation hypothesis: steering with deltaTheta''' |
| 91 from math import atan2,cos,sin | 115 from math import atan2,cos,sin |
| 92 vInitial= velocity.norm2() | 116 vInitial= velocity.norm2() |
| 93 theta= atan2(velocity.y,velocity.x) | 117 theta= atan2(velocity.y,velocity.x) |
| 94 newTheta= theta + deltaTheta | 118 newTheta= theta + deltaTheta |
| 95 velocity= moving.Point(vInitial* cos(newTheta),vInitial* sin(newTheta)) | 119 velocity= moving.Point(vInitial* cos(newTheta),vInitial* sin(newTheta)) |
| 96 position= position+ (velocity). multiply(deltaT) | 120 position= position+ (velocity). multiply(deltaT) |
| 97 return position | 121 return position |
| 98 | 122 |
| 99 def MonteCarlo(movingObject1,movingObject2, instant): | 123 def MonteCarlo(movingObject1,movingObject2, instant): |
| 100 ''' Monte Carlo Simulation : estimate the probability of collision''' | 124 ''' Monte Carlo Simulation : estimate the probability of collision''' |
| 101 from random import uniform | 125 from random import uniform |
| 102 from math import pow, sqrt, sin, cos,atan2 | 126 from math import pow, sqrt, sin, cos,atan2 |
| 103 N=1000 | 127 N=1000 |
| 104 ProbOfCollision = 0 | 128 ProbOfCollision = 0 |
| 105 for n in range (1, N): | 129 for n in range (1, N): |
| 106 # acceleration limit | 130 # acceleration limit |
| 107 acc1 = uniform(-0.040444,0) | 131 acc1 = uniform(-0.040444,0) |
| 108 acc2 = uniform(-0.040444,0) | 132 acc2 = uniform(-0.040444,0) |
| 109 p1= movingObject1.getPositionAtInstant(instant) | 133 p1= movingObject1.getPositionAtInstant(instant) |
| 110 p2= movingObject2.getPositionAtInstant(instant) | 134 p2= movingObject2.getPositionAtInstant(instant) |
| 111 v1= movingObject1.getVelocityAtInstant(instant) | 135 v1= movingObject1.getVelocityAtInstant(instant) |
| 112 v2= movingObject2.getVelocityAtInstant(instant) | 136 v2= movingObject2.getVelocityAtInstant(instant) |
| 113 distance= (p1-p2).norm2() | 137 distance= (p1-p2).norm2() |
| 114 distanceThreshold= 1.8 | 138 distanceThreshold= 1.8 |
| 115 t=1 | 139 t=1 |
| 116 while distance > distanceThreshold and t <= deltaT: | 140 while distance > distanceThreshold and t <= deltaT: |
| 117 # Extrapolation position | 141 # Extrapolation position |
| 118 (p1,v1) = motion(p1,v1,acc1) | 142 (p1,v1) = motion(p1,v1,acc1) |
| 119 (p2,v2) = motion(p2,v2,acc2) | 143 (p2,v2) = motion(p2,v2,acc2) |
| 120 distance= (p1-p2).norm2() | 144 distance= (p1-p2).norm2() |
| 121 if distance <=distanceThreshold: | 145 if distance <=distanceThreshold: |
| 122 ProbOfCollision= ProbOfCollision+1 | 146 ProbOfCollision= ProbOfCollision+1 |
| 123 t+=1 | 147 t+=1 |
| 124 POC= float(ProbOfCollision)/N | 148 POC= float(ProbOfCollision)/N |
| 125 return POC | 149 return POC |
| 126 | 150 |
| 127 def velocitySteering(velocity,steering): | 151 def velocitySteering(velocity,steering): |
| 128 from math import atan2,cos,sin | 152 from math import atan2,cos,sin |
| 129 vInitial= velocity.norm2() | 153 vInitial= velocity.norm2() |
| 130 theta= atan2(velocity.y,velocity.x) | 154 theta= atan2(velocity.y,velocity.x) |
| 131 newTheta= theta + steering | 155 newTheta= theta + steering |
| 132 v= moving.Point(vInitial* cos(newTheta),vInitial* sin(newTheta)) | 156 v= moving.Point(vInitial* cos(newTheta),vInitial* sin(newTheta)) |
| 133 return v | 157 return v |
| 134 | 158 |
| 135 def MonteCarloSteering(movingObject1,movingObject2, instant,steering1,steering2): | 159 def MonteCarloSteering(movingObject1,movingObject2, instant,steering1,steering2): |
| 136 ''' Monte Carlo Simulation : estimate the probability of collision in case of steering''' | 160 ''' Monte Carlo Simulation : estimate the probability of collision in case of steering''' |
| 137 from random import uniform | 161 from random import uniform |
| 138 from math import pow, sqrt, sin, cos,atan2 | 162 from math import pow, sqrt, sin, cos,atan2 |
| 139 N=1000 | 163 N=1000 |
| 140 L= 2.4 | 164 L= 2.4 |
| 141 ProbOfCollision = 0 | 165 ProbOfCollision = 0 |
| 142 for n in range (1, N): | 166 for n in range (1, N): |
| 143 # acceleration limit | 167 # acceleration limit |
| 144 acc1 = uniform(-0.040444,0) | 168 acc1 = uniform(-0.040444,0) |
| 145 acc2 = uniform(-0.040444,0) | 169 acc2 = uniform(-0.040444,0) |
| 146 p1= movingObject1.getPositionAtInstant(instant) | 170 p1= movingObject1.getPositionAtInstant(instant) |
| 147 p2= movingObject2.getPositionAtInstant(instant) | 171 p2= movingObject2.getPositionAtInstant(instant) |
| 148 vInit1= movingObject1.getVelocityAtInstant(instant) | 172 vInit1= movingObject1.getVelocityAtInstant(instant) |
| 149 v1= velocitySteering (vInit1,steering1) | 173 v1= velocitySteering (vInit1,steering1) |
| 150 vInit2= movingObject2.getVelocityAtInstant(instant) | 174 vInit2= movingObject2.getVelocityAtInstant(instant) |
| 151 v2= velocitySteering (vInit2,steering2) | 175 v2= velocitySteering (vInit2,steering2) |
| 152 distance= (p1-p2).norm2() | 176 distance= (p1-p2).norm2() |
| 153 distanceThreshold= 1.8 | 177 distanceThreshold= 1.8 |
| 154 t=1 | 178 t=1 |
| 155 while distance > distanceThreshold and t <= deltaT: | 179 while distance > distanceThreshold and t <= deltaT: |
| 156 # Extrapolation position | 180 # Extrapolation position |
| 157 (p1,v1) = motion(p1,v1,acc1) | 181 (p1,v1) = motion(p1,v1,acc1) |
| 158 (p2,v2) = motion(p2,v2,acc2) | 182 (p2,v2) = motion(p2,v2,acc2) |
| 159 distance= (p1-p2).norm2() | 183 distance= (p1-p2).norm2() |
| 160 if distance <=distanceThreshold: | 184 if distance <=distanceThreshold: |
| 161 ProbOfCollision= ProbOfCollision+1 | 185 ProbOfCollision= ProbOfCollision+1 |
| 162 t+=1 | 186 t+=1 |
| 163 POC= float(ProbOfCollision)/N | 187 POC= float(ProbOfCollision)/N |
| 164 return POC | 188 return POC |
| 165 | 189 |
| 166 | 190 |
