zoukankan
html css js c++ java
卡尔曼
#if
!defined(AFX_KALMAN_H__ED3D740F_01D2_4616_8B74_8BF57636F2C0__INCLUDED_)
#define
AFX_KALMAN_H__ED3D740F_01D2_4616_8B74_8BF57636F2C0__INCLUDED_
#if
_MSC_VER > 1000
#pragma
once
#endif
//
_MSC_VER > 1000
#include
<
math.h
>
#include
"
cv.h
"
class
kalman
{
public
:
void
init_kalman(
int
x,
int
xv,
int
y,
int
yv);
CvKalman
*
cvkalman;
CvMat
*
state;
CvMat
*
process_noise;
CvMat
*
measurement;
const
CvMat
*
prediction;
CvPoint2D32f get_predict(
float
x,
float
y);
kalman(
int
x
=
0
,
int
xv
=
0
,
int
y
=
0
,
int
yv
=
0
);
//
virtual ~kalman();
}
;
#endif
//
!defined(AFX_KALMAN_H__ED3D740F_01D2_4616_8B74_8BF57636F2C0__INCLUDED_)
============================
kalman.cpp
================================
#include
"
kalman.h
"
#include
<
stdio.h
>
/**/
/*
tester de printer toutes les valeurs des vecteurs
*/
/**/
/*
tester de changer les matrices du noises
*/
/**/
/*
replace state by cvkalman->state_post ???
*/
CvRandState rng;
const
double
T
=
0.1
;
kalman::kalman(
int
x,
int
xv,
int
y,
int
yv)
{
cvkalman
=
cvCreateKalman(
4
,
4
,
0
);
state
=
cvCreateMat(
4
,
1
, CV_32FC1 );
process_noise
=
cvCreateMat(
4
,
1
, CV_32FC1 );
measurement
=
cvCreateMat(
4
,
1
, CV_32FC1 );
int
code
=
-
1
;
/**/
/*
create matrix data
*/
const
float
A[]
=
{
1
, T,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
1
, T,
0
,
0
,
0
,
1
}
;
const
float
H[]
=
{
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
}
;
const
float
P[]
=
{
pow(
320
,
2
), pow(
320
,
2
)
/
T,
0
,
0
,
pow(
320
,
2
)
/
T, pow(
320
,
2
)
/
pow(T,
2
),
0
,
0
,
0
,
0
, pow(
240
,
2
), pow(
240
,
2
)
/
T,
0
,
0
, pow(
240
,
2
)
/
T, pow(
240
,
2
)
/
pow(T,
2
)
}
;
const
float
Q[]
=
{
pow(T,
3
)
/
3
, pow(T,
2
)
/
2
,
0
,
0
,
pow(T,
2
)
/
2
, T,
0
,
0
,
0
,
0
, pow(T,
3
)
/
3
, pow(T,
2
)
/
2
,
0
,
0
, pow(T,
2
)
/
2
, T
}
;
const
float
R[]
=
{
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
}
;
cvRandInit(
&
rng,
0
,
1
,
-
1
, CV_RAND_UNI );
cvZero( measurement );
cvRandSetRange(
&
rng,
0
,
0.1
,
0
);
rng.disttype
=
CV_RAND_NORMAL;
cvRand(
&
rng, state );
memcpy( cvkalman
->
transition_matrix
->
data.fl, A,
sizeof
(A));
memcpy( cvkalman
->
measurement_matrix
->
data.fl, H,
sizeof
(H));
memcpy( cvkalman
->
process_noise_cov
->
data.fl, Q,
sizeof
(Q));
memcpy( cvkalman
->
error_cov_post
->
data.fl, P,
sizeof
(P));
memcpy( cvkalman
->
measurement_noise_cov
->
data.fl, R,
sizeof
(R));
//
cvSetIdentity( cvkalman->process_noise_cov, cvRealScalar(1e-5) );
//
cvSetIdentity( cvkalman->error_cov_post, cvRealScalar(1));
//
cvSetIdentity( cvkalman->measurement_noise_cov, cvRealScalar(1e-1) );
/**/
/*
choose initial state
*/
state
->
data.fl[
0
]
=
x;
state
->
data.fl[
1
]
=
xv;
state
->
data.fl[
2
]
=
y;
state
->
data.fl[
3
]
=
yv;
cvkalman
->
state_post
->
data.fl[
0
]
=
x;
cvkalman
->
state_post
->
data.fl[
1
]
=
xv;
cvkalman
->
state_post
->
data.fl[
2
]
=
y;
cvkalman
->
state_post
->
data.fl[
3
]
=
yv;
cvRandSetRange(
&
rng,
0
, sqrt(cvkalman
->
process_noise_cov
->
data.fl[
0
]),
0
);
cvRand(
&
rng, process_noise );
}
CvPoint2D32f kalman::get_predict(
float
x,
float
y)
{
/**/
/*
update state with current position
*/
state
->
data.fl[
0
]
=
x;
state
->
data.fl[
2
]
=
y;
/**/
/*
predict point position
*/
/**/
/*
x'k=A鈥k+B鈥k
P'k=A鈥k-1*AT + Q
*/
cvRandSetRange(
&
rng,
0
, sqrt(cvkalman
->
measurement_noise_cov
->
data.fl[
0
]),
0
);
cvRand(
&
rng, measurement );
/**/
/*
xk=A?xk-1+B?uk+wk
*/
cvMatMulAdd( cvkalman
->
transition_matrix, state, process_noise, cvkalman
->
state_post );
/**/
/*
zk=H?xk+vk
*/
cvMatMulAdd( cvkalman
->
measurement_matrix, cvkalman
->
state_post, measurement, measurement );
/**/
/*
adjust Kalman filter state
*/
/**/
/*
Kk=P'k鈥T鈥?H鈥'k鈥T+R)-1
xk=x'k+Kk鈥?zk-H鈥'k)
Pk=(I-Kk鈥)鈥'k
*/
cvKalmanCorrect( cvkalman, measurement );
float
measured_value_x
=
measurement
->
data.fl[
0
];
float
measured_value_y
=
measurement
->
data.fl[
2
];
const
CvMat
*
prediction
=
cvKalmanPredict( cvkalman,
0
);
float
predict_value_x
=
prediction
->
data.fl[
0
];
float
predict_value_y
=
prediction
->
data.fl[
2
];
return
(cvPoint2D32f(predict_value_x,predict_value_y));
}
void
kalman::init_kalman(
int
x,
int
xv,
int
y,
int
yv)
{
state
->
data.fl[
0
]
=
x;
state
->
data.fl[
1
]
=
xv;
state
->
data.fl[
2
]
=
y;
state
->
data.fl[
3
]
=
yv;
cvkalman
->
state_post
->
data.fl[
0
]
=
x;
cvkalman
->
state_post
->
data.fl[
1
]
=
xv;
cvkalman
->
state_post
->
data.fl[
2
]
=
y;
cvkalman
->
state_post
->
data.fl[
3
]
=
yv;
}
查看全文
相关阅读:
【疑难系列】 是程序卡住了还是怎么了?
【疑难系列】 一个看起来是数据库死锁的问题
求求别再这么用log4x了
如何动态在spring mvc中增加bean
java中被各种XXUtil/XXUtils辅助类恶心到了,推荐这种命名方法
少搞点语法糖,多写点功能
记一次在java中的日期parse错误
《自控力》读后感·一
实现数据权限控制的一种方法
10个必会的 PyCharm 技巧
原文地址:https://www.cnblogs.com/wqj1212/p/1011432.html
最新文章
kibana-sentinl插件监控报警
ubuntu 16.4 安装 filebeat+Logstash+ElasticSearch+Kibana
集中式日志管理各种方案对比
java学习之spring data jpa
java学习之数据库操作 传统jdbc、springjdbc
php实现随机获取人名
支付总结之微信支付(微信单笔收款)
支付总结之签名验证
时间复杂度的计算
Matlab基本函数-conj函数
热门文章
协方差的定义
matlab画柱状图
matlab画带标记的折线图
UBUNTU 10.04上安装和使用HAMACHI
MATLAB绘图
MATLAB的GUI
matlab GUI界面编程总结
正态分布
Arduino蓝牙模块实现通信
我真傻,真的,我单知道...
Copyright © 2011-2022 走看看