Mercurial Hosting > traffic-intelligence
changeset 256:dc1faa7287bd
added the normal adaptation class
author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
---|---|
date | Tue, 24 Jul 2012 01:37:21 -0400 |
parents | 13ec22bec5d4 |
children | 9281878ff19e |
files | python/extrapolation.py python/moving.py python/run-tests.sh python/tests/extrapolation.txt python/tests/storage.txt |
diffstat | 5 files changed, 52 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- a/python/extrapolation.py Mon Jul 23 23:07:19 2012 -0400 +++ b/python/extrapolation.py Tue Jul 24 01:37:21 2012 -0400 @@ -9,8 +9,21 @@ if the predicted position has not been already computed, compute it it should also have a probability''' + def predictPosition(self, nTimeSteps): - return None + if nTimeSteps > 0 and not nTimeSteps in self.predictedPositions.keys(): + self.predictPosition(nTimeSteps-1) + self.predictedPositions[nTimeSteps], self.predictedSpeedOrientations[nTimeSteps] = moving.predictPosition(self.predictedPositions[nTimeSteps-1], self.predictedSpeedOrientations[nTimeSteps-1], self.getControl(), self.maxSpeed) + return self.predictedPositions[nTimeSteps] + + def getPredictedTrajectory(self): + return moving.Trajectory.fromPointList(self.predictedPositions.values()) + + def getPredictedSpeeds(self): + return [so.norm for so in self.predictedSpeedOrientations.values()] + + def draw(self, options = '', withOrigin = False, **kwargs): + self.getPredictedTrajectory().draw(options, withOrigin, **kwargs) class ExtrapolatedTrajectoryConstant(ExtrapolatedTrajectory): '''Extrapolated trajectory at constant speed or acceleration @@ -24,27 +37,25 @@ self.predictedPositions = {0: initialPosition} self.predictedSpeedOrientations = {0: moving.NormAngle.fromPoint(initialVelocity)} - def predictPosition(self, nTimeSteps): - if nTimeSteps > 0 and not nTimeSteps in self.predictedPositions.keys(): - self.predictPosition(nTimeSteps-1) - self.predictedPositions[nTimeSteps], self.predictedSpeedOrientations[nTimeSteps] = moving.predictPosition(self.predictedPositions[nTimeSteps-1], self.predictedSpeedOrientations[nTimeSteps-1], self.control, self.maxSpeed) - return self.predictedPositions[nTimeSteps] + def getControl(self): + return self.control -class ExtrapolatedTrajectoryAdaptation(ExtrapolatedTrajectoryConstant): +class ExtrapolatedTrajectoryNormalAdaptation(ExtrapolatedTrajectory): '''Random small adaptation of vehicle control ''' - def __init__(self, initialPosition, initialVelocity, accelerationBounds, steeringBounds, probability = 1, maxSpeed = None): - self.accelerationBounds = accelerationBounds - self.steeringBounds = steeringBounds + def __init__(self, initialPosition, initialVelocity, accelerationDistribution, steeringDistribution, probability = 1, maxSpeed = None): + '''Constructor + accelerationDistribution and steeringDistribution are distributions + that return random numbers drawn from them''' + self.accelerationDistribution = accelerationDistribution + self.steeringDistribution = steeringDistribution self.maxSpeed = maxSpeed self.probability = probability self.predictedPositions = {0: initialPosition} self.predictedSpeedOrientations = {0: moving.NormAngle.fromPoint(initialVelocity)} - def predictPosition(self, nTimeSteps): - # draw acceleration and steering - # TODO should the predictPosition be in the base class ?? - self.control = moving.NormAngle(0,0) - return ExtrapolatedTrajectoryConstant.predictPosition(self, nTimeSteps) + def getControl(self): + return moving.NormAngle(self.accelerationDistribution(),self.steeringDistribution()) + # Default values: to remove because we cannot tweak that from a script where the value may be different FPS= 25 # No. of frame per second (FPS)
--- a/python/moving.py Mon Jul 23 23:07:19 2012 -0400 +++ b/python/moving.py Tue Jul 24 01:37:21 2012 -0400 @@ -332,6 +332,13 @@ return Trajectory([[float(n) for n in line1.split(' ')], [float(n) for n in line2.split(' ')]]) + @staticmethod + def fromPointList(points): + t = Trajectory() + for p in points: + t.addPosition(p) + return t + def __str__(self): return ' '.join([self.__getitem__(i).__str__() for i in xrange(self.length())])
--- a/python/run-tests.sh Mon Jul 23 23:07:19 2012 -0400 +++ b/python/run-tests.sh Tue Jul 24 01:37:21 2012 -0400 @@ -2,6 +2,7 @@ # for file in tests/*... basename python moving.py python storage.py +rm nonexistent python indicators.py python utils.py python extrapolation.py \ No newline at end of file
--- a/python/tests/extrapolation.txt Mon Jul 23 23:07:19 2012 -0400 +++ b/python/tests/extrapolation.txt Tue Jul 24 01:37:21 2012 -0400 @@ -6,3 +6,20 @@ (0.0...,4.0...) >>> et.predictPosition(1) # doctest:+ELLIPSIS (0.0...,1.0...) + +>>> et = extrapolation.ExtrapolatedTrajectoryConstant(moving.Point(0,0), moving.Point(1,0), moving.NormAngle(0.1,0), maxSpeed = 2) +>>> et.predictPosition(10) # doctest:+ELLIPSIS +(0.0...,15.5...) +>>> et.predictPosition(11) # doctest:+ELLIPSIS +(0.0...,17.5...) +>>> et.predictPosition(12) # doctest:+ELLIPSIS +(0.0...,19.5...) + +>>> import random +>>> acceleration = lambda: random.uniform(-0.5,0.5) +>>> steering = lambda: random.uniform(-0.1,0.1) +>>> et = extrapolation.ExtrapolatedTrajectoryNormalAdaptation(moving.Point(0,0),moving.Point(1,1), acceleration, steering, maxSpeed = 2) +>>> p = et.predictPosition(500) +>>> from numpy import max +>>> max(et.getPredictedSpeeds()) <= 2. +True