ó
èÏOc           @   sš   d  Z  d d l Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d	 e f d
 „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ	 d S(   sJ   
easyleed.kalman
----------------

Kalman filters for tracking the spots

iÿÿÿÿNt   AbstractKalmanFilterc           B   sV   e  Z d  Z d „  Z e j d ƒ d „ Z d	 d „ Z d „  Z	 d „  Z
 d	 d „ Z RS(
   sà    Abstract implementation of a Kalman filter.
    
    Matrices and Vectors can be given in any input format np.matrix() understands.
    Vectors are internally transposed and should therefore be given as column vectors.
    c         C   sw   t  t |  ƒ j ƒ  t j | ƒ j |  _ t j | ƒ |  _ t j | ƒ |  _ t j t j	 t
 |  j j ƒ ƒ ƒ |  _ d S(   s‰    Initialize Kalman filter.

        x: start state vector
        P: start state covariance matrix
        H: measurement matrix
        N(   t   superR    t   __init__t   npt   asmatrixt   Tt   xt   Pt   Ht   identityt   maxt   shapet   _1(   t   selfR   R   R   (    (    sM   /home/salopaasi/Documents/Moo/easyleed_andy/easyleed/trunk/easyleed/kalman.pyR      s
    i   c         C   sM   t  j | ƒ } t  j | ƒ } | |  j |  _ | |  j | j | |  _ d S(   sf    Predict next state.

        F: state transition matrix
        Q: process covariance matrix
        N(   R   R   R   R   R   (   R   t   Ft   Q(    (    sM   /home/salopaasi/Documents/Moo/easyleed_andy/easyleed/trunk/easyleed/kalman.pyt   predict!   s    c         C   sD   | d k	 r( |  j |  j |  j j | S|  j |  j |  j j Sd S(   s;    Returns the covariance matrix of a predicted measurement. N(   t   NoneR   R   R   (   R   t   R(    (    sM   /home/salopaasi/Documents/Moo/easyleed_andy/easyleed/trunk/easyleed/kalman.pyt   predict_measurement_covariance-   s    c         C   s   |  j  |  j S(   s$    Returns the predicted measurement. (   R   R   (   R   (    (    sM   /home/salopaasi/Documents/Moo/easyleed_andy/easyleed/trunk/easyleed/kalman.pyt   predict_measurement4   s    c         C   s„   t  j | ƒ j } t  j | ƒ } |  j |  j j |  j | ƒ j } |  j | | |  j ƒ  |  _ |  j	 | |  j |  j |  _ d S(   sh    Update state estimate.

        z: measurement vector
        R: measurement covariance matrix
        N(
   R   R   R   R   R   R   t   IR   R   R   (   R   t   zR   t   K(    (    sM   /home/salopaasi/Documents/Moo/easyleed_andy/easyleed/trunk/easyleed/kalman.pyt   update8   s
    #c         C   ss   t  j | ƒ j } | d k r3 t  j d d g ƒ n t  j | ƒ } |  j ƒ  } | | } | j |  j | ƒ j | S(   ss    Returns the squared Mahalanobis distance of the given measurement.
        
        z: measurement vector
        i    N(	   R   R   R   R   t   diagt   asarrayR   R   R   (   R   R   R   t   z_predictedt   residual(    (    sM   /home/salopaasi/Documents/Moo/easyleed_andy/easyleed/trunk/easyleed/kalman.pyt   measurement_distanceF   s
    0
(   i   i   N(   t   __name__t
   __module__t   __doc__R   R   t   zerosR   R   R   R   R   R   (    (    (    sM   /home/salopaasi/Documents/Moo/easyleed_andy/easyleed/trunk/easyleed/kalman.pyR       s   			t   AbstractPVKalmanFilterc           B   s/   e  Z d  Z d d d „ Z d „  Z d „  Z RS(   sN    Kalman filter for 2d-tracking using position and velocity as state variables.i    c   	      C   s_   | |  _  | | | | g } d d d d g d d d d g g } t t |  ƒ j | | | ƒ d  S(   Ni   i    (   t   old_timeR   R"   R   (	   R   t   x_int   y_inR   t   timet   vx_int   vy_inR   R   (    (    sM   /home/salopaasi/Documents/Moo/easyleed_andy/easyleed/trunk/easyleed/kalman.pyR   T   s    	$c         C   s$   t  |  j d ƒ t  |  j d ƒ f S(   Ni    i   (   t   floatR   (   R   (    (    sM   /home/salopaasi/Documents/Moo/easyleed_andy/easyleed/trunk/easyleed/kalman.pyt   get_positionZ   s    c         C   s,   t  |  j d ƒ d t  |  j d ƒ d f S(   Ni    g      à?i   (   i    i    (   i   i   (   R)   R   (   R   (    (    sM   /home/salopaasi/Documents/Moo/easyleed_andy/easyleed/trunk/easyleed/kalman.pyt   get_position_err]   s    (   R   R   R    R   R*   R+   (    (    (    sM   /home/salopaasi/Documents/Moo/easyleed_andy/easyleed/trunk/easyleed/kalman.pyR"   R   s   	t   PVKalmanFilter0c           B   s   e  Z d  „  Z RS(   c         O   sx   | |  j  } d d | d g d d d | g d d d d g d d d d g g } t t |  ƒ j | | | Ž | |  _  d  S(   Ni   i    (   R#   R   R,   R   (   R   R&   t   argst   kwargst   dtR   (    (    sM   /home/salopaasi/Documents/Moo/easyleed_andy/easyleed/trunk/easyleed/kalman.pyR   a   s    B(   R   R   R   (    (    (    sM   /home/salopaasi/Documents/Moo/easyleed_andy/easyleed/trunk/easyleed/kalman.pyR,   `   s   t   PVKalmanFilter1c           B   s   e  Z d  „  Z RS(   c   	      O   s©   | |  j  } d |  j  } d | | } | d | | d } d d | d g d d d | g d d | d g d d d | g g } t t |  ƒ j | | | Ž | |  _  d  S(   Ng      ø¿i   g      à?i   i    (   R#   R   R0   R   (	   R   R&   R-   R.   R/   t   at   v_upt   pos_upR   (    (    sM   /home/salopaasi/Documents/Moo/easyleed_andy/easyleed/trunk/easyleed/kalman.pyR   h   s    B(   R   R   R   (    (    (    sM   /home/salopaasi/Documents/Moo/easyleed_andy/easyleed/trunk/easyleed/kalman.pyR0   g   s   t   PVKalmanFilter2c           B   s   e  Z d  „  Z RS(   c   
      O   sÚ   | |  j  } d |  j  } d |  j  d } d | | | | d } | d | | d d d | | d } d d	 | d	 g d	 d d	 | g d	 d	 | d	 g d	 d	 d	 | g g }	 t t |  ƒ j |	 | | Ž | |  _  d  S(
   Ng      ø¿g      þ?i   i   g      à?g      ð?g      @i   i    (   R#   R   R4   R   (
   R   R&   R-   R.   R/   R1   t   a_dotR2   R3   R   (    (    sM   /home/salopaasi/Documents/Moo/easyleed_andy/easyleed/trunk/easyleed/kalman.pyR   r   s    *B(   R   R   R   (    (    (    sM   /home/salopaasi/Documents/Moo/easyleed_andy/easyleed/trunk/easyleed/kalman.pyR4   q   s   t   PVKalmanFilter3c           B   s   e  Z d  „  Z RS(   c         O   s  | |  j  } d |  j  } d |  j  d } d |  j  d } d | | | | d | | d } | d | | d d d	 | | d d d
 | | d }	 d d |	 d g d d d |	 g d d | d g d d d | g g }
 t t |  ƒ j |
 | | Ž | |  _  d  S(   Ng      ø¿g      þ?i   g     €Ài   i   g      à?g      ð?g      @g      @i   i    (   R#   R   R6   R   (   R   R&   R-   R.   R/   R1   R5   t   a_ddotR2   R3   R   (    (    sM   /home/salopaasi/Documents/Moo/easyleed_andy/easyleed/trunk/easyleed/kalman.pyR   }   s    &>B(   R   R   R   (    (    (    sM   /home/salopaasi/Documents/Moo/easyleed_andy/easyleed/trunk/easyleed/kalman.pyR6   |   s   (
   R    t   numpyR   t   objectR    R"   R,   R0   R4   R6   (    (    (    sM   /home/salopaasi/Documents/Moo/easyleed_andy/easyleed/trunk/easyleed/kalman.pyt   <module>   s   G
