42

私の入力は、トラッカーソフトウェアの画面上を移動するドットの2d(x、y)時系列です。カルマンフィルターを使って除去したいノイズがあります。誰かがカルマン2DフィルターのPythonコードを教えてもらえますか?scipyクックブックでは、1dの例しか見つかりませんでした: http : //www.scipy.org/Cookbook/KalmanFiltering OpenCVにカルマンフィルターの実装があることを確認しましたが、コード例を見つけることができませんでした。ありがとう!

4

2 に答える 2

66

ウィキペディアで与えられた方程式に基づいたカルマン フィルターの実装を次に示します。カルマン フィルターに関する私の理解は非常に初歩的なものであるため、このコードを改善する可能性が最も高い方法があることに注意してください。(たとえば、ここで議論されている数値不安定性の問題に悩まされています。私が理解しているように、これはモーション ノイズが非常に小さい場合にのみ数値安定性に影響しQます。実際の生活では、ノイズは通常小さくないため、幸いなことに (少なくとも私の実装では) 実際には、数値的な不安定性は現れません。)

以下の例でkalman_xyは、 は状態ベクトルが 4 つのタプルであると想定しています。位置の 2 つの数値と速度の 2 つの数値です。FおよびH行列は、この状態ベクトル用に特別に定義されています。がx4 タプル状態の場合、

new_x = F * x
position = H * x

kalman次に、一般化されたカルマン フィルターである を呼び出します。これは一般的であり、別の状態ベクトル (位置、速度、加速度を表す 6 タプルなど) を定義したい場合にも役立ちます。F適切なとを指定して運動方程式を定義するだけHです。

import numpy as np
import matplotlib.pyplot as plt

def kalman_xy(x, P, measurement, R,
              motion = np.matrix('0. 0. 0. 0.').T,
              Q = np.matrix(np.eye(4))):
    """
    Parameters:    
    x: initial state 4-tuple of location and velocity: (x0, x1, x0_dot, x1_dot)
    P: initial uncertainty convariance matrix
    measurement: observed position
    R: measurement noise 
    motion: external motion added to state vector x
    Q: motion noise (same shape as P)
    """
    return kalman(x, P, measurement, R, motion, Q,
                  F = np.matrix('''
                      1. 0. 1. 0.;
                      0. 1. 0. 1.;
                      0. 0. 1. 0.;
                      0. 0. 0. 1.
                      '''),
                  H = np.matrix('''
                      1. 0. 0. 0.;
                      0. 1. 0. 0.'''))

def kalman(x, P, measurement, R, motion, Q, F, H):
    '''
    Parameters:
    x: initial state
    P: initial uncertainty convariance matrix
    measurement: observed position (same shape as H*x)
    R: measurement noise (same shape as H)
    motion: external motion added to state vector x
    Q: motion noise (same shape as P)
    F: next state function: x_prime = F*x
    H: measurement function: position = H*x

    Return: the updated and predicted new values for (x, P)

    See also http://en.wikipedia.org/wiki/Kalman_filter

    This version of kalman can be applied to many different situations by
    appropriately defining F and H 
    '''
    # UPDATE x, P based on measurement m    
    # distance between measured and current position-belief
    y = np.matrix(measurement).T - H * x
    S = H * P * H.T + R  # residual convariance
    K = P * H.T * S.I    # Kalman gain
    x = x + K*y
    I = np.matrix(np.eye(F.shape[0])) # identity matrix
    P = (I - K*H)*P

    # PREDICT x, P based on motion
    x = F*x + motion
    P = F*P*F.T + Q

    return x, P

def demo_kalman_xy():
    x = np.matrix('0. 0. 0. 0.').T 
    P = np.matrix(np.eye(4))*1000 # initial uncertainty

    N = 20
    true_x = np.linspace(0.0, 10.0, N)
    true_y = true_x**2
    observed_x = true_x + 0.05*np.random.random(N)*true_x
    observed_y = true_y + 0.05*np.random.random(N)*true_y
    plt.plot(observed_x, observed_y, 'ro')
    result = []
    R = 0.01**2
    for meas in zip(observed_x, observed_y):
        x, P = kalman_xy(x, P, meas, R)
        result.append((x[:2]).tolist())
    kalman_x, kalman_y = zip(*result)
    plt.plot(kalman_x, kalman_y, 'g-')
    plt.show()

demo_kalman_xy()

ここに画像の説明を入力

赤い点はノイズの多い位置測定値を示し、緑の線はカルマン予測位置を示しています。

于 2012-12-16T17:58:49.010 に答える