您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > rtklib学习心得
开源的GNSS导航定位包RTKLib的学习历程(一)RTKLIB简介:由日本东京海洋大学开发(TokyoUniversityofMarineScienceandTechnology),笔者查到最早的介绍是一篇日文的,《RTK-GPS用プログラムライブラリRTKLIBの開発?評価および応用》,其介绍的为RTKLIBver.1.1。另有一篇论文《DevelopmentofthelowcostRTKGPSreceiverwithanopensourceprogrampackageRTKLIB》也可以看下。其主要功能如下:支持标准的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。由于作者用BorlandC++开发,笔者用的是VC++,所以移植时还有一些函数需要自己实现,如:intshowmsg(char*format,...)等。注:pntvel在2.4.0发布时,已去掉。应用时调用的主要函数接口如下://initializereceiverrawdatacontrolstructandreallocateobsevationand//epherisbuffer//args:raw_t*rawIOreceiverrawdatacontrolstruct//return:status(1:ok,0:memoryallocationerror)*/externintinit_raw(raw_t*raw);//freereceiverrawdatacontrol----------------------------------------------//freeobservationandephemerisbufferinreceiverrawdatacontrolstruct//args:raw_t*rawIOreceiverrawdatacontrolstruct//return:none//-----------------------------------------------------------------------------*/externvoidfree_raw(raw_t*raw);//inputreceiverrawdatafromstream-----------------------------------------//fetchnextreceiverrawdataandinputamessagefromstream//args:raw_t*rawIOreceiverrawdatacontrolstruct//intformatIreceiverrawdataformat(STRFMT_???)//unsignedchardataIstreamdata(1byte)//return:status(-1:errormessage,0:nomessage,1:inputobservationdata,//2:inputephemeris,3:inputsbasmessage,//9:inpution/utcparameter)//-----------------------------------------------------------------------------externintinput_raw(raw_t*raw,intformat,unsignedchardata);///single-pointpositioning----------------------------------------------------//computereceiverposition,velocity,clockbiasbysingle-pointpositioning//withpseudorangeanddopplerobservables//args:obsd_t*obsIobservationdata//intnInumberofobservationdata//nav_t*navInavigationdata//prcopt_t*optIprocessingoptions//sol_t*solIOsolution//double*azelIOazimuth/elevationangle(rad)(NULL:nooutput)//ssat_t*ssatIOsatellitestatus(NULL:nooutput)//char*msgOerrormessageforerrorexit//return:status(1:ok,0:error)//-----------------------------------------------------------------------------*/externintpntpos(constobsd_t*obs,intn,constnav_t*nav,constprcopt_t*opt,sol_t*sol,double*azel,ssat_t*ssat,char*msg);//velocityestimationbysingle-pointpositioning-----------------------------//computereceiverposition/velocityandclock-bias/drift//args:obsd_t*obsIobservationdatarecords//intnInumberofobservationdatarecords//nav_t*navInavigationmessages//double*rrIreceiverposition(ecef)(m)//double*azelIsatelliteazimuth/elevationangle(rad)//int*vsatIvalidsatelliteflag//double*vrOestimatedvelocity(ecef)(m/s)(3x1)//double*QvOestimatedvelocitycovarience(3x3)//double*ddtrOestimatedreceiverclock-drift(s/s)//return:numberofvalidsatellites(0:error)//-1:numberofvaliddopplers,-2:leastsquareerror//-3:iterationdivergent,-5:validationerror,//-6:gdoperror//-----------------------------------------------------------------------------*/externintpntvel(constobsd_t*obs,intn,constnav_t*nav,constdouble*rr,constdouble*azel,constint*vsat,double*vr,double*Qv,double*ddtr);//transformeceftogeodeticpostion------------------------------------------//transformecefpositiontogeodeticposition//args:double*rIecefposition{x,y,z}(m)//double*posOgeodeticposition{lat,lon,h}(rad,m)//return:none//notes:WGS84,ellipsoidalheight//-----------------------------------------------------------------------------*/externvoidecef2pos(constdouble*r,double*pos);///transformecefvectortolocaltangentalcoordinate-------------------------//transformecefvectortolocaltangentalcoordinate//args:double*posIgeodeticposition{lat,lon}(rad)//double*rIvectorinecefcoordinate{x,y,z}//double*eOvectorinlocaltangentalcoordinate{e,n,u}//return:none//-----------------------------------------------------------------------------*/externvoidecef2enu(constdouble*pos,constdouble*r,double*e);RTKlib学习(二):Glonass参数,该信哪一个?在了解Glonass卫星位置计算时,一般用四阶龙格-库塔算法,笔者在校时学的《数值计算方法》中有讲,不过也差不多忘完了,重新学习吧。算法本身倒不是多难,难得是碰到了参数该用哪一个呢?上图为笔者查找相关论文,搜索出来的,上(左)来自《测绘与空间地理信息》第32卷第2期;上图(右)来自《东南大学学报》第40卷,前者是2009年4月份的,后者是2010年7月份的。两篇文章公式还算一致,但与笔者看的《glonassICD2002r》对不上,如下图:(注:第二与第三公式中参数不一致,Why?)那是不是笔者的ICD文件错误呢?查2008版的ICD文件,如下图所示,同样该参数为1,于是笔者石化了,不知道哪个文档可信。有做过的朋友,请知会下,Why?谢谢先。rtklib学习(三)单频RTK后处理笔者准备读rtklib中的RTK部分源码了,在解读RTK部分源码之前,还是先来看下原作者提供的BIN工具如何处理RTK定位,先了解应用的数据处理流程,对解读源码有一定的帮助。笔者准备的是一份10年采集的单频L1的数据,先将数据转至rinex格式,利用RTKCONV工具,注意Format的选择,同时在转换RTCM数据时,还要设置采集的时间,建议先转移动站数据,得到时间。转换数据OK后,就可以打开RTKPOST加载数据,作后处理定位了,如下图所示:后处理定位前,先设置定位模式,其各项设置参考下列三个图片:选择Moving-Base模式,即流动站-基站;笔者的数据只有L1的,所以Frequencies选L1;SolutionType可以任意,这里先前向;仰角这里采用默认值15度;等等;采用默认设置,如下:设置输出数据格式,这里采用默认值:后处理成功后,定位结果如下图所示:经纬度平面图,如下所示:RTKLIB:免费的GNSS定位开源软件发布时间:2012-11-2811:14:53RTKLIB是一个开放源码的程序包,供标准与精确GNSS全球导航卫星系统用。RTKLIB包括一个可移植的程序库和几个应用程序(AP)库。RTKLI
本文标题:rtklib学习心得
链接地址:https://www.777doc.com/doc-6102621 .html