diff python/extrapolation.py @ 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
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)