প্রদত্ত অবস্থান পরিমাপ, वेग এবং ত্বরণ কীভাবে অনুমান করা যায়


11

আমি ভেবেছিলাম এটি সহজ, কিন্তু আমার নির্বোধ পদ্ধতির ফলে খুব গোলমাল হয়েছিল। T_angle.txt নামের একটি ফাইলটিতে আমার এই নমুনার সময় এবং অবস্থান রয়েছে:

0.768 -166.099892
0.837 -165.994148
0.898 -165.670052
0.958 -165.138245
1.025 -164.381218
1.084 -163.405838
1.144 -162.232704
1.213 -160.824051
1.268 -159.224854
1.337 -157.383270
1.398 -155.357666
1.458 -153.082809
1.524 -150.589943
1.584 -147.923012
1.644 -144.996872
1.713 -141.904221
1.768 -138.544807
1.837 -135.025749
1.896 -131.233063
1.957 -127.222366
2.024 -123.062325
2.084 -118.618355
2.144 -114.031906
2.212 -109.155006
2.271 -104.059753
2.332 -98.832321
2.399 -93.303795
2.459 -87.649956
2.520 -81.688499
2.588 -75.608597
2.643 -69.308281
2.706 -63.008308
2.774 -56.808586
2.833 -50.508270
2.894 -44.308548
2.962 -38.008575
3.021 -31.808510
3.082 -25.508537
3.151 -19.208565
3.210 -13.008499
3.269 -6.708527
3.337 -0.508461
3.397 5.791168
3.457 12.091141
3.525 18.291206
3.584 24.591179
3.645 30.791245
3.713 37.091217
3.768 43.291283
3.836 49.591255
3.896 55.891228
3.957 62.091293
4.026 68.391266
4.085 74.591331
4.146 80.891304
4.213 87.082100
4.268 92.961502
4.337 98.719368
4.397 104.172363
4.458 109.496956
4.518 114.523888
4.586 119.415550
4.647 124.088860
4.707 128.474464
4.775 132.714500
4.834 136.674385
4.894 140.481148
4.962 144.014626
5.017 147.388458
5.086 150.543938
5.146 153.436089
5.207 156.158638
5.276 158.624725
5.335 160.914001
5.394 162.984924
5.463 164.809685
5.519 166.447678

এবং বেগ এবং অ্যাক্সিলারশান অনুমান করতে চান। আমি জানি যে উচ্চারণটি ধ্রুবক, এই ক্ষেত্রে গতিবেগটি প্রায় 100 ডিগ্রি / সেকেন্ড না হওয়া পর্যন্ত প্রায় 55 ডিগ্রি / সেকেন্ড ^ 2, তারপরে এটিসি শূন্য এবং বেগের ধ্রুবক। শেষে অ্যাক্সিলারেশন -5 ডিগ্রি / সেকেন্ড। 2 হয়। এখানে সায়্লাব কোড যা বিশেষভাবে ত্বরণের খুব শোরগোল এবং অব্যবহৃত অনুমান দেয়।

clf()
clear
M=fscanfMat('t_angle.txt');
t=M(:,1);
len=length(t);
x=M(:,2);
dt=diff(t);
dx=diff(x);
v=dx./dt;
dv=diff(v);
a=dv./dt(1:len-2);
subplot(311), title("position"),
plot(t,x,'b');
subplot(312), title("velocity"),
plot(t(1:len-1),v,'g');
subplot(313), title("acceleration"),
plot(t(1:len-2),a,'r');

আমি পরিবর্তে কলম্যান ফিল্টার ব্যবহার করার কথা ভাবছিলাম, আরও ভাল অনুমান পেতে। এটা কি এখানে উপযুক্ত? কীভাবে ফাইলার সমীকরণ তৈরি করতে হয় তা জানেন না, কলম্যান ফিল্টারগুলির সাথে খুব অভিজ্ঞ না। আমি মনে করি রাষ্ট্র ভেক্টরটি বেগ এবং অ্যাক্সিলারেশন এবং ইন-সিগন্যাল অবস্থান। বা কেএফ এর চেয়ে সহজ পদ্ধতি আছে যা কার্যকর ফলাফল দেয়।

সমস্ত পরামর্শ স্বাগত! এখানে চিত্র বর্ণনা লিখুন


1
এটি একটি কলম্যান ফিল্টারের উপযুক্ত অ্যাপ্লিকেশন। কালমান ফিল্টার উপর Wikipedia নিবন্ধটি একটি উদাহরণ খুব আপনার মত হয়েছে। এটি কেবল অবস্থান এবং গতি সম্পর্কে অনুমান করে, তবে আপনি যদি সেই উদাহরণটি বুঝতে পারেন তবে এটির ত্বরণে প্রসারিত করাও সোজা।
জেসন আর

1
স্কিপিতে এটি দরকারী হতে পারে < ডকস.সিকিপি.আর.ডোক / স্কিপি-0.16.1/references/generated/… >
মাইক

উত্তর:


12

একটি উপায় হ'ল সমস্যাটিকে ন্যূনতম-স্কোয়ার স্মুথ হিসাবে নিক্ষেপ করা। স্থানীয়ভাবে একটি চলন্ত উইন্ডোতে বহুবর্ষের সাথে ফিট করার ধারণাটি রয়েছে, তারপরে বহুবর্ষের ডেরাইভেটিভকে মূল্যায়ন করুন। সাভিৎস্কি-গোলে ফিল্টারিংয়ের এই উত্তরের কিছুটা তাত্ত্বিক পটভূমি রয়েছে এটি কীভাবে নন-ইউনিফর্ম নমুনার জন্য কাজ করে।

এই ক্ষেত্রে, কৌশলটির সুবিধাগুলি / সীমাবদ্ধতার বিষয়ে কোড সম্ভবত আরও আলোকিত। নিম্নলিখিত নকল স্ক্রিপ্টটি দুটি পরামিতিগুলির উপর ভিত্তি করে প্রদত্ত অবস্থান সংকেতের বেগ এবং ত্বরণ গণনা করবে: 1) স্মুথিং উইন্ডোর আকার এবং 2) স্থানীয় বহুবর্ষ সমীকরণের ক্রম।

# Example Usage:
# python sg.py position.dat 7 2

import math
import sys

import numpy as np
import numpy.linalg
import pylab as py

def sg_filter(x, m, k=0):
    """
    x = Vector of sample times
    m = Order of the smoothing polynomial
    k = Which derivative
    """
    mid = len(x) / 2        
    a = x - x[mid]
    expa = lambda x: map(lambda i: i**x, a)    
    A = np.r_[map(expa, range(0,m+1))].transpose()
    Ai = np.linalg.pinv(A)

    return Ai[k]

def smooth(x, y, size=5, order=2, deriv=0):

    if deriv > order:
        raise Exception, "deriv must be <= order"

    n = len(x)
    m = size

    result = np.zeros(n)

    for i in xrange(m, n-m):
        start, end = i - m, i + m + 1
        f = sg_filter(x[start:end], order, deriv)
        result[i] = np.dot(f, y[start:end])

    if deriv > 1:
        result *= math.factorial(deriv)

    return result

def plot(t, plots):
    n = len(plots)

    for i in range(0,n):
        label, data = plots[i]

        plt = py.subplot(n, 1, i+1)
        plt.tick_params(labelsize=8)
        py.grid()
        py.xlim([t[0], t[-1]])
        py.ylabel(label)

        py.plot(t, data, 'k-')

    py.xlabel("Time")

def create_figure(size, order):
    fig = py.figure(figsize=(8,6))
    nth = 'th'
    if order < 4:
        nth = ['st','nd','rd','th'][order-1]

    title = "%s point smoothing" % size
    title += ", %d%s degree polynomial" % (order, nth)

    fig.text(.5, .92, title,
             horizontalalignment='center')

def load(name):
    f = open(name)    
    dat = [map(float, x.split(' ')) for x in f]
    f.close()

    xs = [x[0] for x in dat]
    ys = [x[1] for x in dat]

    return np.array(xs), np.array(ys)

def plot_results(data, size, order):
    t, pos = load(data)
    params = (t, pos, size, order)

    plots = [
        ["Position",     pos],
        ["Velocity",     smooth(*params, deriv=1)],
        ["Acceleration", smooth(*params, deriv=2)]
    ]

    create_figure(size, order)
    plot(t, plots)

if __name__ == '__main__':
    data = sys.argv[1]
    size = int(sys.argv[2])
    order = int(sys.argv[3])

    plot_results(data, size, order)
    py.show()

বিভিন্ন পরামিতিগুলির জন্য এখানে কয়েকটি উদাহরণ প্লট (আপনি সরবরাহ করেছেন ডেটা ব্যবহার করে)।

3 পি স্মুথিং, ২ য় ডিগ্রি বহুপদী 7pt স্মুথিং, ২ য় ডিগ্রি বহুপদী ১১ তম স্মুথিং, ২ য় ডিগ্রি বহুপদী ১১ তম স্মুথিং, ৪ র্থ ডিগ্রি বহুপদী ১১ তম স্মুথিং, দশম ডিগ্রি বহুপদী

উইন্ডোর আকার বাড়ার সাথে সাথে কীভাবে ত্বরণের অংশবিশেষ ধ্রুবক প্রকৃতি কম স্পষ্ট হয়ে যায় তা লক্ষ্য করুন, তবে উচ্চতর-অর্ডার বহুভুজ ব্যবহার করে কিছুটা হলেও পুনরুদ্ধার করা যায়। অবশ্যই, অন্যান্য বিকল্পগুলির মধ্যে দুটি বার প্রথম ডেরাইভেটিভ ফিল্টার প্রয়োগ করা সম্ভব (সম্ভবত বিভিন্ন আদেশের)। আরেকটি বিষয় যা স্পষ্ট হওয়া উচিত তা হ'ল এই ধরণের সাভিটস্কি-গোলে ফিল্টারিং, যেহেতু এটি উইন্ডোর মিডপয়েন্ট ব্যবহার করে, উইন্ডোর আকার বাড়ার সাথে সাথে স্মুথড ডেটার প্রান্তটি আরও বেশি করে কেটে যায়। এই সমস্যাটি সমাধান করার বিভিন্ন উপায় রয়েছে তবে নীচের কাগজে আরও ভাল একটি বর্ণনা করা হয়েছে:

পি.এ. গৌরি, সাধারণভাবে কম-স্কোয়ারগুলি স্মুথ এবং কনভলিউশন (স্যাভিটস্কি – গোলে) পদ্ধতি দ্বারা পার্থক্য, অ্যানাল। কেম। 62 (1990) 570–573। ( গুগল )

একই লেখকের অন্য একটি কাগজ উদাহরণ কোডে সোজাসুজি পদ্ধতির চেয়ে নন-ইউনিফর্ম ডেটা মসৃণ করার আরও কার্যকর উপায় বর্ণনা করে:

পি.এ. গৌরি, সাধারণভাবে কম-স্কোয়ারগুলি মসৃণকরণ এবং সমঝোতার পদ্ধতি অনুসারে অযৌক্তিকভাবে ব্যবধানযুক্ত ডেটার পার্থক্য Anal কেম। 63 (1991) 534–536। ( গুগল )

পরিশেষে, এই অঞ্চলে আরও একটি মূল্যমানের পড়ার মূল্য পার্সসন এবং স্ট্র্যাংয়ের রয়েছে :

পিও পারসন, জি স্ট্র্যাং, স্মাথিং বাই স্যাভিটস্কি – গোলে এবং লেজেন্ড্রে ফিল্টারস, কম। বন্দীরা। অর্থ 13 (2003) 301–316। ( পিডিএফ লিঙ্ক )

এটিতে অনেক বেশি পটভূমি তত্ত্ব রয়েছে এবং উইন্ডোর আকার চয়ন করার জন্য ত্রুটি বিশ্লেষণে মনোনিবেশ করা হয়েছে।


চমৎকার বিশ্লেষণ! +1
পিটার কে

আমি এই উত্তর সম্পূর্ণ প্রশংসা করি!
lgwest

@ ইকুয়েস্ট নিশ্চিত বিষয়, আশা করি এটি সাহায্য করবে!
ডেটাজিস্ট

যদি ডেটা সমানভাবে ব্যবধানে থাকে, যেমন dt = 0.1, তবে এর সাথে সম্পর্কিত ফিল্টারের কাজগুলি কী।
এলজিওয়েস্ট

তারপরে ফিল্টার সহগগুলি স্থির থাকবে, সুতরাং আপনি কেবল একবার স্যাজ_ফিল্টার কল করতে পারেন (এবং অ্যাকসেলের জন্য ডেরিভেটিভ কে - 2 এর ফ্যাক্টরিয়াল দ্বারা ফিল্টারটি গুণান)। এই উত্তরের প্রথম অংশটি দেখুন ।
ডেটাজিস্ট

2

আপনার সম্ভবত এই প্রশ্ন এবং উত্তর হিসাবে ঠিক একই কাজ করা উচিত ,।

সম্পাদনা: দ্বি-মাত্রার রেফারেন্স সরানো; কোডটি কেবলমাত্র একটি ব্যবহার করে (অন্যটি সময় পরিবর্তনশীল) able

তবে আপনার সময়ের নমুনাগুলি সমানভাবে ব্যবধানযুক্ত বলে মনে হচ্ছে না। এটি একটি ইস্যু আরও।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.