2012年7月28日土曜日

rtklibを使ってRINEX L1, C1, L2, P2を表示させる

rtklibというGNSS解析ソフトウェアがある。
    http://www.rtklib.com/

なんとフリーで、オープンソース。
ざっと中身を見ると、APIもかなり充実していて、インターフェースが非常にシンプル。単独測位くらいまでならほとんど自前でコーティングせず作れてしまいそう。すごい。

とりあえずRINEXファイルを表示だけするものを作ってみたので使い方をメモ。

rtklibを使って少しずつGNSS解析の中身を理解していきたい。
(*C1, P2と書いたけど、rinex.cの中で優先順位が決まっているので、きちんと固定するには setrnxcodepriを呼ばなければいけない)
 /*
 * printobs.c
 *
 *  Created   : 2012/07/28
 *      Author: sako
 */
#include "stdio.h"
#include "stdlib.h"
#include "rtklib.h"

/* copied from postpos.c in rtklib v2.4.1 */
static int nextobsf(const obs_t *obs, int *i, int rcv) {
    double tt;
    int n;
    
    for (;*in;(*i)++) if (obs->data[*i].rcv==rcv) break;
    for (n=0;*i+nn;n++) {
        tt=timediff(obs->data[*i+n].time,obs->data[*i].time);
        if (obs->data[*i+n].rcv!=rcv||tt>DTTOL) break;
    }
    return n;
}

int main(int argc, char *argv[]) {
    char *rinex_o;
    int i, j, nu;
    char tmstr[20];

    obs_t obs={0};
    nav_t nav={0};
    sta_t sta[1];

    /* parse argument */
    if (argc > 1) {
     rinex_o = (char *) malloc( strlen(argv[1]) + 1);
     strcpy(rinex_o, argv[1]); 
    }
    else {
        printf("no input file\n");
        return -1;
    }

    /* read rinex obsfile */
    if(readrnx(rinex_o, 0, &obs, &nav, &sta[0]) <= 0) {
        printf("Can't read rinex obs file.\n");
    }

    i = 0;
    while(i<obs.n) {
        /* seek index of the next epoch */
        nu = nextobsf(&obs, &i, 0);
        printf("----- epoch start -----\n");
        printf("sat num: %d\n", nu);

        for(j=i;j<i+nu;j++) {
            time2str(obs.data[j].time, tmstr, 0);
            printf("%2d: %s %3d %f %f %f %f\n", j-i, tmstr, obs.data[j].sat,
                obs.data[j].L[0], obs.data[j].P[0],
                obs.data[j].L[1], obs.data[j].P[1]);
        }
        i += nu;
    }

    return 0;
}

0 件のコメント:

コメントを投稿