1

PC のシリアル ポートに毎秒 GPS データが入力されています。GPS データの処理に成功し、緯度と経度が別々の配列に浮動小数点数として格納されました。

double[] dlat = new double[100000]; //contains the latitude data
double[] dlon = new double[100000]; //contains the longitude data

ほとんどの場合、緯度と経度の数値は同じままで、GPS の位置は 5 メートルごとにしか変化しません。配列内の緯度または経度の値が変更された場合、変更の間に格納されたデータ ポイントの緯度または経度の平均に基づいて、プログラムで予測する必要があります。例えば:

latitudeこれが配列の内容であるとしましょう:

2,2,2,2,2,17

プログラムで配列の内容を次のように変更したいと思います。

2,5,8,11,14,17   

私は問題に取り組んでみましたが、私の方法はうまくいきません:-/ 私はC#が初めてです。これを行うためのより良い方法があるはずです。これは、予測を実行しようとする私のコードのスニペットです (少し後---GPS coordinate prediction---のビットは、機能しないビットです)。

string RxString;// where the raw serial data is stored
string mag;
double[] dmag = new double[100000];//magnetic data stored here
string lat;
double[] dlat = new double[100000];//latitude data stored here
string lon; 
double[] dlon = new double[100000];//longitude data stored here
double average;//average step between change in latiude
int i; //pointer double array data;
int count;//counter for prediction code

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)//activates when port is open and data in buffer
{
    RxString = serialPort1.ReadTo("\r\n");//read raw data from serial port into string
    this.Invoke(new EventHandler(DisplayText));//invoke allows it to call function diplay text*/

    if(RxString.StartsWith("G"))
    {
       lat = RxString.Split(',')[0].Substring(4);// extract latitude
       this.Invoke(new EventHandler(DisplayText1));//invoke allows it to call function diplay text
       dlat[i] = Convert.ToDouble(lat);//convert and store in double array
       this.Invoke(new EventHandler(Form1_Load));//invoke allows it to call function 

       lon = RxString.Split(',')[2];// extract longitude
       this.Invoke(new EventHandler(DisplayText2));//invoke allows it to call function diplay text
       dlon[i] = Convert.ToDouble(lon);//covert and store in double array
       this.Invoke(new EventHandler(Form1_Load));//invoke allows it to call function 

       mag = RxString.Split(',')[3].Substring(6).Trim();// extract magnetic data 
       this.Invoke(new EventHandler(DisplayText3));//invoke allows it to call function diplay text
       dmag[i] = Convert.ToDouble(mag);//convert and store in double array
       this.Invoke(new EventHandler(Form1_Load));//invoke allows it to call function 
       i++;
       RxString = null;

        /* -------------------------GPS coordinate prediction--------------------------------------------- */

       if (i > 0)
       {
           if (dlat[i] == dlat[i - 1])
           {
               count++;
           }
           if (dlat[i] != dlat[i - 1])
           {
               double average = (dlat[i] - dlat[i - 1]) / (count);//average data step beween changed values
               int firstAv = i - (count - 1);//position of first average
               int lastAv = i - 1;//position of last average

               for (int j = firstAv; j <= lastAv; i++)
               {
                   dlat[j] = dlat[j - 1] + average;
               }

               count = 0;
           }
       }
       if (i==0) count = 1;
   }
4

2 に答える 2

1

以下の作品:

    using System;
    using System.Text;

    namespace Practice
    {
        public class Hello
        {
            static double[] ldat = {2.0,2.0,2.00,2.0,2.0,17.0};
            static double[] ldat2 = {2.0,3.0,4.00,4.0,7.0,19.0};
            static double[] ldat3 = {0.0, 0.0, -5.0, -5.0, -11.0, -11.0, -20};

            public static void Main(string[] args)
            {
                test(ldat);
                test(ldat2);
                test(ldat3);
            }

            public static void test(double[] array){
                //Use Code from here.....
                int firstEqualIndex = -1;
                for(int i = 1; i < array.Length ; i ++)
                {
                    if (i > 0)
                    {
                        if(array[i] == array[i - 1])
                        {
                            if(firstEqualIndex == -1)
                            {
                                firstEqualIndex = i - 1;
                            }
                        }
                        else //They are not equal
                        {
                            //Figure out the average.
                            if(firstEqualIndex >= 0)
                            {
                                double average = (array[i] - array[firstEqualIndex]) / (Double)((i - firstEqualIndex));
                                int k = 0;
                                for(int j = firstEqualIndex; j < i; j++)
                                {
                                    array[j] += average * k;
                                    k++;
                                }
                                firstEqualIndex = -1;
                            }
                        }
                    }
                }
                //..... to here.
                StringBuilder builder = new StringBuilder();
                foreach (double entry in array)
                {
                    // Append each int to the StringBuilder overload.
                    builder.Append(entry).Append(", ");
                }
                string result = builder.ToString();
                Console.WriteLine(result);
            }
        }
    }      

このテスト出力

2, 5, 8, 11, 14, 17, 
2, 3, 4, 5.5, 7, 19,
0, -2.5, -5, -8, -11, -15.5, -20,  

メソッドが追加のテストケースで機能することを確認しようとしているすべての編集について申し訳ありません。

編集: 負のケースのテストを追加しました。

于 2013-04-01T16:55:36.233 に答える
1

この問題を信号処理の観点から定式化します。したがって、信号がある場合f(t)(たとえば、離散化された配列である可能性があります)、次のように定義されlatitudeた新しい信号を作成する必要があります。g(t)

g(t) = E[f(z) | t-0.5*w <= z <= t+0.5*w]

ここでE、 は期待値 (または平均) を表し、 はwフィルターの幅です。

この方法で問題をモデル化する利点の 1 つは、動作モデルを指定する非常に具体的な方法があることです。つまり、データ [0, 0, 0, 0, 1, 1, 1, 1] をどのように変換しますか?

[0, 0, 0, 1/3, 2/3, 1, 1, 1] にする必要がありますか?

それとも [0, 1/7, 2/7, 3/7, 4/7, 5/7, 6/7, 1] にするべきでしょうか?

サンプル間の経過時間がわかっている場合は、必要なwモデルを指定する期間を選択できます。

もう 1 つの利点は、非線形運動モデルが必要な場合は、それにも簡単に拡張できることです。上記の例では、ボックス フィルターを使用して平滑化を行いましたが、追跡対象の加速/減速の物理的な制限を考慮に入れるために、別のフィルターを使用することもできます。よりガウス曲線に似た形状のフィルターでそれを実現できます。

于 2013-04-01T17:51:02.400 に答える