本文是 RTKLlib详解 系列文章的一篇,目前该系列文章还在持续总结写作中,以发表的如下,有兴趣的可以翻阅。
[学习] RTKlib详解:功能、工具与源码结构解析
[学习]RTKLib详解:pntpos.c与postpos.c
[学习]RTKLib详解:rtkcmn.c与rtkpos.c
[学习]RTKLib详解:ppp.c与ppp_ar.c
[学习]RTKLib详解:ephemeris.c与rinex.c
[学习]RTKLib详解:sbas.c与rtcm.c
[学习]RTKLib详解:rtksvr.c与streamsvr.c
[学习]RTKLib详解:convkml.c、convrnx.c与geoid.c
[学习]RTKLib详解:datum.c、download.c与lambda.c
[学习]RTKLib详解:ionex.c、options.c与preceph.c
[学习] RTKLib详解:qzslex.c、rcvraw.c与solution.c
Part A : rtksvr
–
一、整体作用与工作流程分析
rtksvr.c是RTK(实时动态定位)服务器的核心模块,负责处理多源输入数据(如观测值、星历、SSR修正等),执行实时动态差分定位解算,并输出高精度定位结果。其工作流程如下:
- 数据输入:通过多个流(
stream)接收原始观测数据、星历、SSR修正等。 - 数据解码:调用
decoderaw解析原始数据或RTCM格式数据,提取观测值、星历等信息。 - 状态更新:通过
updatesvr更新服务器状态,包括导航数据、天线位置、SSR修正等。 - 定位解算:利用RTK算法(如双差载波相位处理)计算移动站位置。
- 结果输出:通过
writesol将解算结果写入输出流,并保存至缓冲区或监控端口。
二、函数详细说明
1. writesolhead:写入解算结果头部
- 功能:生成并写入解算结果的头部信息(如坐标系、时间格式)。
- 参数:
stream_t *stream:输出流指针。solopt_t *solopt:解算选项(如输出格式)。
- 流程:调用
outsolheads生成头部数据,通过strwrite写入流。
2. saveoutbuf:保存输出缓冲区
- 功能:将解算结果存入环形缓冲区,支持多线程安全。
- 参数:
rtksvr_t *svr:RTK服务器结构体。unsigned char *buff:待保存的数据缓冲区。int n:数据长度。int index:缓冲区索引(区分不同输出流)。
- 关键操作:加锁(
rtksvrlock)后复制数据至svr->sbuf[index],更新缓冲区指针nsb。
3. writesol:输出解算结果
- 功能:将定位结果写入输出流,并保存至缓冲区和监控端口。
- 参数:
rtksvr_t *svr(服务器状态)、int index(流索引)。 - 流程:
- 调用
outsols生成标准解算结果,outsolexs生成扩展结果。 - 通过
strwrite写入流,并调用saveoutbuf保存数据。 - 监控端口输出使用简化格式(
solopt_default)。
- 调用
4. updatenav:更新导航数据波长
- 功能:计算卫星信号的波长( λ \lambda λ),用于载波相位解算。
- 数学原理:波长公式为 λ = c / f \lambda = c / f λ=c/f,其中 c c c为光速, f f f为频率。
- 参数:
nav_t *nav(导航数据结构体)。 - 实现:遍历所有卫星和频率,调用
satwavelen计算波长并更新nav->lam。
5. updatefcn:更新GLONASS频率信道
- 功能:同步不同数据流中的GLONASS卫星频率信道号(
frq)。 - 参数:
rtksvr_t *svr。 - 流程:遍历GLONASS卫星,从任意流中获取有效
frq,更新其他流的导航数据。
6. updatesvr:更新服务器状态
- 功能:根据解码结果更新导航数据、观测值、SSR修正等。
- 参数:
rtksvr_t *svr:服务器状态。ret:数据类型标识(如1=观测值,2=星历)。obs_t *obs:观测数据结构体。nav_t *nav:导航数据结构体。
- 关键逻辑:
- 观测值:筛选有效数据并排序。
- 星历:更新GPS/GLONASS星历,确保时效性。
- SSR修正:检查轨道与钟差IOD一致性,避免数据冲突。
7. decoderaw:解码原始数据
- 功能:解析原始数据或RTCM消息,提取观测值、星历等信息。
- 参数:
rtksvr_t *svr、int index(流索引)。 - 返回:解码结果状态(如1=观测值解码成功)。

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



