Psins代码解析之常用的子函数

2023-05-16

1、insinit.m 惯导参数结构体初始化(SINS structure array initialization).

% Prototype: ins = insinit(avp0, ts, var1, var2)
% Initialization usages(maybe one of the following methods):
%       ins = insinit(avp0, ts);
%       ins = insinit(avp0, ts, avperr);
%       ins = insinit(qnb0, vn0, pos0, ts);
% Inputs: avp0 - initial avp0 = [att0; vn0; pos0]
%         ts - SIMU sampling interval
%         avperr - avp error setting
% Output: ins - SINS structure array

调用子函数:ethinit.m ;

调用子函数:inslever.m  

% Prototype: ins = inslever(ins, lever)
% Inputs: ins - SINS structure array created by function 'insinit'
%         lever - lever arms, each column stands for a monitoring point
% Output: ins - SINS structure array with lever arm parameters

2、ethinit.m 地球相关参数结构体初始化(The Earth related parameters (structure array) initialization.)

% Prototype: eth = ethinit(pos, vn)
% Inputs: pos - geographic position [lat;lon;hgt]
%         vn - velocity
% Outputs: eth - parameter structure array
%

调用子函数:ethupdate.m

% Prototype: eth = ethupdate(eth, pos, vn)
% Inputs: eth - input earth structure array
%         pos - geographic position [lat;lon;hgt]
%         vn - velocity
% Outputs: eth - parameter structure array

函数中主要变量:

global glv
    if nargin<2,  vn = [0; 0; 0];  end
    if nargin<1,  pos = [0; 0; 0];  end
    eth.Re = glv.Re; eth.e2 = glv.e2; eth.wie = glv.wie; eth.g0 = glv.g0;
    eth = ethupdate(eth, pos, vn);
    eth.wnie = eth.wnie(:);   eth.wnen = eth.wnen(:);
    eth.wnin = eth.wnin(:);   eth.wnien = eth.wnien(:);
    eth.gn = eth.gn(:);       eth.gcc = eth.gcc(:);

 

3、insupdate.m

% SINS Updating Alogrithm including attitude, velocity and position updating.

(1)首先对地球、载体相关参数进行外推以双子样为例,nts=2*ts,外推ts;

主要是利用:

  • 前一时刻速度、加速度、前一时刻位置;外推得到nts时刻的速度、位置
  • 利用外推得到的速度、位置去更新地球相关参数,主要为:子午圈、卯酉圈半径;东北天下wnie分量(与纬度有关)、wnen分量(与速度、位置有关)、重力加速度(与纬度、高度有关)、等信息

(2)速度更新:以双子样为例,nts=2*ts

程序中,首先根据子样数进行圆锥补偿,得到dvbm,即速度增量;

然后根据速度更新公式:

其中速度更新公式中的一项如下:dvbm/Δt就等于括号中的内容,也就是下面的 ins.fb

也就是ins.fn=qmulv(ins.qnb,ins.fb);然后通过旋转矢量进行变换;

(3)位置更新:以双子样为例,nts=2*ts

利用上面外推nts时刻得到的地球参数和速度更新得到的速度;利用梯形积分得到位置;

(4)姿态更新:以双子样为例,nts=2*ts

利用四元数进行姿态更新;

其中用到了三角函数和单位四元数关系:

捷联惯导更新算法:

% Prototype: ins = insupdate(ins, imu)
% Inputs: ins - SINS structure array created by function 'insinit'
%         imu - gyro & acc incremental sample(s)
% Output: ins - SINS structure array after updating
    nn = size(imu,1);
    nts = nn*ins.ts;  nts2 = nts/2;  ins.nts = nts;
    [phim, dvbm] = cnscl(imu,0);    % coning & sculling compensation
%     [phim, dvbm] = cnscl0(imu);    % coning & sculling compensation
    phim = ins.Kg*phim-ins.eb*nts; dvbm = ins.Ka*dvbm-ins.db*nts;  % calibration
    %% earth & angular rate updating 
    vn01 = ins.vn+ins.an*nts2; pos01 = ins.pos+ins.Mpv*vn01*nts2;  % extrapolation at t1/2
    ins.eth = ethupdate(ins.eth, pos01, vn01);
    ins.wib = phim/nts; ins.fb = dvbm/nts;  % same as trjsimu
    ins.web = ins.wib - ins.Cnb'*ins.eth.wnie;
%     ins.wnb = ins.wib - ins.Cnb'*ins.eth.wnin;
    ins.wnb = ins.wib - (ins.Cnb*rv2m(phim/2))'*ins.eth.wnin;  % 2014-11-30 因为是外推1/2时刻,所以除以2
    %% (1)velocity updating
    ins.fn = qmulv(ins.qnb, ins.fb);
%     ins.an = qmulv(rv2q(-ins.eth.wnin*nts2),ins.fn) + ins.eth.gcc;
    ins.an = rotv(-ins.eth.wnin*nts2, ins.fn) + ins.eth.gcc;
    vn1 = ins.vn + ins.an*nts;
    %% (2)position updating
%     ins.Mpv = [0, 1/ins.eth.RMh, 0; 1/ins.eth.clRNh, 0, 0; 0, 0, 1];
    ins.Mpv(4)=1/ins.eth.RMh; ins.Mpv(2)=1/ins.eth.clRNh;
%     ins.Mpvvn = ins.Mpv*((ins.vn+vn1)/2+(ins.an-ins.an0)*nts^2/3);  % 2014-11-30
    ins.Mpvvn = ins.Mpv*(ins.vn+vn1)/2;
    ins.pos = ins.pos + ins.Mpvvn*nts;  
    ins.vn = vn1;
    ins.an0 = ins.an;
    %% (3)attitude updating
    ins.Cnb0 = ins.Cnb;
%     ins.qnb = qupdt(ins.qnb, ins.wnb*nts);  % lower accuracy than next line
    ins.qnb = qupdt2(ins.qnb, phim, ins.eth.wnin*nts);
    [ins.qnb, ins.att, ins.Cnb] = attsyn(ins.qnb);
    ins.avp = [ins.att; ins.vn; ins.pos];

4、psinstypedef .m,卡尔曼数据融合时,选择状态和量测的数目

首先定义一个结构体:

global psinsdef
    psinsdef = [];

结构体中主要的成员变量为:tag、kfinit、kffk、 kfhk、 kfplot; 根据输入的数字,对转移矩阵、量测矩阵、画图进行相应的计算,其对应的子函数分别为:

  • kffk.m 计算离散、连续转移矩阵 [Fk, Ft] = kffk(ins, varargin)
% Establish Kalman filter system transition matrix.
%
% Prototype: [Fk, Ft] = kffk(ins, fkno, varargin)
% Inputs: ins - SINS structure array, if not struct then nts=ins;
%         fkno - type NO. to get Ft, but fkno=0 for specific demand
%         varargin - if any other parameters
% Outputs: Fk - discrete-time transition matrix
%          Ft - continuous-time transition matirx
  •  kfhk.m 计算量测矩阵
% Establish Kalman filter measurement matrix.
%
% Prototype: Hk = kfhk(ins, varargin)
% Inputs: ins - SINS structure array from function 'insinit'
%         varargin - if any other parameters
% Output: Hk - measurement matrix

 

5、分配内存函数 prealloc.m

所有的变量都有相同的行数,根据指定的列数,进行分配!

调用如下:

[avp, xkk, zkk] = prealloc(fix(len/nn), 10, 10, 7);

    for k=1:nargout
        if nargin==2  % if all of the outputs share the same column
            varargout{k} = zeros(row, varargin{1});
        else
            varargout{k} = zeros(row, varargin{k});
        end
    end

6、利用矢量替换矩阵对角线元素 setdiag.m

常用于设置陀螺仪和加速度计的比例因子参数;

function A = setdiag(A, D)
% Replace the diagonals of a matrix with a vector/scale.
%
% Prototype: A = setdiag(A, D)
% Inputs: A - matrix
%         D - new diagonals
% Output: A - diagonals with 'D'

% Copyright(c) 2009-2015, by Gongmin Yan, All rights reserved.
% Northwestern Polytechnical University, Xi An, P.R.China
% 22/08/2015
    len = length(A);
    D = ones(len,1).*D;
    for k=1:len
        A(k,k) = D(k);
    end

7、输出等于输入子函数 setvals.m

输入等于输出;用于设置变量值;

[ins.tauG, ins.tauA] = setvals(inf(3,1)); % gyro & acc correlation time

函数实现:

function varargout = setvals(varargin)
% Set several output variables to corresponding input values.
%
% Prototype: varargout = setvals(varargin)
%
% See also  prealloc, varpack.

% Copyright(c) 2009-2014, by Gongmin Yan, All rights reserved.
% Northwestern Polytechnical University, Xi An, P.R.China
% 07/03/2014
    for k=1:nargout
        if nargin==1  % all the outputs are set to the same input value
            if iscell(varargin{1})  % avoid nesting varargin, be careful !
                if iscell(varargin{1}{1})
                    varargout{k} = varargin{1}{1}{k};
                else
                    varargout{k} = varargin{1}{k};
                end
            else
                varargout{k} = varargin{1};
            end
        else
            varargout{k} = varargin{k};
        end
    end

8、rv2m.m 旋转矢量到姿态方向矩阵

 

 例如:Cnn=rv2m(-eth.wnie*nts/2);  其代码实现如下:

% Convert rotation vector to transformation matrix.
%
% Prototype: m = rv2m(rv)
% Input: rv - rotation vector
% Output: m - corresponding DCM, such that
%     m = I + sin(|rv|)/|rv|*(rvx) + [1-cos(|rv|)]/|rv|^2*(rvx)^2
%     where rvx is the askew matrix or rv.

9、

 

 

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

Psins代码解析之常用的子函数 的相关文章

  • 构建maven工程指定父工程时parent标签出错

    父类的maven依赖 子类中的maven依赖 一定要谨慎的看一下子类和父类中的groupId一定要相同
  • 树莓派配置网络出现的各种问题和解决思路

    我们拿到树莓派的时候 xff0c 肯定是要树莓派上网的 xff0c 无论是有线还是无线 首先需要将树莓派连接上网 xff0c ifconfig 可以查看 ip 地址 xff08 不是 ifconfig xff09 1 配置网络容易遇到的问题
  • 树莓派远程连接的四种方式(最全)

    准备前提 xff1a 首先用 ifconfig 查看树莓派的 IP 地址 xff0c 记录下来 推荐通过固定 IP 的方法把树莓派的 IP 地址确定下来 xff0c 防止以后再次连接时候 IP 地址的变动导致每次都需要重新查看 IP 地址
  • 驼峰命名法(CamelCase)和下划线命名法(UnderScoreCase)

    骆驼式命名法就是当变量名或函数名是由一个或多个单词连结在一起 xff0c 而构成的唯一识别字时 xff0c 第一个单词以小写字母开始 xff1b 从第二个单词开始以后的每个单词的首字母都采用大写字母 xff0c 例如 xff1a myFir
  • 【STM32F10x】二:利用结构体访问外设

    之前了解使用寄存器操作GPIOA口的LED灯亮灭程序 xff0c 原理是将寄存器的地址强制转换成指针形式 xff0c 然后对指针进行操作 这一章尝试通过将外设定义成结构体的形式来操作外设寄存器 本章重点在于理解和使用 lt 结构体 gt 来
  • TortoiseGit 解决冲突(万能方法)

    思路 xff1a 别人提交了代码 xff0c 你改了代码 xff0c 此时 xff0c 如果不更新或者直接提交都会造成冲突 xff0c 所以最好是在不跟新的情况下 xff0c 把冲突解决掉 xff0c 然后提交代码 xff01 1 右键 t
  • 求正整数n所有可能的和式的组合

    求正整数n所有可能的和式的组合 xff08 如 xff1b 4 61 1 43 1 43 1 43 1 1 43 1 43 2 1 43 3 2 43 1 43 1 2 43 2 xff09 首先说一下 xff0c 群里面很多人在问这个东东
  • 根据PCB扫描图反推原理图

    工具 相机 xff08 拍摄电路板正反面 xff0c 记录元器件位置 xff09 扫描仪 xff08 扫描拆掉元器件的电路板 xff0c 作为底图用于对照着绘制PCB xff09 Photoshop xff08 处理扫描出的图片 xff09
  • 链路聚合原理与配置

    文章目录 一 链路聚合简介链路聚合实现条件 二 链路聚合配置三 总结 一 链路聚合简介 链路聚合 xff1a 指将多个物理端口汇聚在一起 xff0c 形成一个逻辑端口 xff0c 以实现出 入流量吞吐量在各成员端口的负荷分担 xff0c 交
  • 防火墙命令

    防火墙命令 https blog csdn net calm programmer article details 124194093 1 查看防火墙的状态 dead代表关闭 running代表已经开启 systemctl status f
  • 国科大机器人作业四:基于线性的扩展卡尔曼滤波器的机器人定位(实验部分)

    文章目录 练习4 xff1a 基于线性的扩展卡尔曼滤波器的机器人定位1 Introduction2 Kalman Filter Localization2 1 状态预测 State Prediction2 2 状态更新 xff1a Stat
  • React - Context的简单使用

    Context 通过组件树提供了一个传递数据的方法 xff0c 从而避免了在每一个层级手动的传递 props 属性 在一个典型的 React 应用中 xff0c 数据是通过 props 属性由上向下 xff08 由父及子 xff09 的进行
  • cppflow加载tensorflow模型

    用tensorflow框架训练的pb模型在C 43 43 环境下使用的时候 xff0c 总是会出现版本不匹配的情况 xff0c 最近在github看到用cppflow来加载 xff0c 不用重新编译tensorflow xff0c 特别是t
  • 书,永远的朋友

    我自己认为我是一个不大喜欢看书的人 xff0c 相对于书 xff0c 我可能跟喜欢看视频和同高手一起讨论交流 但是 xff0c 真正静下心来 xff0c 想着这么多年来 xff0c 对我影响很大的一些书 xff0c 也能想到一些 索性 xf
  • 我的2013

    今天是2013年的最后一天 xff0c 天气格外的晴朗 xff0c 站在公司的写字楼上 xff0c 能够看到远处的山水 一直都习惯在一年的最后总结一下 xff0c 总结自己哪些地方在成长 xff0c 哪些地方有收获 xff0c 哪些地方需要
  • 项目管理中的TR点

    TR的意思是技术评审 xff0c 是英语Technical Review的简写 一般项目管理中有以下一些技术评审点需要关注 xff1a TR1 概念阶段技术评审点 xff1a 产品需求和概念技术评审 xff08 业务需求评审 xff09 T
  • linux ln 命令使用参数详解(ln -s 软链接)

    这是linux中一个非常重要命令 xff0c 请大家一定要熟悉 它的功能是为某一个文件在另外一个位置建立一个同不的链接 xff0c 这个命令最常用的参数是 s 具体用法是 xff1a ln s 源文件 目标文件 当 我们需要在不同的目录 x
  • 别再让C++头文件中出现“using namespace xxx;”

    在这里 xff0c 我毫不回避地说了这句话 xff1a 引用 我再也不想在任何头文件中看到 using namespace xxx 了 作为一个开发者 团队领导者 xff0c 我经常会去招聘新的项目成员 xff0c 有时候也帮助其他组的人来

随机推荐

  • Linux 查看监听端口的方法

    61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • 一口气说出 OAuth2.0 的四种授权方式

    上周我的自研开源项目开始破土动工了 xff0c 开源项目迈出第一步 xff0c 10 选 1 xff1f 页面模板成了第一个绊脚石 xff0c 密谋很久才付诸行动 xff0c 做这个的初衷就是不想让自己太安稳 xff0c 技术这条路不进步就
  • SVN MERGE 和冲突

    摘要 xff1a 最佳做法是避免冲突 冲突时 xff0c 不要把branch merge到trunk 先由最新版本的trunk得到branch 然后再修改文件 xff0c 直接merge过去就行 这样不会有冲突 先用svn merge dr
  • Linux命令之basename使用

    basename 命令 首先使用 help 参数查看一下 basename命令参数很少 xff0c 很容易掌握 basename help 用法示例 xff1a basename usr bin sort 输出 34 sort 34
  • 各种编码知识简介

    本文主要介绍我们在日常开发中接触到了latin1 xff0c GBK xff0c GB18030 xff0c UTF 8 编码几种 下面首先来看看这几种编码的的区别 latin1 1 先来看看latin1 参考百度百科 Latin1 是IS
  • Linux 技巧:让进程在后台可靠运行的几种方法

    我们经常会碰到这样的问题 xff0c 用 telnet ssh 登录了远程的 Linux 服务器 xff0c 运行了一些耗时较长的任务 xff0c 结果却由于网络的不稳定导致任务中途失败 如何让命令提交后不受本地关闭终端窗口 网络断开连接的
  • nohup命令浅析

    要将一个命令放到后台执行 xff0c 我们一般使用nohup sh command amp amp 都知道是放到后台执行这个命令 xff0c 那么nohup是做什么的 xff1f 这就要从unix的信号说起 xff0c unix的信号机制可
  • 《曾国藩家书大全集》读书笔记——励志篇

    曾国藩将立志作为人生第一要义 xff0c 只要能立志 xff0c 便人人都可以做圣贤豪杰 人生不但要立志 xff0c 还要持之以恒 xff0c 持之以恒是人生第一美德 xff0c 人而无恒 xff0c 将一事无成 曾国藩很重视逆境对人心志的
  • 常见通信协议整理归纳

    一 串行通信与并行通信 1 串行通信 简称串口 串行接口 xff0c 指数据一位一位地顺序传送 xff0c 比如 UART RS232 RS485等 xff0c 串行通信根据发送时源和接收时源是否保持一致 xff0c 又分为同步通信和异步通
  • 书,永远的朋友

    我自己认为我是一个不大喜欢看书的人 xff0c 相对于书 xff0c 我可能跟喜欢看视频和同高手一起讨论交流 但是 xff0c 真正静下心来 xff0c 想着这么多年来 xff0c 对我影响很大的一些书 xff0c 也能想到一些 索性 xf
  • docker镜像搜索网站

    docker https hub docker com search type 61 image
  • Qt 官方示例 | 了解文件读写,看这个例子就够了

    大家好 xff0c 我是老吴 xff0c 一枚勤劳的嵌入式底层劳动人民 我又双叒叕来分享 Qt 的学习心得了 学习 Qt 的最佳途径是阅读官方的手册和示例 xff0c 今天要分享的是 Qt 官方提供的示例 xff1a notepad not
  • 【鸿蒙Harmony OS】Hi3861 开发板简介

    Hi3861开发板介绍 本文档介绍Hi3861 WLAN模组的开发环境搭建 版本编译构建 烧录 源码修改 调试验证等方法 通过学习 xff0c 开发者会对Hi3861 WLAN模组开发流程有初步认识 xff0c 并可上手业务开发 开发板简介
  • VMware 错误:“驱动器未就绪

    用VMware安装系统 xff0c 每次启动都要提示错误 xff1a 驱动器未就绪 xff0c 点取消才能进入 是挺烦的 这是软驱的事 解决办法 xff1a 如图 xff0c 双击 39 Device 39 选项卡中的 39 Floppy
  • STM32H743 UART接收中断设置与原理剖析(HAL库结合FreeRTOS操作系统)

    硬件平台 xff1a STM32H743 软件平台 xff1a Keil 5 采用HAL库 43 FreeRTOS系统 初始化UART配置 void DEBUG USART Config void GPIO InitTypeDef GPIO
  • STM32+HAL+FreeRTOS串口接收一批数据后随机卡死bug的解决办法与详细探索思路(发送函数和接收函数不能同时使用)

    项目背景 keil5 43 HAL库 43 FreeRTOS系统 43 STM32H743 xff0c 存在两个同等优先级的任务 xff0c 一个任务通过串口读取数据 xff0c 一个任务通过串口发送数据 xff0c 从而与其他设备进行信息
  • C中哪些方式定义的字符串,其末尾会自动添加‘\0’

    一 0 的本质 xff1a 39 0 39 就是8位的00000000 xff0c 因为字符类型中并没有对应的这个字符 xff0c 所以这么写 39 0 39 就是 字符串结束标志 39 0 39 是转译字符 xff0c 意思是告诉编译器
  • IMU/GNSS组合导航经典论文&论文合集&IMU校准&ahrs滤波算法

    1 ALLAN方差分析 xff1a 硕士论文 xff1a Modeling Inertial sensors errors using allan variance 文章 xff1a 2 校准算法 xff1a A New Calibrati
  • 捷联惯导基础知识解析之四(粗/精对准和GPS/IMU和GPS/里程计组合导航)

    初始对准 xff08 粗 精对准 xff09 组合导航 一 捷联惯导粗对准 目的 xff1a 寻找 确定参考导航坐标系 xff1b 结果表现形式 xff1a 得到姿态矩阵 xff08 进而可以求出欧拉角 四元数等 xff09 前提 xff1
  • Psins代码解析之常用的子函数

    1 insinit m 惯导参数结构体初始化 SINS structure array initialization Prototype ins 61 insinit avp0 ts var1 var2 Initialization usa