C#实现一阶卡尔曼滤波算法的示例代码
作者:Lxk- 发布时间:2022-12-23 05:28:45
标签:c#,卡尔曼滤波,算法
//FilterKalman.cs
namespace FusionFiltering
{
public class FilterKalman
{
private double A = 1;
private double B = 0;
private double H = 1;
private double R;
private double Q;
private double cov = double.NaN;
private double x = double.NaN;
public FilterKalman(double R, double Q, double A, double B, double H)
{
this.R = R; //过程噪声
this.Q = Q; //测量噪声
this.A = A; //状态转移矩阵
this.B = B; //控制矩阵 u为控制向量
this.H = H; //将估计范围与单位转化为与系统变量(或者说测量值)一致的范围与单位
this.cov = double.NaN;
this.x = double.NaN; // estimated signal without noise
}
public FilterKalman(double R, double Q)
{
this.R = R;
this.Q = Q;
}
public double filter(double measurement, double u)
{
if (double.IsNaN(this.x)) {
this.x = (1 / this.H) * measurement;
this.cov = (1 / this.H) * this.Q * (1 / this.H);
} else {
double predX = (this.A * this.x) + (this.B * u);
double predCov = ((this.A * this.cov) * this.A) + this.Q;
// Kalman gain
double K = predCov * this.H * (1 / ((this.H * predCov * this.H) + this.Q));
// Correction
this.x = predX + K * (measurement - (this.H * predX));
this.cov = predCov - (K * this.H * predCov);
}
return this.x;
}
public double filter(double measurement)
{
double u = 0;
if (double.IsNaN(this.x)) {
this.x = (1 / this.H) * measurement;
this.cov = (1 / this.H) * this.Q * (1 / this.H);
} else {
double predX = (this.A * this.x) + (this.B * u);
double predCov = ((this.A * this.cov) * this.A) + this.R;
// Kalman gain
double K = predCov * this.H * (1 / ((this.H * predCov * this.H) + this.Q));
// Correction
this.x = predX + K * (measurement - (this.H * predX));
this.cov = predCov - (K * this.H * predCov);
}
return this.x;
}
public double lastMeasurement()
{
return this.x;
}
public void setMeasurementNoise(double noise)
{
this.Q = noise;
}
public void setProcessNoise(double noise)
{
this.R = noise;
}
}
}
//ProgramTestData.cs
using System;
using System.Linq;
namespace FusionFiltering
{
public class ProgramTest
{
/// <summary>
/// kalman滤波测试1
/// </summary>
[System.Diagnostics.Conditional("DEBUG")]
public static void TestKalmanFilter1()
{
Console.WriteLine("FilterKalman Usage");
FilterKalman test = new FilterKalman(0.008, 0.1);
double[] testData = { 66, 64, 63, 63, 63, 66, 65, 67, 58 };
foreach (var x in testData) {
Console.WriteLine("Input data: {0:#,##0.00}, Filtered data:{1:#,##0.000}", x, test.filter(x));
}
}
/// <summary>
/// Example Usage with controlled input
/// </summary>
[System.Diagnostics.Conditional("DEBUG")]
public static void TestKalmanFilterWithControlled()
{
Console.WriteLine("FilterKalman Usage with controlled input");
FilterKalman test = new FilterKalman(0.008, 0.1, 1, 1, 1);
double[] testData = { 66, 64, 63, 63, 63, 66, 65, 67, 58 };
double u = 0.2;
foreach (var x in testData) {
Console.WriteLine("Input data: {0:#,##0.00}, Filtered data:{1:#,##0.000}", x, test.filter(x, u));
}
}
}
}
//Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FusionFiltering;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
ProgramTest.TestKalmanFilter1();
Console.ReadKey();
Console.WriteLine();
ProgramTest.TestKalmanFilterWithControlled();
Console.ReadKey();
}
}
}
效果:
来源:https://www.cnblogs.com/Lxk0825/p/13899521.html


猜你喜欢
- 本文实例为大家分享了Unity实现俄罗斯方块第3部分,供大家参考,具体内容如下解决穿透问题逻辑部分1、在物体进行移动的过程中更新格子的信息,
- jrebelJRebel是一套JavaEE开发工具。JRebel允许开发团队在有限的时间内完成更多的任务修正更多的问题,发布更高质量的软件产
- 首先引入pom <!--SpringBoot 2.1.0--> <parent>  
- 在使用Mybatis时,有的时候我们可以不用定义resultMap,而是直接在<select>语句上指定resultType。这
- 圆形头像在我们的日常使用的app中很常见,因为圆形的头像比较美观.使用圆形图片的方法可能有我们直接将图片裁剪成圆形再在app中使用,还有就是
- Java BorderLayout布局管理器的两种排列java中Frame类默认的布局管理器为BorderLayout,其主要是将Frame
- gRPCgRPC是由 google开发的一个高性能、通用的开源RPC框架,主要面向移动应用开发且基于HTTP/2协议标准而设计,同时支持大多
- spring中的bean依赖有大体上可以分为两类,共3中形式,下面简单介绍一下。第一类是构造方法中的循环依赖,这种会报错@Servicepu
- 目录一、首先导入生成二维码和微信支付环境二、在application.yml文件配置微信所有需的基本配置1.导入2.创建MyWXPayCon
- unity贪吃蛇基本原理实现,供大家参考,具体内容如下原理:1、每个身体跟着前面的身体移动;2、蛇头自动一直向前走,可以向左或者向右转弯。思
- 在上一篇文章中,我为大家介绍了《5种创建文件并写入文件数据的方法》,本节我们为大家来介绍6种从文件中读取数据的方法.另外为了方便大家理解,我
- Android短信高效备份这篇文章,承接上一篇。使用高效的方式备份短信——xml序列化器。存储短信,要以对象的方式存储。首先创建javabe
- 背景何为延迟队列?顾名思义,延迟队列就是进入该队列的消息会被延迟消费的队列。而一般的队列,消息一旦入队了之后就会被消费者马上消费。场景一:在
- 在android中的webview中,可以对文本内容进行对齐,具体方法如下 public class MainActivity
- 本文实例讲述了Java编程实现提取文章中关键字的方法。分享给大家供大家参考,具体如下:实现代码:/** * 相关的jar包 * lucene
- instanceof判断某个对象是否是某个类的实例或者某个类的子类的实例。它的判断方式大概是这样的:public<T> bool
- C#如何检测文本文件的编码,本文为大家分享了示例代码,具体内容如下using System;using System.Text;using
- 前面文章介绍了Android利用麦克风采集并显示模拟信号的实现方法,这种采集手段适用于无IO控制、单纯读取信号的情况。如果传感器本身需要包含
- 以下将是 C# 7.0 中所有计划的语言特性的描述。随着 Visual Studio “15” Preview 4 版本的发布,这些特性中的
- 一、什么是深拷贝和浅拷贝对于所有面向对象的语言,复制永远是一个容易引发讨论的题目,C#中也不例外。此类问题在面试中极其容易被问到,我们应该在