KF-GINS分析报告(By GPT3.5)
KF-GINS源代码:
https://github.com/i2Nav-WHU/KF-GINS
接下来请你逐文件分析下面的工程
[0/16] 请对下面的程序文件做一个概述: .\KF-GINS-main\src\common\angle.h
该文件是一个C++头文件,用于定义角度转换的常量和函数。
文件首先定义了两个常量:D2R表示角度转弧度的比例(即π/180),R2D表示弧度转角度的比例(即180/π)。
接下来定义了一个名为Angle的类,其中定义了四个静态函数:rad2deg和deg2rad实现弧度与角度之间的转换,rad2deg和deg2rad还有两个形参为Eigen矩阵的函数,可以将相应的矩阵中的每个元素进行弧度-角度或角度-弧度的转换。
最后,文件使用了头文件保护,防止多次包含。
[1/16] 请对下面的程序文件做一个概述: .\KF-GINS-main\src\common\earth.h
这个程序文件定义了一个名为 Earth
的类,包含了一些地球相关的函数和常数。
其中,成员函数有:
gravity
: 计算在某个地点下的正常重力加速度值。meridianPrimeVerticalRadius
: 计算子午圈半径和卯酉圈半径。RN
: 计算卯酉圈半径。cne
: 计算从导航坐标系到地心地固坐标系的转换矩阵。qne
: 计算从导航坐标系到地心地固坐标系的转换四元数。blh
: 从导航坐标系到地心地固坐标系转换四元数得到纬度和经度。blh2ecef
: 大地坐标(纬度、经度和高程)转地心地固坐标。ecef2blh
: 地心地固坐标转大地坐标。DRi
: n系相对位置转大地坐标相对位置。DR
: 大地坐标相对位置转n系相对位置。local2global
: 局部坐标(在origin处展开)转大地坐标。global2local
: 大地坐标转局部坐标(在origin处展开)。local2global
: 局部坐标(在origin处展开)转大地坐标和旋转矩阵。global2local
: 大地坐标和旋转矩阵转局部坐标(在origin处展开)。iewe
: 地球自转角速度投影到e系。iewn
: 地球自转角速度投影到n系。iewn
: n系相对于e系转动角速度投影到n系。
该类中定义的常数有:
- WGS84_WIE: 地球自转角速度。
- WGS84_F: 扁率。
- WGS84_RA: 长半轴a。
- WGS84_RB: 短半轴b。
- WGS84_GM0: 地球引力常数。
- WGS84_E1: 第一偏心率平方。
- WGS84_E2: 第二偏心率平方。
[2/16] 请对下面的程序文件做一个概述: .\KF-GINS-main\src\common\logging.h
该程序文件是一个头文件,名为“logging.h”,它提供了一个Logging类,该类的主要作用是:
- 初始化glog日志系统;
- 定义了一些宏,如LOGI、LOGW、LOGE、LOGF和DLOGI等,用于生成日志;
- 定义了一些打印和格式化输出函数,如printMatrix()和doubleData(),用于将矩阵和浮点型数据转成字符串格式;
具体地,该程序文件包含以下部分:
- 头文件和命名空间的声明;
- 日志输出宏定义;
- Logging类的定义;
- Logging类的成员函数定义;
总之,该程序文件的主要功能是:提供了日志输出、矩阵打印和浮点型数据格式化输出等功能,它是一个通用的、方便的日志输出工具库。
[3/16] 请对下面的程序文件做一个概述: .\KF-GINS-main\src\common\rotation.h
本程序文件为C++头文件,文件名为”rotation.h”。该文件定义了一个名为”Rotation”的类,其中包含多个静态方法,用于进行矩阵和四元数的转换、欧拉角和矩阵之间的转换、向量的叉积运算等操作。具体方法如下:
- matrix2quaternion():将旋转矩阵转换为四元数;
- quaternion2matrix():将四元数转换为旋转矩阵;
- matrix2euler():将旋转矩阵转换为欧拉角(ZYX顺序,前右下的IMU);
- quaternion2euler():将四元数转换为欧拉角(ZYX顺序,前右下的IMU);
- rotvec2quaternion():将旋转向量转换为四元数;
- quaternion2vector():将四元数转换为旋转向量;
- euler2matrix():将欧拉角转换为旋转矩阵(ZYX顺序);
- euler2quaternion():将欧拉角转换为四元数;
- skewSymmetric():计算向量的叉积矩阵;
- quaternionleft():计算四元数的左乘矩阵;
- quaternionright():计算四元数的右乘矩阵。
头文件中调用了Eigen库中的矩阵和向量运算相关函数。此外,该头文件还包含GNU通用公共许可证的声明。
[4/16] 请对下面的程序文件做一个概述: .\KF-GINS-main\src\common\types.h
该程序文件common\types.h定义了三种数据类型:GNSS、IMU和Pose,它们分别表示全球导航卫星系统数据、惯性测量单元数据和姿态数据。这些结构体分别包含不同的成员变量,用于表示每个数据类型所需要的信息。在GNSS和IMU结构体中,time表示时间戳,blh和std表示位置和标准差,dtheta和dvel表示角速度和线性速度,odovel表示原始的速度。在Pose结构体中,R表示旋转矩阵,t表示平移向量。此外,该程序文件还引用了Eigen库中的一些类型,使用了typedef关键字定义了新的类型名,简化了代码的书写。
[5/16] 请对下面的程序文件做一个概述: .\KF-GINS-main\src\fileio\filebase.h
这是一个C++程序文件,文件名为fileio\filebase.h。该文件定义了一个FileBase类,用于文件读写操作。该类具有以下成员函数:
- 构造函数:默认构造函数。
- 析构函数:类的析构函数。
- close():关闭文件操作函数。
- isOpen():判断文件是否打开函数。
- isEof():判断文件是否到达文件结尾函数。
- fstream():获取文件流函数。
- columns():返回文件列数函数。
该类还具有以下成员变量:
- filefp_:文件指针。
- filetype_:文件类型,TEXT或BINARY。
- columns_:文件列数。
该文件的主要作用是封装了文件操作函数,方便其他文件调用。
[6/16] 请对下面的程序文件做一个概述: .\KF-GINS-main\src\fileio\fileloader.h
该程序文件是一个头文件,文件名为fileloader.h。
该文件定义了一个FileLoader类,它继承自FileBase类。FileLoader类的主要作用是读取和加载包含数据的文件。该类中包含了以下公共成员函数:
- 构造函数:用于创建FileLoader对象。
- open()函数:用于打开指定的文件并设置读取所需的列数和文件类型。
- load()函数:用于加载一个连续的数据块。
- loadn()函数:用于加载包含多个数据块的文件。
- load()函数:用于从指定的文件中加载数据到指定的向量中。
- loadn()函数:用于从指定的文件中加载多个数据块到指定的二维向量中。
FileLoader类中还包含了一个私有成员函数load_(),它用于实际执行文件的读取操作。它还包含一个私有成员变量data_,用于暂存载入的数据块。
整个文件的注释中介绍了文件的版权信息和GNU通用公共许可证的使用条款。
[7/16] 请对下面的程序文件做一个概述: .\KF-GINS-main\src\fileio\filesaver.h
该程序文件定义了一个名为FileSaver的类,它是FileBase类的子类。该类提供了打开文件、将数据写入文件的功能。这个类被用于数据的保存。程序使用C++语言编写,依赖于fstream、string和vector标准库,以及absl库中的absl::strings::string_view类。该文件定义的类以文件流的方式,将数据以文本或二进制的格式写入到本地磁盘文件。其中,dump函数将一维向量写入文件,dumpn函数将二维向量写入文件。
[8/16] 请对下面的程序文件做一个概述: .\KF-GINS-main\src\fileio\gnssfileloader.h
该程序文件是一个基于C++语言的头文件,名为gnssfileloader.h,主要用于读取GNSS文件的内容。文件中定义了一个GnssFileLoader类,该类继承自FileLoader类,并且实现了一个读取下一个GNSS数据的成员函数next()。这个函数将数据加载到data_这个vector中,然后将gnss_这个结构体赋值并返回。文件中还定义了一个构造函数,该函数接受文件名和列数,然后以文本方式打开。从文件中读取的数据包含了24小时内GNSS的位置坐标和速度信息。
[9/16] 请对下面的程序文件做一个概述: .\KF-GINS-main\src\fileio\imufileloader.h
该程序文件名为imufileloader.h,定义了一个名为ImuFileLoader的类,继承了FileLoader类,用于从文本或二进制文件中加载IMU(惯性测量单元)数据。类中包含了构造函数、next()方法、starttime()方法和endtime()方法。
构造函数ImuFileLoader的作用是打开给定文件名的文件,存储文件的类型(文本文件或二进制文件)、每一行包含的数据的数量以及采样率。然后根据采样率计算采样时间dt。
next()方法读取数据文件中的下一行,并将其解析为IMU对象。该方法还会计算两个IMU时间之间的dt,并将其存储到IMU对象的dt成员变量中。如果IMU时间间隔大于0.1秒,则IMU对象的dt将被设置为dt_。如果数据文件存在第8个元素,则将其存储至IMU对象的odovel成员变量中。
starttime()方法将文件读取指针移到文件开头并返回第一行数据的时间戳。
endtime()方法将文件读取指针移到文件结尾,并返回最后一行数据的时间戳。如果文件类型为文本文件,则通过读取回车符來确定最后一行的位置。
[10/16] 请对下面的程序文件做一个概述: .\KF-GINS-main\src\kf-gins\gi_engine.h
本程序文件名为”gi_engine.h”,属于KF-GINS程序包中的一个头文件,主要包含了GIEngine类的声明和定义。GIEngine是一个基于EKF(扩展卡尔曼滤波)的GNSS/INS(全球卫星定位系统/惯性导航系统)组合导航算法。其主要功能包括添加新的IMU(惯性测量单元)数据和GNSS(全球导航卫星系统)数据、处理新的IMU数据、内插IMU数据、获取当前时间、获取当前IMU状态、获取当前状态协方差等。其中,Kalman预测和Kalman更新是基于EKF的Kalman滤波过程。此外,还包括了一些辅助函数,例如IMU误差补偿、状态更新、协方差检查等。
[11/16] 请对下面的程序文件做一个概述: .\KF-GINS-main\src\kf-gins\insmech.h
该程序文件是一个C++头文件,名称为kf-gins\insmech.h。该文件定义了一个名为INSMech的C++类,其中包含用于计算内部机械组合(INS Mechanization)的静态函数。calculateInternalMechanization。该C++类定义了以下三个静态函数:posUpdate,velUpdate和attUpdate。每个函数都以两个IMU数据和前一秒的PVA状态作为输入,以及当前PVA状态作为输出。整体而言,程序文件实现了一个用于计算INS机械编排(INS Mechanization)的算法。
[12/16] 请对下面的程序文件做一个概述: .\KF-GINS-main\src\kf-gins\kf_gins_types.h
这是一个C++程序文件,命名为 kf_gins_types.h,主要包含一些结构体的定义。其中常用的结构体包括:
- Attitude:表示姿态,包含四元数、方向余弦矩阵和欧拉角;
- PVA:表示位置、速度和姿态,包含三个向量,其中姿态通过 Attitude 定义;
- NavState:表示导航状态,包含位置、速度、欧拉角和 IMU 误差;
- ImuError:表示 IMU 的误差偏差和比例因子误差;
- ImuNoise:表示 IMU 的噪声(角速度随机游走、加速度随机游走、陀螺仪偏差、加速度计偏差、陀螺仪比例因子误差、加速度计比例因子误差和时间相关项);
- GINSOptions:表示 GNSS/INS 导航系统的选项,包含初始状态和状态标准差、IMU 噪声参数、安装参数。
此外,该程序文件还包含了一些常数和函数定义。
[13/16] 请对下面的程序文件做一个概述: .\KF-GINS-main\src\kf_gins.cpp
本程序是一个基于扩展卡尔曼滤波(EKF)实现的GNSS/INS(全称为全球卫星导航系统/惯性导航系统)集成导航系统。该程序封装了一个GIEngine
类,其中实现了EKF滤波算法、导航状态更新、误差补偿等功能。该程序提供了一个接口,可以读取IMU数据和GNSS数据,并对其进行处理,输出导航状态估计结果和相关统计指标。
该程序包含一个主函数main
,在其中使用了Eigen
库(用于矩阵运算)和absl
库(用于计时和显示处理进度)等外部库。主函数首先读取一个YAML格式的配置文件,然后读取IMU数据和GNSS数据(从文件中读取),加载配置参数到GINSOptions
结构体中,并构造GIEngine
对象。然后,程序会设置输出文件的路径和格式,对数据进行对齐并进行数据处理,最终输出导航状态和相关统计信息。
程序中的loadConfig
函数用于读取配置文件,将相关参数存储在GINSOptions
结构体中,并将其转换为程序中所用的标准单位。writeNavResult
函数用于将导航状态保存到导航结果文件中,writeSTD
函数用于将协方差矩阵的标准差保存到相应的文件中。
[14/16] 请对下面的程序文件做一个概述: .\KF-GINS-main\src\kf-gins\gi_engine.cpp
该程序文件是一个基于扩展卡尔曼滤波器(EKF)的GNSS/INS集成导航系统的实现,文件名为”gi_engine.cpp”。该系统通过将GNSS和IMU测量数据融合,能够提供比单独使用GNSS或IMU更准确的导航状态估计。
该程序开始定义了一个名为”GIEngine”的类,其构造函数接收系统设置选项,并设置了一些初始值和协方差矩阵,以及对系统噪声阵的初始化。实现了一个名为”initialize”的函数,对位置、速度、姿态和IMU误差等进行了初始化。接下来的”newImuProcess”函数是整个程序的核心部分,在该函数中,通过判断GNSS数据是否有效,决定是否更新GNSS导航状态并反馈系统状态,同时通过IMU测量值来计算系统状态的传播和协方差矩阵的更新。函数”imuCompensate”是用来补偿IMU中的误差,并将IMU数据传递给函数”insPropagation”进行状态传播。最后一个函数”insPropagation”实现了状态转移矩阵、传播噪声矩阵、噪声驱动矩阵的初始化,并通过机械编排算法计算IMU的状态更新和姿态误差的传播,从而更新状态及协方差矩阵。
该程序实现了对GNSS/INS融合导航的基本功能,为GNSS和IMU测量值的有效融合提供了一种方法。
[15/16] 请对下面的程序文件做一个概述: .\KF-GINS-main\src\kf-gins\insmech.cpp
该程序文件为KF-GINS(基于EKF的GNSS/INS集成导航系统)的一个部分,实现了INS机械部分的三个主要步骤:速度更新,位置更新和姿态更新。在速度更新中,根据比力积分项和重力/哥式积分项更新速度;在位置更新中,根据速度外推至中间时刻再更新位置;在姿态更新中,根据速度更新求得中间时刻的速度和位置,然后计算旋转四元数,对姿态矩阵进行更新。
该程序文件涉及多个子函数和矩阵计算,其中一些重要部分包括:
- 比力积分项对速度的更新
- 速度与位置的外推
- 地理参数(如子午圈和卯酉圈半径)的计算
- 重力/哥式积分项对速度的更新
- 姿态矩阵和旋转四元数的计算
这些计算实现了IMU测量的处理和导航计算的关键步骤。
根据以上你自己的分析,对程序的整体功能和构架做出概括。然后用一张markdown表格整理每个文件的功能(包括common\angle.h, common\earth.h, common\logging.h, common\rotation.h, common\types.h, fileio\filebase.h, fileio\fileloader.h, fileio\filesaver.h, fileio\gnssfileloader.h, fileio\imufileloader.h, kf-gins\gi_engine.h, kf-gins\insmech.h, kf-gins\kf_gins_types.h, kf_gins.cpp, kf-gins\gi_engine.cpp, kf-gins\insmech.cpp)。
程序整体功能设计
该程序是一个基于GNSS/INS融合的导航系统,能够读取GNSS和IMU数据,将两者融合计算出导航状态并输出到文件中。整体构架分为两个部分:
- 位于common文件夹下的头文件用于提供一些基础的数学工具函数和数据类型定义等。
- 位于fileio和kf-gins文件夹下的源文件用于提供数据的输入输出和GNSS/INS导航系统的计算和实现。
文件功能汇总
文件名 | 功能 |
---|---|
angle.h | 提供弧度和角度互相转换的函数。 |
earth.h | 提供地球的相关参数定义,如自转角速度,长半轴短半轴,引力常数等。 |
logging.h | 提供日志输出、矩阵打印和浮点型数据格式化输出等功能。 |
rotation.h | 提供一些旋转矩阵计算的函数。 |
types.h | 定义了程序中使用的一些基础数据类型和常量。 |
filebase.h | 封装了文件操作函数,方便其他文件调用。 |
fileloader.h | 读取文件,并将数据保存至内存中。 |
filesaver.h | 将内存中的数据保存为文件。 |
gnssfileloader.h | 读取GNSS数据文件。 |
imufileloader.h | 读取IMU数据文件。 |
gi_engine.h | 实现了GNSS/INS导航引擎的初始化和协方差计算。 |
insmech.h | 实现了将IMU测量值解算为PVA状态的机械编排算法。 |
kf_gins_types.h | 定义了用于GNSS/INS导航系统的选项,包括初始状态和状态标准差、IMU噪声参数、安装参数等。 |
kf_gins.cpp | 主函数,读取配置文件并执行GNSS/INS导航系统。 |
gi_engine.cpp | 实现了GNSS/INS导航引擎的函数。 |
insmech.cpp | 实现了机械编排算法。 |
文章出处登录后可见!