当前位置:首页 > rtklib学习心得
开源的GNSS导航定位包RTKLib的学习历程(一)
RTKLIB简介:
由日本东京海洋大学开发(Tokyo University of Marine Science and Technology
),笔者查到最早的介绍是一篇日文的,《RTK-GPS用プログラムライブラリRTKLIBの開発?評価および応用》,其介绍的为RTKLIB ver.1.1。另有一篇论文《Development of the lowcost RTK GPS receiver with an open source program package RTKLIB》也可以看下。 其主要功能如下:
支持标准的GPS、GLONASS、QZSS和SBAS的为精确定位算法(目前此版本不支持Galileo系统)
支持多种动态、静态卫星定位方式(单点定位、DGPS、载波相位动态差分定位RTK、静态、移动基站、PPP)
支持全球定位导航系统的多种标准格式和协议 支持多品牌接收机的专有消息传输协议 支持多种通讯方式
====================华丽的分割线====================
下面开始介绍笔者的学习历程,由于工作的原因,时间跨度有些大,断断续续的。
初次接触RTKLib是在2010年8月份,当时版本还是2.3.0,下载了源码,花时间做了一个简单的应用:通过调用RTKLIB的API接口,进行单点定位,并计算出速度、方位角、仰角等,主要调用的函数依顺序为:
init_raw, input_raw,pntpos,ecef2pos,pntvel,ecef2enu,free_raw 。
由于作者用Borland C++开发,笔者用的是VC++,所以移植时还有一些函数需要自己实现,如:
int showmsg(char *format, ...)等。
注: pntvel在2.4.0发布时,已去掉。
应用时调用的主要函数接口如下:
// initialize receiver raw data control struct and reallocate obsevation and // epheris buffer
// args : raw_t *raw IO receiver raw data control struct // return : status (1:ok,0:memory allocation error) */ extern int init_raw(raw_t *raw);
// free receiver raw data control ---------------------------------------------- // free observation and ephemeris buffer in receiver raw data control struct // args : raw_t *raw IO receiver raw data control struct // return : none
//-----------------------------------------------------------------------------*/ extern void free_raw(raw_t *raw);
// input receiver raw data from stream ----------------------------------------- // fetch next receiver raw data and input a message from stream // args : raw_t *raw IO receiver raw data control struct // int format I receiver raw data format (STRFMT_???) // unsigned char data I stream data (1 byte)
// return : status (-1: error message, 0: no message, 1: input observation data, // 2: input ephemeris, 3: input sbas message, // 9: input ion/utc parameter)
// -----------------------------------------------------------------------------
extern int input_raw(raw_t *raw, int format, unsigned char data); /// single-point positioning ---------------------------------------------------- // compute receiver position, velocity, clock bias by single-point positioning // with pseudorange and doppler observables // args : obsd_t *obs I observation data // int n I number of observation data // nav_t *nav I navigation data // prcopt_t *opt I processing options // sol_t *sol IO solution
// double *azel IO azimuth/elevation angle (rad) (NULL: no output) // ssat_t *ssat IO satellite status (NULL: no output) // char *msg O error message for error exit // return : status(1:ok,0:error)
// -----------------------------------------------------------------------------*/ extern int pntpos(const obsd_t *obs, int n, const nav_t *nav, const prcopt_t *opt, sol_t *sol, double *azel, ssat_t *ssat, char *msg);
// velocity estimation by single-point positioning ----------------------------- // compute receiver position/velocity and clock-bias/drift // args : obsd_t *obs I observation data records // int n I number of observation data records // nav_t *nav I navigation messages // double *rr I receiver position (ecef) (m)
// double *azel I satellite azimuth/elevation angle (rad) // int *vsat I valid satellite flag
// double *vr O estimated velocity (ecef) (m/s) (3 x 1) // double *Qv O estimated velocity covarience (3 x 3) // double *ddtr O estimated receiver clock-drift (s/s) // return : number of valid satellites (<0:error)
// -1: number of valid dopplers, -2: least square error
// -3: iteration divergent, -5: validation error, // -6: gdop error
// -----------------------------------------------------------------------------*/ extern int pntvel(const obsd_t *obs, int n, const nav_t *nav, const double *rr, const double *azel, const int *vsat, double *vr, double *Qv, double *ddtr);
// transform ecef to geodetic postion ------------------------------------------ // transform ecef position to geodetic position // args : double *r I ecef position {x,y,z} (m)
// double *pos O geodetic position {lat,lon,h} (rad,m) // return : none
// notes : WGS84, ellipsoidal height
// -----------------------------------------------------------------------------*/ extern void ecef2pos(const double *r, double *pos);
/// transform ecef vector to local tangental coordinate ------------------------- // transform ecef vector to local tangental coordinate // args : double *pos I geodetic position {lat,lon} (rad) // double *r I vector in ecef coordinate {x,y,z}
// double *e O vector in local tangental coordinate {e,n,u} // return : none
// -----------------------------------------------------------------------------*/ extern void ecef2enu(const double *pos, const double *r, double *e);
共分享92篇相关文档