PSINS工具箱函数介绍——kfinit

Psins代码解析之kalman松组合导航融合算法 test_SINS_GPS_153.m&test_SINS_GPS_186.m&test_SINS_GPS_193.m 框架: 设置松组合导航算法中状态量、观测量数目;比如:psinstypedef(153),状态误差量为15维,量测量为3维; 对仿真生成的飞行轨迹(test_SINS_trj.m),设置IMU误差;并同时对初始AVP参数设置误差; 对kalman滤波器的参数进行初始化: % KF filter rk = posseterr([1;1;3]); %位置误差 kf = kfinit(ins, ... 阅读详情

在这里插入图片描述

kfinit是kf的参数初始化函数,用于初始化滤波参数

本文所述的代码需要基于PSINS工具箱,工具箱的讲解:

使用方法

kfinit这个函数的字面意思是:kf的初始化。这里面的 " k f " "kf" "kf"表示的不是狭义的线性卡尔曼滤波,而是所有卡尔曼滤波类的滤波方法,后面不管是EKF,还是UKF、CKF,都是用这个kfinit来初始化的。
此函数的使用格式如下:

kf = kfinit(ins, davp0, imuerr, rk);

其中ins为惯导数据、davp0为初始的avp误差,imuerr为imu误差,rk为观测向量各元素的误差标准差。

例程实践

运行代码

运行下列代码,获得所需要的量:

glvs
psinstypedef(153);
trj = trjfile('trj10ms.mat');
% initial settings
[nn, ts, nts] = nnts(2, trj.ts);
imuerr = imuerrset(0.03, 100, 0.001, 5);
imu = imuadderr(trj.imu, imuerr);
davp0 = avperrset([0.5;-0.5;20], 0.1, [1;1;3]);
ins = insinit(avpadderr(trj.avp0,davp0), ts);
% KF filter
rk = poserrset([1;1;3]);

再运行kfinit的代码:

kf = kfinit(ins, davp0, imuerr, rk);

运行结果

可得结构体kf,其值包括:
在这里插入图片描述
其中,Qt和Rk分别为状态转移协方差矩阵和观测协方差矩阵。
Pxk是当前时刻(也就是初始时刻)的状态协方差矩阵。
Hk和Qk是观测矩阵和状态转移矩阵。

函数解析

函数完整代码如下:

function kf = kfinit(ins, varargin)
% Kalman filter initializes for structure array 'kf', this precedure 
% usually includs the setting of structure fields: Qt, Rk, Pxk, Hk.
%
% Prototype: kf = kfinit(ins, varargin)
% Inputs: ins - SINS structure array, if not struct then nts=ins;
%         varargin - if any other parameters
% Output: kf - Kalman filter structure array
%
% See also  kfinit0, kfsetting, kffk, kfkk, kfupdate, kffeedback, psinstypedef.

% Copyright(c) 2009-2014, by Gongmin Yan, All rights reserved.
% Northwestern Polytechnical University, Xi An, P.R.China
% 09/10/2013
global glv psinsdef
[Re,deg,dph,ug,mg] = ... % just for short
    setvals(glv.Re,glv.deg,glv.dph,glv.ug,glv.mg); 
o33 = zeros(3); I33 = eye(3); 
kf = [];
if isstruct(ins),    nts = ins.nts;
else                 nts = ins;
end
switch(psinsdef.kfinit)
    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;
        kf.Rk = diag(rk)^2;
        kf.Pxk = diag([davp; imuerr.eb; imuerr.db]*1.0)^2;
        kf.Hk = kfhk(0);
    case psinsdef.kfinit156,
        psinsdef.kffk = 15;  psinsdef.kfhk = 156;  psinsdef.kfplot = 15;
        [davp, imuerr, rk] = setvals(varargin);
        kf.Qt = diag([imuerr.web; imuerr.wdb; zeros(9,1)])^2;
        kf.Rk = diag(rk)^2;
        kf.Pxk = diag([davp; imuerr.eb; imuerr.db]*1.0)^2;
        kf.Hk = kfhk(0);
    case psinsdef.kfinit183,
        psinsdef.kffk = 18;  psinsdef.kfhk = 183;  psinsdef.kfplot = 18;
        [davp, imuerr, lever, r0] = setvals(varargin);
        kf.Qt = diag([imuerr.web; imuerr.wdb; zeros(9+3,1)])^2;
        kf.Rk = diag(r0)^2;
        kf.Pxk = diag([davp; imuerr.eb; imuerr.db; lever]*1.0)^2;
        kf.Hk = zeros(3,18);
    case psinsdef.kfinit186,
        psinsdef.kffk = 18;  psinsdef.kfhk = 186;  psinsdef.kfplot = 18;
        [davp, imuerr, lever, r0] = setvals(varargin);
        kf.Qt = diag([imuerr.web; imuerr.wdb; zeros(3,1); imuerr.sqg; imuerr.sqa; zeros(3,1)])^2;
        kf.Rk = diag(r0)^2;
        kf.Pxk = diag([davp; imuerr.eb; imuerr.db; lever]*1.0)^2;
        kf.Hk = zeros(6,18);
    case psinsdef.kfinit193
        psinsdef.kffk = 19;  psinsdef.kfhk = 193;  psinsdef.kfplot = 19;
        [davp, imuerr, lever, dT, r0] = setvals(varargin);
        kf.Qt = diag([imuerr.web; imuerr.wdb; [1/Re;1/Re;1]*glv.mpsh; ...
            [1;1;1]*0*glv.dphpsh; [1;1;1]*0*glv.ugpsh; [1;1;1]*0.*glv.mpsh; 0])^2;
        kf.Rk = diag(r0)^2;
        kf.Pxk = diag([davp; imuerr.eb; imuerr.db; lever; dT]*1.0)^2;
        kf.Hk = zeros(3,19);
    case psinsdef.kfinit196
        psinsdef.kffk = 19;  psinsdef.kfhk = 196;  psinsdef.kfplot = 19;
        [davp, imuerr, lever, dT, r0] = setvals(varargin);
        kf.Qt = diag([imuerr.web; imuerr.wdb; [1/Re;1/Re;1]*0*glv.mpsh; ...
            [1;1;1]*0*glv.dphpsh; [1;1;1]*0*glv.ugpsh; [1;1;1]*0*glv.mpsh; 0])^2;
        kf.Rk = diag(r0)^2;
        kf.Pxk = diag([davp; imuerr.eb; imuerr.db; lever; dT]*1.0)^2;
        kf.Hk = zeros(6,19);
    case psinsdef.kfinit246
        psinsdef.kffk = 24;  psinsdef.kfhk = 246;  psinsdef.kfplot = 24;
        [davp, imuerr, r0] = setvals(varargin);
        kf.Qt = diag([imuerr.web; imuerr.wdb; [1/Re;1/Re;1]*0*glv.mpsh; ...
            [1;1;1]*0*glv.dphpsh; [1;1;1]*0*glv.ugpsh; zeros(9,1)])^2;
        kf.Rk = diag(r0)^2;
        kf.Pxk = diag([davp; imuerr.eb; imuerr.db; imuerr.dKga(1:9)]*1.0)^2;
        kf.Hk = zeros(6,24);
    case psinsdef.kfinit331,
        psinsdef.kffk = 33;  psinsdef.kfhk = 331;  psinsdef.kfplot = 33;
        [davp, imuerr, r0] = setvals(varargin);
        kf.Qt = diag([imuerr.web; imuerr.wdb; zeros(9+15+3,1)])^2;
        kf.Rk = diag(r0)^2;
        kf.Pxk = diag([davp; imuerr.eb; imuerr.db; imuerr.dKga; imuerr.KA2])^2;
        kf.Hk = kfhk(ins);
        kf.xtau(1:psinsdef.kffk,1) = 0;
    case psinsdef.kfinit346,
        psinsdef.kffk = 34;  psinsdef.kfhk = 346;  psinsdef.kfplot = 34;
        [davp, imuerr, lever, dT, r0] = setvals(varargin);
        kf.Qt = diag([imuerr.web; imuerr.wdb; zeros(9+3+1+15,1)])^2;
        kf.Rk = diag(r0)^2;
        kf.Pxk = diag([davp; imuerr.eb; imuerr.db; lever; dT; imuerr.dKga])^2;
        kf.Hk = kfhk(ins);
        kf.xtau(1:psinsdef.kffk,1) = 0;
    case psinsdef.kfinit376,
        psinsdef.kffk = 37;  psinsdef.kfhk = 376;  psinsdef.kfplot = 37;
        [davp, imuerr, lever, dT, r0] = setvals(varargin);
        kf.Qt = diag([imuerr.web; imuerr.wdb; zeros(9+3+1+15+3,1)])^2;
        kf.Rk = diag(r0)^2;
        kf.Pxk = diag([davp; imuerr.eb; imuerr.db; lever; dT; imuerr.dKga; davp(4:6)]*10)^2;
        kf.Hk = kfhk(ins);
        kf.xtau(1:psinsdef.kffk,1) = 0;
    otherwise,
        kf = feval(psinsdef.typestr, psinsdef.kfinittag, [{ins},varargin]);
end
kf = kfinit0(kf, nts);

里面每一个case表示不同的滤波形式,按照PSINS惯用的命名规则,psinsdef.kfinit后面的三位数,前两位(左侧的两位)表示状态量的维度,最后一位(最右边一位,也就是个位数)表示观测量的维度。
以153距离,其每一行的代码作用如下:

  • 将各个tag标注为153:
    psinsdef.kffk = 15; psinsdef.kfhk = 153; psinsdef.kfplot = 15;
  • 将函数输入的第2~4个元素分开
    [davp, imuerr, rk] = setvals(varargin);
  • 根据IMU误差特性求解状态转移噪声协方差
    kf.Qt = diag([imuerr.web; imuerr.wdb; zeros(9,1)])^2;
  • 根据观测噪声求解观测噪声协方差
    kf.Rk = diag(rk)^2;
  • 根据初始误差求解初始的状态协方差 P x k P_{xk} Pxk​
    kf.Pxk = diag([davp; imuerr.eb; imuerr.db]*1.0)^2;
    % 求观测矩阵
    kf.Hk = kfhk(0);
PSINS组合导航工具箱基本概念与函数简介 文章目录习惯约定与常用变量符号PSINS全局变量结构体glv(global variable)坐标系定义姿态阵/姿态四元数/姿态角IMU采样数据AVP导航参数误差参数其他导入数据文件与数据提取转换导入文件数据有以下方式:数据提取转换举例绘图显示绘图辅助函数传感器数据绘图导航结果绘图进度条函数姿态阵/姿态四元数/欧拉角/等效旋转矢量之间转换 习惯约定与常用变量符号 PSINS全局变量结构体glv(global variable) 运行glvs脚本文件,内部实际调用的是glvf函数,这个函数就是可以初始化全局变 阅读详情

相关推荐

严恭敏老师PSINS工具箱学习笔记-3:卡尔曼滤波核心函数kfinit与kfupdate深度解析

本文深度解析严恭敏老师PSINS工具箱中的卡尔曼滤波核心函数kfinit与kfupdate,探讨其在SINS/GPS组合导航中的关键作用。通过详细代码示例和工程实践,揭示状态矩阵初始化、噪声配置及量测更新的技术细节,帮助开发者掌握高精度导航滤波器的实现与调试技巧。

weixin_30808693的博客 552

基于PSINS工具箱的卡尔曼滤波与SINS/GNSS组合导航

文章目录卡尔曼滤波与SINS/GNSS组合导航典型的SINS/GNSS组合滤波 卡尔曼滤波与SINS/GNSS组合导航 用于Kalman滤波的函数有: psinstypedef(nnm):KF状态维数nn/量测维数m定义(一般可直接用于SINS/GNSS组合),或用户自定义字符串,在kfinit/kffk/kfhk/kfplot等函数中作为类型区分标识; kfinit:滤波器主要参数初始化,再用kfinit0更多的参数初始化; function kf = kfinit(ins, varargin) % Ka

十八与她的博客 3104

新手避坑指南:用严恭敏老师的PSINS工具箱跑通第一个SINS仿真(附完整代码)

本文为新手提供了使用严恭敏老师的PSINS工具箱进行SINS仿真的详细指南,包括环境配置、工具箱初始化、demo文件运行机制及常见问题排查。通过完整代码示例和实用技巧,帮助读者快速掌握惯性导航仿真的核心步骤,避免常见错误,提升学习效率。

congsong2560的博客 422

严恭敏老师PSINS工具箱学习笔记-1

关于严恭敏老师PSINS工具箱的学习-入门级别

weixin_57967772的博客 9386

新手也能懂的PSINS工具箱实战:手把手教你跑通SINS/GPS松组合仿真(附完整代码解读)

刚接触惯性导航领域的研究者常会遇到这样的困境:面对复杂的数学公式和密密麻麻的MATLAB代码,既想快速上手实践,又担心基础薄弱无法理解核心原理。严恭敏教授的PSINS工具箱作为国内惯性导航领域的标杆工具,其强大功能与学习曲线往往形成鲜明对比。本文将采用"代码即注释"的实战方式,带您逐行拆解SINS/GPS松组合的实现过程,即使没有专业背景,也能在仿真环境中搭建完整的导航系统。松组合的核心是卡尔曼滤波,其工作流程如同经验丰富的航海家:根据惯性推算(预测)和GPS观测(修正)不断调整自己的判断。

weixin_30897079的博客 597

手把手教你用严恭敏PSINS工具箱跑通test_SINS_GPS_153:从数据加载到误差分析全流程

本文详细介绍了如何使用严恭敏PSINS工具箱跑通test_SINS_GPS_153示例,从数据加载到误差分析的全流程。通过逐步解析环境准备、仿真参数初始化、数据预处理、卡尔曼滤波器实现及结果可视化,帮助新手快速掌握SINS/GPS组合导航系统的仿真技术。文章还提供了常见问题排查指南和进阶技巧,适合惯性导航领域的研究者和工程师参考。

weixin_30417487的博客 463

PSINS工具箱函数介绍——kfinit0

【注】本文所述的函数kfinit0不同于kfinit,后者的讲解链接见:PSINS工具箱函数介绍——kfinit kfinit是kf的参数初始化函数,用于初始化滤波参数 本文所述的代码需要基于PSINS工具箱,工具箱的讲解:kf = kfinit0(kf, nts); kf是关于卡尔曼滤波的参数,是一个结构体,参考kfinit这个函数:https://blog.youkuaiyun.com/callmeup/article/details/140779776 另一个输入值nts是INS的采样周期,一般在kfinit这

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 540

深入Psins工具箱:拆解Kalman滤波在SINS/GPS松组合中的‘黑箱’(以153/186/193状态模型为例)

本文深入解析Psins工具箱中Kalman滤波在SINS/GPS松组合导航中的实现细节,重点探讨153、186、193三种状态模型的应用与差异。通过拆解kfinit、kffk、kfhk等核心函数,揭示误差状态Kalman滤波(ESKF)在融合算法中的关键作用,为导航系统开发者提供从基础使用到自定义扩展的实用指南。

weixin_42531779的博客 364

基于【PSINS工具箱】的EKF和CKF组合导航效果对比|MATLAB源代码演示

需要PSINS工具箱才能正常运行。集成了EKF(扩展卡尔忙滤波)和CKF(容积卡尔曼滤波),包含了滤波结果的对比。带中文注释。

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 715

新手也能懂的PSINS工具箱实战:手把手教你跑通test_SINS_GPS_153松组合仿真

本文详细介绍了如何使用PSINS工具箱实现SINS/GPS松组合导航仿真,特别针对test_SINS_GPS_153.m脚本进行手把手教学。从环境配置、脚本解析到卡尔曼滤波器实现,帮助新手快速掌握组合导航仿真技术,并提供了常见问题排查和参数调整建议。

weixin_30918633的博客 329

深入PSINS工具箱:拆解test_SINS_GPS_153中的卡尔曼滤波器配置与调参实战

本文深入解析PSINS工具箱中的test_SINS_GPS_153案例,详细拆解卡尔曼滤波器在SINS/GPS松组合导航中的配置与调参实战。从15维状态模型到噪声矩阵设置,再到协方差约束与数值稳定性优化,提供全面的调参技巧和方法论,帮助工程师提升组合导航系统的滤波性能。

weixin_30553777的博客 415

深入PSINS工具箱的卡尔曼滤波内核:kfinit、kfupdate、kffeedback三大函数详解与调参避坑指南

本文深入解析PSINS工具箱中卡尔曼滤波的三大核心函数kfinit、kfupdate和kffeedback,提供参数调优与避坑指南。通过实战案例,详细讲解滤波器初始化、更新策略和状态反馈机制的优化方法,帮助工程师解决滤波发散、收敛速度慢等问题,提升惯性导航系统精度。

weixin_30465747的博客 254

华强北手表256G真相大揭秘:ADB命令实测内存与存储(附完整调试教程)

本文通过ADB命令实战揭秘华强北智能手表256G存储等硬件参数的真实性。文章提供了从开启调试模式到使用ADB命令查询系统属性、验证内存与存储容量的完整教程,帮助用户识别参数虚标,评估设备真实性能与潜在风险。

e3f4g5的博客 1231

新手也能懂的PSINS工具箱实战:手把手教你跑通SINS/GPS松组合仿真(附完整代码)

本文详细介绍了PSINS工具箱的实战应用,从环境配置到SINS/GPS松组合仿真的全流程。通过逐行解析`test_SINS_GPS_153.m`脚本,帮助新手快速掌握松组合导航仿真技术,并提供完整代码和调试技巧,适合惯性导航领域的学习者和开发者。

weixin_30522183的博客 360

Win10/Win11共享打印机0x00000709终极修复指南:从注册表到LPD协议的全面解决方案

本文提供了Win10/Win11共享打印机0x00000709错误的终极修复指南,涵盖从注册表修改到LPD协议的全面解决方案。通过详细分析错误根源、基础修复四步法、高阶LPD协议方案及企业级深度修复策略,帮助用户彻底解决打印机共享问题,提升局域网打印效率。

weixin_33724046的博客 309

雪亮工程视频联网技术详解:视综平台主流接入方式与协议分析

随着雪亮工程建设的深入,视频资源的汇聚与共享成为核心需求。本文简要剖析了雪亮视综平台下的视频联网接入技术,重点讲解了主流接入方式的区别与选型,并深入探讨了平台内部及跨平台的视频资源共享机制(含级联与推送模式),旨在为安防开发人员和系统集成商提供清晰的架构思路与技术参考。

lsz152590的博客 716

PSINS滤波初始化函数修改,151

PSINS的kfinit没有对应的15为状态、1维观测的滤波,但是实际上仅高度可观测的情况在实际上是需要的(无GNSS、只有气压高度计),这里给出出去改后的kf初始化函数。

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 348

天龙八部TLBB系列 - 网单用数据库修改为其他门派

专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等) --- 天龙八部修改门派

空名先生 9429

深入PSINS工具箱:拆解SINS/GPS松组合中的卡尔曼滤波器配置与调参心得

本文深入解析PSINS工具箱中SINS/GPS松组合的卡尔曼滤波器配置与调参技巧,涵盖滤波器初始化、状态转移矩阵设计、量测更新策略及高级调参方法。通过实战案例展示如何优化农业无人机的导航性能,提升定位精度和系统稳定性,为惯性导航与卫星导航组合系统提供实用指导。

weixin_30785593的博客 396

CD-SSB和NCD-SSB相关内容

NR中,PSS/SSS 和PBCH总是绑定的,因此也称为SSB block。频域由下往上,第121个SC(k = 120)的中心频率,就是SSB的GSCN对应的SSREF(同步参考频率)的出处如上,同步栅格映射到SSB 的RE位置是10个PRB的位置,然后指向RE index 0,即第121个子载波的中心频率;UE获得N_offset_GSCN后,即可结合当前SSB的GSCN推算下一个SSB的GSCN =N_Reference_GSCN(当前SSB的GSCN) + N_offset_GSCN。

asd199086的博客 3424

【图论】系列(七)图论的中心性度量方法及重要性评价指标

图论中的中心性度量方法是用来衡量图中各个节点(或顶点)相对重要性的指标。

qq_30066733的博客 1075

Ubuntu+ Matlab下运行PSINS2017版本时报错

PSINS2017 , Ubuntu

BenHu556的博客 202

为Ollama本地大模型添加持久化记忆层:openclaw-ollama-memory项目详解

在构建基于大型语言模型(LLM)的对话应用时,上下文管理是核心技术挑战之一。其原理在于模型本身不具备跨会话的持久化记忆能力,每次请求都是独立的。这导致在多轮对话中,模型无法有效利用历史信息,用户体验割裂。从技术价值看,独立的记忆层通过解耦推理与存储,能突破模型固定上下文窗口的限制,实现更智能、连贯的交互。其核心应用场景包括聊天机器人、智能助手及需要长期记忆的复杂代理。本文聚焦的 openclaw-ollama-memory 项目,正是为 Ollama 生态提供的记忆层解决方案,它通过向量检索和智能摘要等机制

weixin_42521558的博客 312

PSINS工具箱函数介绍——gpssimu

gpssimu是生成GPS的位置和速度信息的函数

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 1233

Newton & Nvidia 开源 GPU 加速机器人仿真器入门教程(一)

Newton 是一个 GPU 加速、可扩展和可微分的物理仿真引擎,专为机器人、研究和高级仿真工作流而设计。Newton 基于 NVIDIA Warp 并集成了 MuJoCo Warp,为用户和开发人员提供了高性能仿真、现代 Python API 和灵活的架构。

机器人控制与仿真应用 1480

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

上一篇: 【基于PSINS】UKF/SSUKF对比的MATLAB程序
下一篇: MATLAB中“varargin”的作用
MATLAB卡尔曼
MATLAB卡尔曼 毕昇杯全国一等奖获得者 毕昇杯全国一等奖获得者 领域专家: 数据科学与机器学习技术领域 领域专家: 数据科学与机器学习技术领域
博客等级 码龄14年 7622粉丝 1415原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

MATLAB卡尔曼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值