rtklib学习心得

2019-02-16 00:18

开源的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);

RTKlib学习(二):Glonass参数,该信哪一个?

在了解Glonass卫星位置计算时,一般用四阶龙格-库塔算法,笔者在校时学的《数值计算方法》中有讲,不过也差不多忘完了,重新学习吧。算法本身倒不是多难,难得是碰到了参数该用哪一个呢?

上图为笔者查找相关论文,搜索出来的,上(左)来自《测绘与空间地理信息》第32卷第2期;上图(右)来自《东南大学学报》第40卷,前者是2009年4月份的,后者是2010年7月份的。两篇文章公式还算一致,但与笔者看的《glonass ICD 2002r》对不上,如下图:(注:第二与第三公式中参数不一致,Why?)


rtklib学习心得.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:初中科学竞赛辅导《密度》经典选择20题

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: