2012-12-16 36 views
22

में कलमैन 2 डी फ़िल्टर मेरा इनपुट ट्रैकर सॉफ़्टवेयर के लिए स्क्रीन पर चलने वाले डॉट की 2 डी (x, y) टाइम श्रृंखला है। इसमें कुछ शोर है जो मैं कलमान फ़िल्टर का उपयोग करना चाहता हूं। क्या कोई मुझे कलमैन 2 डी फ़िल्टर के लिए एक पायथन कोड के लिए इंगित कर सकता है? scipy cookbook में मुझे केवल 1 डी उदाहरण मिला: http://www.scipy.org/Cookbook/KalmanFiltering मैंने देखा कि ओपनसीवी में कलमान फ़िल्टर के लिए कार्यान्वयन है, लेकिन कोड उदाहरण नहीं मिल सका। धन्यवाद!पालमॉन

+1

मैं निश्चित रूप से इस विषय पर एक विशेषज्ञ नहीं हूं, लेकिन कक्षा में हम हमेशा प्रत्येक पंक्ति और कॉलम पर इसे लागू करने के साथ 2 डी स्पेस पर फ़िल्टर लागू करते हैं। क्या आपने कोशिश की? शायद यह आपके परिणामों को पहले से ही बेहतर करेगा। – erikbwork

+1

मुझे लगता है कि आपको 1 डी उदाहरण को सामान्यीकृत करना होगा यदि आप। चूंकि आपने कल्पना नहीं की है कि यह numpy का उपयोग करके अजगर में होना चाहिए (मैं बस यह अनुमान लगा रहा हूं) अन्यथा मैं आपको ओएसएस की तरह मैटलैब कोड http://www.mathworks.com/matlabcentral/fileexchange/14243-2d- लक्ष्य-ट्रैकिंग-उपयोग-काल्मन-फ़िल्टर जिसे scipy के लिए अपनाया जा सकता है। उसी लिंक में आपने स्रोत में एक और लिंक प्रदान किया है जो स्निपेट के लेखक द्वारा कल्लम फ़िल्टरिंग पर एकत्र किए गए सभी प्रकार के इंफोस को लाता है http://www.cs.unc.edu/~welch/kalman/ –

+1

यदि आप किसी और से पहले समाधान के साथ आते हैं, तो कृपया यहां अपने स्वयं के प्रश्न का उत्तर देना न भूलें। इसे एसओ पर एक अच्छा अभ्यास माना जाता है। –

उत्तर

38

यहां equations given on wikipedia के आधार पर कलमैन फ़िल्टर का मेरा कार्यान्वयन है। कृपया ध्यान रखें कि कलमान फिल्टर की मेरी समझ बहुत ही प्राथमिक है इसलिए इस कोड को बेहतर बनाने के सबसे अधिक संभावित तरीके हैं। (उदाहरण के लिए, यह here पर चर्चा की संख्यात्मक अस्थिरता समस्या से पीड़ित है। जैसा कि मैं इसे समझता हूं, यह Q, गति शोर, बहुत छोटा है, यह संख्यात्मक स्थिरता को प्रभावित करता है। वास्तविक जीवन में, शोर आमतौर पर छोटा नहीं होता है, सौभाग्य से (। स्थान के लिए 2 नंबर, और वेग के लिए 2 संख्या: व्यवहार में मेरी कार्यान्वयन के लिए कम से कम) में संख्यात्मक अस्थिरता अप

नीचे दिए गए उदाहरण में नहीं दिखा है), kalman_xy मानता राज्य वेक्टर एक 4 टपल है। F और H मैट्रिक्स विशेष रूप से इस राज्य वेक्टर के लिए परिभाषित किया गया है: अगर x एक 4 टपल राज्य,

new_x = F * x 
position = H * x 

यह तो kalman, जो सामान्यीकृत 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() 

enter image description here

लाल बिंदु शोर स्थिति माप दिखाने के लिए, हरे रंग की रेखा से पता चलता Kalman भविष्यवाणी पदों।

+0

धन्यवाद! मैंने आपके कोड को मेरा विलय कर दिया, और यह पूरी तरह से काम करता है। –

+0

'क्यू' और' आर' के लिए "अवैज्ञानिक" स्पष्टीकरण क्या होगा? मुझे लगता है कि "बड़ा क्यू, तेजी से xhat वर्तमान प्रवृत्ति का पालन करता है" और "छोटा आर, तेजी से xhat का मतलब बदल जाएगा" – Boern

+0

कम प्रक्रिया शोर 'क्यू' के लिए, भविष्यवाणी त्रुटि covariance' पी' कम है । 'क्यू' और 'आर' दोनों कलमैन लाभ 'के' को प्रभावित करते हैं।के बारे में सोचते हुए: \t आर = 0 के लिए: ज़ेड अधिक विश्वसनीय है, जबकि अनुमानित माप कम विश्वसनीय है → के = एच^(- 1) \t पी = 0: जेड पर भरोसा है, जबकि एचएक्स अधिक विश्वसनीय है → कश्मीर = 0 – user972851