Mercurial > hg > nsaunier > traffic-intelligence
comparison python/prediction.py @ 600:414b2e7cd873
merge feature-minDistance-based collisionPoints calculation in prediction file
| author | Mohamed Gomaa |
|---|---|
| date | Thu, 18 Apr 2013 17:12:53 -0400 |
| parents | f65b828e5521 |
| children | 480c8edf177e |
comparison
equal
deleted
inserted
replaced
| 599:4b5fe2de1e8d | 600:414b2e7cd873 |
|---|---|
| 177 | 177 |
| 178 def computeExpectedIndicator(points): | 178 def computeExpectedIndicator(points): |
| 179 from numpy import sum | 179 from numpy import sum |
| 180 return sum([p.indicator*p.probability for p in points])/sum([p.probability for p in points]) | 180 return sum([p.indicator*p.probability for p in points])/sum([p.probability for p in points]) |
| 181 | 181 |
| 182 def computeCollisionTime(predictedTrajectory1, predictedTrajectory2, collisionDistanceThreshold, timeHorizon): | 182 def getPredictedSetPositions (predictedTrajectory,instant): |
| 183 positions=[] | |
| 184 for p in predictedTrajectory: | |
| 185 positions.append(p.predictPosition(instant)) | |
| 186 return positions | |
| 187 | |
| 188 def computeCollisionTime(predictedTrajectory1, predictedTrajectory2, collisionDistanceThreshold, timeHorizon,asWholeVehicle=False ): | |
| 183 '''Computes the first instant at which two predicted trajectories are within some distance threshold''' | 189 '''Computes the first instant at which two predicted trajectories are within some distance threshold''' |
| 184 t = 1 | 190 if asWholeVehicle: |
| 185 p1 = predictedTrajectory1.predictPosition(t) | 191 from scipy.spatial.distance import cdist |
| 186 p2 = predictedTrajectory2.predictPosition(t) | 192 import numpy as np |
| 187 while t <= timeHorizon and (p1-p2).norm2() > collisionDistanceThreshold: | 193 t = 1 |
| 194 p1= [p.astuple() for p in getPredictedSetPositions (predictedTrajectory1,t)] | |
| 195 p2= [p.astuple() for p in getPredictedSetPositions (predictedTrajectory2,t)] | |
| 196 distance= cdist(p1,p2, metric='euclidean') | |
| 197 minDist= distance.min() | |
| 198 while t <= timeHorizon and minDist > collisionDistanceThreshold: | |
| 199 p1= [p.astuple() for p in getPredictedSetPositions (predictedTrajectory1,t)] | |
| 200 p2= [p.astuple() for p in getPredictedSetPositions (predictedTrajectory2,t)] | |
| 201 distance= cdist(p1,p2, metric='euclidean') | |
| 202 minDist= distance.min() | |
| 203 t += 1 | |
| 204 Index=np.unravel_index(distance.argmin(), distance.shape) | |
| 205 involvedPosition1= p1[Index[0]] | |
| 206 involvedPosition2= p2[Index[1]] | |
| 207 return t, involvedPosition1, involvedPosition2 | |
| 208 else: | |
| 209 t = 1 | |
| 188 p1 = predictedTrajectory1.predictPosition(t) | 210 p1 = predictedTrajectory1.predictPosition(t) |
| 189 p2 = predictedTrajectory2.predictPosition(t) | 211 p2 = predictedTrajectory2.predictPosition(t) |
| 190 t += 1 | 212 while t <= timeHorizon and (p1-p2).norm2() > collisionDistanceThreshold: |
| 191 return t, p1, p2 | 213 p1 = predictedTrajectory1.predictPosition(t) |
| 192 | 214 p2 = predictedTrajectory2.predictPosition(t) |
| 193 def computeCrossingsCollisionsAtInstant(currentInstant, obj1, obj2, predictionParameters, collisionDistanceThreshold, timeHorizon, computeCZ = False, debug = False): | 215 t += 1 |
| 194 '''returns the lists of collision points and crossing zones | 216 return t, p1, p2 |
| 195 | 217 |
| 196 Check: Predicting all the points together, as if they represent the whole vehicle''' | 218 def computeCrossingsCollisionsAtInstant(currentInstant, obj1, obj2, predictionParameters, collisionDistanceThreshold, timeHorizon, computeCZ = False, debug = False, asWholeVehicle=False): |
| 219 '''returns the lists of collision points and crossing zones | |
| 220 Check: Predicting all the points together, as if they represent the whole vehicle''' # Done | |
| 221 | |
| 197 predictedTrajectories1 = predictionParameters.generatePredictedTrajectories(obj1, currentInstant) | 222 predictedTrajectories1 = predictionParameters.generatePredictedTrajectories(obj1, currentInstant) |
| 198 predictedTrajectories2 = predictionParameters.generatePredictedTrajectories(obj2, currentInstant) | 223 predictedTrajectories2 = predictionParameters.generatePredictedTrajectories(obj2, currentInstant) |
| 199 | 224 |
| 200 collisionPoints = [] | 225 collisionPoints = [] |
| 201 crossingZones = [] | 226 crossingZones = [] |
| 202 for et1 in predictedTrajectories1: | 227 if asWholeVehicle: |
| 203 for et2 in predictedTrajectories2: | 228 t, p1, p2 = computeCollisionTime(predictedTrajectories1, predictedTrajectories2, collisionDistanceThreshold, timeHorizon,asWholeVehicle) |
| 204 t, p1, p2 = computeCollisionTime(et1, et2, collisionDistanceThreshold, timeHorizon) | 229 if t <= timeHorizon: |
| 230 collisionPoints.append(SafetyPoint((moving.Point(p1[0]+p2[0],p1[1]+p2[1])).multiply(0.5), 1, t)) | |
| 231 else: | |
| 232 for et1 in predictedTrajectories1: | |
| 233 for et2 in predictedTrajectories2: | |
| 234 t, p1, p2 = computeCollisionTime(et1, et2, collisionDistanceThreshold, timeHorizon,asWholeVehicle) | |
| 205 | 235 |
| 206 if t <= timeHorizon: | 236 if t <= timeHorizon: |
| 207 collisionPoints.append(SafetyPoint((p1+p2).multiply(0.5), et1.probability*et2.probability, t)) | 237 collisionPoints.append(SafetyPoint((p1+p2).multiply(0.5), et1.probability*et2.probability, t)) |
| 208 elif computeCZ: # check if there is a crossing zone | 238 elif computeCZ: # check if there is a crossing zone |
| 209 # TODO? zone should be around the points at which the traj are the closest | 239 # TODO? zone should be around the points at which the traj are the closest |
| 210 # look for CZ at different times, otherwise it would be a collision | 240 # look for CZ at different times, otherwise it would be a collision |
| 211 # an approximation would be to look for close points at different times, ie the complementary of collision points | 241 # an approximation would be to look for close points at different times, ie the complementary of collision points |
| 212 cz = None | 242 cz = None |
| 213 t1 = 0 | 243 t1 = 0 |
| 214 while not cz and t1 < timeHorizon: # t1 <= timeHorizon-1 | 244 while not cz and t1 < timeHorizon: # t1 <= timeHorizon-1 |
| 215 t2 = 0 | 245 t2 = 0 |
| 216 while not cz and t2 < timeHorizon: | 246 while not cz and t2 < timeHorizon: |
| 217 #if (et1.predictPosition(t1)-et2.predictPosition(t2)).norm2() < collisionDistanceThreshold: | 247 #if (et1.predictPosition(t1)-et2.predictPosition(t2)).norm2() < collisionDistanceThreshold: |
| 218 # cz = (et1.predictPosition(t1)+et2.predictPosition(t2)).multiply(0.5) | 248 # cz = (et1.predictPosition(t1)+et2.predictPosition(t2)).multiply(0.5) |
| 219 cz = moving.segmentIntersection(et1.predictPosition(t1), et1.predictPosition(t1+1), et2.predictPosition(t2), et2.predictPosition(t2+1)) | 249 cz = moving.segmentIntersection(et1.predictPosition(t1), et1.predictPosition(t1+1), et2.predictPosition(t2), et2.predictPosition(t2+1)) |
| 220 if cz: | 250 if cz: |
| 221 crossingZones.append(SafetyPoint(cz, et1.probability*et2.probability, abs(t1-t2))) | 251 crossingZones.append(SafetyPoint(cz, et1.probability*et2.probability, abs(t1-t2))) |
| 222 t2 += 1 | 252 t2 += 1 |
| 223 t1 += 1 | 253 t1 += 1 |
| 224 | 254 |
| 225 if debug: | 255 if debug: |
| 226 from matplotlib.pyplot import figure, axis, title | 256 from matplotlib.pyplot import figure, axis, title |
| 227 figure() | 257 figure() |
| 228 for et in predictedTrajectories1: | 258 for et in predictedTrajectories1: |
| 237 title('instant {0}'.format(i)) | 267 title('instant {0}'.format(i)) |
| 238 axis('equal') | 268 axis('equal') |
| 239 | 269 |
| 240 return collisionPoints, crossingZones | 270 return collisionPoints, crossingZones |
| 241 | 271 |
| 242 def computeCrossingsCollisions(obj1, obj2, predictionParameters, collisionDistanceThreshold, timeHorizon, computeCZ = False, debug = False, timeInterval = None): | 272 def computeCrossingsCollisions(obj1, obj2, predictionParameters, collisionDistanceThreshold, timeHorizon, computeCZ = False, debug = False, timeInterval = None,asWholeVehicle=False): |
| 243 '''Computes all crossing and collision points at each common instant for two road users. ''' | 273 '''Computes all crossing and collision points at each common instant for two road users. ''' |
| 244 collisionPoints={} | 274 collisionPoints={} |
| 245 crossingZones={} | 275 crossingZones={} |
| 246 if timeInterval: | 276 if timeInterval: |
| 247 commonTimeInterval = timeInterval | 277 commonTimeInterval = timeInterval |
| 248 else: | 278 else: |
| 249 commonTimeInterval = obj1.commonTimeInterval(obj2) | 279 commonTimeInterval = obj1.commonTimeInterval(obj2) |
| 250 for i in list(commonTimeInterval)[:-1]: # do not look at the 1 last position/velocities, often with errors | 280 for i in list(commonTimeInterval)[:-1]: # do not look at the 1 last position/velocities, often with errors |
| 251 collisionPoints[i], crossingZones[i] = computeCrossingsCollisionsAtInstant(i, obj1, obj2, predictionParameters, collisionDistanceThreshold, timeHorizon, computeCZ, debug) | 281 collisionPoints[i], crossingZones[i] = computeCrossingsCollisionsAtInstant(i, obj1, obj2, predictionParameters, collisionDistanceThreshold, timeHorizon, computeCZ, debug,asWholeVehicle) |
| 252 | 282 |
| 253 return collisionPoints, crossingZones | 283 return collisionPoints, crossingZones |
| 254 | 284 |
| 255 def computeCollisionProbability(obj1, obj2, predictionParameters, collisionDistanceThreshold, timeHorizon, debug = False, timeInterval = None): | 285 def computeCollisionProbability(obj1, obj2, predictionParameters, collisionDistanceThreshold, timeHorizon, debug = False, timeInterval = None): |
| 256 '''Computes only collision probabilities | 286 '''Computes only collision probabilities |
| 289 title('instant {0}'.format(i)) | 319 title('instant {0}'.format(i)) |
| 290 axis('equal') | 320 axis('equal') |
| 291 | 321 |
| 292 return collisionProbabilities | 322 return collisionProbabilities |
| 293 | 323 |
| 294 | |
| 295 if __name__ == "__main__": | 324 if __name__ == "__main__": |
| 296 import doctest | 325 import doctest |
| 297 import unittest | 326 import unittest |
| 298 suite = doctest.DocFileSuite('tests/prediction.txt') | 327 suite = doctest.DocFileSuite('tests/prediction.txt') |
| 299 #suite = doctest.DocTestSuite() | 328 #suite = doctest.DocTestSuite() |
