Mercurial > hg > nsaunier > traffic-intelligence
diff python/extrapolation.py @ 258:d90be3c02267
reasonably efficient computation of collision points and crossing zones
| author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
|---|---|
| date | Tue, 24 Jul 2012 12:37:47 -0400 |
| parents | 9281878ff19e |
| children | 8ab76b95ee72 |
line wrap: on
line diff
--- a/python/extrapolation.py Tue Jul 24 03:27:29 2012 -0400 +++ b/python/extrapolation.py Tue Jul 24 12:37:47 2012 -0400 @@ -10,6 +10,13 @@ it should also have a probability''' + def __init__(self): + self.probability = 0. + self.predictedPositions = {} + self.predictedSpeedOrientations = {} + self.collisionPoints = {} + self.crossingZones = {} + def predictPosition(self, nTimeSteps): if nTimeSteps > 0 and not nTimeSteps in self.predictedPositions.keys(): self.predictPosition(nTimeSteps-1) @@ -63,41 +70,60 @@ def createExtrapolatedTrajectories(extrapolationParameters, initialPosition, initialVelocity, maxSpeed): '''extrapolationParameters specific to each method (in name field) ''' - if extrapolationHypothesis.name == 'constant velocity': + if extrapolationParameters.name == 'constant velocity': return [ExtrapolatedTrajectoryConstant(initialPosition, initialVelocity, maxSpeed = maxSpeed)] else: print('Unknown extrapolation hypothesis') return [] +class CollisionPoint(moving.Point): + def __init__(self, p, probability = 1., TTC = -1): + self.x = p.x + self.y = p.y + self.probability = probability + self.TTC = TTC + +class CrossingZone(moving.Point): + def __init__(self, p, probability = 1., pPET = -1): + self.x = p.x + self.y = p.y + self.probability = probability + self.pPET = pPET + def computeCrossingsCollisions(extrapolatedTrajectories1, extrapolatedTrajectories2, collisionDistanceThreshold, timeHorizon): '''returns the lists of collision points and crossing zones ''' collisionPoints = [] - TTCs = [] crossingZones = [] - pPETs = [] for et1 in extrapolatedTrajectories1: for et2 in extrapolatedTrajectories2: t = 1 p1 = et1.predictPosition(t) p2 = et2.predictPosition(t) - while t <= timeHorizon and (p1-p2).norm() > collisionDistanceThreshold: + while t <= timeHorizon and (p1-p2).norm2() > collisionDistanceThreshold: p1 = et1.predictPosition(t) p2 = et2.predictPosition(t) t += 1 if t <= timeHorizon: - TTCs.append(t) # todo store probability - collisionPoints.append((p1+p2).multiply(0.5)) + collisionPoints.append(CollisionPoint((p1+p2).multiply(0.5), et1.probability*et2.probability, t)) else: # check if there is a crossing zone - for t1 in xrange(timeHorizon-1): - for t2 in xrange(timeHorizon-1): - cz = moving.segmentIntersection (et1.predictPosition(t1), et1.predictPosition(t1+1), et2.predictPosition(t2), et2.predictPosition(t2+1)) + # TODO? zone should be around the points at which the traj are the closest + # look for CZ at different times, otherwise it would be a collision + # an approximation would be to look for close points at different times, ie the complementary of collision points + cz = None + t1 = 0 + while not cz and t1 < timeHorizon: # t1 <= timeHorizon-1 + t2 = 0 + while not cz and t2 < timeHorizon: + #if (et1.predictPosition(t1)-et2.predictPosition(t2)).norm2() < collisionDistanceThreshold: + # cz = (et1.predictPosition(t1)+et2.predictPosition(t2)).multiply(0.5) + cz = moving.segmentIntersection(et1.predictPosition(t1), et1.predictPosition(t1+1), et2.predictPosition(t2), et2.predictPosition(t2+1)) if cz: - crossingZones.append(cz) - pPETs.append(abs(t1-t2)) - break - return collisionPoints, crossingZones, TTCs, pPETs + crossingZones.append(CrossingZone(cz, et1.probability*et2.probability, abs(t1-t2))) + t2 += 1 + t1 += 1 + return collisionPoints, crossingZones
