资源简介
用C++实现了卡尔曼滤波对飞行轨迹的预测算法,并附有测试数据

代码片段和文件信息
#include
#include
#include
#include
#include
#define N 5 //状态值维数
using namespace std;
ifstream infile;
//measuredValue用于存储从输入的飞行数据
typedef struct{
double time;//时间
double x;//纬度
double y;//经度
double v;//地速
double h;//高度
double sita;//航向
}measuredValue;
measuredValue mValue[2];
//kalmanInfo用于存储状态值信息
typedef struct
{
double filterValue[N];//最优估计 n*1
double kg[N][N];//卡尔曼增益 n*m
double A[N][N];//状态转移矩阵 n*n
double H[N][N];//状态映射矩阵 m*n
double Q[N][N];//过程噪声协方差 n*n
double R[N][N];// 测量噪声协方差 n*n
double P[N][N];//估计误差协方差 n*n
}kalmanInfo;
kalmanInfo kal;
///卡尔曼滤波算法初始化
void kalmanInit()
{
//状态值初始化
for(int i = 0; i<5;i++)
{
kal.filterValue[i] = 0;
}
//状态转移矩阵初始化,需要更新
for(int i = 0;i < N;i++)
{
kal.A[i][i] = 1;
}
kal.A[0][3] = 0;
kal.A[1][3] = 0;
//过程噪声协方差初始化,根据实际情况给出,不需更新
for(int i = 0;i {
kal.Q[i][i] = 1e-8;
}
//测量噪声协方差初始化,根据实际给出,不需要更新
for(int i = 0;i {
kal.R[i][i] = 1e-8;
}
//状态映射矩阵初始化,不需要更新
for(int i = 0;i {
kal.H[i][i] = 1;
}
//估计误差协方差矩阵,任意给定,会逐渐收敛
for(int i = 0;i {
kal.P[i][i] = 1;
}
}
void updataData()
{
mValue[0].x = mValue[1].x;
mValue[0].y = mValue[1].y;
mValue[0].h = mValue[1].h;
mValue[0].v = mValue[1].v;
mValue[0].sita = mValue[1].sita;
mValue[0].time = mValue[1].time;
}
//getData(),获取一组飞行数据
//从文件“predictValue.txt”中读取
//(时间,纬度,经度,高度,速度,磁航向)
void getData()
{
updataData();
infile >> mValue[1].time>>mValue[1].x>>mValue[1].y>>mValue[1].h>>mValue[1].v>>mValue[1].sita;
}
//打印每一时刻的预测信息,输出到文件“predictValue.txt“
void printPredictValue(double PV[])
{
ofstream outfile;
outfile.open(“predictValue.txt“ios::app);
if(!outfile)
{
cout<<“OutFile Not Open!“< }
outfile< for(int i = 0;i < N;i ++)
{
outfile< }
outfile< outfile.close();
}
//矩阵求逆
bool matrixInverse(double a2[][N] double b2[][N])
{
int i j k;
double max temp;
double t[N][N]; //临时矩阵
//将A矩阵存放在临时矩阵t[n][n]中
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
t[i][j] = a2[i][j];
}
}
//初始化B矩阵为单位阵
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
b2[i][j] = (i == j) ? (double)1 : 0;
}
}
for (i = 0; i < N; i++)
{
//寻找主元
max = t[i][i];
k = i;
for (j = i + 1; j < N; j++)
{
if (fabs(t[j][i]) > fabs(max))
{
max = t[j][i];
k = j;
}
}
//如果主元所在行不是第i行,进行行交换
if (k != i)
{
for (j = 0; j < N; j++)
{
temp = t[i][j];
t[i][j] = t[k][j];
t[k][j] = temp;
//B伴随交换
temp = b2[i][j];
b2[i][j] = b2[k][j];
b2[k][j] = temp;
}
}
//判断主元是否为0 若是则矩阵A不是满秩矩阵不存在逆矩阵
if (t[i][i]
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 7949 2019-07-22 09:29 卡尔曼滤波算法航迹预测\kalmanFileter.cpp
文件 1937403 2019-07-22 09:31 卡尔曼滤波算法航迹预测\kalmanFileter.exe
文件 0 2019-07-22 09:32 卡尔曼滤波算法航迹预测\predictValue.txt
文件 2070 2019-07-22 09:30 卡尔曼滤波算法航迹预测\testData.txt
目录 0 2019-07-22 09:31 卡尔曼滤波算法航迹预测
----------- --------- ---------- ----- ----
1947422 5
相关资源
- C++头文件转delphi工具 + 源码
- 国际象棋的qt源代码
- C++中头文件与源文件的作用详解
- C++多线程网络编程Socket
- VC++ 多线程文件读写操作
- 利用C++哈希表的方法实现电话号码查
- 移木块游戏,可以自编自玩,vc6.0编写
- C++纯文字DOS超小RPG游戏
- VC++MFC小游戏实例教程(实例)+MFC类库
- 连铸温度场计算程序(C++)
- 6自由度机器人运动学正反解C++程序
- Em算法(使用C++编写)
- libstdc++-4.4.7-4.el6.i686.rpm
- VC++实现CMD命令执行与获得返回信息
- 白话C++(全)
- C++标准库第1、2
- 大数类c++大数类
- C++语言编写串口调试助手
- c++素数筛选法
- C++ mqtt 用法
- 商品库存管理系统 C++ MFC
- c++ 多功能计算器
- C++17 In Detail
- 嵌入式QtC++编程课件
- 颜色识别形状识别STM103嵌入式代码
- c++ 邮件多附件群发
- c++ 透明代理(hookproxy)
- mfc 调用redis
- FTP客户端源码(c++)
- c++ 画图(14Qt-XPS)
评论
共有 条评论