মসৃণ জিপিএস ডেটা


145

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

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


গতি এবং opeালের মতো সম্পর্কিত (ডেরাইভেটিভ) মানগুলি গণনা করার চেষ্টা করার সময় আমি "জিপিএস শব্দ" এর খারাপ প্রভাবগুলি অনুভব করি, যা উচ্চতর নমুনা হার ট্র্যাকলগগুলির জন্য খুব বিচ্ছিন্ন ((যেহেতু সময়ের পূর্ণসংখ্যার [এক সেকেন্ড] রেজোলিউশন রয়েছে)।
হেলটনবাইকার

4
(এছাড়াও, যদি আপনি প্রধান রাস্তাগুলি চলাচল করে থাকেন তবে আপনি "রাস্তায় স্ন্যাপ" আলগোরিদিম ব্যবহার করতে পারেন তবে আপনার যদি একটি ভাল [সঠিক, সুনির্দিষ্ট] রোডম্যাপ ডেটাসেট থাকে Just কেবল একটি চিন্তাভাবনা)
হেলটনবাইকার

আমি নির্ভুলতার জন্যও এই সমস্যার মুখোমুখি হয়েছি।
ভিরুম্যাক্স

উত্তর:


80

এখানে একটি সাধারণ কালমন ফিল্টার যা ঠিক এই পরিস্থিতির জন্য ব্যবহার করা যেতে পারে। এটি অ্যান্ড্রয়েড ডিভাইসে করা কিছু কাজ থেকে এসেছিল।

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

কোডটি উন্নত হতে পারে, কারণ এটি ধরে নিয়েছে যে বর্তমান অবস্থানের সর্বোত্তম অনুমানটি হ'ল সর্বশেষ পরিচিত অবস্থান, এবং যদি কেউ চলমান হয় তবে আরও ভাল অনুমানের জন্য অ্যান্ড্রয়েডের সেন্সর ব্যবহার করা সম্ভব হবে possible কোডটিতে একটি একক ফ্রি প্যারামিটার কি রয়েছে, যা প্রতি সেকেন্ডে মিটারে প্রকাশ করা হয়, যা কোনও নতুন অবস্থানের অনুমানের অভাবে নির্ভুলতা কত দ্রুত কমে যায় তা বর্ণনা করে। উচ্চতর কিউ প্যারামিটারের অর্থ হ'ল যথার্থতা দ্রুত ক্ষয় হয়। কলম্যান ফিল্টারগুলি সাধারণত যখন আরও ভালভাবে প্রত্যাশার চেয়ে দ্রুত গতিতে থাকে তখন আরও ভাল কাজ করে, তাই অ্যান্ড্রয়েড ফোন নিয়ে ঘুরে দেখার জন্য আমি দেখতে পাই যে প্রতি সেকেন্ডে কিউ = 3 মিটার ভাল কাজ করে, যদিও আমি সাধারণত তার চেয়ে ধীর গতিতে হাঁটা করি। তবে যদি দ্রুত গাড়ীটিতে ভ্রমণ করা হয় তবে আরও বড় সংখ্যক অবশ্যই ব্যবহার করা উচিত।

public class KalmanLatLong {
    private final float MinAccuracy = 1;

    private float Q_metres_per_second;    
    private long TimeStamp_milliseconds;
    private double lat;
    private double lng;
    private float variance; // P matrix.  Negative means object uninitialised.  NB: units irrelevant, as long as same units used throughout

    public KalmanLatLong(float Q_metres_per_second) { this.Q_metres_per_second = Q_metres_per_second; variance = -1; }

    public long get_TimeStamp() { return TimeStamp_milliseconds; }
    public double get_lat() { return lat; }
    public double get_lng() { return lng; }
    public float get_accuracy() { return (float)Math.sqrt(variance); }

    public void SetState(double lat, double lng, float accuracy, long TimeStamp_milliseconds) {
        this.lat=lat; this.lng=lng; variance = accuracy * accuracy; this.TimeStamp_milliseconds=TimeStamp_milliseconds;
    }

    /// <summary>
    /// Kalman filter processing for lattitude and longitude
    /// </summary>
    /// <param name="lat_measurement_degrees">new measurement of lattidude</param>
    /// <param name="lng_measurement">new measurement of longitude</param>
    /// <param name="accuracy">measurement of 1 standard deviation error in metres</param>
    /// <param name="TimeStamp_milliseconds">time of measurement</param>
    /// <returns>new state</returns>
    public void Process(double lat_measurement, double lng_measurement, float accuracy, long TimeStamp_milliseconds) {
        if (accuracy < MinAccuracy) accuracy = MinAccuracy;
        if (variance < 0) {
            // if variance < 0, object is unitialised, so initialise with current values
            this.TimeStamp_milliseconds = TimeStamp_milliseconds;
            lat=lat_measurement; lng = lng_measurement; variance = accuracy*accuracy; 
        } else {
            // else apply Kalman filter methodology

            long TimeInc_milliseconds = TimeStamp_milliseconds - this.TimeStamp_milliseconds;
            if (TimeInc_milliseconds > 0) {
                // time has moved on, so the uncertainty in the current position increases
                variance += TimeInc_milliseconds * Q_metres_per_second * Q_metres_per_second / 1000;
                this.TimeStamp_milliseconds = TimeStamp_milliseconds;
                // TO DO: USE VELOCITY INFORMATION HERE TO GET A BETTER ESTIMATE OF CURRENT POSITION
            }

            // Kalman gain matrix K = Covarariance * Inverse(Covariance + MeasurementVariance)
            // NB: because K is dimensionless, it doesn't matter that variance has different units to lat and lng
            float K = variance / (variance + accuracy * accuracy);
            // apply K
            lat += K * (lat_measurement - lat);
            lng += K * (lng_measurement - lng);
            // new Covarariance  matrix is (IdentityMatrix - K) * Covarariance 
            variance = (1 - K) * variance;
        }
    }
}

1
ভেরিয়েন্সের গণনাটি হওয়া উচিত নয়: বৈকল্পিক + = টাইমসিঙ্ক_মিলিসেকেন্ডস * টাইমসিঙ্ক_মিলিসেকেন্ডস * কিউমেট্রেস_পার_সেকেন্ড * কিউমেট্রেস_পার_সেকেন্ড / 1000000
হোরাসিও

4
@ হোরাসিয়ো, আমি জানি আপনি কেন এমন মনে করেন, তবে না! গাণিতিকভাবে, এখানে অনিশ্চয়তা একটি উইনার প্রক্রিয়া অনুসারে তৈরি করা হয়েছে (দেখুন এন.ইউইউইকিপিডিয়া.র.উইকি / উইনার_প্রসেস ) এবং একটি উইনার প্রক্রিয়া সহ সময়ের সাথে রৈখিকভাবে প্রসারিত হয়। ভেরিয়েবলটি সেই উইকিপিডিয়া নিবন্ধের "সম্পর্কিত প্রক্রিয়াগুলি" বিভাগের Q_metres_per_secondভেরিয়েবলের sigmaসাথে মিলে যায়। Q_metres_per_secondএটি একটি আদর্শ বিচ্যুতি এবং এটি মিটারে পরিমাপ করা হয়, সুতরাং মিটার এবং মিটার / সেকেন্ড নয় এর ইউনিট। এটি 1 সেকেন্ড অতিক্রান্ত হওয়ার পরে বিতরণের মানক বিচ্যুতির সাথে মিলে যায়।
Stochastically

3
আমি এই পদ্ধতির এবং কোডটি চেষ্টা করেছিলাম, তবে এটি মোট দূরত্বটি খুব বেশি সংক্ষিপ্ত করে শেষ করেছে। এটি খুব অসম্পূর্ণ করা হয়েছে।
আন্দ্রেয়াস রুডল্ফ

1
@ ব্যবহারকারী ২৯৯৯৯৩ yes হ্যাঁ, আপনি লোকেশনচেনড () থেকে যে স্থানাঙ্কগুলি পান তা প্রক্রিয়া করার জন্য কোডটি ব্যবহার করুন।
Stochastically

2
@ কোরে যদি আপনার কাছে সঠিকতার তথ্য না থাকে তবে আপনি কলম্যান ফিল্টার ব্যবহার করতে পারবেন না। কলম্যান ফিল্টার যা করতে চেষ্টা করছে এটি সম্পূর্ণ মৌলিক।
Stachastically

75

আপনি যা খুঁজছেন তাকে কলম্যান ফিল্টার বলা হয় । এটি ঘন ঘন নেভিগেশনাল ডেটা মসৃণ করতে ব্যবহৃত হয় । এটি অগত্যা তুচ্ছ নয়, এবং আপনি করতে পারেন এমন অনেকগুলি টিউনিং রয়েছে তবে এটি একটি খুব মানক পদ্ধতির এবং এটি ভালভাবে কাজ করে। একটি কেফিল্টার লাইব্রেরি রয়েছে যা একটি সি ++ বাস্তবায়ন।

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


1
ধন্যবাদ ক্রিস। হ্যাঁ, আমি কিছু অনুসন্ধান করার সময় কলম্যান সম্পর্কে পড়েছি, তবে এটি অবশ্যই আমার গণিত জ্ঞানের বাইরে beyond আপনি কি কোনও নমুনা কোড সহজেই পড়তে (এবং বুঝতে পারবেন), বা আরও ভাল কিছু বাস্তবায়ন উপলব্ধ সম্পর্কে অবগত আছেন? (সি / সি ++ / জাভা)
আল।

1
@ সমস্ত দুর্ভাগ্যক্রমে কলম্যান ফিল্টারগুলির সাথে আমার একমাত্র এক্সপোজারটি কাজের মধ্য দিয়ে রয়েছে, তাই আমার কাছে কিছু চমত্কারভাবে মার্জিত কোড রয়েছে যা আমি আপনাকে দেখাতে পারছি না।
ক্রিস আরগুইন

কোনও সমস্যা নেই :-) আমি চেষ্টা করার চেষ্টা করেছি তবে কিছু কারণে মনে হচ্ছে এই কলম্যান জিনিসটি কালো যাদু। প্রচুর তত্ত্বের পৃষ্ঠাগুলি কিন্তু কোনও কোডের সামান্য .. ধন্যবাদ, অন্যান্য পদ্ধতি চেষ্টা করবে।
আল।

2
kalman.sourceforge.net/index.php এখানে কলম্যান ফিল্টার সি ++ বাস্তবায়ন।
রোস্তিস্লাভ দ্রুজচেঙ্কো

1
@ ক্রিস আরগুইন আপনাকে স্বাগতম ফলাফলটি ভাল হলে দয়া করে আমাকে জানান।
রোস্তিস্লাভ দ্রুজচেনকো

11

এটি কিছুটা দেরিতে আসতে পারে ...

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

আমি এটি বেশিরভাগ পঠনের মধ্যে "ইন্টারপোলেট" করতে ব্যবহার করি - উদাহরণস্বরূপ (এক সেকেন্ডের সর্বোচ্চ জিপিএস হারের পরিবর্তে) প্রতি 100 মিলিতে আপডেট (অবস্থানের পূর্বাভাস) পাওয়ার জন্য, যা আমার অবস্থানটি অ্যানিমেটেড করার সময় আমাকে আরও ভাল ফ্রেম রেট দেয়।

অক্ষাংশ, দ্রাঘিমাংশ এবং উচ্চতা: প্রকৃতপক্ষে, এটি প্রতিটি মাত্রার জন্য তিনটি কলম্যান ফিল্টার ব্যবহার করে। তারা যাই হোক না কেন, স্বাধীন।

এটি ম্যাট্রিক্স গণিতকে অনেক সহজ করে তোলে: একটি 6x6 রাজ্যের রূপান্তর ম্যাট্রিক্স ব্যবহার না করে আমি 3 টি পৃথক 2x2 ম্যাট্রিক ব্যবহার করি। আসলে কোডে আমি মোটেই ম্যাট্রিক ব্যবহার করি না। সমস্ত সমীকরণ সমাধান করা এবং সমস্ত মান আদিম (ডাবল)।

উত্স কোডটি কাজ করছে এবং একটি ডেমো ক্রিয়াকলাপ রয়েছে। কিছু জায়গায় জাভাডোকের অভাবের জন্য দুঃখিত, আমি ধরব।


1
আমি আপনার লিবিব কোডটি ব্যবহার করার চেষ্টা করেছি, আমি কিছু অনাকাঙ্ক্ষিত ফলাফল পেয়েছি, আমি কিছু ভুল করছি কিনা তা নিশ্চিত নই ... (নীচে চিত্র url, নীলা ফিল্টার করা লোকেশনের
umesh

আপনি যে স্পাইকগুলি মাঝারি (কমলা রেখা) থেকে 'বাড়ন্ত' দেখছেন তা নেটওয়ার্ক সরবরাহকারীর আপডেটগুলির মতো দেখাচ্ছে। আপনি কি কাঁচা নেটওয়ার্ক এবং জিপিএস আপডেট উভয়ই প্লট করার চেষ্টা করতে পারেন? আপনি কী অর্জন করতে চাইছেন তার উপর নির্ভর করে কোনও নেটওয়ার্ক আপডেট না করেই আপনি আরও ভাল হতে পারেন। বিটিডব্লিউ, আপনি সেই কাঁচা কমলা আপডেটগুলি কোথা থেকে পাচ্ছেন?
ভিলোরেন

1
কমলা পয়েন্টগুলি জিপিএস সরবরাহকারীর, এবং নীল কালমান থেকে, আমি মানচিত্রে লগগুলি প্লট করেছি
u

আপনি কি আমাকে কিছু পাঠ্য বিন্যাসে ডেটা পাঠাতে পারবেন? প্রতিটি অবস্থানের আপডেটে লোকেশন.জেটপ্রাইডার () ফিল্ড সেট থাকে। সমস্ত লোকেশন.টোস্ট্রিং () সহ কেবল একটি ফাইল।
ভিলোরেন

9

আপনার প্রতি সময় অবস্থান পরিবর্তন থেকে গতি গণনা করা উচিত নয়। জিপিএসের সঠিক অবস্থান থাকতে পারে তবে এর সঠিক গতি (5 কিলোমিটার / ঘন্টা উপরে) রয়েছে। সুতরাং জিপিএস লোকেশন স্ট্যাম্প থেকে গতিটি ব্যবহার করুন। এবং আরও আপনার অবশ্যই এটি করা উচিত নয়, যদিও এটি বেশিরভাগ সময় কাজ করে।

জিপিএস অবস্থানগুলি, যেমন বিতরণ করা হয়েছে, ইতিমধ্যে কলম্যান ফিল্টার হয়েছে, আপনি সম্ভবত উন্নতি করতে পারবেন না, পোস্ট প্রসেসিংয়ে সাধারণত আপনার জিপিএস চিপের মতো একই তথ্য থাকে না।

আপনি এটি মসৃণ করতে পারেন, তবে এটি ত্রুটিগুলিও প্রবর্তন করে।

কেবল নিশ্চিত হয়ে নিন যে ডিভাইস স্থির থাকা অবস্থায় আপনার অবস্থানগুলি অপসারণ করে, এটি জাম্পিং অবস্থানগুলি সরিয়ে দেয়, কিছু ডিভাইস / কনফিগারেশনগুলি অপসারণ না করে।


5
আপনি কি দয়া করে এর জন্য কিছু রেফারেন্স সরবরাহ করতে পারেন?
ivyleavedtoadflax

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

2
স্থির থাকা অবস্থায় "চারপাশে লাফিয়ে পড়া" কেবল ত্রুটির একমাত্র উত্স নয়। এছাড়াও সিগন্যাল প্রতিচ্ছবি রয়েছে (যেমন পর্বত থেকে) যেখানে অবস্থানটি চারপাশে লাফ দেয়। আমার জিপিএস চিপস (উদাহরণস্বরূপ গারমিন ডাকোটা ২০, সোনিরিকসন নিও) এটিকে ফিল্টার করেনি ... এবং ব্যাকোমেট্রিক চাপের সাথে একত্রিত না হয়ে আসলে কী রসিকতা হল জিপিএস সিগন্যালের উচ্চতা মান। এই মানগুলি ফিল্টার করা হয় না বা আমি না ছাপানো মানগুলি দেখতে চাই না।
hgoebl

1
@AlexWien জিপিএস একটি সহনশীলতা আপনি বেধ সঙ্গে একটি গোলক দান করার জন্য একটি সময়ে একটি বিন্দু থেকে দুরত্ব গণনা, একটি শেল একটি উপগ্রহ চারপাশে কেন্দ্রীভূত। আপনি এই শেল ভলিউমের কোথাও আছেন। এই শেল ভলিউমের তিনটি ছেদ আপনাকে একটি অবস্থানের পরিমাণ দেয়, এর কেন্দ্রবিন্দু যা আপনার গণিত অবস্থান। যদি আপনার কাছে প্রতিবেদনিত পজিশনের একটি সেট থাকে এবং আপনি জানেন যে সেন্সরটি বিশ্রামে রয়েছে, সেন্ট্রয়েডকে কার্যকরভাবে গণনা করা আরও অনেক শাঁসকে ছেদ করে, নির্ভুলতার উন্নতি করে। এই ক্ষেত্রে ত্রুটি হ্রাস করা হয়
পিটার উইন

6
"বিতরণ হিসাবে জিপিএসের অবস্থানগুলি ইতিমধ্যে কলম্যান ফিল্টার হয়েছে, আপনি সম্ভবত উন্নতি করতে পারবেন না"। আপনি যদি এমন কোনও উত্সকে নির্দেশ করতে পারেন যা আধুনিক স্মার্টফোনগুলির জন্য এটি নিশ্চিত করে (উদাহরণস্বরূপ), এটি খুব কার্যকর হবে। আমি নিজেই এর প্রমাণ দেখতে পাচ্ছি না। এমনকি কোনও ডিভাইসের কাঁচা অবস্থানের সাধারণ কলম্যান ফিল্টারিং দৃ়ভাবে প্রস্তাব দেয় যে এটি সত্য নয়। কাঁচা অবস্থানগুলি প্রায় কাছাকাছি খালি নাচ, যখন ফিল্টার করা অবস্থানগুলি প্রায়শই আসল (পরিচিত) অবস্থানের কাছাকাছি থাকে।
sobri

6

আমি সাধারণত অ্যাক্সিলোমিটার ব্যবহার করি। অল্প সময়ের মধ্যে হঠাৎ অবস্থানের পরিবর্তন উচ্চ ত্বরণকে বোঝায়। যদি এটি অ্যাক্সিলোমিটার টেলিমেট্রিতে প্রতিফলিত না হয় তবে এটি সম্ভবত অবশ্যই গণনা পজিশনে ব্যবহৃত "সেরা তিন" উপগ্রহের পরিবর্তনের কারণে ঘটেছে (যার প্রতি আমি জিপিএস টেলিপোর্টিং হিসাবে উল্লেখ করি)।

যখন কোনও সম্পদ বিশ্রামে থাকে এবং জিপিএস টেলিপোর্টিংয়ের কারণে আশায় থাকে, আপনি যদি ক্রমান্বয়ে সেন্ট্রয়েড গণনা করেন তবে আপনি কার্যকরভাবে একটি বৃহত্তর এবং বৃহত্তর গোছা ছেদ করে, যথাযথতা উন্নতি করছেন।

সম্পদ যখন বিশ্রামে না থাকে তখন এটি করার জন্য আপনাকে গতি, শিরোনাম এবং রৈখিক এবং ঘূর্ণমানের (যদি আপনার গাইরোস থাকে) ত্বরণ ডেটার ভিত্তিতে তার সম্ভাব্য পরবর্তী অবস্থান এবং ওরিয়েন্টেশনটি অনুমান করতে হবে must এটি বিখ্যাত কে ফিল্টারটি কমবেশি করে। আপনি জিপিএস মডিউল ব্যতীত সমস্ত কিছু সম্বলিত একটি এএইচআরএসে এবং প্রায় একটি জ্যাক সহ একটি এএচআরএসে প্রায় 150 ডলারে হার্ডওয়্যারে পুরো জিনিসটি পেতে পারেন। বোর্ডে এটির নিজস্ব সিপিইউ এবং কালম্যান ফিল্টারিং রয়েছে; ফলাফল স্থিতিশীল এবং বেশ ভাল। অন্তর্নিহিত দিকনির্দেশনা ঝাঁকুনির প্রতি অত্যন্ত প্রতিরোধী তবে সময়ের সাথে বয়ে যায়। জিপিএস ঝাঁকুনির ঝুঁকিপূর্ণ তবে সময়ের সাথে এড়িয়ে যায় না, তারা একে অপরকে ক্ষতিপূরণ দেওয়ার জন্য ব্যবহারিকভাবে তৈরি করা হয়েছিল।


4

একটি পদ্ধতি যা কম গণিত / তত্ত্ব ব্যবহার করে তা হ'ল একবারে 2, 5, 7, বা 10 ডেটা পয়েন্টের নমুনা তৈরি করা এবং সেগুলি নির্ধারিত যা নির্ধারণ করে। কলম্যান ফিল্টারের চেয়ে একজন আউটলারের কম সঠিক পরিমাপের জন্য পয়েন্টগুলির মধ্যে সমস্ত জোড় বুদ্ধিমান দূরত্ব নেওয়ার জন্য নীচের অ্যালগরিদমটি ব্যবহার করা হয় এবং অন্যের থেকে দূরে থাকাটিকে বাইরে ফেলে দিতে হয়। সাধারণত সেই মানগুলি আপনি প্রতিস্থাপন করছেন এমন বহির্মুখী মানটির নিকটতম মানের সাথে প্রতিস্থাপিত হয়

উদাহরণ স্বরূপ

এ, বি, সি, ডি, ই পাঁচটি নমুনা বিন্দুতে স্মুথ করা

এটোটাল = দূরত্বের যোগসূত্র এসি এডি এডি এই

বিটোটাল = দূরত্বের যোগসূত্রের বিসি বিসি বিডি হতে পারে

সিটিটাল = এসইএম দূরত্বের এসি বিসি সিডি সিই

ডিটিওএলএল = দূরত্বের যোগফল ডিএ ডিবি ডিসি ডিইইডি

ETOTAL = দূরত্বের SUM EA EB EC DE

বিটিওটাল বৃহত্তম হলে আপনি বিন্দু বি কে ডি দিয়ে প্রতিস্থাপন করবেন যদি বিডি = মিনিট {এ বি, বিসি, বিডি, BE}

এই স্মুথিং আউটলিয়ারদের নির্ধারণ করে এবং অবস্থানিক লাইনটি মসৃণ করতে বিন্দু ডি এর পরিবর্তে বিডির মিডপয়েন্ট ব্যবহার করে বাড়ানো যায়। আপনার মাইলেজটি পৃথক হতে পারে এবং আরও গাণিতিকভাবে কঠোর সমাধানের উপস্থিতি থাকতে পারে।


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

1
হ্যাঁ, এটি ওজনযুক্ত উপায়গুলির একটি রূপ বলে মনে হচ্ছে। আপনি যদি কোনও স্মুথলি করতে চান তবে আপনাকে "অতীত" পয়েন্টগুলি ব্যবহার করতে হবে, কারণ সিস্টেমটি আরও কোথায় মসৃণ করতে হবে তা জানতে বর্তমান অবস্থানের চেয়ে বেশি হওয়া দরকার। যদি আপনার জিপিএস প্রতি সেকেন্ডে একবার ডেটাপয়েন্ট নিচ্ছে এবং আপনার ব্যবহারকারী প্রতি পাঁচ সেকেন্ডে একবার স্ক্রিনটি দেখে, আপনি তাকে লক্ষ্য না করেই 5 টি ডেটাপয়েন্ট ব্যবহার করতে পারেন! একটি চলমান গড় কেবলমাত্র এক পিপি দিয়ে বিলম্বিত হবে।
কার্ল

4

কমপক্ষে স্কোয়ারের মতো, এখানে আরও কয়েকটি জিনিস পরীক্ষা করার জন্য রয়েছে:

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

  2. আপনি রিপোর্ট করা নির্ভুলতার ভিত্তিতে ডেটা পয়েন্টগুলি ওজন করার চেষ্টা করতে পারেন। নির্ভুলতা যখন কম ওজন হয় তখন সেই ডেটা পয়েন্ট কম হয়।

  3. আপনি যে জিনিসটির চেষ্টা করতে চাইতে পারেন সেটি হ'ল একক পয়েন্ট প্রদর্শন করা, যদি নির্ভুলতা কম থাকে তবে কোনও বৃত্ত বা এমন কিছু চিহ্নিত করা হয় যা ব্যবহারকারী রিপোর্ট করা নির্ভুলতার ভিত্তিতে তৈরি হতে পারে indic (আইফোনের অন্তর্নির্মিত গুগল ম্যাপস অ্যাপ্লিকেশনটি এটি করে))


3

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

আপনার পরিচিতদের মধ্যে মানগুলিকে বিভক্ত করতে সক্ষম হওয়া আপনাকে একটি সুন্দর মসৃণ রূপান্তর এবং আপনার কাছে উচ্চ-বিশ্বস্ততা থাকলে কোন ডেটা উপস্থিত হবে তার একটি / যুক্তিসঙ্গত / আনুমানিক মূল্য দেয়। http://en.wikipedia.org/wiki/Spline_interpolation

বিভিন্ন স্প্লাইনের বিভিন্ন বৈশিষ্ট্য রয়েছে। যার সবচেয়ে বেশি ব্যবহার করা আমি দেখেছি সে হ'ল আকিমা এবং কিউবিক স্প্লিন্স।

আর একটি অ্যালগরিদম বিবেচনা করার জন্য হ'ল রামার-ডগলাস-পিউকার লাইন সরলীকরণ অ্যালগরিদম, এটি জিপিএস ডেটার সরলকরণে সাধারণত ব্যবহৃত হয়। ( http://en.wikedia.org/wiki/Ramer- ডগলাস- পিউকার_ালগোরিদম )


3

কলম্যান ফিল্টারগুলিতে ফিরে যাচ্ছি ... আমি এখানে জিপিএস ডেটার জন্য একটি কলম্যান ফিল্টারের সি প্রয়োগকারী পেয়েছি: http://github.com/lacker/ikalman আমি এখনও এটি চেষ্টা করে দেখিনি, তবে এটি আশাব্যঞ্জক বলে মনে হচ্ছে।


0

কারও আগ্রহী হলে কফিস্ক্রিপ্টে ম্যাপযুক্ত। ** সম্পাদনা -> দুঃখিত ব্যাকবোনটি ব্যবহার করেও, তবে আপনি ধারণাটি পেয়ে যান।

অ্যাট্রিবিস সহ একটি বীকন গ্রহণ করতে সামান্য পরিবর্তিত হয়েছে

অক্ষর

MIN_ACCURACY = 1

# mapped from http://stackoverflow.com/questions/1134579/smooth-gps-data

class v.Map.BeaconFilter

  constructor: ->
    _.extend(this, Backbone.Events)

  process: (decay,beacon) ->

    accuracy     = Math.max beacon.accuracy, MIN_ACCURACY

    unless @variance?
      # if variance nil, inititalise some values
      @variance     = accuracy * accuracy
      @timestamp_ms = beacon.date.getTime();
      @lat          = beacon.latitude
      @lng          = beacon.longitude

    else

      @timestamp_ms = beacon.date.getTime() - @timestamp_ms

      if @timestamp_ms > 0
        # time has moved on, so the uncertainty in the current position increases
        @variance += @timestamp_ms * decay * decay / 1000;
        @timestamp_ms = beacon.date.getTime();

      # Kalman gain matrix K = Covarariance * Inverse(Covariance + MeasurementVariance)
      # NB: because K is dimensionless, it doesn't matter that variance has different units to lat and lng
      _k  = @variance / (@variance + accuracy * accuracy)
      @lat = _k * (beacon.latitude  - @lat)
      @lng = _k * (beacon.longitude - @lng)

      @variance = (1 - _k) * @variance

    [@lat,@lng]

এটি সম্পাদনা করার চেষ্টা করা হয়েছে, তবে শেষ লাইনে একটি টাইপো রয়েছে যেখানে @latএবং @lngসেট করা আছে। এর +=চেয়ে বেশি হওয়া উচিত=
jdixon04

0

আমি জাভা কোডটি @ স্টোচেস্টিকালি থেকে কোটলিনে রূপান্তর করেছি

class KalmanLatLong
{
    private val MinAccuracy: Float = 1f

    private var Q_metres_per_second: Float = 0f
    private var TimeStamp_milliseconds: Long = 0
    private var lat: Double = 0.toDouble()
    private var lng: Double = 0.toDouble()
    private var variance: Float =
        0.toFloat() // P matrix.  Negative means object uninitialised.  NB: units irrelevant, as long as same units used throughout

    fun KalmanLatLong(Q_metres_per_second: Float)
    {
        this.Q_metres_per_second = Q_metres_per_second
        variance = -1f
    }

    fun get_TimeStamp(): Long { return TimeStamp_milliseconds }
    fun get_lat(): Double { return lat }
    fun get_lng(): Double { return lng }
    fun get_accuracy(): Float { return Math.sqrt(variance.toDouble()).toFloat() }

    fun SetState(lat: Double, lng: Double, accuracy: Float, TimeStamp_milliseconds: Long)
    {
        this.lat = lat
        this.lng = lng
        variance = accuracy * accuracy
        this.TimeStamp_milliseconds = TimeStamp_milliseconds
    }

    /// <summary>
    /// Kalman filter processing for lattitude and longitude
    /// /programming/1134579/smooth-gps-data/15657798#15657798
    /// </summary>
    /// <param name="lat_measurement_degrees">new measurement of lattidude</param>
    /// <param name="lng_measurement">new measurement of longitude</param>
    /// <param name="accuracy">measurement of 1 standard deviation error in metres</param>
    /// <param name="TimeStamp_milliseconds">time of measurement</param>
    /// <returns>new state</returns>
    fun Process(lat_measurement: Double, lng_measurement: Double, accuracy: Float, TimeStamp_milliseconds: Long)
    {
        var accuracy = accuracy
        if (accuracy < MinAccuracy) accuracy = MinAccuracy

        if (variance < 0)
        {
            // if variance < 0, object is unitialised, so initialise with current values
            this.TimeStamp_milliseconds = TimeStamp_milliseconds
            lat = lat_measurement
            lng = lng_measurement
            variance = accuracy * accuracy
        }
        else
        {
            // else apply Kalman filter methodology

            val TimeInc_milliseconds = TimeStamp_milliseconds - this.TimeStamp_milliseconds

            if (TimeInc_milliseconds > 0)
            {
                // time has moved on, so the uncertainty in the current position increases
                variance += TimeInc_milliseconds.toFloat() * Q_metres_per_second * Q_metres_per_second / 1000
                this.TimeStamp_milliseconds = TimeStamp_milliseconds
                // TO DO: USE VELOCITY INFORMATION HERE TO GET A BETTER ESTIMATE OF CURRENT POSITION
            }

            // Kalman gain matrix K = Covarariance * Inverse(Covariance + MeasurementVariance)
            // NB: because K is dimensionless, it doesn't matter that variance has different units to lat and lng
            val K = variance / (variance + accuracy * accuracy)
            // apply K
            lat += K * (lat_measurement - lat)
            lng += K * (lng_measurement - lng)
            // new Covarariance  matrix is (IdentityMatrix - K) * Covarariance
            variance = (1 - K) * variance
        }
    }
}

0

এখানে যার প্রয়োজন হয় তার জন্য @ স্টোকাস্টিকাল জাভা প্রয়োগের একটি জাভাস্ক্রিপ্ট বাস্তবায়ন:

class GPSKalmanFilter {
  constructor (decay = 3) {
    this.decay = decay
    this.variance = -1
    this.minAccuracy = 1
  }

  process (lat, lng, accuracy, timestampInMs) {
    if (accuracy < this.minAccuracy) accuracy = this.minAccuracy

    if (this.variance < 0) {
      this.timestampInMs = timestampInMs
      this.lat = lat
      this.lng = lng
      this.variance = accuracy * accuracy
    } else {
      const timeIncMs = timestampInMs - this.timestampInMs

      if (timeIncMs > 0) {
        this.variance += (timeIncMs * this.decay * this.decay) / 1000
        this.timestampInMs = timestampInMs
      }

      const _k = this.variance / (this.variance + (accuracy * accuracy))
      this.lat += _k * (lat - this.lat)
      this.lng += _k * (lng - this.lng)

      this.variance = (1 - _k) * this.variance
    }

    return [this.lng, this.lat]
  }
}

ব্যবহারের উদাহরণ:

   const kalmanFilter = new GPSKalmanFilter()
   const updatedCoords = []

    for (let index = 0; index < coords.length; index++) {
      const { lat, lng, accuracy, timestampInMs } = coords[index]
      updatedCoords[index] = kalmanFilter.process(lat, lng, accuracy, timestampInMs)
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.