PSINS-VC60代码移植到STM32单片机
1.代码管理
PSINS源代码使用VC6.0编写,可以使用CMAKE对代码进行管理,在Windows平台下,可以使用MINGW或MSVC编译代码,通过编写CMakeLists.txt文件来链接代码(最基础的三行即可实现对PSINSC++代码的链接,或者参考KF-GINS的写法),编译器使用VSCODE即可。
2.代码结构
2.1 主函数入口Main_SinsGps.cpp
PSINS主函数内容比较简单,主要实现文件的读取,Demo的调用和卡尔曼滤波函数的调用。
2.2 核心函数库部分PSINS.h与PSINS.cpp
这一部分是PSINS C++代码的核心,包括对全局变量的定义,定义三维向量函数和矩阵函数、四元数函数等,也包括辅助数据处理类函数如Allan方差法统计序列的方差,同时定义了初始对准如凝固系对准法、GNSS速度辅助对准等,卡尔曼滤波函数与组合导航函数以及文件读写函数也包含在内,这一部分是将PSINS移植和调用的关键。
2.3 卡尔曼滤波函数KFApp.h与KFApp.cpp
这一部分定义了卡尔曼滤波函数及其实现
2.4 串口函数SerialPort.h与SerialPort.cpp
2.5 示例Demo
包含丰富的Demo示例
函数移植
如果想将PSINS移植到STM32单片机平台,需要创建C++的STM32代码,为了省去前期配置单片机的时间可以将配置好的.ioc文件复制到新创建的工程中,生成代码即可,编写代码过程中注意将C++头文件命名为.hpp将C++源文件命名为.cpp,并将main.c重命名为main.cpp。
问题1:C/C++混合编译
C/C++混合编译,使用g++编译器进行编译,如果不加以区分,由于C++编译器会对C++函数名称进行改写,而不会对C函数进行改写,因此会出现链接错误,为了解决这个问题可以在C函数头文件中使用extern “C”,使得g++编译器在遇到C文件时还是以C的方式去编译链接函数。
问题2:路径包含问题
对于从外部直接粘贴过来的源代码程序或文件夹,需要手动将源文件的地址包含在其他需要调用此程序的路径中,如果勾选了上方的Exclude resource from build , 则该源码不会被编译,如果需要调用该源码内容会出现链接错误。
问题3:CubeMX自动生成代码导致的重定义问题
CubeMX可以选择自动生成代码,如果又想自己接管这个函数的定义,就会出现函数重定义错误,需要在相应部分(NVIC->Genrate…)取消勾选。
问题4:波特率修改后不生效问题
修改波特率后,再次烧录程序发现没有生效,需要清理工程重新构建方可生效。