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
--- a/python/tests/storage.txt	Mon Jul 23 23:07:19 2012 -0400
+++ b/python/tests/storage.txt	Tue Jul 24 01:37:21 2012 -0400
@@ -5,4 +5,5 @@
 []
 >>> loadTrajectoriesFromSqlite("nonexistent", 'feature')
 DB Error: no such table: positions
+DB Error: no such table: velocities
 []