基于6自由度飞行器的EKF和INS融合算法的MATLAB仿真

news2024/12/26 22:24:52

目录

1.算法描述

2.仿真效果预览

3.MATLAB核心程序

4.完整MATLAB


1.算法描述

       六自由度四轴飞行器,包括由四根杆组成的正四面体,所述正四面体的中心位置设有一个空心圆球,空心圆球上设有四根支杆分别与正四面体的四个顶点相连,所述空心圆球内设有电池和控制系统,

        INS/GPS的松组合模型所使用的传感器有三轴IMU,三轴磁强计和GPS接收机模块,它们分别提供载体在机体坐标系下的加速度信息、角速度信息、航向信息(已经预先基于三轴磁强计解算出航向信息,并减去当地磁偏角)、载体在导航系中的三维位置信息和导航系中的三维速度信息。各个传感器(尤其是IMU和三轴磁强计)需要经过初始校准,GPS接收机模块(以ublox m8n中ubx协议中的pvt为例)配置输出经度、纬度、海拔高度和NED坐标系下的三轴速度。

        卡尔曼滤波(Kalman Filter)是一种高效的自回归滤波器,它能在诸多不确定性情况的组合信息中估计动态系统的状态,是一种强大的、通用性极强的工具。由鲁道夫.E.卡尔曼于1961年前后首次提出,并首先应用于阿波罗计划的轨道预测。

ekf

对于KF、EKF、UKF的主要差异,通俗一点说,主要如下:

      卡尔曼滤波器 KF 是一种用作最小二乘误差优化器的滤波器,为了使其工作,在滤波器内部考虑的系统必须是线性的,即基于线性系统的前提假设。

       为了使用KF对非线性系统进行状态估计或参数估计,一种可能的方法是围绕其当前状态对正在研究的系统进行线性化,并强制滤波器使用系统的这个线性化版本作为模型. 这是Extended Kalman Filter,或简称为EKF。

       然而,由于EKF 不是很稳定,而且很多时候,当它确实收敛到“正确”解时,其收敛过程会非常缓慢。为了改进这个滤波器的固有不足,一些作者开始使用 Unscented Transformation,而不是使用线性化来预测被研究系统的行为。因此,具有 Unscented 变换(无迹变换)的 Kalman 滤波器称为 Unscented Kalman Filter,或简称为 UKF。

       与 EKF 相比,UKF具有一些优势,因为 Unscented 变换在某种程度上比线性化更好地描述了非线性系统,因此该滤波器更迅速地收敛到正确的解。而使用 EKF,这个滤波器可能会变得不稳定,结果可能会出现偏差。

核心差异总结如下:
KF:    线性化假设,求解线性系统,对应的是线性模型
EKF:  求解对象是非线性系统,通过Taylor展开式,舍去高阶项,基于线性化思想来近似线性化
————————————————

INS 

       惯性导航系统(INS,以下简称惯导)是一种不依赖于外部信息、也不向外部辐射能量的自主式导航系统。其工作环境不仅包括空中、地面,还可以在水下。惯导的基本工作原理是以牛顿力学定律为基础,通过测量载体在惯性参考系的加速度,将它对时间进行积分,且把它变换到导航坐标系中,就能够得到在导航坐标系中的速度、偏航角和位置等信息。

       惯性导航系统(INS,Inertial Navigation System)也称作惯性参考系统,是一种不依赖于外部信息、也不向外部辐射能量(如无线电导航那样)的自主式导航系统。其工作环境不仅包括空中、地面,还可以在水下。惯性导航的基本工作原理是以牛顿力学定律为基础,通过测量载体在惯性参考系的加速度,将它对时间进行积分,且把它变换到导航坐标系中,就能够得到在导航坐标系中的速度、偏航角和位置等信息。

       惯性导航系统属于推算导航方式,即从一已知点的位置根据连续测得的运动体航向角和速度推算出其下一点的位置,因而可连续测出运动体的当前位置。惯性导航系统中的陀螺仪用来形成一个导航坐标系,使加速度计的测量轴稳定在该坐标系中,并给出航向和姿态角;加速度计用来测量运动体的加速度,经过对时间的一次积分得到速度,速度再经过对时间的一次积分即可得到位移。

2.仿真效果预览

matlab2022a仿真结果如下:

 

 

3.MATLAB核心程序

 
% IMU location specifier
r_imu=[-.5/12 -3/12 1/12]'*0; % Currently set to 0. Offset effects are not currently considered
r_GPS=[1.5, 0 ,0 ]; % This is the location of the GPS wrt CG, this is very important
%rotation matrix ------------------------------------------------------
phi= x(1);
theta= x(2);
psi = x(3);
 
 
L_bi = [cos(theta)*cos(psi) cos(theta)*sin(psi) -sin(theta); ...
    sin(phi)*sin(theta)*cos(psi)-cos(phi)*sin(psi)  sin(phi)*sin(theta)*sin(psi)+cos(phi)*cos(psi) sin(phi)*cos(theta); ...
    cos(phi)*sin(theta)*cos(psi)+sin(phi)*sin(psi)  cos(phi)*sin(theta)*sin(psi)-sin(phi)*cos(psi) cos(phi)*cos(theta)];
 
 
Rt2b=L_bi';
 
[U,S,V]=svd(Rt2b);
R = U*V';
if 1+R(1,1)+R(2,2)+R(3,3) > 0
    b(1,1)    = 0.5*sqrt(1+R(1,1)+R(2,2)+R(3,3));
    b(2,1)    = ((R(3,2)-R(2,3))/4)/b(1);
    b(3,1)    = (R(1,3)-R(3,1))/4/b(1);
    b(4,1)    = (R(2,1)-R(1,2))/4/b(1);
    b       = b/norm(b);    
else
    R
    error('R diagonal too negative.')
    b = zeros(4,1);
end
 
 
%-----------------------------------------------------------------
q1=b(1);%the quaternions are called b1-b4 in the data file that you loaded
q2=b(2);
q3=b(3);
q4=b(4);
 
%initialize velocity
vx = 0;
vy = 0;
vz = 0;
 
%set sample time
dt = .02;
tf=size(A,2);
 
 
 
xhat = [0 0 0 0 0 0 b(1) b(2) b(3) b(4) bp bq br bfx bfy bfz]';
 
% noise params process noise 
Q = diag([.1 .1 .1 .1 .1 .1 .8 .8 .8 .8 .0001 .0001 .0001 .0001 .0001 .0001]);
 
 
R = diag([9 9 9 3 3 3]);
 
 
P = diag([30 30 30 3 3 3 .1 .1 .1 .1 .1 .1 .1 .1 .1 .1]);
Pdot=P*0;
tic
for k = 1:tf
    time= (k-1)*dt;
 
    xhatold=xhat;
    p = (A(1,k)*pi/180-xhat(11));
    q = (A(2,k)*pi/180-xhat(12));
    r = A(3,k)*pi/180-xhat(13);
    fx = (A(4,k)-xhat(14));
    fy = (A(5,k)-xhat(15));
    fz = -A(6,k)-xhat(16);  
    
    
    
    % Raw sensor measurments for plotting
    p_raw = A(1,k)*pi/180;
    q_raw = A(2,k)*pi/180;
    r_raw = A(3,k)*pi/180;
    fx_raw = A(4,k);
    fy_raw = A(5,k);
    fz_raw = A(6,k);
    
    quat = [xhat(7) xhat(8) xhat(9) xhat(10)]';
    quatmag= sqrt(quat(1)^2+quat(2)^2+quat(3)^2+quat(4)^2);
    
    quat = quat/quatmag;
 
    q1 = quat(1);
    q2 = quat(2);
    q3 = quat(3);
    q4 = quat(4);
 
    L_bl = [q1^2+q2^2-q3^2-q4^2    2*(q2*q3+q1*q4)      2*(q2*q4-q1*q3)
        2*(q2*q3-q1*q4)    q1^2-q2^2+q3^2-q4^2    2*(q3*q4+q1*q2)
        2*(q2*q4+q1*q3)      2*(q3*q4-q1*q2)    q1^2-q2^2-q3^2+q4^2];
    L_lb = L_bl';
    
    
 
    vq_term_11=2*(q1*fx-q4*fy+q3*fz);
    vq_term_12=2*(q2*fx+q3*fy+q4*fz);
    vq_term_13=2*(-q3*fx+q2*fy+q1*fz);
    vq_term_14=2*(-q4*fx-q1*fy+q2*fz);
    
    vq_term_21=2*(q4*fx+q1*fy-q2*fz);
    vq_term_22=2*(q3*fx-q2*fy-q1*fz);
    vq_term_23=2*(q2*fx+q3*fy+q4*fz);
    vq_term_24=2*(q1*fx-q4*fy+q3*fz);
    
    vq_term_31=2*(-q3*fx+q2*fy+q1*fz);
    vq_term_32=2*(q4*fx+q1*fy-q2*fz);
    vq_term_33=2*(-q1*fx+q4*fy-q3*fz);
    vq_term_34=2*(q2*fx+q3*fy+q4*fz);
    
    delv_delq=[[vq_term_11 vq_term_12 vq_term_13 vq_term_14];[vq_term_21 vq_term_22 vq_term_23 vq_term_24];[vq_term_31 vq_term_32 vq_term_33 vq_term_34]];
    
    %delV/del_abias
    delv_delba=(-1)*(L_lb);
    
    %delQ/delQ
    delq_delq=(-0.5)*[[0 p q r];[-p 0 -r q];[-q r 0 -p];[-r -q p 0]];
    
 
    %delQ/del_gyrobias
    delq_delbw=0.5*([[q2 q3 q4];[-q1 q4 -q3];[-q4 -q1 q2];[q3 -q2 -q1]]);
     
      
    % 现在组装过渡矩阵
    I=eye(3,3);
    trans_row1=[zeros(3,3) I zeros(3,4) zeros(3,3) zeros(3,3)];
    trans_row2=[zeros(3,3) zeros(3,3) delv_delq zeros(3,3) delv_delba];
    trans_row3=[zeros(4,3) zeros(4,3) delq_delq delq_delbw zeros(4,3)];
    trans_row4=[zeros(3,3) zeros(3,3) zeros(3,4) zeros(3,3) zeros(3,3)];
    trans_row5=[zeros(3,3) zeros(3,3) zeros(3,4) zeros(3,3) zeros(3,3)];
    
    phi_matrix=[trans_row1;trans_row2;trans_row3;trans_row4;trans_row5];
    
    phi_matrix_for_predict=phi_matrix(1:10,1:10);
   
    %下一状态预测
    xhat(1:10)=(expm(phi_matrix_for_predict*dt))*xhat(1:10)+[zeros(1,5) 32.2*dt zeros(1,4)]';
    quat_update=[xhat(7) xhat(8) xhat(9) xhat(10)]';
    quat_update_norm=norm(quat_update);
    xhat(7)=xhat(7)/quat_update_norm;
    xhat(8)=xhat(8)/quat_update_norm;
    xhat(9)=xhat(9)/quat_update_norm;
    xhat(10)=xhat(10)/quat_update_norm;
    
   %传播误差协方差矩阵,我建议使用连续积分,因为Q,R没有离散化
    Pdot=phi_matrix*P+P*phi_matrix'+Q;
    P1=Pdot*dt;
    P=P+P1;
    
    %% Correction step
    % 从GPS获取您的测量值、3个位置和3个速度
    z =[ A(7,k) A(8,k) A(9,k) A(10,k) A(11,k) A(12,k)]'; % x y z vx vy vz
       
    % Write out the measurement matrix linearization to get H
    
    %del P/del q
    Hxq_row_1=[-r_GPS(1)*2*q1 -r_GPS(1)*2*q2 r_GPS(1)*2*q3 r_GPS(1)*2*q4];
    Hxq_row_2=[-r_GPS(1)*2*q4 -r_GPS(1)*2*q3 -r_GPS(1)*2*q2 -r_GPS(1)*2*q1];
    Hxq_row_3=[r_GPS(1)*2*q3 -r_GPS(1)*2*q4 r_GPS(1)*2*q1 -r_GPS(1)*2*q2];
    H_delp_delq=[Hxq_row_1;Hxq_row_2;Hxq_row_3];
    
    % del v/del q
    
    Hvq_row_1=[(r_GPS(1)*2*q3*q+r_GPS(1)*2*q4*r) (r_GPS(1)*2*q4*q-r_GPS(1)*2*q3*r) (r_GPS(1)*2*q1*q-r_GPS(1)*2*q2*r) (r_GPS(1)*2*q2*q+r_GPS(1)*2*q1*r)];
    Hvq_row_2=[(-r_GPS(1)*2*q2*q-r_GPS(1)*2*q1*r) (r_GPS(1)*2*q2*r-r_GPS(1)*2*q1*q) (r_GPS(1)*2*q4*q-r_GPS(1)*2*q3*r) (r_GPS(1)*2*q3*q+r_GPS(1)*2*q4*r)];
    Hvq_row_3=[(r_GPS(1)*2*q1*q-r_GPS(1)*2*q2*r) (-r_GPS(1)*2*q2*q-r_GPS(1)*2*q1*r) (-r_GPS(1)*2*q3*q-r_GPS(1)*2*q4*r) (r_GPS(1)*2*q4*q-r_GPS(1)*2*q3*r)];
    H_delv_delq=[Hvq_row_1;Hvq_row_2;Hvq_row_3];
    
    % Assemble H
    H=[[I zeros(3,3) H_delp_delq zeros(3,6)];[zeros(3,3) I H_delv_delq zeros(3,6)]];
    %rank(obsv(phi_matrix,H))
    %Compute Kalman gain
    S=H*P*H'+R;
    K=P*H'*inv(S);
 
    xhat=xhat+K*(z-H*xhat);
    
    P=(eye(16,16)-K*H)*P;
 
    quatprev=[xhatold(7) xhatold(8) xhatold(9) xhatold(10)]';
    quatprev=quatprev/norm(quatprev);
     
 
    [phi(k),theta(k),psi(k)]=quat2euler(quatprev');
    phi(k)=phi(k)*180/pi;
    theta(k)=theta(k)*180/pi;
    psi(k)=psi(k)*180/pi;
    
    quat1 = A(13:16,k);
    [phi_raw(k),theta_raw(k),psi_raw(k)]=quat2euler(quat1');
    phi_raw(k)=phi_raw(k)*180/pi;
    theta_raw(k)=theta_raw(k)*180/pi;
    psi_raw(k)=psi_raw(k)*180/pi;
    xhatR(k,:)= [xhatold(1:6)' quatprev(1) quatprev(2) quatprev(3) quatprev(4) xhatold(11:16)'];
    P_R(k,:) = diag(P);
    z_R(k,:) = z;
    OMEGA_raw(k,:)=[p_raw,q_raw,r_raw]';
    OMEGA(k,:)=[p,q,r]';
    FX(k,:)=[fx_raw,fy_raw,fz_raw]';
  
end
toc
t = 1:(k);
A124

4.完整MATLAB

V

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/95446.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nodejs+vue041家政管理系统

基本要求:要求此系统能较完善的实现服务人员及客户信息的管理等功能。 主界面:分为用户登陆和管理员登陆,用户登陆包含客户登录和服务人员登陆。 用户注册:注册时可选择身份(客户或者服务人员)。 后台管…

目前免费用可用的天气api接口及失效接口

网上关于免费天气api接口很多,本人总结了一下目前还可用的免费api接口和已失效的接口如下: 目前可用接口: 1、讯飞语音识别内置的墨迹天气API。链接: http://autodev.openspeech.cn/csp/api/v2.1/weather?openIdaiuicus&c…

【Javaweb-前端】CSS

1. Syntax Selector − A selector is an HTML tag at which a style will be applied. This could be any tag like or etc.Property − A property is a type of attribute of HTML tag. Put simply, all the HTML attributes are converted into CSS properties. They coul…

散热材料产业SWOT分析:5G建设带动市场需求 多元化散热方案将成行业主流

传统散热材料以石墨片和导热凝胶等TIM材料(导热界面材料)为主,石墨片存在导热系数相对较低、厚度相对较大等问题。目前热管和VC(均热板)开始从电脑、服务器等领域渗透到智能手机终端,石墨烯材料也开始应用。…

Docker笔记--容器转换为镜像、Dockerfile的使用

目录 1--使用 docker commit 将容器转换为镜像 1-1--容器转换为镜像 1-2--实例代码 1-3--注意事项: 2--Dockerfile的使用 2-1--常用关键字 2-2--利用 dockerfile 搭建 Centos:7 镜像 1--使用 docker commit 将容器转换为镜像 1-1--容器转换为镜像 # 将容器…

家电产品出口指南,RoHs法规详解

【家电产品出口指南,RoHs法规详解】 受疫情影响,我国家电出口创新高,据海关总署发布的数据统计,2021年,中国家用电器出口额987.2亿美元,同比增长22.3%,出口规模远超历史同期水平,创近…

新款Macbook Pro可以升级固态硬盘吗?

不知道有多少用户因为预算不足而选购了256GB固态硬盘版本的Mac呢?在购买Mac之前,总觉得“省省总会有的”。实际上,还是很多256G的用户都在后悔:“为什么当初没有加钱升级固态硬盘啊!”小编在此也提醒大家,如…

让人恶心的多线程代码,性能怎么优化!

Java 中最烦人的,就是多线程,一不小心,代码写的比单线程还慢,这就让人非常尴尬。 通常情况下,我们会使用 ThreadLocal 实现线程封闭,比如避免 SimpleDateFormat 在并发环境下所引起的一些不一致情况。其实…

Java+MySQL校园网络超市系统的设计与实现 开题 论文

随着我国教育模式的改革,我国的大学生数量在逐步的增加,虽然每个高校的附近都有便利店但是很是时候这些便利店不能够满足学生的日常生活和学习的需求,尤其是便利店因为成本的原因货物不全 ,而大学生很多时候更希望通过网络购买自己所需的物品,所以通过校园网络超市系统来购买自…

基于java+springmvc+mybatis+vue+mysql的大学校医院信息管理系统

项目介绍 本系统采用java语言开发,后端采用ssm框架,前端采用vue技术,数据库采用mysql进行数据存储。 前台: 首页、校医、药品信息、疫情公告、个人中心、后台管理 后台: 首页、个人中心、在线问诊管理、问诊回复管理…

计算机毕设Python+Vue校园新闻广播系统(程序+LW+部署)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

[附源码]Node.js计算机毕业设计个人人际关系管理软件Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

Mysql 数据库时间与系统时间不一致问题排查

NO.1 产生问题 在我们学习中使用到sysdate这个函数时,发现查出来的日期时间与当前的正确时间不一致,相差8个小时左右,为什么会产生这个问题?又该如何解决? – 在数据库中使用sysdate()函数查询系统时间 select sysd…

【MAX7800与ESP8266mcu串口通讯点灯】

【MAX7800与ESP8266mcu通讯】1. 前言2. 实验条件2.1 硬件条件2.2 软件条件3. 程序编写3.1 ESP8266程序解剖3.2 MAX7800程序解剖4. 实验效果4.1 esp8266打印如下4.2 max7800打印如下5. 小结1. 前言 前期搭好MAX7800 的eclipse和ESP82666的Arduino开发环境,现在开始慢…

计算机毕设Python+Vue校园网上二手交易系统(程序+LW+部署)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

非零基础自学Golang 第8章 包管理 8.2 包的声明 8.3 包的导入

非零基础自学Golang 文章目录非零基础自学Golang第8章 包管理8.2 包的声明8.3 包的导入8.3.1 导入声明8.3.2 远程导入8.3.3 别名导入8.3.4 匿名导入第8章 包管理 8.2 包的声明 包是结构化代码的一种方式:每个程序都由包(通常简称为pkg)的概…

35岁程序员:被大厂裁员后,我赚到手的却是这样:

这两年互联网行业一直不平静,都得都懂。认识一兄弟,技术不错,p7,干架构的,也在这场风波中“光荣毕业”了,前段时间找我出去小聚,聊起了这事儿: “比起惆怅,我更多的是感到…

04-Golang的一些基本变量

Golang的一些基本变量变量介绍概念变量使用注意事项变量的使用的基本步骤程序中 号的使用变量介绍 概念 变量相当于内存中一个数据存储空间的表示,你可以把变量看作是一个个房间的门牌号,通过门牌号我们可以找到房间,同样的道理&#xff0c…

Mycat(1):Mycat简介

1、什么是MyCat MyCat是目前最流行的分布式数据库中间插件,是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL…

ODN 2395丨艾美捷CpG ODN系列参数介绍

艾美捷CpG ODN系列——ODN 2006:具有硫代磷酸酯骨架的CpG寡脱氧核苷酸(C型)。人和小鼠TLR9(Toll样受体9)的特异性配体。 艾美捷CpG ODN 丨ODN 2395化学性质: 序列:5-tcgtcgtttttcggcgcgcgccgcg…