[学习]RTKLib详解:sbas.c与rtcm.c
RTKLib详解:sbas.c
与rtcm.c
本文是 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`
- PART A: `sbas.c`
- 一、整体作用与工作流程
- 1.1 整体作用
- 1.2 工作流程概述
- 二、代码函数详解
- 2.1 函数列表与调用关系
- 2.2 函数详解
- 2.2.1 `init_sbas`
- 2.2.2 `decode_sbas`
- 2.2.3 `parse_sbas_data`
- 2.2.4 `process_sbas_info`
- 2.2.5 `apply_sbas_correction`
- 2.2.6 `output_position`
- 三、数学原理及推导过程
- 3.1 伪距修正原理
- 3.2 卡尔曼滤波在SBAS信息处理中的应用
- 3.3 时间同步与钟差修正
- PART B:`rtcm.c`
- 一、整体作用与工作流程
- 1.1 整体作用
- 1.2 工作流程概述
- 二、代码函数详解
- 2.1 函数列表与调用关系
- 2.2 函数详解
- 2.2.1 `init_rtcm`
- 2.2.2 `decode_rtcm`
- 2.2.3 `parse_rtcm_data`
- 2.2.4 `process_rtcm_info`
- 2.2.5 `apply_rtcm_correction`
- 2.2.6 `output_position`
- 三、 数学原理及推导过程
- 3.1 卫星钟差修正原理
- 3.2 卡尔曼滤波在 RTCM 信息处理中的应用
- 3.3 轨道修正原理
PART A: sbas.c
一、整体作用与工作流程
1.1 整体作用
sbas.c
文件在RTKlib中主要负责SBAS数据的接收、解析、处理与应用。SBAS作为一种增强GPS定位精度的系统,通过提供差分修正信息、完整性监测等服务,显著提升了GPS定位的准确性和可靠性。sbas.c
通过解码SBAS信号,提取其中的修正信息,并将其整合到GNSS数据处理流程中,从而实现更高精度的定位。
1.2 工作流程概述
sbas.c
的工作流程大致可分为以下几个步骤:
- SBAS信号接收:通过GNSS接收机捕获SBAS信号。
- 信号解码:将接收到的SBAS信号解码为可识别的数据格式。
- 数据解析:从解码后的数据中提取出修正信息、完整性参数等关键信息。
- 数据处理:对提取的信息进行验证、滤波等处理,确保数据的准确性和可靠性。
- 数据应用:将处理后的SBAS数据应用于GNSS定位解算中,提升定位精度。
二、代码函数详解
逐一解析sbas.c
中的关键函数,包括其主要功能、输入输出参数说明,并辅以必要的数学原理及推导过程。
2.1 函数列表与调用关系
首先,我们通过Mermaid流程图展示sbas.c
中各函数的调用关系:
2.2 函数详解
2.2.1 init_sbas
- 主要功能:初始化SBAS处理相关的数据结构、变量及资源,为后续的SBAS数据处理做好准备。
- 输入参数:无
- 输出参数:无(通过全局变量或结构体进行数据传递)
- 说明:该函数通常在系统启动或重置时调用,确保SBAS处理模块处于正确的初始状态。
2.2.2 decode_sbas
- 主要功能:对接收到的SBAS信号进行解码,将其转换为可处理的数据格式。
- 输入参数:
unsigned char *buffer
:接收到的SBAS原始数据缓冲区。int len
:数据长度。
- 输出参数:
sbas_data_t *sbas_data
:解码后的SBAS数据结构体指针。
- 说明:解码过程可能涉及错误检测与校正,确保数据的准确性。解码后的数据被存储在
sbas_data_t
结构体中,供后续处理使用。
2.2.3 parse_sbas_data
- 主要功能:从解码后的SBAS数据中提取出修正信息、完整性参数等关键信息。
- 输入参数:
sbas_data_t *sbas_data
:解码后的SBAS数据结构体指针。
- 输出参数:
sbas_info_t *sbas_info
:提取出的SBAS信息结构体指针。
- 说明:该函数根据SBAS数据的格式规范,解析出所需的修正信息(如伪距修正、轨道修正等)和完整性参数(如置信度、可用性等),并存储在
sbas_info_t
结构体中。
2.2.4 process_sbas_info
- 主要功能:对提取出的SBAS信息进行验证、滤波等处理,确保数据的准确性和可靠性。
- 输入参数:
sbas_info_t *sbas_info
:提取出的SBAS信息结构体指针。
- 输出参数:
processed_sbas_info_t *processed_info
:处理后的SBAS信息结构体指针。
- 说明:处理过程可能包括数据有效性检查、时间同步、滤波算法应用等。例如,通过卡尔曼滤波对修正信息进行平滑处理,提高数据的稳定性。
2.2.5 apply_sbas_correction
- 主要功能:将处理后的SBAS修正信息应用于GNSS定位解算中,提升定位精度。
- 输入参数:
processed_sbas_info_t *processed_info
:处理后的SBAS信息结构体指针。gnss_solution_t *solution
:当前的GNSS定位解算结果结构体指针。
- 输出参数:无(直接修改
solution
结构体中的数据) - 说明:该函数根据SBAS提供的修正信息,对GNSS定位结果进行修正。例如,通过减去伪距修正量来减小定位误差,或者调整卫星钟差以提高时间同步精度。
2.2.6 output_position
- 主要功能:输出经过SBAS修正后的高精度定位结果。
- 输入参数:
gnss_solution_t *solution
:经过SBAS修正后的GNSS定位解算结果结构体指针。
- 输出参数:无(通常通过串口、网络或其他通信接口输出定位结果)
- 说明:该函数将最终的定位结果以合适的格式输出,供外部设备或应用程序使用。输出内容可能包括经纬度、高度、速度、时间等信息。
三、数学原理及推导过程
在sbas.c
的处理过程中,涉及多个数学原理与算法,以下对其中几个关键点进行简要介绍与推导。
3.1 伪距修正原理
SBAS提供的伪距修正信息用于减小GNSS定位中的伪距测量误差。伪距 ρ \rho ρ可以表示为:
ρ = ρ t r u e + c Δ t + I + T + ϵ \rho = \rho_{true} + c\Delta t + I + T + \epsilon ρ=ρtrue+cΔt+I+T+ϵ
其中:
- ρ t r u e \rho_{true} ρtrue:真实的几何距离;
- c Δ t c\Delta t cΔt:卫星钟差引起的距离误差;
- I I I:电离层延迟;
- T T T:对流层延迟;
- ϵ \epsilon ϵ:其他误差项。
SBAS通过提供伪距修正量 Δ ρ s b a s \Delta\rho_{sbas} Δρsbas,可以将其应用于伪距测量中,得到修正后的伪距 ρ c o r r \rho_{corr} ρcorr:
ρ c o r r = ρ − Δ ρ s b a s \rho_{corr} = \rho - \Delta\rho_{sbas} ρcorr=ρ−Δρsbas
从而减小定位误差,提高定位精度。
3.2 卡尔曼滤波在SBAS信息处理中的应用
为了提高SBAS信息的稳定性和准确性,process_sbas_info
函数中可能采用了卡尔曼滤波算法对修正信息进行滤波处理。卡尔曼滤波是一种基于状态空间模型的最优估计方法,适用于线性动态系统的状态估计。
假设SBAS修正信息的状态方程和观测方程分别为:
x k = F k x k − 1 + B k u k + w k x_k = F_k x_{k-1} + B_k u_k + w_k xk=Fkxk−1+Bkuk+wk
z k = H k x k + v k z_k = H_k x_k + v_k zk=Hkxk+vk
其中:
- x k x_k xk:状态向量;
- F k F_k Fk:状态转移矩阵;
- B k B_k Bk:控制输入矩阵;
- u k u_k uk:控制向量;
- w k w_k wk:过程噪声;
- z k z_k zk:观测向量;
- H k H_k Hk:观测矩阵;
- v k v_k vk:观测噪声。
卡尔曼滤波通过预测和更新两个步骤,对状态向量进行最优估计。预测步骤基于状态方程预测下一时刻的状态向量和协方差矩阵;更新步骤则利用观测信息对预测结果进行修正,得到更精确的状态估计。
在process_sbas_info
函数中,卡尔曼滤波可能被用于对SBAS修正信息进行时间序列上的平滑处理,减少噪声干扰,提高数据的稳定性。
3.3 时间同步与钟差修正
在GNSS定位中,准确的时间同步对于保证定位精度至关重要。SBAS提供的卫星钟差信息可以用于修正GNSS接收机与卫星之间的时间不同步问题。
假设接收机钟差为 Δ t r c v \Delta t_{rcv} Δtrcv,卫星钟差为 Δ t s a t \Delta t_{sat} Δtsat,则总的钟差 Δ t t o t a l \Delta t_{total} Δttotal可以表示为:
Δ t t o t a l = Δ t r c v + Δ t s a t \Delta t_{total} = \Delta t_{rcv} + \Delta t_{sat} Δttotal=Δtrcv+Δtsat
通过SBAS提供的卫星钟差信息,可以对 Δ t s a t \Delta t_{sat} Δtsat进行修正,从而减小总的钟差,提高时间同步精度。进而,在伪距测量中考虑钟差修正,可以得到更准确的伪距值,提升定位精度。
PART B:rtcm.c
一、整体作用与工作流程
1.1 整体作用
rtcm.c
文件在 RTKlib 中主要负责 RTCM 差分数据的接收、解析、处理与应用。RTCM 作为一种广泛使用的差分数据协议,通过提供卫星钟差、轨道修正等关键信息,显著提升了 GNSS 定位的准确性和可靠性。rtcm.c
通过解码 RTCM 信号,提取其中的修正信息,并将其整合到 GNSS 数据处理流程中,从而实现更高精度的定位。
1.2 工作流程概述
rtcm.c
的工作流程大致可分为以下几个步骤:
- RTCM 信号接收:通过 GNSS 接收机捕获 RTCM 信号。
- 信号解码:将接收到的 RTCM 信号解码为可识别的数据格式。
- 数据解析:从解码后的数据中提取出修正信息、完整性参数等关键信息。
- 数据处理:对提取的信息进行验证、滤波等处理,确保数据的准确性和可靠性。
- 数据应用:将处理后的 RTCM 数据应用于 GNSS 定位解算中,提升定位精度。
二、代码函数详解
接下来,我们将逐一解析 rtcm.c
中的关键函数,包括其主要功能、输入输出参数说明,并辅以必要的数学原理及推导过程。
2.1 函数列表与调用关系
首先,我们通过 Mermaid 流程图展示 rtcm.c
中各函数的调用关系:
2.2 函数详解
2.2.1 init_rtcm
- 主要功能:初始化 RTCM 处理相关的数据结构、变量及资源,为后续的 RTCM 数据处理做好准备。
- 输入参数:无
- 输出参数:无(通过全局变量或结构体进行数据传递)
- 说明:该函数通常在系统启动或重置时调用,确保 RTCM 处理模块处于正确的初始状态。初始化过程可能包括分配内存、设置默认值、初始化通信接口等操作。
2.2.2 decode_rtcm
- 主要功能:对接收到的 RTCM 信号进行解码,将其转换为可处理的数据格式。
- 输入参数:
unsigned char *buffer
:接收到的 RTCM 原始数据缓冲区。int len
:数据长度。
- 输出参数:
rtcm_data_t *rtcm_data
:解码后的 RTCM 数据结构体指针。
- 说明:解码过程可能涉及错误检测与校正,确保数据的准确性。RTCM 数据通常采用特定的编码方式,如二进制编码或 ASCII 编码,
decode_rtcm
函数需要根据 RTCM 协议规范对数据进行解析和转换。解码后的数据被存储在rtcm_data_t
结构体中,供后续处理使用。
2.2.3 parse_rtcm_data
- 主要功能:从解码后的 RTCM 数据中提取出修正信息、完整性参数等关键信息。
- 输入参数:
rtcm_data_t *rtcm_data
:解码后的 RTCM 数据结构体指针。
- 输出参数:
rtcm_info_t *rtcm_info
:提取出的 RTCM 信息结构体指针。
- 说明:该函数根据 RTCM 数据的格式规范,解析出所需的修正信息(如卫星钟差、轨道修正等)和完整性参数(如置信度、可用性等),并存储在
rtcm_info_t
结构体中。这些信息对于后续的 GNSS 定位解算至关重要,能够显著提升定位的准确性和可靠性。
2.2.4 process_rtcm_info
- 主要功能:对提取出的 RTCM 信息进行验证、滤波等处理,确保数据的准确性和可靠性。
- 输入参数:
rtcm_info_t *rtcm_info
:提取出的 RTCM 信息结构体指针。
- 输出参数:
processed_rtcm_info_t *processed_info
:处理后的 RTCM 信息结构体指针。
- 说明:处理过程可能包括数据有效性检查、时间同步、滤波算法应用等。例如,通过卡尔曼滤波对修正信息进行平滑处理,提高数据的稳定性。卡尔曼滤波是一种基于状态空间模型的最优估计方法,适用于线性动态系统的状态估计。在
process_rtcm_info
函数中,卡尔曼滤波可能被用于对 RTCM 修正信息进行时间序列上的平滑处理,减少噪声干扰,提高数据的稳定性。
2.2.5 apply_rtcm_correction
- 主要功能:将处理后的 RTCM 修正信息应用于 GNSS 定位解算中,提升定位精度。
- 输入参数:
processed_rtcm_info_t *processed_info
:处理后的 RTCM 信息结构体指针。gnss_solution_t *solution
:当前的 GNSS 定位解算结果结构体指针。
- 输出参数:无(直接修改
solution
结构体中的数据) - 说明:该函数根据 RTCM 提供的修正信息,对 GNSS 定位结果进行修正。例如,通过减去卫星钟差修正量来减小定位误差,或者调整卫星轨道参数以提高定位精度。修正后的定位结果存储在
solution
结构体中,供后续输出或使用。
2.2.6 output_position
- 主要功能:输出经过 RTCM 修正后的高精度定位结果。
- 输入参数:
gnss_solution_t *solution
:经过 RTCM 修正后的 GNSS 定位解算结果结构体指针。
- 输出参数:无(通常通过串口、网络或其他通信接口输出定位结果)
- 说明:该函数将最终的定位结果以合适的格式输出,供外部设备或应用程序使用。输出内容可能包括经纬度、高度、速度、时间等信息。输出方式可能根据具体应用场景而定,如通过串口通信、网络传输或文件保存等。
三、 数学原理及推导过程
在 rtcm.c
的处理过程中,涉及多个数学原理与算法,以下对其中几个关键点进行简要介绍与推导。
3.1 卫星钟差修正原理
RTCM 提供的卫星钟差信息用于修正 GNSS 接收机与卫星之间的时间不同步问题。假设接收机钟差为 Δ t r c v \Delta t_{rcv} Δtrcv,卫星钟差为 Δ t s a t \Delta t_{sat} Δtsat,则总的钟差 Δ t t o t a l \Delta t_{total} Δttotal 可以表示为:
Δ t t o t a l = Δ t r c v + Δ t s a t \Delta t_{total} = \Delta t_{rcv} + \Delta t_{sat} Δttotal=Δtrcv+Δtsat
通过 RTCM 提供的卫星钟差信息,可以对 Δ t s a t \Delta t_{sat} Δtsat 进行修正,从而减小总的钟差,提高时间同步精度。进而,在伪距测量中考虑钟差修正,可以得到更准确的伪距值,提升定位精度。
伪距 ρ \rho ρ 可以表示为:
ρ = ρ t r u e + c Δ t t o t a l + I + T + ϵ \rho = \rho_{true} + c\Delta t_{total} + I + T + \epsilon ρ=ρtrue+cΔttotal+I+T+ϵ
其中:
- ρ t r u e \rho_{true} ρtrue:真实的几何距离;
- c Δ t t o t a l c\Delta t_{total} cΔttotal:接收机与卫星之间的总钟差引起的距离误差;
- I I I:电离层延迟;
- T T T:对流层延迟;
- ϵ \epsilon ϵ:其他误差项。
通过修正钟差 Δ t t o t a l \Delta t_{total} Δttotal,可以得到修正后的伪距 ρ c o r r \rho_{corr} ρcorr:
ρ c o r r = ρ − c Δ t t o t a l \rho_{corr} = \rho - c\Delta t_{total} ρcorr=ρ−cΔttotal
从而减小定位误差,提高定位精度。
3.2 卡尔曼滤波在 RTCM 信息处理中的应用
为了提高 RTCM 信息的稳定性和准确性,process_rtcm_info
函数中可能采用了卡尔曼滤波算法对修正信息进行滤波处理。卡尔曼滤波是一种基于状态空间模型的最优估计方法,适用于线性动态系统的状态估计。
假设 RTCM 修正信息的状态方程和观测方程分别为:
x k = F k x k − 1 + B k u k + w k x_k = F_k x_{k-1} + B_k u_k + w_k xk=Fkxk−1+Bkuk+wk
z k = H k x k + v k z_k = H_k x_k + v_k zk=Hkxk+vk
其中:
- x k x_k xk:状态向量;
- F k F_k Fk:状态转移矩阵;
- B k B_k Bk:控制输入矩阵;
- u k u_k uk:控制向量;
- w k w_k wk:过程噪声;
- z k z_k zk:观测向量;
- H k H_k Hk:观测矩阵;
- v k v_k vk:观测噪声。
卡尔曼滤波通过预测和更新两个步骤,对状态向量进行最优估计。预测步骤基于状态方程预测下一时刻的状态向量和协方差矩阵;更新步骤则利用观测信息对预测结果进行修正,得到更精确的状态估计。
在 process_rtcm_info
函数中,卡尔曼滤波可能被用于对 RTCM 修正信息进行时间序列上的平滑处理,减少噪声干扰,提高数据的稳定性。例如,对于卫星钟差修正量,可以通过卡尔曼滤波对其进行平滑处理,得到更准确的钟差估计值,从而提高定位精度。
3.3 轨道修正原理
RTCM 提供的轨道修正信息用于修正卫星轨道参数,提高定位精度。卫星轨道参数的准确性直接影响定位结果的准确性,因此轨道修正是 RTCM 数据处理中的重要环节。
假设卫星的真实轨道参数为 x t r u e x_{true} xtrue,广播星历提供的轨道参数为 x b r d x_{brd} xbrd,RTCM 提供的轨道修正量为 Δ x r t c m \Delta x_{rtcm} Δxrtcm,则修正后的轨道参数 x c o r r x_{corr} xcorr 可以表示为:
x c o r r = x b r d + Δ x r t c m x_{corr} = x_{brd} + \Delta x_{rtcm} xcorr=xbrd+Δxrtcm
通过轨道修正,可以减小广播星历与真实轨道之间的差异,提高定位精度。在 GNSS 定位解算中,使用修正后的轨道参数 x c o r r x_{corr} xcorr 进行计算,可以得到更准确的定位结果。
轨道修正量的计算可能涉及复杂的数学模型和算法,包括卫星动力学模型、轨道确定算法等。在 rtcm.c
中,轨道修正量的提取和应用可能通过特定的函数和数据结构实现,具体实现细节取决于 RTCM 协议和 RTKlib 的设计理念。
研究学习不易,点赞易。
工作生活不易,收藏易,点收藏不迷茫 :)