diff scripts/safety-analysis.py @ 614:5e09583275a4

Merged Nicolas/trafficintelligence into default
author Mohamed Gomaa <eng.m.gom3a@gmail.com>
date Fri, 05 Dec 2014 12:13:53 -0500
parents 806df5f61c03
children 6d89520e269f
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/safety-analysis.py	Fri Dec 05 12:13:53 2014 -0500
@@ -0,0 +1,75 @@
+#! /usr/bin/env python
+
+import storage, prediction, events, moving
+
+import sys, argparse, random
+
+import matplotlib.pyplot as plt
+import numpy as np
+
+# todo: very slow if too many predicted trajectories
+# add computation of probality of unsucessful evasive action
+
+parser = argparse.ArgumentParser(description='The program processes indicators for all pairs of road users in the scene')
+parser.add_argument('--cfg', dest = 'configFilename', help = 'name of the configuration file', required = True)
+parser.add_argument('--prediction-method', dest = 'predictionMethod', help = 'prediction method (constant velocity (vector computation), constant velocity, normal adaptation, point set prediction)', choices = ['cvd', 'cv', 'na', 'ps'])
+parser.add_argument('--display-cp', dest = 'displayCollisionPoints', help = 'display collision points', action = 'store_true')
+parser.add_argument('-n', dest = 'nProcesses', help = 'number of processes to run in parallel', type = int, default = 1)
+args = parser.parse_args()
+
+params = storage.ProcessParameters(args.configFilename)
+
+# parameters for prediction methods
+if args.predictionMethod:
+    predictionMethod = args.predictionMethod
+else:
+    predictionMethod = params.predictionMethod
+
+def accelerationDistribution(): 
+    return random.triangular(-params.maxNormalAcceleration, params.maxNormalAcceleration, 0.)
+def steeringDistribution():
+    return random.triangular(-params.maxNormalSteering, params.maxNormalSteering, 0.)
+
+if predictionMethod == 'cvd': # TODO add cve: constant velocity exact (Sohail's)
+    predictionParameters = prediction.CVDirectPredictionParameters()
+elif predictionMethod == 'cv':
+    predictionParameters = prediction.ConstantPredictionParameters(params.maxPredictedSpeed)
+elif predictionMethod == 'na':
+    predictionParameters = prediction.NormalAdaptationPredictionParameters(params.maxPredictedSpeed,
+                                                                           params.nPredictedTrajectories, 
+                                                                           accelerationDistribution,
+                                                                           steeringDistribution,
+                                                                           params.useFeaturesForPrediction)
+elif predictionMethod == 'ps':
+    predictionParameters = prediction.PointSetPredictionParameters(params.maxPredictedSpeed)
+# no else required, since parameters is required as argument
+
+# evasiveActionPredictionParameters = prediction.EvasiveActionPredictionParameters(params.maxPredictedSpeed, 
+#                                                                                  params.nPredictedTrajectories, 
+#                                                                                  params.minExtremeAcceleration,
+#                                                                                  params.maxExtremeAcceleration,
+#                                                                                  params.maxExtremeSteering,
+#                                                                                  params.useFeaturesForPrediction)
+
+objects = storage.loadTrajectoriesFromSqlite(params.databaseFilename,'object')
+if params.useFeaturesForPrediction:
+    features = storage.loadTrajectoriesFromSqlite(params.databaseFilename,'feature') # needed if normal adaptation
+    for obj in objects:
+        obj.setFeatures(features)
+
+interactions = events.createInteractions(objects)
+for inter in interactions:
+    inter.computeIndicators()
+    inter.computeCrossingsCollisions(predictionParameters, params.collisionDistance, params.predictionTimeHorizon, params.crossingZones, nProcesses = args.nProcesses)
+
+storage.saveIndicators(params.databaseFilename, interactions)
+
+if args.displayCollisionPoints:
+    plt.figure()
+    allCollisionPoints = []
+    for inter in interactions:
+        for collisionPoints in inter.collisionPoints.values():
+            allCollisionPoints += collisionPoints
+    moving.Point.plotAll(allCollisionPoints)
+    plt.axis('equal')
+