Mercurial > hg > nsaunier > traffic-intelligence
comparison python/prediction.py @ 630:69a98f84f3eb
corrected major issue with pPET, only for CVDirect prediction for now
| author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
|---|---|
| date | Tue, 17 Feb 2015 02:21:31 +0100 |
| parents | 0a5e89d6fc62 |
| children | 3058e00887bc |
comparison
equal
deleted
inserted
replaced
| 629:0a5e89d6fc62 | 630:69a98f84f3eb |
|---|---|
| 285 if debug: | 285 if debug: |
| 286 savePredictedTrajectoriesFigure(currentInstant, obj1, obj2, predictedTrajectories1, predictedTrajectories2, timeHorizon) | 286 savePredictedTrajectoriesFigure(currentInstant, obj1, obj2, predictedTrajectories1, predictedTrajectories2, timeHorizon) |
| 287 | 287 |
| 288 return currentInstant, collisionPoints, crossingZones | 288 return currentInstant, collisionPoints, crossingZones |
| 289 | 289 |
| 290 def computeCrossingsCollisions(predictionParams, obj1, obj2, 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): | 290 |
| 291 '''Computes all crossing and collision points at each common instant for two road users. ''' | 291 class PredictionParameters: |
| 292 collisionPoints={} | 292 def __init__(self, name, maxSpeed): |
| 293 crossingZones={} | 293 self.name = name |
| 294 if timeInterval: | 294 self.maxSpeed = maxSpeed |
| 295 commonTimeInterval = timeInterval | 295 |
| 296 else: | 296 def __str__(self): |
| 297 commonTimeInterval = obj1.commonTimeInterval(obj2) | 297 return '{0} {1}'.format(self.name, self.maxSpeed) |
| 298 if nProcesses == 1: | 298 |
| 299 if usePrototypes: | 299 def generatePredictedTrajectories(self, obj, instant): |
| 300 firstInstant= next( (x for x in xrange(commonTimeInterval.first,commonTimeInterval.last) if x-obj1.getFirstInstant() >= acceptPartialLength and x-obj2.getFirstInstant() >= acceptPartialLength), commonTimeInterval.last) | 300 return [] |
| 301 commonTimeIntervalList1= list(xrange(firstInstant,commonTimeInterval.last-1)) # do not look at the 1 last position/velocities, often with errors | 301 |
| 302 commonTimeIntervalList2= list(xrange(firstInstant,commonTimeInterval.last-1,step)) # do not look at the 1 last position/velocities, often with errors | 302 def computeCrossingsCollisionsAtInstant(self, currentInstant, obj1, obj2, collisionDistanceThreshold, timeHorizon, computeCZ = False, debug = False,usePrototypes=True,route1= (-1,-1),route2=(-1,-1),prototypes={},secondStepPrototypes={},nMatching={},objects=[],noiseEntryNums=[],noiseExitNums=[],minSimilarity=0.1,mostMatched=None,useDestination=True,useSpeedPrototype=True): |
| 303 for i in commonTimeIntervalList2: | 303 return computeCrossingsCollisionsAtInstant(self, currentInstant, obj1, obj2, collisionDistanceThreshold, timeHorizon, computeCZ, debug,usePrototypes,route1,route2,prototypes,secondStepPrototypes,nMatching,objects,noiseEntryNums,noiseExitNums,minSimilarity,mostMatched,useDestination,useSpeedPrototype) |
| 304 i, cp, cz = computeCrossingsCollisionsAtInstant(predictionParams, i, obj1, obj2, collisionDistanceThreshold, timeHorizon, computeCZ, debug,usePrototypes,route1,route2,prototypes,secondStepPrototypes,nMatching,objects,noiseEntryNums,noiseExitNums,minSimilarity,mostMatched,useDestination,useSpeedPrototype) | 304 |
| 305 def computeCrossingsCollisions(self, obj1, obj2, collisionDistanceThreshold, timeHorizon, computeCZ = False, debug = False, timeInterval = None, nProcesses = 1,usePrototypes=True,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): | |
| 306 #def computeCrossingsCollisions(predictionParams, obj1, obj2, 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): | |
| 307 '''Computes all crossing and collision points at each common instant for two road users. ''' | |
| 308 collisionPoints={} | |
| 309 crossingZones={} | |
| 310 if timeInterval: | |
| 311 commonTimeInterval = timeInterval | |
| 312 else: | |
| 313 commonTimeInterval = obj1.commonTimeInterval(obj2) | |
| 314 if nProcesses == 1: | |
| 315 if usePrototypes: | |
| 316 firstInstant= next( (x for x in xrange(commonTimeInterval.first,commonTimeInterval.last) if x-obj1.getFirstInstant() >= acceptPartialLength and x-obj2.getFirstInstant() >= acceptPartialLength), commonTimeInterval.last) | |
| 317 commonTimeIntervalList1= list(xrange(firstInstant,commonTimeInterval.last-1)) # do not look at the 1 last position/velocities, often with errors | |
| 318 commonTimeIntervalList2= list(xrange(firstInstant,commonTimeInterval.last-1,step)) # do not look at the 1 last position/velocities, often with errors | |
| 319 for i in commonTimeIntervalList2: | |
| 320 i, cp, cz = self.computeCrossingsCollisionsAtInstant(i, obj1, obj2, collisionDistanceThreshold, timeHorizon, computeCZ, debug,usePrototypes,route1,route2,prototypes,secondStepPrototypes,nMatching,objects,noiseEntryNums,noiseExitNums,minSimilarity,mostMatched,useDestination,useSpeedPrototype) | |
| 321 if len(cp) != 0: | |
| 322 collisionPoints[i] = cp | |
| 323 if len(cz) != 0: | |
| 324 crossingZones[i] = cz | |
| 325 if collisionPoints!={} or crossingZones!={}: | |
| 326 for i in commonTimeIntervalList1: | |
| 327 if i not in commonTimeIntervalList2: | |
| 328 i, cp, cz = self.computeCrossingsCollisionsAtInstant(i, obj1, obj2, collisionDistanceThreshold, timeHorizon, computeCZ, debug,usePrototypes,route1,route2,prototypes,secondStepPrototypes,nMatching,objects,noiseEntryNums,noiseExitNums,minSimilarity,mostMatched,useDestination,useSpeedPrototype) | |
| 329 if len(cp) != 0: | |
| 330 collisionPoints[i] = cp | |
| 331 if len(cz) != 0: | |
| 332 crossingZones[i] = cz | |
| 333 else: | |
| 334 for i in list(commonTimeInterval)[:-1]: # do not look at the 1 last position/velocities, often with errors | |
| 335 i, cp, cz = self.computeCrossingsCollisionsAtInstant(i, obj1, obj2, collisionDistanceThreshold, timeHorizon, computeCZ, debug,usePrototypes,route1,route2,prototypes,secondStepPrototypes,nMatching,objects,noiseEntryNums,noiseExitNums,minSimilarity,mostMatched,useDestination,useSpeedPrototype) | |
| 336 if len(cp) != 0: | |
| 337 collisionPoints[i] = cp | |
| 338 if len(cz) != 0: | |
| 339 crossingZones[i] = cz | |
| 340 else: | |
| 341 from multiprocessing import Pool | |
| 342 pool = Pool(processes = nProcesses) | |
| 343 jobs = [pool.apply_async(computeCrossingsCollisionsAtInstant, args = (self, i, obj1, obj2, collisionDistanceThreshold, timeHorizon, computeCZ, debug,usePrototypes,route1,route2,prototypes,secondStepPrototypes,nMatching,objects,noiseEntryNums,noiseExitNums,minSimilarity,mostMatched,useDestination,useSpeedPrototype)) for i in list(commonTimeInterval)[:-1]] | |
| 344 #results = [j.get() for j in jobs] | |
| 345 #results.sort() | |
| 346 for j in jobs: | |
| 347 i, cp, cz = j.get() | |
| 348 #if len(cp) != 0 or len(cz) != 0: | |
| 305 if len(cp) != 0: | 349 if len(cp) != 0: |
| 306 collisionPoints[i] = cp | 350 collisionPoints[i] = cp |
| 307 if len(cz) != 0: | 351 if len(cz) != 0: |
| 308 crossingZones[i] = cz | 352 crossingZones[i] = cz |
| 309 if collisionPoints!={} or crossingZones!={}: | 353 pool.close() |
| 310 for i in commonTimeIntervalList1: | 354 return collisionPoints, crossingZones |
| 311 if i not in commonTimeIntervalList2: | 355 #return computeCrossingsCollisions(self, obj1, obj2, collisionDistanceThreshold, timeHorizon, computeCZ, debug, timeInterval, nProcesses,usePrototypes,route1,route2,prototypes,secondStepPrototypes,nMatching,objects,noiseEntryNums,noiseExitNums,minSimilarity,mostMatched,useDestination,useSpeedPrototype,acceptPartialLength, step) |
| 312 i, cp, cz = computeCrossingsCollisionsAtInstant(predictionParams, i, obj1, obj2, collisionDistanceThreshold, timeHorizon, computeCZ, debug,usePrototypes,route1,route2,prototypes,secondStepPrototypes,nMatching,objects,noiseEntryNums,noiseExitNums,minSimilarity,mostMatched,useDestination,useSpeedPrototype) | |
| 313 if len(cp) != 0: | |
| 314 collisionPoints[i] = cp | |
| 315 if len(cz) != 0: | |
| 316 crossingZones[i] = cz | |
| 317 else: | |
| 318 for i in list(commonTimeInterval)[:-1]: # do not look at the 1 last position/velocities, often with errors | |
| 319 i, cp, cz = computeCrossingsCollisionsAtInstant(predictionParams, i, obj1, obj2, collisionDistanceThreshold, timeHorizon, computeCZ, debug,usePrototypes,route1,route2,prototypes,secondStepPrototypes,nMatching,objects,noiseEntryNums,noiseExitNums,minSimilarity,mostMatched,useDestination,useSpeedPrototype) | |
| 320 if len(cp) != 0: | |
| 321 collisionPoints[i] = cp | |
| 322 if len(cz) != 0: | |
| 323 crossingZones[i] = cz | |
| 324 else: | |
| 325 from multiprocessing import Pool | |
| 326 pool = Pool(processes = nProcesses) | |
| 327 jobs = [pool.apply_async(computeCrossingsCollisionsAtInstant, args = (predictionParams, i, obj1, obj2, collisionDistanceThreshold, timeHorizon, computeCZ, debug,usePrototypes,route1,route2,prototypes,secondStepPrototypes,nMatching,objects,noiseEntryNums,noiseExitNums,minSimilarity,mostMatched,useDestination,useSpeedPrototype)) for i in list(commonTimeInterval)[:-1]] | |
| 328 #results = [j.get() for j in jobs] | |
| 329 #results.sort() | |
| 330 for j in jobs: | |
| 331 i, cp, cz = j.get() | |
| 332 #if len(cp) != 0 or len(cz) != 0: | |
| 333 if len(cp) != 0: | |
| 334 collisionPoints[i] = cp | |
| 335 if len(cz) != 0: | |
| 336 crossingZones[i] = cz | |
| 337 pool.close() | |
| 338 return collisionPoints, crossingZones | |
| 339 | |
| 340 class PredictionParameters: | |
| 341 def __init__(self, name, maxSpeed): | |
| 342 self.name = name | |
| 343 self.maxSpeed = maxSpeed | |
| 344 | |
| 345 def __str__(self): | |
| 346 return '{0} {1}'.format(self.name, self.maxSpeed) | |
| 347 | |
| 348 def generatePredictedTrajectories(self, obj, instant): | |
| 349 return [] | |
| 350 | |
| 351 def computeCrossingsCollisionsAtInstant(self, currentInstant, obj1, obj2, collisionDistanceThreshold, timeHorizon, computeCZ = False, debug = False,usePrototypes=True,route1= (-1,-1),route2=(-1,-1),prototypes={},secondStepPrototypes={},nMatching={},objects=[],noiseEntryNums=[],noiseExitNums=[],minSimilarity=0.1,mostMatched=None,useDestination=True,useSpeedPrototype=True): | |
| 352 return computeCrossingsCollisionsAtInstant(self, currentInstant, obj1, obj2, collisionDistanceThreshold, timeHorizon, computeCZ, debug,usePrototypes,route1,route2,prototypes,secondStepPrototypes,nMatching,objects,noiseEntryNums,noiseExitNums,minSimilarity,mostMatched,useDestination,useSpeedPrototype) | |
| 353 | |
| 354 def computeCrossingsCollisions(self, obj1, obj2, collisionDistanceThreshold, timeHorizon, computeCZ = False, debug = False, timeInterval = None, nProcesses = 1,usePrototypes=True,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): | |
| 355 return computeCrossingsCollisions(self, obj1, obj2, collisionDistanceThreshold, timeHorizon, computeCZ, debug, timeInterval, nProcesses,usePrototypes,route1,route2,prototypes,secondStepPrototypes,nMatching,objects,noiseEntryNums,noiseExitNums,minSimilarity,mostMatched,useDestination,useSpeedPrototype,acceptPartialLength, step) | |
| 356 | 356 |
| 357 def computeCollisionProbability(self, obj1, obj2, collisionDistanceThreshold, timeHorizon, debug = False, timeInterval = None): | 357 def computeCollisionProbability(self, obj1, obj2, collisionDistanceThreshold, timeHorizon, debug = False, timeInterval = None): |
| 358 '''Computes only collision probabilities | 358 '''Computes only collision probabilities |
| 359 Returns for each instant the collision probability and number of samples drawn''' | 359 Returns for each instant the collision probability and number of samples drawn''' |
| 360 collisionProbabilities = {} | 360 collisionProbabilities = {} |
| 485 using direct computation of the intersecting point''' | 485 using direct computation of the intersecting point''' |
| 486 | 486 |
| 487 def __init__(self): | 487 def __init__(self): |
| 488 PredictionParameters.__init__(self, 'constant velocity (direct computation)', None) | 488 PredictionParameters.__init__(self, 'constant velocity (direct computation)', None) |
| 489 | 489 |
| 490 def computeCrossingsCollisionsAtInstant(self, currentInstant, obj1, obj2, collisionDistanceThreshold, timeHorizon, computeCZ = False, debug = False): | 490 def computeCrossingsCollisionsAtInstant(self, currentInstant, obj1, obj2, collisionDistanceThreshold, timeHorizon, computeCZ = False, debug = False, *kwargs): |
| 491 collisionPoints = [] | 491 collisionPoints = [] |
| 492 crossingZones = [] | 492 crossingZones = [] |
| 493 | 493 |
| 494 p1 = obj1.getPositionAtInstant(currentInstant) | 494 p1 = obj1.getPositionAtInstant(currentInstant) |
| 495 p2 = obj2.getPositionAtInstant(currentInstant) | 495 p2 = obj2.getPositionAtInstant(currentInstant) |
| 496 if (p1-p2).norm2() <= collisionDistanceThreshold: | 496 if (p1-p2).norm2() <= collisionDistanceThreshold: |
| 497 collisionPoints = [SafetyPoint((p1+p1).multiply(0.5), 1., 0.)] | 497 collisionPoints = [SafetyPoint((p1+p1).multiply(0.5), 1., 0.)] |
| 498 else: | 498 else: |
| 499 v1 = obj1.getVelocityAtInstant(currentInstant) | 499 v1 = obj1.getVelocityAtInstant(currentInstant) |
| 500 v2 = obj2.getVelocityAtInstant(currentInstant) | 500 v2 = obj2.getVelocityAtInstant(currentInstant) |
| 501 intersection = moving.intersection(p1, p2, v1, v2) | 501 intersection = moving.intersection(p1, p1+v1, p2, p2+v2) |
| 502 | 502 |
| 503 if intersection != None: | 503 if intersection != None: |
| 504 dp1 = intersection-p1 | 504 dp1 = intersection-p1 |
| 505 dp2 = intersection-p2 | 505 dp2 = intersection-p2 |
| 506 if moving.Point.dot(dp1, v1) > 0 and moving.Point.dot(dp2, v2) > 0: # if the road users are moving towards the intersection | 506 dot1 = moving.Point.dot(dp1, v1) |
| 507 dot2 = moving.Point.dot(dp2, v2) | |
| 508 #print dot1, dot2 | |
| 509 # (computeCZ and (dot1 > 0 or dot2 > 0)) or ( | |
| 510 if (computeCZ and (dot1 > 0 or dot2 > 0)) or (dot1 > 0 and dot2 > 0): # if the road users are moving towards the intersection or if computing pPET | |
| 507 dist1 = dp1.norm2() | 511 dist1 = dp1.norm2() |
| 508 dist2 = dp2.norm2() | 512 dist2 = dp2.norm2() |
| 509 s1 = v1.norm2() | 513 s1 = math.copysign(v1.norm2(), dot1) |
| 510 s2 = v2.norm2() | 514 s2 = math.copysign(v2.norm2(), dot2) |
| 511 halfCollisionDistanceThreshold = collisionDistanceThreshold/2. | 515 halfCollisionDistanceThreshold = collisionDistanceThreshold/2. |
| 512 timeInterval1 = moving.TimeInterval(max(0,dist1-halfCollisionDistanceThreshold)/s1, (dist1+halfCollisionDistanceThreshold)/s1) | 516 timeInterval1 = moving.TimeInterval(max(0,dist1-halfCollisionDistanceThreshold)/s1, (dist1+halfCollisionDistanceThreshold)/s1) |
| 513 timeInterval2 = moving.TimeInterval(max(0,dist2-halfCollisionDistanceThreshold)/s2, (dist2+halfCollisionDistanceThreshold)/s2) | 517 timeInterval2 = moving.TimeInterval(max(0,dist2-halfCollisionDistanceThreshold)/s2, (dist2+halfCollisionDistanceThreshold)/s2) |
| 514 collisionTimeInterval = moving.TimeInterval.intersection(timeInterval1, timeInterval2) | 518 collisionTimeInterval = moving.TimeInterval.intersection(timeInterval1, timeInterval2) |
| 515 if computeCZ and collisionTimeInterval.empty(): | 519 |
| 516 crossingZones = [SafetyPoint(intersection, 1., timeInterval1.distance(timeInterval2))] | 520 if collisionTimeInterval.empty(): |
| 521 if computeCZ: | |
| 522 crossingZones = [SafetyPoint(intersection, 1., timeInterval1.distance(timeInterval2))] | |
| 517 else: | 523 else: |
| 518 collisionPoints = [SafetyPoint(intersection, 1., collisionTimeInterval.center())] | 524 collisionPoints = [SafetyPoint(intersection, 1., collisionTimeInterval.center())] |
| 525 # elif computeCZ and (dot1 > 0 or dot2 > 0): | |
| 526 # if dot1 > 0: | |
| 527 # firstUser = obj2 # first through crossingzone | |
| 528 # secondUser = obj1 # second through crossingzone | |
| 529 # elif dot2 > 0: | |
| 530 # firstUser = obj1 | |
| 531 # secondUser = obj2 | |
| 532 # p2 = secondUser.getPositionAtInstant(currentInstant) | |
| 533 # v2 = secondUser.getVelocityAtInstant(currentInstant) | |
| 534 # indices, intersections = firstUser.getPositions().getLineIntersections(p2, p2+v2) | |
| 535 # if indices != None: | |
| 536 # pass | |
| 537 # else: # one has to predict !!! | |
| 519 | 538 |
| 520 if debug and intersection!= None: | 539 if debug and intersection!= None: |
| 521 from matplotlib.pyplot import plot, figure, axis, title | 540 from matplotlib.pyplot import plot, figure, axis, title |
| 522 figure() | 541 figure() |
| 523 plot([p1.x, intersection.x], [p1.y, intersection.y], 'r') | 542 plot([p1.x, intersection.x], [p1.y, intersection.y], 'r') |
| 526 obj1.plot('r') | 545 obj1.plot('r') |
| 527 obj2.plot('b') | 546 obj2.plot('b') |
| 528 title('instant {0}'.format(currentInstant)) | 547 title('instant {0}'.format(currentInstant)) |
| 529 axis('equal') | 548 axis('equal') |
| 530 | 549 |
| 531 return collisionPoints, crossingZones | 550 return currentInstant, collisionPoints, crossingZones |
| 532 | 551 |
| 533 class CVExactPredictionParameters(PredictionParameters): | 552 class CVExactPredictionParameters(PredictionParameters): |
| 534 '''Prediction parameters of prediction at constant velocity | 553 '''Prediction parameters of prediction at constant velocity |
| 535 using direct computation of the intersecting point (solving for the equation''' | 554 using direct computation of the intersecting point (solving for the equation''' |
| 536 | 555 |
| 544 | 563 |
| 545 p1 = obj1.getPositionAtInstant(currentInstant) | 564 p1 = obj1.getPositionAtInstant(currentInstant) |
| 546 p2 = obj2.getPositionAtInstant(currentInstant) | 565 p2 = obj2.getPositionAtInstant(currentInstant) |
| 547 v1 = obj1.getVelocityAtInstant(currentInstant) | 566 v1 = obj1.getVelocityAtInstant(currentInstant) |
| 548 v2 = obj2.getVelocityAtInstant(currentInstant) | 567 v2 = obj2.getVelocityAtInstant(currentInstant) |
| 549 intersection = moving.intersection(p1, p2, v1, v2) | 568 intersection = moving.intersection(p1, p1+v1, p2, p2+v2) |
| 550 | 569 |
| 551 if intersection != None: | 570 if intersection != None: |
| 552 ttc = moving.Point.timeToCollision(p1, p2, v1, v2, collisionDistanceThreshold) | 571 ttc = moving.Point.timeToCollision(p1, p2, v1, v2, collisionDistanceThreshold) |
| 553 if ttc: | 572 if ttc: |
| 554 return [SafetyPoint(intersection, 1., ttc)], [] # (p1+v1.multiply(ttc)+p2+v2.multiply(ttc)).multiply(0.5) | 573 return [SafetyPoint(intersection, 1., ttc)], [] # (p1+v1.multiply(ttc)+p2+v2.multiply(ttc)).multiply(0.5) |
