0

@皆さん、最近 IMU からのデータの読み取りに問題があります。以下は、デバイスから取得したデータです。ASCII で、すべて文字で、データ サイズは [122] です。これは非常に大きいため、それらを short に変換してから float にする必要がありますが、理由と方法がわかりません。 .....

unsigned char data[33];
short x,y,z;
float x_fl,y_fl,z_fl,t_fl;
float bias[3]={0,0,0};//array initialization
unsigned char sum_data=0;
int batch=0;
if ( !PurgeComm(file,PURGE_RXCLEAR ))
    cout << "Clearing RX Buffer Error" << endl;//this if two sentence aim to clean the buffer

//---------------- read data from IMU ----------------------
do { ReadFile(file,&data_check,1,&read,NULL);
       //if ((data_check==0x026))
       { ReadFile(file,&data,33,&read,NULL); }

       ///  Wx Values               
       {
          x=(data[8]<<8)+data[9];                               
          x_fl=(float)6.8664e-3*x;                                                  
          bias[0]+=(float)x_fl;                                               
        }

        ///  Wy Values                                      
        {
          y=(data[10]<<8)+data[11];
          y_fl=(float)6.8664e-3*y;
          bias[1]+=(float)y_fl;                                                 
        }

        ///  Wz Values                      
        {
          z=(data[12]<<8)+data[13];
          z_fl=(float)6.8664e-3*z; 
          bias[2]+=(float)z_fl;                                                 
        }

        batch++;

}while(batch<NUM_BATCH_BIAS);

$VNYMR,+049.320,-017.922,-024.946,+00.2829,-00.2734,+00.2735,-02.961,+03.858,-08.325,-00.001267,+00.000213,-00.001214*64

$VNYMR,+049.322,-017.922,-024.948,+00.2829,-00.2714,+00.2735,-02.958,+03.870,-08.323,+00.004923,-00.000783,+00.000290*65

$VNYMR,+049.321,-017.922,-024.949,+00.2821,-00.2655,+00.2724,-02.984,+03.883,-08.321,+00.000648,-00.000391,-00.000485*61

$VNYMR,+049.320,-017.922,-024.947,+00.2830,-00.2665,+00.2756,-02.983,+03.874,-08.347,-00.003416,+00.000437,+00.000252*6C

$VNYMR,+049.323,-017.921,-024.947,+00.2837,-00.2773,+00.2714,-02.955,+03.880,-08.326,+00.002570,-00.001066,+00.000690*67

$VNYMR,+049.325,-017.922,-024.948,+00.2847,-00.2715,+00.2692,-02.944,+03.875,-08.344,-00.002550,+00.000638,+00.000022*6A

$VNYMR,+049.326,-017.921,-024.945,+00.2848,-00.2666,+00.2713,-02.959,+03.876,-08.309,+00.002084,+00.000449,+00.000667*6A

私がやりたいことは次のとおりです。

  1. コンマで区切られた最後の 6 つの数字を抽出します。ところで、最後の 3 文字 (*66 など) は必要ありません。
  2. 抽出したデータを 6 つの .dat ファイルに保存します。

これを行う最善の方法は何ですか?

IMU からこの生データを取得したので、最後の 6 つのデータが必要accelerations(x,y,z)ですgyros(x,y,z)

  1. IMU のタイム スタンプも必要なので、各データ ストリームの最後にカウンターを設定する方法を誰かが教えてくれれば完璧です。

最後の言葉は、Windows、C++ でデータ取得を行っているということです。

誰かが私を助けてくれることを願っています、私はやることがたくさんあるのでびっくりしています、そしてそれは本当に迷惑です!!

4

1 に答える 1

0

scanf 関数の全ファミリ (fscanf、sscanf、およびいくつかの「安全な」関数) があります。行を文字列に読み取ったと仮定します:-

sscanf( s, "VNYMR,%*f,%*f,%*f,%*f,%*f,%*f,%f,%f,%f,%f,%f,%f", &accX, &accY, &accZ, &gyroX, &gyroY, &gyroZ )

そして、私が正しく数えたと仮定します!これにより、リテラルの $VNYMR がそこにあることが確認され、その後に割り当てない約 5 つの float があり、最後に重要な 6 つが続きます。&accaX などは float のアドレスです。結果をテストします - 行われた割り当ての数..

于 2016-02-13T02:23:24.513 に答える