卡尔曼滤波

卡尔曼滤波C语言实现

陌路散爱 提交于 2020-01-17 13:03:59
卡尔曼5条基本公式,参考 https://wenku.baidu.com/view/8523cb6eaf1ffc4ffe47ac24.html #include "stdio.h" #include "stdlib.h" #include "math.h" #define kal_Q 0.001 /*过程噪声协方差,Q增大,动态响应变快,收敛稳定性变坏*/ #define kal_R 0.542 /*观测噪声协方差,R增大,动态响应变慢,收敛稳定性变好*/ double frand() { return 2 * ((rand() / (double)RAND_MAX) - 0.5); /*随机噪声 */ } /*Measure 原始测量数据 op_flg 0 仅初始化参数 1 执行卡尔曼滤波 */ double Kalman(double measure,int op_flg) { double x_mid,kg,p_mid; static double x_last = 0,p_last = 0; double x_now,p_now; if(op_flg) /*非初始化*/ { x_mid = x_last; p_mid = p_last + kal_Q; kg = p_mid / (p_mid + kal_R); x_now = x_mid + kg * (measure -

室内定位系列(五)——目标跟踪(卡尔曼滤波)

混江龙づ霸主 提交于 2020-01-13 11:59:27
进行目标跟踪时,先验知识告诉我们定位轨迹是平滑的,目标当前时刻的状态与上一时刻的状态有关,滤波方法可以将这些先验知识考虑进来得到更准确的定位轨迹。本文简单介绍卡尔曼滤波及其使用。 原理 卡尔曼滤波的细节可以参考下面这些,有直观解释也有数学推导。 运动目标跟踪(一)--搜索算法预测模型之KF,EKF,UKF 初学者的卡尔曼滤波——扩展卡尔曼滤波(一) 理解Kalman滤波的使用 这里仅从目标定位跟踪的角度做一个简化版的介绍。 定位跟踪时,可以通过某种定位技术(比如位置指纹法)得到一个位置估计(观测位置),也可以根据我们的经验(运动目标常常是匀速运动的)由上一时刻的位置和速度来预测出当前位置(预测位置)。把这个观测结果和预测结果做一个加权平均作为定位结果,权值的大小取决于观测位置和预测位置的不确定性程度,在数学上可以证明在预测过程和观测过程都是线性高斯时,按照卡尔曼的方法做加权是最优的。 扩展: 在有些应用中,如果不是线性高斯的情况该怎么办?可以采用 EKF (扩展卡尔曼滤波),在工作点附近对系统进行线性化,即使不是高斯也近似成高斯去做。这样做有点太粗糙了,于是又有了 IEKF (迭代卡尔曼滤波,对工作点进行迭代优化), UKF或SPKF (无迹卡尔曼滤波,不做线性化,而是投影做出一个高斯分布去近似)。或者抛弃各种假设,直接采用蒙特卡洛的方式,假设出很多的粒子去近似分布,就是 PF

卡尔曼滤波

谁说胖子不能爱 提交于 2019-12-28 00:45:44
#include "opencv2/video/tracking.hpp" #include "opencv2/highgui/highgui.hpp" #include <stdio.h> #include<iostream> using namespace cv; using namespace std; const int winHeight = 600; const int winWidth = 800; Point mousePosition = Point(winWidth >> 1, winHeight >> 1); //mouse event callback void mouseEvent(int event, int x, int y, int flags, void *param) { if (event == CV_EVENT_MOUSEMOVE) { mousePosition = Point(x, y); } } int main(void) { Mat processNoise(2, 1, CV_32F);//新加程序 RNG rng; //1.kalman filter setup const int stateNum = 4; //状态值4×1向量(x,y,△x,△y) const int measureNum = 2; //测量值2×1向量(x

无迹卡尔曼滤波

て烟熏妆下的殇ゞ 提交于 2019-12-26 01:59:21
无迹卡尔曼滤波在生成sigma点集的时候,要用到一个P矩阵,这个P矩阵的初值是怎样设置的,是随便进行设定的吗?还有就是这个P矩阵怎样保证每次迭代更新后P矩阵都是正定的,有没有大佬可以解释以下啊。 下边附上黄小平和王岩老师编著的《卡尔曼滤波原理及应用》中的一段程序,希望有大佬可以给与解释。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 无迹Kalman滤波在目标跟踪中的应用 % 详细原理介绍及中文注释请参考: % 《卡尔曼滤波原理及应用-MATLAB仿真》,电子工业出版社,黄小平著。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function UKF clc;clear; T=1; N=60/T; X=zeros(4,N); X(:,1)=[-100,2,200,20]; %x位置,x速度,y位置,y速度 Z=zeros(1,N); %传感器对位置的观测 delta_w=1e-3; %如果增大这个数,目标真实轨迹就是曲线了 Q=delta_w diag([0.5,1]) ;%过程噪声均值 G=[T 2/2,0;T,0;0,T 2/2;0,T];%过程噪声驱动矩阵 R=5

基于加速度计与气压计的三阶卡尔曼滤波计算加速度、速度及高度

家住魔仙堡 提交于 2019-12-18 19:47:21
本文主要介绍了卡尔曼滤波器的使用原理,给出了matlab代码,并在STM32F407平台对卡尔曼滤波器进行了验证,传感器为MPU6050与DPS310,测试结果令人满意,速度与高度无累积误差。 系统状态方程 在开始讲卡尔曼滤波器之前需要先提一下状态方程。因为卡尔曼的计算公式是建立在状态方程上的,所以我们需要先写出系统的状态方程。离散状态方程为: 其中 X (k)为当前状态, X (k+1)为下一时刻状态, Φ 为转移矩阵, B 为控制矩阵, u 为控制量, Г 为噪声矩阵, W 为系统噪声, Y 为输出量, H 为输出矩阵, V 为观测噪声。简单来说就是通过这一时刻已知的状态、控制量及系统噪声可以求出此刻的能观测到的输出以及下一时刻的状态。 那什么又是状态呢?对于我们要分析的系统来说,加速度、速度、以及高度就是系统的状态,也就是说公式中的 X (k)就是包含加速度、速度、以及高度的向量。 同理: 而状态转移矩阵 Φ 是表述下一时刻状态与此刻状态关系的矩阵,在本系统中我们能够非常清楚得列出他们的关系,假设我们采样周期T比较短,可以近似认为加速度a几乎不变,则 将上面几个等式写成矩阵形式则为: 由此我们可以得到转移矩阵Φ就是: 对于我们要分析的系统,没有控制量,不考虑其他系统噪声的情况下,后面两项可以直接拿掉,状态方程简化为: 状态方程第一个式子分析完了接下来分析下第二个式子。

图解卡尔曼滤波

≯℡__Kan透↙ 提交于 2019-12-16 03:12:07
How a Kalman filter works, in pictures From: https://www.bzarg.com/p/how-a-kalman-filter-works-in-pictures/ https://zhuanlan.zhihu.com/p/39912633 https://blog.csdn.net/u010720661/article/details/63253509 来源: CSDN 作者: gadwgdsk 链接: https://blog.csdn.net/gadwgdsk/article/details/103522612

卡尔曼滤波C代码分析

余生长醉 提交于 2019-12-14 11:55:09
float Angle=0.0; //卡尔曼滤波器的输出值,最优估计的角度 //float Gyro_x=0.0; //卡尔曼滤波器的输出值,最优估计的角速度 float Q_angle=0.001; //陀螺仪噪声的协方差(估计过程的误差协方差) float Q_gyro=0.003; //陀螺仪漂移噪声的协方差(估计过程的误差协方差) float R_angle=0.5; //加速度计测量噪声的协方差 float dt=0.005; //积分时间,dt为滤波器采样时间(秒) char C_0 = 1; //H矩阵的一个数 float Q_bias=0, Angle_err=0; //Q_bias为陀螺仪漂移 float PCt_0=0, PCt_1=0, E=0; //中间变量 float K_0=0, K_1=0, t_0=0, t_1=0; //K是卡尔曼增益,t是中间变量 float Pdot[4] ={0,0,0,0}; //计算P矩阵的中间变量 float PP[2][2] = { { 1, 0 },{ 0, 1 } }; //公式中P矩阵,X的协方差 void Kalman_Filter(float Gyro,float Accel)//Gyro陀螺仪的测量值,Accel加速度计的角度计算值 { Angle += (Gyro - Q_bias)*dt; /

卡尔曼滤波(Kalman filter)

戏子无情 提交于 2019-12-10 03:00:08
参考 : https://zh.wikipedia.org/wiki/%E5%8D%A1%E5%B0%94%E6%9B%BC%E6%BB%A4%E6%B3%A2 卡尔曼滤波模型 : 其中噪声服从 假设初始状态以及每一时刻的噪声{ x 0 , w 1 , ..., w k , v 1 ... v k }都互相独立. 卡尔曼滤波器 两个 状态 变量: , 在时刻 k 的状态的估计 , 后验 估计误差协方差矩阵,度量估计值的精确程度 预测 (预测状态) (预测估计协方差矩阵) 更新 三个辅助变量 (测量余量) (测量余量协方差) (最优卡尔曼增益) 更新滤波器变量 x 与 P : (更新的状态估计) (更新的协方差估计) 以上是kalman的流程(from wiki),下面是具体的推导过程 具体推导 这边用的是不一样的记号(MIT的lecture) 然后,我们有 最优卡尔曼增益 上面的就是 最优卡尔曼增益 ,所以有 例子 假设一辆小车,我们值观测到了位置,我们用kalman滤波去估计速度 N = 100 z = np.arange(N) + 0.0 # 观测到的位置,做匀速直线运动, 0, 1, 2, 3,... noise = np.random.randn(N) # 观测的位置加上1的噪声 z += noise X = np.array([5, 5]).reshape(-1, 1)

卡尔曼滤波

泪湿孤枕 提交于 2019-12-06 14:41:04
卡尔曼滤波的基本思想是,给定一个假设的合理期望值后,结合系统历史的测量情况下,为系统建立当前的测量模型,是一个概率最大化预测。结合历史测量数据并不是保留了漫长的历史数据后给出的结果,而是在系统迭代更新只保留最近的估计模型供下一次迭代使用,但是最近的估计模型都是跟前面的数据有一定的关系,是前面数据的不断迭代实现的预测结果。单就看当时的结果的话,只与上一次模型的预测结果有关,这样的思想简化了计算机的计算能力。卡尔曼滤波的核心是信息融合,包括系统受到的干扰及测量传感器的噪声。根据这些信号预测当前的状态模型,说白了就是一个估计其,下面是它的原理: 对于离散线性时不变系统: 来源: https://www.cnblogs.com/fuzhuoxin/p/11983165.html