欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    卡尔曼滤波算法(C--C++两种实现代码)(11页).doc

    • 资源ID:35958930       资源大小:255.50KB        全文页数:11页
    • 资源格式: DOC        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    卡尔曼滤波算法(C--C++两种实现代码)(11页).doc

    -卡尔曼滤波算法(C-C+两种实现代码)-第 11 页卡尔曼滤波算法实现代码C+实现代码如下:=kalman.h=/ kalman.h: interface for the kalman class./#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.fl0=x;    state->data.fl1=xv;    state->data.fl2=y;    state->data.fl3=yv;    cvkalman->state_post->data.fl0=x;    cvkalman->state_post->data.fl1=xv;    cvkalman->state_post->data.fl2=y;    cvkalman->state_post->data.fl3=yv; cvRandSetRange( &rng, 0, sqrt(cvkalman->process_noise_cov->data.fl0), 0 );    cvRand( &rng, process_noise );    CvPoint2D32f kalman:get_predict(float x, float y)    /* update state with current position */    state->data.fl0=x;    state->data.fl2=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.fl0), 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 );    cvKalmanCorrect( cvkalman, measurement );    float measured_value_x = measurement->data.fl0;    float measured_value_y = measurement->data.fl2;     const CvMat* prediction = cvKalmanPredict( cvkalman, 0 );    float predict_value_x = prediction->data.fl0;    float predict_value_y = prediction->data.fl2;    return(cvPoint2D32f(predict_value_x,predict_value_y);void kalman:init_kalman(int x,int xv,int y,int yv) state->data.fl0=x;    state->data.fl1=xv;    state->data.fl2=y;    state->data.fl3=yv;    cvkalman->state_post->data.fl0=x;    cvkalman->state_post->data.fl1=xv;    cvkalman->state_post->data.fl2=y;    cvkalman->state_post->data.fl3=yv;c语言实现代码如下:#include "stdlib.h"  #include "rinv.c"  int lman(n,m,k,f,q,r,h,y,x,p,g)  int n,m,k;  double f,q,r,h,y,x,p,g;   int i,j,kk,ii,l,jj,js;    double *e,*a,*b;    e=malloc(m*m*sizeof(double);    l=m;    if (l<n) l=n;    a=malloc(l*l*sizeof(double);    b=malloc(l*l*sizeof(double);    for (i=0; i<=n-1; i+)      for (j=0; j<=n-1; j+)         ii=i*l+j; aii=0.0;          for (kk=0; kk<=n-1; kk+)            aii=aii+pi*n+kk*fj*n+kk;            for (i=0; i<=n-1; i+)      for (j=0; j<=n-1; j+)         ii=i*n+j; pii=qii;          for (kk=0; kk<=n-1; kk+)            pii=pii+fi*n+kk*akk*l+j;            for (ii=2; ii<=k; ii+)       for (i=0; i<=n-1; i+)        for (j=0; j<=m-1; j+)           jj=i*l+j; ajj=0.0;            for (kk=0; kk<=n-1; kk+)              ajj=ajj+pi*n+kk*hj*n+kk;                  for (i=0; i<=m-1; i+)        for (j=0; j<=m-1; j+)           jj=i*m+j; ejj=rjj;            for (kk=0; kk<=n-1; kk+)              ejj=ejj+hi*n+kk*akk*l+j;                  js=rinv(e,m);        if (js=0)            free(e); free(a); free(b); return(js);        for (i=0; i<=n-1; i+)        for (j=0; j<=m-1; j+)           jj=i*m+j; gjj=0.0;            for (kk=0; kk<=m-1; kk+)              gjj=gjj+ai*l+kk*ej*m+kk;                  for (i=0; i<=n-1; i+)           jj=(ii-1)*n+i; xjj=0.0;            for (j=0; j<=n-1; j+)              xjj=xjj+fi*n+j*x(ii-2)*n+j;                  for (i=0; i<=m-1; i+)           jj=i*l; bjj=y(ii-1)*m+i;            for (j=0; j<=n-1; j+)              bjj=bjj-hi*n+j*x(ii-1)*n+j;                  for (i=0; i<=n-1; i+)           jj=(ii-1)*n+i;            for (j=0; j<=m-1; j+)              xjj=xjj+gi*m+j*bj*l;                  if (ii<k)           for (i=0; i<=n-1; i+)            for (j=0; j<=n-1; j+)               jj=i*l+j; ajj=0.0;                for (kk=0; kk<=m-1; kk+)                  ajj=ajj-gi*m+kk*hkk*n+j;                if (i=j) ajj=1.0+ajj;                          for (i=0; i<=n-1; i+)            for (j=0; j<=n-1; j+)               jj=i*l+j; bjj=0.0;                for (kk=0; kk<=n-1; kk+)                  bjj=bjj+ai*l+kk*pkk*n+j;                          for (i=0; i<=n-1; i+)            for (j=0; j<=n-1; j+)               jj=i*l+j; ajj=0.0;                for (kk=0; kk<=n-1; kk+)                  ajj=ajj+bi*l+kk*fj*n+kk;                          for (i=0; i<=n-1; i+)            for (j=0; j<=n-1; j+)               jj=i*n+j; pjj=qjj;                for (kk=0; kk<=n-1; kk+)                  pjj=pjj+fi*n+kk*aj*l+kk;                                  free(e); free(a); free(b);    return(js);  

    注意事项

    本文(卡尔曼滤波算法(C--C++两种实现代码)(11页).doc)为本站会员(1595****071)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开