Examples
These examples demonstrate how to use the Kalman operator.
This following example uses the Kalman operator to track vehicle movement:
// Tracking an object movement in 2D plain with constant velocity
// An object is moving in 2D plane with constant velocity (1.5, 1.0).
// We observe the noisy object position (x, y) as position vector [x,y]
// We estimate the state vector (x,y, dx, dy) made of estimated "real" position (x,y) and estimated
// velocity (dx, dy). We also predict the next position of the moving object.
use com.teracloud.streams.timeseries.modeling::Kalman;
composite KalmanMain {
graph
stream<list<float64> movingObjectInitialPosition> kalmanSrc = Beacon() {
param
iterations: 50u;
output
kalmanSrc: movingObjectInitialPosition = [10.0,10.0]; //this is the initial position
}
// simulate a changing position (x,y) with a fixed velocity of (dx=1.5, dy=0.5)
stream<list<float64> observedPosition> objectObservations = Functor(kalmanSrc) {
logic
state: {
mutable float64 dx = 1.5;
mutable float64 dy = 0.5;
float64 observationNoise = 0.3f; // our estimate of the noise covariance when measuring the position
mutable list<float64> movingPosition;
}
onTuple kalmanSrc: {
movingPosition = movingObjectInitialPosition;
movingPosition[0] += dx; // move object at fixed velocity
movingPosition[1] += dy; // move object at fixed velocity
// add white noise to simulate noisy observations
movingPosition[0] += sqrt(observationNoise)**(random() - 0.5);
movingPosition[1] += sqrt(observationNoise)**(random() - 0.5);
dx += 1.5; // increment to next position
dy += 0.5; // increment to next position
}
output
objectObservations: observedPosition = movingPosition;
}
// Now send observed position to Kalman and get estimated real position and velocity, and also the
// predicted next position
stream<list<float64> observedPosition,list<float64> estimatedCurrentState, list<float64> predictedNextPosition> KalmanTracking
= Kalman(objectObservations) {
param
inputTimeSeries: observedPosition;
stateVectorDimension: 4u;
initialState: [ 10.0, 10.0, 1.0, 0.0]; // initial state
observationNoiseCovariance: 0.3;
stateNoiseCovariance: 0.3;
//state to state transition
stateTransitionMatrix: [[1.0,0.0,1.0,0.0],[0.0,1.0,0.0,1.0],[0.0,0.0,1.0,0.0],[0.0,0.0,0.0,1.0]];
observationMatrix: [[1.0,0.0,0.0,0.0],[0.0,1.0,0.0,0.0]]; // observation to state transition
output
KalmanTracking:
estimatedCurrentState = predictedState(),
predictedNextPosition = predictedTimeSeries();
}
() as SnkKey = FileSink(KalmanTracking) {
param
file: "KalmanTracking.dat";
format: csv;
}
}