MATLAB 默认采用双精度进行数据计算,在使用MATLAB时也不会注意到每个变量的具体类型。最近用MATLAB跑捷联惯导静态仿真时却出现了问题。
首先用光纤惯导在静止条件采集了6000s以上的数据:
然后利用惯导数据进行惯导解算,得到的解算结果如下图:
虽然存在明显的姿态和速度误差,但是位置输出却没有误差。然后我又换用严老师的捷联惯导工具箱做惯导解算,结果得到的速度误差相同,位置误差同样为0。
为了查明原因,在姿态更新函数insupdate中位置更新部分中断检查。函数源码如下:
function [ qnb, vn, pos, eth ] = insupdate( qnb, vn, pos, wm, vm, ts )
% 纯惯导更新函数
% 输入:qnb 姿态四元数, vn 速度, pos 位置(纬经高), wm 陀螺角增量, vm速度增量, ts采样周期
nn = size(wm,1); nts = nn*ts;
[phim, dvbm] = cnscl([wm, vm],1);
eth = earth(pos, vn);
vn1 = vn + rv2m(-eth.wnin*nts/2)*qmulv(qnb, dvbm) + eth.gcc*nts;
vn = (vn+vn1)/2;
pos = pos + [vn(2)/eth.RMh; vn(1)/eth.clRNh; vn(3)]*nts; vn = vn1;
qnb = qmul(rv2q(-eth.wnin*nts), qmul(qnb, rv2q(phim)));
qnb = qnormlz(qnb);
end
惯导解算中,位置增量[vn(2)/eth.RMh;vn(1)/eth.clRNh;vn(3)]*nts并不为零,但是位置向量pos在加上位置增量后却依然是0。检查发现位置增量是“3×1 single 列向量”,速度向量vn也是单精度。在位置更新前加入“vn = double(vn)”后得到的导航解算结果如下:
位置误差已经正常,但是解算速度也变慢了。
位置增量大约是10^-10量级,即使使用单精度存储数据,也不应当直接按0处理,虽然解决了这个问题,但是还不清楚具体的原因。