ardupilot(EKF)扩展卡尔曼滤波

合集下载

扩展Kalman滤波(EKF)和无迹卡尔曼滤波(ukf)

扩展Kalman滤波(EKF)和无迹卡尔曼滤波(ukf)
UKF算法的核心是UT变换,UT是一种计算非线性 变换中的随机变量的统计特征的新方法,是UKF的基 础。
三、无迹卡尔曼滤波算法(UKF)
假设n维随机向量x : N(x, Px) ,x通过非线性函数y=f(x) 变换后得到n维的随机变量y。通过UT变换可以以较 高的精度和较低的计算复杂度求得y的均值 y 和方 差 Px 。UT的具体过程可描述如下:
三、无迹卡尔曼滤波算法(UKF)
UKF是用确定的采样来近似状态的后验PDF,可以 有效解决由系统非线性的加剧而引起的滤波发散问 题,但UKF仍是用高斯分布来逼近系统状态的后验概 率密度,所以在系统状态的后验概率密度是非高斯 的情况下,滤波结果将有极大的误差。
三、无迹卡尔曼滤波算法(UKF)
: Matlab程序

dax = 1.5; day = 1.5; % 系统噪声

X = zeros(len,4); X(1,:) = [0, 50, 500, 0]; % 状态模拟的初值

for k=2:len
x = X(k-1,1); vx = X(k-1,2); y = X(k-1,3); vy = X(k-1,4);

F(3,4) = 1;

F(4,4) = 2*ky*vy;

2) = 1;
二、扩展Kalman滤波(EKF)算法
function H = JacobianH(X) % 量测雅可比函数

x = X(1); y = X(3);

H = zeros(2,4);

r = sqrt(x^2+y^2);
二、扩展Kalman滤波(EKF)算法
EKF算法是一种近似方法,它将非线性模型在状态 估计值附近作泰勒级数展开,并在一阶截断,用得 到的一阶近似项作为原状态方程和测量方程近似表 达形式,从而实现线性化同时假定线性化后的状态 依然服从高斯分布,然后对线性化后的系统采用标 准卡尔曼滤波获得状态估计。采用局部线性化技术, 能得到问题局部最优解,但它能否收敛于全局最优 解,取决于函数的非线性强度以及展开点的选择。

c语言实现扩展卡尔曼滤波

c语言实现扩展卡尔曼滤波

c语言实现扩展卡尔曼滤波
扩展卡尔曼滤波是一种常用于传感器融合的滤波算法,可以有效地估计目标的状态并减小测量误差。

在本文中,我将以人类的视角来描述扩展卡尔曼滤波的原理和应用。

让我简要介绍一下卡尔曼滤波的基本原理。

卡尔曼滤波是一种递归的滤波算法,通过预测和更新两个步骤来估计系统的状态。

在预测步骤中,根据系统的动态模型和先验信息,预测下一个状态的均值和方差。

然后,在更新步骤中,利用测量值对预测结果进行修正,得到最优的状态估计。

扩展卡尔曼滤波是卡尔曼滤波的一种扩展,可以处理非线性系统。

与传统的卡尔曼滤波不同,扩展卡尔曼滤波使用线性化的动态模型和测量模型来进行状态预测和更新。

具体而言,扩展卡尔曼滤波通过在每次迭代中对非线性函数进行线性化,将非线性系统转化为线性系统进行处理。

在实际应用中,扩展卡尔曼滤波广泛用于目标跟踪、导航和定位等领域。

例如,在自动驾驶汽车中,扩展卡尔曼滤波可以利用车载传感器(如雷达和摄像头)的测量数据,对车辆的位置和速度进行估计,从而实现精确的自动驾驶控制。

扩展卡尔曼滤波还可以应用于机器人定位和导航。

通过结合惯性测量单元(IMU)和全向视觉传感器的测量数据,扩展卡尔曼滤波可以
实现机器人在未知环境中的定位和导航。

这对于无人机、无人车等智能机器人的自主导航非常重要。

扩展卡尔曼滤波是一种强大的滤波算法,能够在非线性系统中有效地估计目标的状态。

它在传感器融合、目标跟踪和机器人导航等应用中发挥着重要的作用。

通过合理地选择动态模型和测量模型,并利用适当的线性化方法,我们可以利用扩展卡尔曼滤波来解决各种实际问题,并取得良好的估计效果。

扩展卡尔曼滤波(EKF)理论讲解与实例(matlab、python和C++代码)

扩展卡尔曼滤波(EKF)理论讲解与实例(matlab、python和C++代码)

扩展卡尔曼滤波(EKF)理论讲解与实例(matlab、python和C++代码)扩展卡尔曼滤波(EKF)理论讲解与实例(matlab、python和C++代码)⽂章⽬录我们上篇提到的 (参见我的另⼀篇⽂章: )是⽤于线性系统,预测(运动)模型和观测模型是在假设⾼斯和线性情况下进⾏的。

简单的卡尔曼滤波必须应⽤在符合⾼斯分布的系统中,但是现实中并不是所有的系统都符合这样 。

另外⾼斯分布在⾮线性系统中的传递结果将不再是⾼斯分布。

那如何解决这个问题呢?扩展卡尔曼滤波就是⼲这个事的。

理论讲解扩展卡尔曼滤波(Extended Kalman Filter,EKF)通过局部线性来解决⾮线性的问题。

将⾮线性的预测⽅程和观测⽅程进⾏求导,以切线代替的⽅式来线性化。

其实就是在均值处进⾏⼀阶泰勒展开。

数学中,泰勒公式是⼀个⽤函数在某点的信息描述其附近取值的公式( ⼀句话描述:就是⽤多项式函数去逼近光滑函数 )。

如果函数⾜够平滑的话,在已知函数在某⼀点的各阶导数值的情况之下,泰勒公式可以⽤这些导数值做系数构建⼀个多项式来近似函数在这⼀点的邻域中的值。

泰勒公式还给出了这个多项式和实际的函数值之间的偏差。

表⽰ 在第 阶导数的表达式,带⼊⼀个值计算后得到的结果(注意,它是个值)是⼀个系数(⼀个值),每⼀项都不同,第⼀项 ,第⼆项 …… 依此类推是⼀个以为⾃变量的表达式 。

是泰勒公式的余项,是 的⾼阶⽆穷⼩KF 和EKF 模型对⽐⾸先,让卡尔曼先和扩展卡尔曼滤波做⼀个对⽐。

在对⽐过程中可以看出,扩展卡尔曼是⼀个简单的⾮线性近似滤波算法,指运动或观测⽅程不是线性的情况,在预测模型部分,扩展卡尔曼的预测模型和量测模型已经是⾮线性了。

为了简化计算,EKF 通过⼀阶泰勒分解线性化运动、观测⽅程。

KF 与EKF 具有相同的算法结构,都是以⾼斯形式描述后验概率密度的,通过计算贝叶斯递推公式得到的。

最⼤的不同之处在于,计算⽅差时,EKF 的状态转移矩阵(上⼀时刻的状态信息)和观测矩阵(⼀步预测)都是状态信息的雅克⽐矩阵( 偏导数组成的矩阵)。

扩展Kalman滤波(EKF)和无迹卡尔曼滤波 PPT

扩展Kalman滤波(EKF)和无迹卡尔曼滤波 PPT

三、无迹卡尔曼滤波算法(UKF)
2(nk)n
(n)Px
w
m i
w
c i
f (•)
Y if(X i)i,0 ,1 ,.2 .n.,.......7 ).(....
三、无迹卡尔曼滤波算法(UKF)
2n
y wimYi .................................(.8) i0
for k=1:len
r = sqrt(X(k,1)^2+X(k,3)^2) + dr*randn(1,1);
a = atan(X(k,1)/X(k,3)) + dafa*randn(1,1);
Z(k,:) = [r, a];
end
大家应该也有点累了,稍作休息
大家有疑问的,可以询问和交流
二、扩展Kalman滤波(EKF)算法
UKF算法的核心是UT变换,UT是一种计算非线性 变换中的随机变量的统计特征的新方法,是UKF的基 础。
三、无迹卡尔曼滤波算法(UKF)
假设n维随机向量x: N(x,Px),x通过非线性函数y=f(x) 变换后得到n维的随机变量y。通过UT变换可以以较 高的精度和较低的计算复杂度求得y的均值 y 和方 差 Px 。UT的具体过程可描述如下:
X(k,:) = [x, vx, y, vy];
end
figure(1), hold off, plot(X(:,1),X(:,3),'-b'), grid on
% figure(2), plot(X(:,2:2:4))
ห้องสมุดไป่ตู้
% 构造量测量
mrad = 0.001;
dr = 10; dafa = 10*mrad; % 量测噪声

扩展卡尔曼滤波器(EKF)进行信号处理及信号参数估计

扩展卡尔曼滤波器(EKF)进行信号处理及信号参数估计

% 扩展卡尔曼滤波器估计单相电压幅值、相位、频率参数(含直流)function test2_EKFclose all;clc;tic; %计时%模型:y=A0+A1*cos(omega*t+phy1)%离散化:y(k)=A0(k)+A1(k)*cos(omega(k)*k*Ts+phy1(k))%状态变量:x1(k)=A0(k),x2(k)=omega(k),x3(k)=A1(k)*cos(omega(k)*k*Ts+phy1(k) ),x4(k)=A1(k)*sin(omega(k)*k*Ts+phy1(k))%下一时刻状态变量为(假设状态不突变):A0(k+1)=A0(k),A1(k+1)=A1(k),omega(k+1)=omega(k),phy1(k+1)=phy1 (k);%则对应状态为:x1(k+1)=x1(k),x2(k+1)=x2(k),x3(k+1)=x3(k)*cos(x2(k)*Ts)-x4(k)*sin(x(2)*Ts),x4(k+1)=x3(k)*sin(x2(k)*Ts)+x4(k)*cos(x(2)*Ts);%状态空间描述:X(k+1)=f(X(k))+W(k);y(k)=H*X(k)+v(k)%f(X(k))=[x1(k);x2(k);x3(k)*cos(x2(k)*Ts)-x4(k)*sin(x(2)*Ts);x3(k)*sin(x2(k)*Ts)+x4(k)*cos(x(2)*Ts)]%偏导(只求了三个):f`(X(k))=[1,0,0;0,1,0;0,-x3(k)*Ts*sin(x2(k)*Ts)-x4(k)*Ts*cos(x2(k)*Ts),cos(x2(k)*Ts);0,x3(k)*Ts*cos(x2(k)*Ts)-x4(k)*Ts*sin(x2(k)*Ts),sin(x2(k)*Ts)]N=1000;t=linspace(0,1,N);y=2+0.5*cos(2*pi*100*t+pi/3);y1=y+0.05*randn(size(y));% p1=1*exp(-4*log(2)*(t-0.5).^2/0.005^2);% y1=y1+p1;% y1=y;Ts=diff(t(1:2));% plot(t,y)% 状态空间描述:X(k+1)=f(X(k))+W(k);y(k)=H*X(k)+v(k);X=zeros(4,N);% X1=X;X(:,1)=[0,199*pi,0,0];Q=1e-7*eye(4);R=1;P=1e4*eye(4);H=[1,0,1,0];for j=2:NX1=[X(1,j-1);X(2,j-1);X(3,j-1)*cos(X(2,j-1)*Ts)-X(4,j-1)*sin(X(2,j-1)*Ts);X(3,j-1)*sin(X(2,j-1)*Ts)+X(4,j-1)*cos(X(2,j-1)*Ts)];F=[1,0,0,00,1,0,00,-X(3,j-1)*Ts*sin(X(2,j-1)*Ts)-X(4,j-1)*Ts*cos(X(2,j-1)*Ts),cos(X(2,j-1)*Ts),-sin(X(2,j-1)*Ts)0,X(3,j-1)*Ts*cos(X(2,j-1)*Ts)-X(4,j-1)*Ts*sin(X(2,j-1)*Ts),sin(X(2,j-1)*Ts),cos(X(2,j-1)*Ts)];P1=F*P*F'+Q;K=P1*H'/(H*P1*H'+R);X(:,j)=X1+K*(y1(j)-H*X1);P=(eye(4)-K*H)*P1;endy2=H*X;toc; %结束计时subplot(2,3,1)plot(t,y1)hold onplot(t,y2,'-',t,y,'--')hold offsubplot(2,3,2)plot(t,X(1,:)) %直流偏移subplot(2,3,3)plot(t,X(2,:)/2/pi) %频率% ylim([5,15])subplot(2,3,4)% plot(t,y1-mean(y1)-y2)plot(t,sqrt(X(3,:).^2+X(4,:).^2)) %幅值subplot(2,3,5)plot(t,atan(X(4,:)./X(3,:))) %相位subplot(2,3,6)plot(t,y1-y2) %误差。

卡尔曼滤波、扩展卡尔曼滤波、无迹卡尔曼滤波以及粒子滤波原理

卡尔曼滤波、扩展卡尔曼滤波、无迹卡尔曼滤波以及粒子滤波原理

卡尔曼滤波、扩展卡尔曼滤波、无迹卡尔曼滤波以及粒子滤波原理所有滤波问题其实都是求感兴趣的状态的后验概率分布,只是由于针对特定条件的不同,可通过求解递推贝叶斯公式获得后验概率的解析解(KF、EKF、UKF),也可通过大数统计平均求期望的方法来获得后验概率(PF)。

1 KF、EKF、UKF1.1 定义KF、EKF、UKF 都是一个隐马尔科夫模型与贝叶斯定理的联合实现。

是通过观测信息及状态转移及观测模型对状态进行光滑、滤波及预测的方法。

而KF、EKF及UKF的滤波问题都可以通过贝叶斯估计状态信息的后验概率分布来求解。

Kalman在线性高斯的假设下,可以直接获得后验概率的解析解;EKF是非线性高斯模型,通过泰勒分解将非线性问题转化为线性问题,然后套用KF的方法求解,缺陷是线性化引入了线性误差且雅克比、海塞矩阵计算量大;而UKF也是非线性高斯模型,通过用有限的参数来近似随机量的统计特性,用统计的方法计算递推贝叶斯中各个积分项,从而获得了后验概率的均值和方差。

1.2 原理KF、EKF、UKF滤波问题是一个隐马尔科夫模型与贝叶斯定理的联合实现。

一般的状态模型可分为状态转移方程和观测方程,而状态一般都是无法直接观测到的,所以时隐马尔科夫模型。

然后,它将上一时刻获得的状态信息的后验分布作为新的先验分布,利用贝叶斯定理,建立一个贝叶斯递推过程,从而得到了贝叶斯递推公式,像常用的卡尔曼滤波、扩展卡尔曼滤波、不敏卡尔曼滤波以及粒子滤波都是通过不同模型假设来近似最优贝叶斯滤波得到的。

这也是滤波问题的基本思路。

所有贝叶斯估计问题的目的都是求解感兴趣参数的后验概率密度。

并且后验概率的求解是通过递推计算目标状态后验概率密度的方法获得的。

在贝叶斯框架下,通过状态参数的先验概率密度和观测似然函数来求解估计问题;在目标跟踪背景下(隐马尔科夫模型),目标动态方差决定状态转移概率,观测方程决定释然函数。

一般化的整个计算过程可以分为3步:01. 一步状态预测:通过状态转移概率及上一时刻的后验概率算出一步预测概率分布。

扩展卡尔曼滤波器和无迹卡尔曼滤波器的性能对比研究

扩展卡尔曼滤波器和无迹卡尔曼滤波器的性能对比研究

第三代业务支撑系统总体架构规范.第三代业务支撑系统-B O SS 系统总体技术规范. 第三代业务支撑系统开通中心试点方案.拆分处理集群模式:拆分处理主机分布式部署,任意节点故障,工单调度应用将工单分发至其余节点处理;网元处理集群:网元处理主机分布式部署,任意节点故障, 拆分处理应用将工单分发至其余节点处理;数据库服务器部署在高可靠型服务器上,部署生产数据 库和容灾数据库各1套。

5结语基于分布式架构统一开通系统的设计方案,通过分布式 部署及开通机制优化,提高了系统开通效率,从而提高客户满 意度。

应用主机的分布式部署,支持系统水平扩展,系统扩容 周期可以大大缩短。

建设开通运营管理平台,提供可视化运 维能力,提高系统的运维效率。

参考文献:工单应该尽快完成。

最后时限的算法为deadline 创建时间-优 先级*权值,权值的单位为秒。

最后时限越小的工单,越先被处 理。

在工单导入环节按时间,工单ID 从开通接口表导数据到 内存,排序后生成优先级队列。

所有的优先级队列都按deadline 排序,当deadline 相同时,按工单ID 排序,同时优先级队列采 用二叉树的方式存储,每次处理最左叶子节点(优先级最高)的 工单,保证高优先级工单能及时处理,同时随着时间的推移,较 早时间进来的低优先级工单会慢慢移入左树枝,最终被取走处 理,避免了低优先级工单长时间无法处理的情况。

4系统部署建议统一开通系统的部署引入了分布式架构,通过将系统不 同功能模块部署到集群的不同服务节点上,并确保主备关系 的服务器部署在不同机架上,从而提高系统的可用性、稳定性, 同时提高大数据量处理效率。

工单调度采用主备模式:工单调度主机做H A 互备,如果 出现单节点故障,自动在备机上启动;2018年第5期 (总第185期)信息通信INFORMATION & COMMUNICATIONS2018(Sum . N o 185)扩展卡尔曼滤波器和无迹卡尔曼滤波器的性能对比研究战帅\冯世民2(解放军92419部队,辽宁葫芦岛125001 ;2.解放军92941部队,辽宁葫芦岛125001)摘要:针对扩展卡尔曼滤波(extended Kalman filter , EKF )和无迹卡尔曼滤波(unscented Kalman filter , UKF )两种常用非线 性估值滤波算法的性能优劣问题,文章从算法基本原理出发,对E K F 和U K F 在线性估计器意义上的一致性、在线性化 方式上的区别以及滤波器调参特点等方面进行了理论分析,并给出了一种用于E K F 的调参方法。

扩展卡尔曼滤波EKF在移动机器人SLAM的应用

扩展卡尔曼滤波EKF在移动机器人SLAM的应用

扩展卡尔曼滤波 EKF在移动机器人SLAM的应用摘要:为了满足移动机器人在已知初始位姿情况下对于移动定位准确性的需要,这里基于激光雷达的数据采集前提下,对移动机器人的运动学模型和观测模型进行了分析,通过对移动机器人进行运动分析,实现移动机器人的准确定位。

仿真实验结果表明:该算法可以提高定位精度,算法实现相对容易,为移动机器人准确定位提供了参考。

关键词:移动机器人;扩展卡尔曼滤波;运动学模型;观测模型;定位0引言即时定位与地图构建(Simultaneous Localization and Mapping)SLAM技术,就是指移动机器人在自身位置信息不确定的环境下,通过自身的传感器来对外界环境采集数据,在移动过程中实时的进行对环境地图的增量式构建并进行自主定位和导航。

即时定位与地图构建的能力的存在与否,决定了移动机器人能否真正实现自主定位导航。

在移动机器人定位过程中,由于外界环境、噪声以及自身误差等一些不确定的因素[1],都会导致机器人在定位过程中的困难。

最初的卡尔曼滤波(Kalman Filter)在处理SLAM的一些问题时,往往具有一些局限性,只能应用于线性化的高斯系统中。

扩展卡尔曼滤波是线性卡尔曼滤波在非线性方向的延伸,在大多数的关于SLAM的解决方案中,扩展卡尔曼滤波器成为了最普遍也是应用最为广泛的解决方法[2]。

扩展卡尔曼滤波的核心思想就是在非线性系统中,通过泰勒级数展开将非线性模型近似线性化处理,寻求最优解的过程[3]。

扩展卡尔曼滤波器有着高度的数学严谨性、收敛速度快、预测估计简单直接等优点[4],非常适合于SLAM问题的算法结构。

首先建立移动机器人运动学模型,通过激光雷达来获取周围环境信息来构建观测方程。

通过将运动学模型与观测模型相结合,利用卡尔曼滤波对环境特征进行预估更新,实现移动机器人的准确定位。

1系统工作原理如图1所示为扩展卡尔曼滤波移动机器人的系统原理图,该系统是一个递推的闭环过程。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ardupilot(EKF)扩展卡尔曼滤波一、初识卡尔曼滤波器为了描述方便我从网上找了一张卡尔曼滤波器的5大公式的图片。

篇幅所限,下图所示的是多维卡尔曼滤波器(因为EKF2是多维扩展卡尔曼滤波器,所以我们从多维说起),为了跟好的理解卡尔曼滤波器可以百度一下,从一维开始。

这5个公式之外还有一个观测模型,根据你实际的观测量来确定,它的主要作用是根据实际情况来求观测矩阵H。

因为卡尔曼滤波器是线性滤波器,状态转移矩阵A和观测矩阵H是确定的。

在维基百科上状态转移矩阵用F表示。

在ardupilot EKF2算法中,状态转移矩阵也是用F表示的。

下面是维基百科给出的线性卡尔曼滤波器的相关公式。

上述更新(后验)估计协方差的公式对任何增益K k都有效,有时称为约瑟夫形式。

为了获得最佳卡尔曼增益,该公式进一步简化为P k|k=(I-K k H k)P k|k-1,它在哪种形式下应用最广泛。

但是,必须记住它仅对最小化残差误差的最佳增益有效。

为了使用卡尔曼滤波器来估计仅给出一系列噪声观测过程的内部状态,必须根据卡尔曼滤波器的框架对过程进行建模,这意味着指定一下矩阵:只要记住一点就行了,卡尔曼滤波器的作用就是输入一些包含噪声的数据,得到一些比较接近真是情况的数据。

比如无人机所使用的陀螺仪和加速度计的读值,他们的读值都是包含噪声的,比如明明真实的角速度是俯仰2°/s,陀螺仪的读值却是2.5°/s。

通过扩展卡尔曼之后的角速度值会变得更加接近2º/s的真实值,有可能是2.1º/s。

二、扩展卡尔曼滤波器因为卡尔曼滤波器针对的是线性系统,状态转移模型(说的白话一点就是知道上一时刻被估计量的值,通过状态转移模型的公式可以推算出当前时刻被估计量的值)和观测模型。

注:有的资料显示状态模型中有,有的没有,目前我也不清楚是为什么,有可能和被估计的对象有关。

但看多了你就会发现不管网上给的公式有怎样的不同,但总体的流程是一样的,都是这5大步骤。

我个人觉得维基百科给的公式较为标准。

因为扩展卡尔曼滤波器(EKF,Extended Kalman filter)的使用场景为非线性系统。

所以上面两公式改写为下面所示的样子,我个人的理解是,因为是非线性系统,所以没有固定的状态转移矩阵和观测矩阵。

到这儿为止卡尔曼滤波器到扩展卡尔曼滤波器的过度就完成了(多说一句,因为传感器的数据采样是有时间间隔的,算法的运行也是有间隔的,所以本文提到的KF和EKF都是离散型的)。

下面是扩展卡尔曼滤波器的相关公式。

有心的你一定发现了,扩展卡尔曼滤波器的状态转移和观测模型中,没有了状态转移矩阵和观测矩阵,但预测和更新过程中,还是要用到和。

就我个人的了解,求和的过程就是对非线性系统线性化。

和的求法如下:看到这两个求和的公式,是不是头都大了。

看了半天也不知道是什么意思,光看公式也不知道,这两个矩阵到底该怎么求。

我一开始就是这个感觉,什么雅克比矩阵,什么一阶偏导,听得头都大了(还是大学数学没学好...)。

实际上数学家最擅长的事情就是把简单的问题复杂化,把对问题的描述抽象化。

抽象带来的问题就是,公式具有高度的概括性,反映了一系列具有相同特性事物的关系,简单明了的说明了事物的本质。

但抽象化掩盖了细节,使人理解起来什么十分困难。

随后我会结合EKF2的代码作出详细的解释,参照着具体的情况和公式,反复多看几遍,你就会有一个比较清晰的了解。

想要深入了解ardupilot EKF2的原理,一定要把扩展卡尔曼滤波器的这几个公式,背的滚瓜烂熟,这样在后续读代码的时候,就能迅速联想起代码所对应的过程和公式,这一点很重要。

在了解EKF2的初期,并不需要知道扩展卡尔曼滤波器的公式为什么是这样,你只要知道EKF2的每个阶段,用的公式是什么样子的就可以了。

事实上我在为EKF2添加观测量并测试成功的两年之后,才逐渐的知道EKF2每一步所使用的公式都是什么。

以自身经验来讲,我觉得对EKF2的了解,需要经历3个阶段。

第一阶段、不知其然最开始,你想要了解ardupilot姿态解算的(ardupilot的核心代码大致分为几块,姿态解算(准确的说应该是位姿解算)、姿态控制、位置控制、任务决策、路径规划等,其中位姿解算是重中之重,其他模块都依赖于位姿解算模块所提供的准确的姿态、位置信息)相关的代码,看了它类的名字AP_NavEKF2,你在网上一搜或问了同事、同学、老师,知道了ardupilot使用的是扩展卡尔曼滤波器。

你在网上开始查资料,这时你查到的资料鱼龙混杂,有的说的是扩展卡尔曼滤波器,有的实际上说的是卡尔曼滤波器。

在查资料的过程中你渐渐的知道了四元数、欧拉角、旋转矩阵、旋转向量等名词,但此时的你还是一头雾水。

随着你看的资料越来越多,你逐渐的知道了扩展卡尔曼滤波器的作用,他的大体过程,他的输入输出是什么。

虽然这时你也许还不大清楚为啥网上查到的公式有的地方长得不大一样,但你发现他们大部分是一样的。

虽然你还不知道和是怎么求得的,对了,你有可能查到的公式里状态转移和观测矩阵是和(我当时查到的就是这样,这直接导致后面看代码更加的头雾水)。

此时,你觉得你对EKF有了一定的了解,开始看代码。

你努力的通过代码了解EKF2的程序流程,一开始是一些逻辑代码,你看得有些吃力,但还可以经过一番鏖战,你终于看到了EKF2的核心代码(在此期间,相同的代码你有可能会看好几遍,而且每一遍的理解都不一样)。

当你试着找到那5大公式时,你崩溃了。

状态转移矩阵在哪?观测矩阵在哪?是什么?又是什么?怎么还有和?公式里也没有提到呀。

你再往下看,看到了和,你的心情稍微平复了一些,终于看到两个公式里提到的变量。

但这也和理论中的公式相差十万八千里。

再往后看,你看到了函数SelectMagFusion,此时的你猜想,这个函数的作用应该是修正偏航角(Yaw)。

你觉得这个函数有可能是一个突破口,于是你在粗略的看了看这个函数之后,确定了你的想法。

之后的你了解了磁罗盘数据的格式和代表的含义,然后又开始读代码,读着读着,又看到了一大堆的计算,就在你痛苦不看之时,Kfusion出现在你的眼前。

此时的你隐约的感觉到这个函数应该是修正最终的输出量(偏航角)的地方。

在经过无数个日夜,看代码,树立猜想,再看代码,推翻猜想的循环后,你终于知道了这个函数里关键变量的作用,但此时的你还是不知道那一大坨的计算是干什么的,不过多天的思考,你知道只要找到输入,在修正量一致的情况下,计算过程应该是一致的,你沿着这个思路,修改了输入,发现输出确实发生了变化。

经过无数个日夜的煎熬,终于送了口气。

此时的你沿着这个方向,经过多次的修改、测试,终于实现了自己想要的结果。

得到预想结果的你,高兴极了。

既然修改成功了,目标达到了,EKF2里又有一大坨计算,看着都让人头疼,这个事情也可以放放了。

毕竟自己已经是修改过EKF2,ardupilot核心代码的人了。

第二阶段、知其然当你经历过第一阶段后,你就去了解其他方面的知识了(也有可能是,你实在看不懂那一坨计算代码是干什么的,拼命的看了一段时间,还是没有任何进展,这时投入产出比变得很低很低,你觉得不如先去了解下其他方面的知识)。

在学习其他知识的过程中,你还是时常想起EKF2那些你没有弄明白的问题,你时常翻看EKF2相关的代码、之前找到的EKF资料,也时不时的从网上再查看一些新的资料,还有那个matlab脚本文件(GenerateNavFilterEquations.m)。

通过注释你知道了,EKF2的代码是从这个脚本中来的,你在第一阶段中也看过这个脚本,但也没有看出来,EKF2是怎么通过这个脚本来。

也许你对matlab也不是那么熟悉(语法似乎和C++差不多,都是变量、函数,但又感觉差的很多),在看脚本的时候,看得迷迷糊糊,痛苦的很。

所有在你翻看了这些资料后,你又去了解其他的知识了。

期间你知道了ROS、了解了人工智能,知道了python的作用和应用场景,所以你花时间学习了python。

这时你还是时常想着ardupilot EKF2的实现到底是个怎样的过程。

在你不断的思考和查资料中,你似乎对EKF的了解又深了一点点。

此时你再一次的看了GenerateNavFilterEquations.m,这时你发现,你似乎可以读懂这个脚本了,这个脚本的语法和python是那么的相似,但其中有几行还是不一样,你通过百度和自己的实际操作,也逐渐的弄明白了。

在看脚本的过程中,你发现,脚本中的状态转移矩阵用的是,以某种运算通过求得了,这时你恍然大悟,EKF代码中的是和状态转移矩阵相关的。

你之前一直在找的,在代码中压根就不存在,所以你之前一直感觉EKF2和EKF理论不是那么一致。

之后,你又找到了EKF2代码中存在的、。

对应的找到了EKF理论中的哪些公式。

又花了一两周时间,弄明白了这些公式所代表的含义,将EKF2的代码和公式终于对应了起来。

但此时你又发现EKF2所用的公式和维基百科中的有一些区别,和你找的其他资料也不大一样,和秦永元老师写的《卡尔曼滤波与组合导航原理》一书中所写的公式也不一样,不是多一点就是少一点。

因为ardupilot的广泛应用,所以你的直觉告诉你,EKF2所用的公式虽然和资料里的都不一样,但事实证明它是可用的,那它这么用公式也是可以的。

为了加深你的理解,将EKF2所使用的公式,对照着代码写了一遍。

此时你已经明白了EKF2所使用的公式有哪些,状态向量、状态转移矩阵、观测矩阵和协方差矩阵都是什么。

你已经知道了在有新的传感器后,如何添加到EKF2中,使其提高系统对自身姿态、位置或速度的估计。

进行怎样的测试,来证明你的添加量是能用的。

但你此时依然不清楚EKF2所用的公式为什么是那样,换个公式行不行,EKF的哪些参数影响了它的结果,影响有多大?是如何影响的?第三阶段、知其所以然在经历了一、二阶段之后,你对EKF和其在ardupilot中的实现(EKF2)有了一定的了解,但第二阶段完成后,你还是有许多的疑问。

要解决这些疑问你必须要对EKF有更深层次的了解,知道EKF哪些公式是怎么推导来的。

这需要较深的数学基础。

第三阶段注定是个硬骨头,完成它需要很多理论知识,包括数学知识、EKF相关的知识、导航相关的知识、传感器相关的知识。

但你了解了这些知识,并用这些知识解答了EKF2为什么要选取那几个公式,那几个公式是不是最优选择的问题。

在解决了这些问题后,你可以针对多旋翼用C/C++实现一个支持IMU、GPS和磁罗盘的位姿解算算法。

如果这些事情你都做完了,恭喜你,你已经成为EKF方面的大牛了。

三、一睹EKF2芳容预测过程首先我们来确定EKF算法预测过程两个方程(预测状态估计方程和预测协方差估计方程)中的函数和变量。

也就是状态向量Xk、函数f(xk-1,uk-1,wk-1)、状态转移矩阵F、协方差矩阵P、过程噪声协方差矩阵Q和不知名的矩阵L。

相关文档
最新文档