Psins代码解析之kalman松组合导航融合算法 test_SINS_GPS_153.m&test_SINS_GPS_186.m&test_SINS_GPS_193.m

2023-05-16

框架:

  • 设置松组合导航算法中状态量、观测量数目;比如:psinstypedef(153),状态误差量为15维,量测量为3维;
  • 对仿真生成的飞行轨迹(test_SINS_trj.m),设置IMU误差;并同时对初始AVP参数设置误差;
  • 对kalman滤波器的参数进行初始化:
% KF filter
rk = posseterr([1;1;3]); %位置误差
kf = kfinit(ins, davp0, imuerr, rk);

1、kalman滤波器参数初始化:

    case psinsdef.kfinit153,
        psinsdef.kffk = 15;  psinsdef.kfhk = 153;  psinsdef.kfplot = 15;
        [davp, imuerr, rk] = setvals(varargin);
        kf.Qt = diag([imuerr.web; imuerr.wdb; zeros(9,1)])^2; %注意此处是Qt
        kf.Rk = diag(rk)^2;
        kf.Pxk = diag([davp; imuerr.eb; imuerr.db]*1.0)^2;
        kf.Hk = kfhk(0);
kf = kfinit0(kf, nts);

最终得到离散化的kf参数,如下:

“1”的计算:kf.Qt = diag([imuerr.web; imuerr.wdb; zeros(3,1); imuerr.sqg; imuerr.sqa; zeros(3,1)])^2;

“2”的计算:kf.Qk = kf.Qt*kf.nts;  end %离散化的Q

“3”的计算:kf.xtau = ones(size(kf.xk))*eps;  示例代码中给出的是一个matlab能够分辨的最小值;

“4”的计算:kf.xfb(idx) = kf.xfb(idx) + xfb_tmp(idx);  % record total feedback,对进行误差反馈的状态量,每次有反馈都进行反馈的累加

“5”的计算:xtau = kf.xtau;
                   xtau(kf.xtau<kf.T_fb) = kf.T_fbkf.coef_fb = kf.T_fb./xtau;  %2015-2-22 反馈系数

其中 kf.T_fb = 1;   end %时间标签,即kalman数据融合时间,此处等于1秒

2、捷联惯导解算:纯惯导解算和kalman时间更新、量测更新;

kalman滤波流程图:

(1)时间更新:

采用双子样进行惯导解算,并且对误差状态进行、误差状态方差进行预测更新;

    wvm = imu(k:k1,1:6);  t = imu(k1,end);
    if k>200*100
        wvm(:,6) = wvm(:,6)+50*glv.ug*ts;
    end
    ins = insupdate(ins, wvm);
    kf.Phikk_1 = kffk(ins); %discrete-time transition matrix 得到离散的状态转移矩阵
    kf = kfupdate(kf); %执行时间更新

状态转移矩阵的求取为:

离散化:

执行状态更新:kf.Gammak=1;

(2)量测更新:

主要进行:量测一步预测、量测一步预测均方误差阵、状态一步预测与量测一步预测之间的协均方误差阵、增益矩阵K计算、状态最优估计、状态估计均方误差阵;

代码如下:

    if mod(t,1)==0 %整秒进行kalman滤波的量测更新;
        posGPS = trj.avp(k1,7:9)' + davp0(7:9).*randn(3,1);  % GPS pos simulation with some white noise
        kf = kfupdate(kf, ins.pos-posGPS, 'M');
        [kf, ins] = kffeedback(kf, ins, 1, 'vp');
        avp(ki,:) = [ins.avp', t];
        xkpk(ki,:) = [kf.xk; diag(kf.Pxk); t]';  ki = ki+1;
    end

量测更新:

        if TimeMeasBoth=='M'        % Meas Updating
            kf.xkk_1 = kf.xk;    
            kf.Pxkk_1 = kf.Pxk; 
        elseif TimeMeasBoth=='B'    % Time & Meas Updating
            kf.xkk_1 = kf.Phikk_1*kf.xk;    
            kf.Pxkk_1 = kf.Phikk_1*kf.Pxk*kf.Phikk_1' + kf.Gammak*kf.Qk*kf.Gammak';
        else
            error('TimeMeasBoth input error!');
        end
        kf.Pxykk_1 = kf.Pxkk_1*kf.Hk';
        kf.Py0 = kf.Hk*kf.Pxykk_1;
        kf.ykk_1 = kf.Hk*kf.xkk_1;
        kf.rk = yk-kf.ykk_1;
        kf.Pykk_1 = kf.Py0 + kf.Rk;
        kf.Kk = kf.Pxykk_1*invbc(kf.Pykk_1); % kf.Kk = kf.Pxykk_1*kf.Pykk_1^-1;
        kf.xk = kf.xkk_1 + kf.Kk*kf.rk;
        kf.Pxk = kf.Pxkk_1 - kf.Kk*kf.Pykk_1*kf.Kk';
        kf.Pxk = (kf.Pxk+kf.Pxk')*(kf.fading/2); % symmetrization & forgetting factor 'fading'

误差状态反馈、校正导航系统:[kf, ins] = kffeedback(kf, ins, 1, 'vp');

注意,因为系统是基于误差状态量的kalman组合导航系统,因此,当系统估计除了误差状态,毕竟对相应的状态量做了补偿,则需要在误差状态量中予以扣除;

3、误差显示:

(1)kalman组合导航结果输出:【avp】

(2)kalman组合导航结果与参考真值做差输出:avperr = avpcmp(avp, trj.avp)

仿真轨迹如下:参考链接Psins代码解析一之全局变量&轨迹仿真(test_SINS_trj.m)&惯性解算(test_SINS.m)

(3)kalman组合导航中,最优估计误差状态量输出:【kf.xk

inserrplot(xkpk(:,[1:psinsdef.kfplot,end]));

        case 'avped'
            myfigure;
            subplot(321), plot(t, err(:,1:2)/glv.sec); xygo('phiEN');
            subplot(322), plot(t, err(:,3)/glv.min); xygo('phiU');
            subplot(323), plot(t, err(:,4:6)); xygo('dV');
            subplot(324), plot(t, [err(:,7:8)*glv.Re,err(:,9)]); xygo('dP');
            subplot(325), plot(t, err(:,10:12)/glv.dph); xygo('eb');
            subplot(326), plot(t, err(:,13:15)/glv.ug); xygo('db');

(4)粉红色线条为 avperr = avpcmp(avp, trj.avp);即avperr与xkpk整合在一张图上;

(5)diag(kf.Pxk) ,sqrt(误差状态估计均方误差阵图):对角线元素:

inserrplot([sqrt(xkpk(:,psinsdef.kfplot+1:end-1)),xkpk(:,end)]);

4、杆臂效应和时间对齐误差;

(1)杆臂效应,参数估计:

在组合导航中,一般以IMU器件所在的位置为姿态、速度、位置的基准;由于GNSS接收机天线的安装与IMU器件有偏差,存在杆臂效应,如下图所示:

杆臂:由IMU指向GNSS天线;基于此,推导出INS和GNSS速度、位置关系;

其中,Mpv为:

状态误差量为:18-state included:  phi(3), dvn(3), dpos(3), eb(3), db(3), lever(3)

量测矩阵为:Hk = [zeros(6,3), eye(6), zeros(6,6), [-ins.CW;-ins.MpvCnb]];

(2)时间不同步,参数估计:

以图示为例:卫星信号和惯导信号时间不同步误差为δt,如果惯导在两个采样时刻间的速度率变化为an,则有如下计算公式:

即,速度、位置不同步误差为:

状态误差量为:19-state included:  phi(3), dvn(3), dpos(3), eb(3), db(3), lever(3), dT(1)

量测矩阵为:Hk = [zeros(3,6), eye(3), zeros(3,6), -ins.MpvCnb, ins.Mpvvn]; %位置误差参与量测更新

参考:

状态空间模型为:19-state included:  phi(3), dvn(3), dpos(3), eb(3), db(3), lever(3), dT(1)

(3)以test_SINS_GPS_193.m为例:

误差状态量为:phi(3), dvn(3), dpos(3), eb(3), db(3), lever(3), dT(1);

量测状态为:Δpos

需要注意的几个点:

  • 利用trj生成GPS轨迹时,需要添加lever、dT误差(lever = [1; 2; 3]、dT = 0.1);在程序中,lever是以IMU中心为基准; 而dT为IMU和GPS数据之间的时间不对齐误差, 此处指gps时间超前IMU时间,如下图所示:

  • 量测矩阵H的建立:

Hk = [zeros(3,6), eye(3), zeros(3,6), -ins.MpvCnb, -ins.Mpvvn];

其中: ”-ins.MpvCnb, -ins.Mpvvn“ 在每次进行量测更新时,都需要更新;其在ins = inslever(ins)中实现。

  • 量测更新中,Zk的编排:

kf = kfupdate(kf, ins.posL-ins.Mpvvn*dt-posGPS, 'M')

画图展示:程序中采用“avp”反馈;预设lever=[1;2;3] 、dT = 0.1;

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Psins代码解析之kalman松组合导航融合算法 test_SINS_GPS_153.m&test_SINS_GPS_186.m&test_SINS_GPS_193.m 的相关文章

  • 如何查看手机是否有GPS设备?

    我正在尝试找到一段代码可以告诉我Android手机是否有GPS设备 我在搜索结果中获得的大多数示例都表明 GPS 是否启用 我感兴趣的是Android手机是否有物理GPS设备 Thanks 从 API 级别 8 Froyo 开始 您可以使用
  • 同时有多个位置提供商

    我的定位系统有一些问题 我有一个实现位置侦听器的服务 我希望尽可能使用网络获得最佳位置 如果网络不够准确 精度大于 300mt 则使用 GPS 问题是这样的 我每 5 分钟需要一次位置信息 如果可能的话准确 否则不准确 我从一个开始 Loc
  • 需要 Android 活动等待获取 GPS 位置

    对不起我的英语不好 我正在尝试从 GPS 获取单个位置以添加全局变量纬度 经度 GPS 打开 但在从 GPS 检索数据之前活动仍在继续 换句话说 我的需求 仅当找到位置并且填充了经度和纬度变量时 方法 getCurrentLocation
  • 如何在 JavaScript 中查找到已知位置的距离

    在浏览器中使用 JavaScript 如何确定从我当前位置到另一个我有纬度和经度的位置的距离 如果您的代码在浏览器中运行 您可以使用 HTML5 地理定位 API window navigator geolocation getCurren
  • 如何停止位置管理器?

    不知道为什么 但有时 LocationManager 在关闭应用程序后仍然工作 我在一个 Activity 的 onCreate Methode 中调用 startGPS 只有一个 让我称之为 StartActivity protected
  • Android GPS 路由系统

    我正在开发一个 Android 应用程序 它可以定位用户 假设用户在路上 并且该应用程序将为用户创建最短路线 以便能够到达用户选择的目的地 定位用户不是问题 因为这里有一个 API http www vogella com articles
  • C#:GPS跟踪系统[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何在 C net 中构建带有移动设备 带 GPS 的 GPS 跟踪系统 场景是 通过支持 GPS 的手机跟踪用户 服务工程师 这里没
  • 在带有校准点的地图上将经度和纬度转换为 X Y

    如果我有一张尺寸为 sizeX sizeY 的 jpeg 地图 以及地图上的一些校准点 X Y 经度 纬度 使用给定的经度 纬度对计算地图中相应 XY 点的算法是什么 这对我有用 没有那么多废话 int x int MAP WIDTH 36
  • 如何确定当前用户位置是否在我的 MKCooperativeRegion 内?

    我有一个坐标区域 我已确定该区域包含我想要为我的应用程序显示的内容的限制 我已将其设置为具有中心点纬度 经度和跨度的 MKCooperativeRegion 如何确定当前 userLocation 是否在我的坐标区域内 使用地图矩形 这是使
  • 我如何从 JMapViewer 世界地图中获取鼠标单击位置

    我正在使用地图浏览器 http wiki openstreetmap org wiki JMapViewerjar 在 JPanel 上显示世界地图 在地图上我添加MapMarkerDot s这是 GPS 点 问题是当我单击MapMarke
  • 设置模拟位置时 GPS 提供商未知错误?

    我正在尝试设置我的模拟位置 但是 我收到以下错误 提供商 gps 未知 并且不确定出了什么问题 我已经获得了在manifest xml 中声明的所有权限以及所有参数 模拟定位法 Initiates the method to set the
  • 如何通过 GPRS 向 GPS 追踪器(TK103、GT02、GT06、TK102 等)发送命令

    这已经被问过这里https stackoverflow com questions 25460743 gps tracker tk103 how to send message through server https stackoverf
  • React Native Android 位置请求超时

    在 IOS 中查找 GPS 坐标时没有问题 效果很好 Android 端不如 IOS 稳定 在真机和模拟器中都会出现这个问题 有时它可以找到位置 但有时却找不到 寻找了3天 但没有找到解决方案 当我的应用程序无法找到我的位置时 我尝试通过谷
  • 寻找另一部智能手机的笛卡尔坐标?

    考虑到我有两部智能手机 A 和 B 如果我拿着智能手机 A 有没有办法确定 B 相对于我自己的位置 所以如果我们有这张图片的情况 它会告诉我 B 位于位置 2 1 利用 WiFi 信号强度来获取位置等创造性方法更受欢迎 我还可以确定两部手机
  • 在不改变我的位置的情况下获取当前位置的经度和纬度

    我可以找到当前位置的纬度和经度 但是这些数据在更改我的当前位置之前不会显示 我想在不更改我的位置的情况下获取当前位置的经度和纬度 package com example gps import android app Activity imp
  • Google 地图 (Android) 中的位置更新率

    我正在编写一个简单的基于 GPS 的应用程序 用于位置感知 每当启用 GPS 时 应用程序都会请求位置更新并以格式打印纬度和经度 TextView 如果 GPS 被禁用 位置提供商会回退到LocationManager NETWORK PR
  • 如何将timestamp_t转换为实际时间?

    我见过很多使用 time t 的例子 但 timestamp t 让我感到困惑 我正在做一个作业 我们需要打印出 GPS 数据 并且 GPS 设备返回一个类型 timestamp t 来表示它的时间戳和纪元时间 我尝试过使用 gmtime
  • Android:计算两个位置之间距离的最佳方法

    我在这个主题上做了一些研究 但有很多观点并没有给出一个清晰的图像 我的问题是这样的 我正在为 Android 开发一个基于 GPS 的应用程序 在其中我想实时了解 Android LocationManager 指定的当前位置与其他位置之间
  • 如何从 Android 手机获取 GPS 数据?

    有没有办法将 Android 手机的 GPS 数据连接 USB 有线 到 PC 我目前正在使用基于 gpsd 项目的 GPSTether 应用程序 我正在寻找比该应用程序提供更多控制且错误更少的替代方案 另外 是否有另一种方法可以在不使用任
  • 检测wifi是否启用(无论是否连接)

    对于 GPS 跟踪应用程序来说 在打开 WIFI 的情况下记录位置信号会导致数据非常不精确或存在间隙 在开始跟踪之前 我已使用可达性查询来检测 wifi 是否可用 问题是 如果进行该查询时 wifi 已启用但未连接到网络 则表明无法通过 w

随机推荐