Mercurial Hosting > traffic-intelligence
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