Psins之 test_SINS_GPS_153代码解析

先大致理一下流程:

第一步:

用增量得到phim和dvbm,并减去加速度计和陀螺引起的误差

第二步:

计算得出ins.web和ins.wnb

第三步:

1.计算导航坐标系下的加速度,并更新vn1=ins.vn+ins.an*nts

2.进行位置更新,对用中值法对速度进行计算,得到位置变化量

3.姿态更新

第四步:

进行卡尔曼滤波,分为两种情况,第一种若没有或者没有合适的量测情况下,只进行滤波一步预测与预测误差协方差阵的计算:

若适合进行与观测值融合,那么进入剩下的三个公式。

 大致流程如上,但是最后一个第5个公式的代码不太明白:

 对于估计误差协方差阵,有以下几种表示:

-----------------------------------------------------------后续增加----------------------------------------------------------

当滤波完成后,后面还有一个限制Pk的操作:

Using Pmax&Pmin to constrain Pxk, such that Pmin<=diag(Pxk)<=Pmax;使Pk在一定的范围内。

滤波完成后,需要对进行滤波反馈:

进入: [kf, ins] = kffeedback(kf, ins, 1, 'avp');

我们直接看循环,循环前只做了把kf.xk的值传递给xfb_tmp;

 循环内做了用惯导计算出的值减去卡尔曼滤波估计出的姿态、速度、位置误差。

第一行代码:每次减完都需要把当前时刻的估计误差给扣除,也就是最后把姿态、速度、位置误差全部清零。

第二行:把每次的误差大小都叠加起来。

最后重新计算反馈后的姿态、速度、位置,把这个值作为惯导的值。退出滤波反馈函数。

剩下的就是记录并且画图了,不是重点。

等效旋转矢量基于泰勒级数展开的多字样算法推导大致如下:

首先假设角速度的形式

然后推导出连续形式下的角增量

最后消去a、b、T得到等效旋转矢量的表达。 

一般不优先考虑此方法,解释如下:


下面简单推导基于圆锥误差补偿的多字样算法,具体推导见严老师书2.6节:

 假设圆锥运动条件下的陀螺仪角速度:

 Ω为振动频率

经过一番推导得在tm-1和tm之间的等效旋转矢量近似表达式:

 然后对角速度积分得角增量:

 

 我们都是用角增量来代替旋转矢量,但是我们发现上述推导的角增量和旋转矢量在z轴上不同,因此,我们采用旋转矢量来进行姿态更新时会产生误差,且会随时间不断积累。这个误差表达如:

 后续推导过于复杂了,直接给出结论:

 补偿形式如下:

本文选择nn=1;也就是单子样。

代码主体为两部分:第一部分为惯导更新,第二步为卡尔曼滤波。

首先看insupdate

 cnscl函数为圆锥运动和划桨补偿:

 当为单子样时,应该是没有圆锥运动补偿的,dphim一直为[0,0,0];

下面进入划桨补偿:

根据书82页的公式:

 代码应该没有考虑等号右边最后一项有害加速度的计算,

对于等号右边第二项为比力速度增量也是比较复杂的,代码中dvbm由vmm当前时刻的速度增量,rotm和scullm构成。

rotm称为速度的旋转误差补偿量在书83页:

 scullm为划桨误差补偿量在n=1时,没有补偿。

 phim = ins.Kg*phim-ins.eb*nts; dvbm = ins.Ka*dvbm-ins.db*nts; 

 Kg和Ka应该是用来校正的,实际陀螺和加速度计并不是正交的,代码中都为1。

ins.eb和ins.db分别为陀螺常值偏置和加速度常值偏置。

下面进行外推:

imu更新时间为0.01s,单子样的nts=0.01;nts2=0.005;

速度更新、位置更新:根据前一时刻的速度和位置,外推得到nts时刻的速度、位置。得到区间中点的状态。

vn01 = ins.vn+ins.an*nts2; 
pos01 = ins.pos+ins.Mpv*vn01*nts2;

 Mpv形式如下:

 下面计算下列参数:

 在速度更新下:

根据枯荣有常大佬写的:

 只不过,我们这边的单子样没有划桨补偿,只有前两项。

下面把载体系下的比力转换到导航系下:

ins.fn = qmulv(ins.qnb, ins.fb);

 下面计算中间时刻去掉地球重力加速度的导航坐标系的加速度

ins.an = rotv(-ins.eth.wnin*nts2, ins.fn) + ins.eth.gcc;

ins.anbar = 0.9*ins.anbar + 0.1*ins.an;这个暂时不知道;

接下来用中间时刻的加速度来计算整个时间段的速度增量,得到当前时刻的速度,此方法应该叫中值法速度更新:

vn1 = ins.vn + ins.an*nts;

 接下来进行位置更新:

首先把导航系下的速度转换到经纬高为单位的速度

ins.Mpv(4)=1/ins.eth.RMh; ins.Mpv(2)=1/ins.eth.clRNh;
ins.Mpvvn = ins.Mpv*(ins.vn+vn1)/2;
ins.pos = ins.pos + ins.Mpvvn*nts;  

计算出中间时刻的速度,乘以时间求出经纬度位置的变化量,加上起始时刻的位置,得到当前时刻的位置。

下面进行的是姿态更新书80页:

这个是连续的,离散化的应该是左边为当前时刻的姿态,右边为载体系相对于惯性系的角增量和导航系相对于惯性系的角增量。

下面为用当前时刻的qnb对参数进行更新: 

[ins.qnb, ins.att, ins.Cnb] = attsyn(ins.qnb);
ins.avp = [ins.att; ins.vn; ins.pos];

上述完成了惯导的更新,下面进入了卡尔曼滤波部分

第一步构造连续状态下的Ft:

依据为严老师书P94页的误差方程:

 代码构造如下形式:

%%     fi     dvn    dpos    eb       db
Ft = [ Maa    Mav    Map    -ins.Cnb  O33 
       Mva    Mvv    Mvp     O33      ins.Cnb 
       O33    Mpv    Mpp     O33      O33
       zeros(6,9)  diag(-1./[ins.tauG;ins.tauA]) ];
%     Maa = [ 0,               ins.eth.wnin(3),-ins.eth.wnin(2); 
%            -ins.eth.wnin(3), 0,               ins.eth.wnin(1); 
%             ins.eth.wnin(2),-ins.eth.wnin(1), 0 ];
%     Mav = [ 0,       -f_RMh, 0;
%             f_RNh,    0,     0;
%             f_RNh*tl, 0,     0 ];
Map = Mp1+Mp2;

%     Mp1 = [ 0,               0, 0;
%            -ins.eth.wnie(3), 0, 0;
%             ins.eth.wnie(2), 0, 0 ];

%     Mp2 = [ 0,             0,  vN_RMh2;
%             0,             0, -vE_RNh2;
%             vE_clRNh*secl, 0, -vE_RNh2*tl];



%     Mva = [ 0,         -ins.fn(3),   ins.fn(2);                   
%             ins.fn(3),  0,           -ins.fn(1);
%            -ins.fn(2),  ins.fn(1),          0 ];

 Mvv = Avn*Mav - Awn;
 Mvp = Avn*(Mp1+Map);

%     Mpv = [ 0,       f_RMh, 0;
%             f_clRNh, 0,     0;
%             0,       0,     1 ];

%     Mpp = [ 0,           0, -vN_RMh2;
%             vE_clRNh*tl, 0, -vE_RNh2*secl;
%             0,           0,  0 ];

 见严老师书推导:

Avn推导如下:

 

g0 = 9.7803267714;  scl = ins.eth.sl*ins.eth.cl;
Mvp(3) = Mvp(3)-g0*(5.27094e-3*2+2.32718e-5*4*ins.eth.sl2)*scl;
Mvp(9) = Mvp(9)+3.086e-6; 

 mvp(3)和mvp(9)不太明白

上述完成F的构造;

下面根据GPS数据进行滤波更新。

至此惯导更新部分大部分已经完成,后续还会有一些详细推导,和卡尔曼滤波部分。

上述为本人看法,若有不对请指正。

 -----------------------------------------------------------未完待续---------------------------------------------------------

主要参考资料为严老师的捷联惯导算法与组合导航原理

感谢严老师的代码

  • 11
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
sins/gps紧组合编程 Matlab代码是一种用于导航系统的编程语言,其中sins代表strapdown inertial navigation system,gps代表global positioning system。将sins和gps紧密组合,可以提高导航系统的精度和可靠性。 以下是可能的Matlab代码示例: 1.初始化程序 使用Matlab的初始化模板以及任何附加的功能库,为sins和gps导航系统定义变量和常量。这些变量包括惯性导航器的加速度计,陀螺仪和磁罗盘等设备,以及接收和处理gps信号所需的代码。 2. 陀螺与加速度计数据集成 使用陀螺和加速度计数据集成技术,将惯性导航器的运动信息转换为空间位置和速度。数据集成技术还包括误差校正和滤波方法,以优化导航信息的准确性和鲁棒性。 3. GPS数据处理 处理gps接收器的定位信息,并与惯性导航器的位置和速度信息进行紧密组合。同时也需要处理gps信号的误差和干扰,以保证导航系统的稳定性和准确性。 4. 紧组合滤波器 使用紧组合滤波器,将gps和惯性导航器的信息进行融合,以优化导航系统的精度和可靠性。滤波器可以有效处理多源信息的差异和偏差,并提供高度可靠的位置和速度解决方案。 总之,sins/gps紧组合编程 Matlab代码可以在空中、陆地和海洋导航和控制系统中发挥重要作用,如飞机、卫星和无人机等。它可以大大提高导航系统的定位、速度和高度测量精度,并为物理环境、时间和成本上的多种场合提供最优解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

男人黄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值