开源的GNSS导航定位包RTKLib的学习历程(一)     DATE: 2020-04-16 09:19

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
 
====================华丽的分割线====================
 
下面开始介绍笔者的学习历程,由于工作的原因,时间跨度有些大,断断续续的。
初次接触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 message from stream 
//  args   raw_t  *raw   IO     receiver raw data control struct 
//           int    format      receiver raw data format (STRFMT_???) 
//           unsigned char data 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        observation data 
//          int              number of observation data 
//           nav_t  *nav        navigation data 
//           prcopt_t *opt      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        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        observation data records 
//           int              number of observation data records 
//           nav_t  *nav        navigation messages 
//           double *rr         receiver position (ecef) (m) 
//           double *azel       satellite azimuth/elevation angle (rad) 
//           int    *vsat       valid satellite flag 
//           double *vr         estimated velocity (ecef) (m/s) (3 1) 
//           double *Qv         estimated velocity covarience (3 3) 
//           double *ddtr       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          ecef position {x,y,z} (m) 
//           double *pos        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        geodetic position {lat,lon} (rad) 
//           double *r          vector in ecef coordinate {x,y,z} 
//           double *e          vector in local tangental coordinate {e,n,u} 
//  return none 
// -----------------------------------------------------------------------------*/ 
extern void ecef2enu(const double *pos, const double *r, double *e); 

  上一篇:高性能授时天线测试
  下一篇:RTKLIB使用教程