changeset 352:72aa44072093

safety analysis script with option for prediction method
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Thu, 27 Jun 2013 01:35:47 -0400
parents 891858351bcb
children 8672c101bfec
files c/Parameters.cpp include/Parameters.hpp python/prediction.py python/utils.py scripts/safety-analysis.py tracking.cfg
diffstat 6 files changed, 61 insertions(+), 46 deletions(-) [+]
line wrap: on
line diff
--- a/c/Parameters.cpp	Thu Jun 27 00:25:51 2013 -0400
+++ b/c/Parameters.cpp	Thu Jun 27 01:35:47 2013 -0400
@@ -63,6 +63,7 @@
     ("prediction-time-horizon", po::value<float>(&predictionTimeHorizon)->default_value(5.), "time horizon for collision prediction (s)")
     ("collision-distance", po::value<float>(&collisionDistance)->default_value(1.8), "collision distance threshold (m)")
     ("crossing-zones", po::value<bool>(&crossingZones)->default_value(false), "option to compute crossing zones and predicted PET")
+    ("prediction-method", po::value<string>(&predictionMethod)->default_value("na"), "prediction method")
     ("npredicted-trajectories", po::value<int>(&nPredictedTrajectories)->default_value(1), "number of predicted trajectories (use depends on prediction method)")
     ("min-acceleration", po::value<float>(&minAcceleration)->default_value(-9.1), "minimum acceleration for input distribution (m/s2) (used only for evasive action distributions)")
     ("max-acceleration", po::value<float>(&maxAcceleration)->default_value(2.), "maximum acceleration for input distribution (m/s2)")
--- a/include/Parameters.hpp	Thu Jun 27 00:25:51 2013 -0400
+++ b/include/Parameters.hpp	Thu Jun 27 01:35:47 2013 -0400
@@ -53,6 +53,7 @@
   float predictionTimeHorizon;
   float collisionDistance;
   bool crossingZones;
+  std::string predictionMethod;
   int nPredictedTrajectories;
   float minAcceleration;
   float maxAcceleration;
--- a/python/prediction.py	Thu Jun 27 00:25:51 2013 -0400
+++ b/python/prediction.py	Thu Jun 27 01:35:47 2013 -0400
@@ -80,11 +80,16 @@
                                                maxSpeed = self.maxSpeed)]
 
 class NormalAdaptationPredictionParameters(PredictionParameters):
-    def __init__(self, maxSpeed, nPredictedTrajectories, maxAcceleration, maxSteering):#, useFeatures = False
-        PredictionParameters.__init__(self, 'normal adaptation', maxSpeed)
+    def __init__(self, maxSpeed, nPredictedTrajectories, maxAcceleration, maxSteering, useFeatures = False):
+        if useFeatures:
+            name = 'point set normal adaptation'
+        else:
+            name = 'normal adaptation'
+        PredictionParameters.__init__(self, name, maxSpeed)
         self.nPredictedTrajectories = nPredictedTrajectories
         self.maxAcceleration = maxAcceleration
         self.maxSteering = maxSteering
+        self.useFeatures = useFeatures
         self.accelerationDistribution = lambda: random.triangular(-self.maxAcceleration, 
                                                                    self.maxAcceleration, 0.)
         self.steeringDistribution = lambda: random.triangular(-self.maxSteering, 
@@ -92,17 +97,25 @@
         
     def __str__(self):
         return PredictionParameters.__str__(self)+' {0} {1} {2}'.format(self.nPredictedTrajectories, 
-                                                                           self.maxAcceleration, 
-                                                                           self.maxSteering)
+                                                                        self.maxAcceleration, 
+                                                                        self.maxSteering)
 
     def generatePredictedTrajectories(self, obj, instant):
         predictedTrajectories = []
+        if self.useFeatures:
+            features = [f for f in obj.features if f.existsAtInstant(instant)]
+            positions = [f.getPositionAtInstant(instant) for f in features]
+            velocities = [f.getVelocityAtInstant(instant) for f in features]
+        else:
+            positions = [obj.getPositionAtInstant(instant)]
+            velocities = [obj.getVelocityAtInstant(instant)]
         for i in xrange(self.nPredictedTrajectories):
-            predictedTrajectories.append(PredictedTrajectoryNormalAdaptation(obj.getPositionAtInstant(instant), 
-                                                                                   obj.getVelocityAtInstant(instant), 
-                                                                                   self.accelerationDistribution, 
-                                                                                   self.steeringDistribution, 
-                                                                                   maxSpeed = self.maxSpeed))
+            for initialPosition,initialVelocity in zip(positions, velocities):
+                predictedTrajectories.append(PredictedTrajectoryNormalAdaptation(initialPosition, 
+                                                                                 initialVelocity, 
+                                                                                 self.accelerationDistribution, 
+                                                                                 self.steeringDistribution, 
+                                                                                 maxSpeed = self.maxSpeed))
         return predictedTrajectories
 
 class PointSetPredictionParameters(PredictionParameters):
--- a/python/utils.py	Thu Jun 27 00:25:51 2013 -0400
+++ b/python/utils.py	Thu Jun 27 01:35:47 2013 -0400
@@ -456,6 +456,7 @@
         self.predictionTimeHorizon = config.getfloat(self.sectionHeader, 'prediction-time-horizon')*self.videoFrameRate
         self.collisionDistance = config.getfloat(self.sectionHeader, 'collision-distance')
         self.crossingZones = config.getboolean(self.sectionHeader, 'crossing-zones')
+        self.predictionMethod = config.get(self.sectionHeader, 'prediction-method')
         self.nPredictedTrajectories = config.getint(self.sectionHeader, 'npredicted-trajectories')
         self.minAcceleration = config.getfloat(self.sectionHeader, 'min-acceleration')/self.videoFrameRate**2
         self.maxAcceleration = config.getfloat(self.sectionHeader, 'max-acceleration')/self.videoFrameRate**2
@@ -471,6 +472,7 @@
 
 def dropTables(connection, tableNames):
     'deletes the table with names in tableNames'
+    import sqlite3
     try:
         cursor = connection.cursor()
         for tableName in tableNames:
--- a/scripts/safety-analysis.py	Thu Jun 27 00:25:51 2013 -0400
+++ b/scripts/safety-analysis.py	Thu Jun 27 01:35:47 2013 -0400
@@ -9,27 +9,32 @@
 
 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')
-#parser.add_argument('--maxspeed', dest = 'maxSpeed', help = 'maximum speed when predicting future motion (km/h)', default = 50, type = int)
-#parser.add_argument('--time-horizon', dest = 'maxSpeed', help = 'maximum speed when predicting future motion (km/h)', default = 50, type = int)
+parser.add_argument('--prediction-method', dest = 'predictionMethod', help = 'prediction method (constant velocity, normal adaptation, point set prediction)', choices = ['cv', 'na', 'ps'])
 args = parser.parse_args()
 
-# TODO work on the way to indicate an interaction definition
-
-# if False: # test if there is a configuration file?
 params = utils.TrackingParameters()
 params.loadConfigFile(args.configFilename)
 
 # parameters for prediction methods
-constantVelocityPredictionParameters = prediction.ConstantPredictionParameters(params.maxPredictedSpeed)
+if args.predictionMethod:
+    predictionMethod = args.predictionMethod
+else:
+    predictionMethod = params.predictionMethod
 
-normalAdaptationPredictionParameters = prediction.NormalAdaptationPredictionParameters(params.maxPredictedSpeed, 
-                                                                                       params.nPredictedTrajectories, 
-                                                                                       params.maxAcceleration,
-                                                                                       params.maxSteering,
-                                                                                       params.useFeaturesForPrediction)
-
-featurePredictionParameters = prediction.PointSetPredictionParameters(params.maxPredictedSpeed, 
-                                                                      params.nPredictedTrajectories)
+if predictionMethod == 'cv':
+    predictionParameters = prediction.ConstantPredictionParameters(params.maxPredictedSpeed)
+elif predictionMethod == 'na':
+    predictionParameters = prediction.NormalAdaptationPredictionParameters(params.maxPredictedSpeed, 
+                                                                           params.nPredictedTrajectories, 
+                                                                           params.maxAcceleration,
+                                                                           params.maxSteering,
+                                                                           params.useFeaturesForPrediction)
+elif predictionMethod == 'ps':
+    predictionParameters = prediction.PointSetPredictionParameters(params.nPredictedTrajectories,
+                                                                   params.maxPredictedSpeed)
+else:
+    print('Prediction method {} is not valid. See help.'.format(predictionMethod))
+    sys.exit()
 
 evasiveActionPredictionParameters = prediction.EvasiveActionPredictionParameters(params.maxPredictedSpeed, 
                                                                                  params.nPredictedTrajectories, 
@@ -38,33 +43,24 @@
                                                                                  params.maxSteering,
                                                                                  params.useFeaturesForPrediction)
 
-featureEvasiveActionPredictionParameters = prediction.EvasiveActionPredictionParameters(params.maxPredictedSpeed, 
-                                                                                        params.nPredictedTrajectories, 
-                                                                                        params.minAcceleration,
-                                                                                        params.maxAcceleration,
-                                                                                        params.maxSteering,
-                                                                                        params.useFeaturesForPrediction)
-
-
-
 objects = storage.loadTrajectoriesFromSqlite(params.databaseFilename,'object')
-# features = storage.loadTrajectoriesFromSqlite('amherst-10.sqlite','feature') # needed if normal adaptation
+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:
+for inter in interactions[:1]:
     inter.computeIndicators()
-    inter.computeCrossingsCollisions(constantVelocityPredictionParameters, params.collisionDistance, params.predictionTimeHorizon, params.crossingZones)
+    inter.computeCrossingsCollisions(predictionParameters, params.collisionDistance, params.predictionTimeHorizon, params.crossingZones)
 
 storage.saveIndicators(params.databaseFilename, interactions)
 
-# if display:
-#     plt.figure()
-#     plt.axis('equal')
-#     for inter in interactions[:2]:
-#         for collisionPoints in inter.collisionPoints.values():
-#             for cp in collisionPoints:
-#                 plot([cp.x], [cp.y], 'x')
-
-# for the demo, output automatically a map
-# possibility to process longitudinal coords only
+if False:
+    plt.figure()
+    plt.axis('equal')
+    for inter in interactions:
+        for collisionPoints in inter.collisionPoints.values():
+            for cp in collisionPoints:
+                plt.plot([cp.x], [cp.y], 'x')
     
--- a/tracking.cfg	Thu Jun 27 00:25:51 2013 -0400
+++ b/tracking.cfg	Thu Jun 27 01:35:47 2013 -0400
@@ -71,6 +71,8 @@
 collision-distance = 1.8
 # option to compute crossing zones and predicted PET
 crossing-zones = false
+# prediction method: cv, na, ps
+prediction-method = na
 # number of predicted trajectories (use depends on prediction method)
 npredicted-trajectories = 10
 # minimum acceleration for input distribution (m/s2) (used only for evasive action distributions)
@@ -80,4 +82,4 @@
 # maximum steering for input distribution (rad/s)
 max-steering = 0.5
 # use feature positions and velocities for prediction
-use-features-prediction = false
\ No newline at end of file
+use-features-prediction = true