严老师的工具箱提供不仅提供Matlab版本方便大家学习,还提供了C++版本用于数据处理和嵌入式开发。虽然两者的程序结构不同,但是可以预见C++程序的计算速度会显著快于Matlab。因此在处理较大数据时,特别是涉及到组合导航时,使用C++是更好的选择。那在处理简单的纯惯性解算的时候,两者又有多大的差距呢?
在此之前写了一个基于MFC 的数据处理软件,但是UI更新会影响计算效率,所以重新编写一个控制台程序。用XzyGraphics做了一个简单的交互UI,写一些小工具XzyGraphics还是挺方便的,但是之后还是想找一个开源的更完善的控制台界面的库。
C++,Windows,XzyGraphics图形库
新写的控制台应用程序,主要就是输入文件地址、采样时间、对准时间等参数,然后就执行导航解算。
处理特别大的文件时,不能直接将其导入到Matlab中,内存肯定是不够用的。只能用读文件的方式,按时间顺序读入IMU数据完成导航解算,再将结果写入到输出文件中。
start; % 初始化
ss = 2; % 子样数
ts = 0.01; % 采样时间
filename = 'navdata.bin'; % IMU数据文件名
att0 = [0;0;0].*glv.deg; % 初始姿态
vel0 = [0;0;0]; % 初始速度
pos0 = posset([34,108,400]); % 初始位置
avp = avpset(att0, vel0, pos0); % avp向量初始化
qnb = a2qua(att0); % 四元数初始化
fpimu = fopen(filename,'rb'); % 打开输入文件
fpres = fopen('navResult.bin','wb'); % 打开输出文件
while ~feof(fpimu)
imu = reshape(fread(fpimu, ss*7, 'double'), 7,[])'; % 读取IMU数据
if isempty(imu), break; end
[qnb, avp(4:6), avp(7:9), eth] = insupdatePlus(qnb, avp(4:6), avp(7:9), imu(:,1:3), imu(:,4:6), ts);
avp(1:3) = q2att(qnb);
fwrite(fpres, avp, 'double'); % 输出解算结果
end
fclose(fpimu); % 关闭文件
fclose(fpres);
用2h的静态数据(100Hz)测试两种程序的运行速度,得到每小时IMU数据的处理时间:
程序 | 100Hz数据 | 400Hz数据 |
Matlab | 13.5s/h | 54s/h |
C++ | 6.5s/h | 26s/h |
从这个测试来看,在进行纯惯性导航解算的时候,使用C++程序差不多可以比Matlab节省一半的时间。现在笔记本的内存都是16G以上,如果是一天的导航数据,用Matlab处理方便一些,虽然计算时间多一些,但是数据在工作空间中,分析数据和画图会方便很多。处理长航时的数据还是建议用C++。