PSINS(高精度捷联惯导算法)

站内搜索

高精度定位定向系统后处理软件使用说明






高精度定位定向系统后处理软件(PSINS-POS)

使用说明V1.2












西北工业大学  严恭敏

2020.04.10




1.说明        

2.数据准备        

3.正反向滤波        

4.数据融合与结果查看        

5.致谢        





1.说明

1)本软件适用于捷联惯导/卫星的松组合导航正反向Kalman滤波后处理;

2)组合导航算法主体采用VC6.0 C++编写,配合Matlab\PSINS工具箱一起使用方便画图直观查看结果

3)具体算法细节和技术技巧可参考文献“捷联惯导算法与组合导航原理”、“传统组合导航中的实用Kalman滤波技术评述”。

2.数据准备

确保安装Matlab\PSINS工具箱

本软件的输入IMU/GNSS原始数据“\data\imugps.bin为二进制数据,15列double型,使\data\show_pos.mMatlab程序,查看如下

imugps = binfile('imugps.bin', 15);

imu = imugps(:,1:7); imuplot(imu)

idx = imugps(:,14)>0;

gps = [imugps(idx,8:14), imugps(idx,7)-imugps(idx,15)]; gpsplot(gps);

原始数据格式显示如下:

img1

图1

中,1-3列为陀螺角增量(rad),4-6列为加速度计速度增量(m/s),7列为IMU时间(s);8-10列为卫导E/N/U速度m/s,11-13列为卫导位置(纬/rad、高度m,14列卫星有效标志(0/1),15列同步时间差(s,dt=IMUt-GNSSt)。如果文件某行没有卫星信号,则该行只有IMU数据有值,而卫导数据全填0,数据文件虽存在很多无用的0信息,但该数据对其方式方便C++处理

画出IMU和GNSS原始数据图分别如下

img2

图2

img3

图3

图中“*”为GNSS-RTK非固定解结果。

3.正反向滤波

使用VC6.0打开PSINS.dsw工程文件,并设置合适的原始数据\data\imugps.bin所在文件路径、以及输出处理结果保存路径和文件名,如下图

img4

图4

后处理程序主体包含初始对准->正向Kalman滤波->反向Kalman滤波及融合三个过程。通过图2IMU数据查看,可选取前期静止时间段的数据初始对准,对准开始时确保GNSS定位数据有效

Kalman滤波状态选为34维,如下

img5

状态img6中各符号(分量序号)依次为失准角(1-3)、速度误差(4-6)、位置误差(7-9)、陀螺漂移(10-12)、加计偏值(13-15)、IMU/GNSS杆臂(16-18)、IMU/GNSS不同步时差(19)、陀螺标定误差(20-28)、加计标定误差(29-34)img7分别定义如下

img8

运行程序,窗口显示进度如下:

img9

5

后处理软件运行完成后,导航结果、滤波状态及均方误差信息默认存储文件“\data\posres.bin和“\data\fusion.bin

4.数据融合与结果查看

(1)Matlab融合

对正反向滤波结果进行融合采用简单的加权平均方法就行可由C++的正反向输出文件posres.bin通过Matlab处理。使用‘\data\show_pos.m中程序进行数据加载和融合如下

n = 34;

res = binfile('posres.bin', 21+n*2+6+3); len2 = length(res)/2;

avp = res(:,[1:21,end]); % insplot(avp(:,[1:15,end]));

avp1 = avp(1:len2,:);

avp2 = flipud(avp(len2+1:end,:)); avp2(:,[4:6,10:12,19])=-avp2(:,[4:6,10:12,19]);

xk = res(:,[22:21+n,end]);

xk1 = xk(1:len2,:);

xk2 = flipud(xk(len2+1:end,:)); xk2(:,[4:6,10:12,19])=-xk2(:,[4:6,10:12,19]);

pk = res(:,[22+n:21+2*n,end]);

pk1 = pk(1:len2,:);

pk2 = flipud(pk(len2+1:end,:));

avpf = [fusion(avp1(:,1:15), pk1(:,1:15), avp2(:,1:15), pk2(:,1:15), 1), avp1(:,end)];

完成融合后,将GNSS(蓝色)、正向滤波(红色)、反向滤波(洋红)、融合(黄色)四条平面轨迹画图如下

gps1 = avp1(avp1(:,19)>0.1, [16:21,end]);

pos2dplot(gps1(:,4:7), avp1(:,[7:9,end]), avp2(:,[7:9,end]), avpf(:,[7:9,end]));

img10

图6

图中大部分局部放大可以看出,黄色的融合结果总是在红色正向和洋红反向的中间,曲线更平滑,应该精度更高。

特别模拟700-1000s时段共300s的GNSS丢星,绘制正向、反向和融合三者与GNSS的位置误差,如下

avpcmpplot(gps1, avp1(:,[4:9,end]), avp2(:,[4:9,end]), avpf(:,[4:9,end]), 'vp');

img11

7

图中,点划线为正向Kalman滤波误差,长虚线为向误差,短虚线为融合误差。多数情况下“正向误差偏左,反向误差偏右,正反融合恰好左右相互抵消”,因而融合误差会比较小。可能得注意丢星的两端点融合有一些特殊需要处理的(容易解决)

量测噪声自适应结果

rk = res(:, [22+2*n:21+2*n+6,end]); rvpplot(rk);

img12

8

状态估计结果

inserrplot(xk, 'avpedltkgka')


img13

9

前15维状态进行了反馈校正,接近于零;而16-18分量杆臂和19维分量时间不同步没有反馈校正,所以显示有值不为零。注意杆臂估计值于C++中故意设置“kf.lvGPS = CVect3(1.0, 0.5, 0.5)”接近,改成其它值也可大概估计出来;时间不同步约14ms,说明IMU与GNSS本质不同步

img14

10

陀螺和加计标定误差估计结果不大,实际应用中如果惯导标定较好这些参数可以不列入状态,可降低Kalman滤波维数为19维。只需在KFApp.cpp文件“CKFApp::CKFApp(double ts):CSINSTDKF(34, 6)”语句中34改为19即可,非常简单,但注意输出文件“\data\kf.bin”的列数变化。

状态估计均方差

inserrplot([sqrt(pk(:,1:n)),pk(:,end)], 'avpedltkgka')


img15

11


img16

12

滤波状态显示:

st = res(:, [end-2,end]); st(len2+1:end,1) = st(len2+1:end,1)*2^10;

stateplot(st);


img17

13

图中state1/2/3表示东/北/天速度量测,4/5/6表示纬/经/高量测,大于10者为对应的反向滤波有量测

2C++直接融合

C++直接融合输出的文件为fusion.bin,将其与Matlab结果比较差别很小,如下图。

% show C++ fusion results

avpf1 = binfile('fusion.bin', 2*9+1); insplot(avpf1(:,[1:9,end]));

avpcmpplot(avpf(:,[4:9,end]), avpf1(:,[4:9,end]), 'vp');

img18

5.致谢

感谢立得空间信息技术公司提供IMU/GNSS样本数据,其中IMU光纤陀螺精度约为0.03°/h(200Hz);RTK-GNSS定位精度为厘米级(1Hz)








一套PSINS-POS算法程序在手

剩下的只是Kalman滤波器PQR调参了!!