卡尔曼滤波原理介绍及算法实现

2023-05-16

卡尔曼滤波原理介绍及算法实现

  • 基础概念及理论
    • 状态方程和观测方程
    • 建立卡尔曼滤波评估方程
    • 卡尔曼滤波分类
  • 六维力传感器滤波案例
    • 建立状态方程和观测方程
    • 求激励和误差协方差
    • 计算卡尔曼增益
    • 卡尔曼滤波表达式
  • 算法代码实现

本文将参照教科书的介绍,然后结合机械臂末端六维力传感数据滤波为例,详细介绍其公式推导和代码实现。

基础概念及理论

状态方程和观测方程

在对特定问题卡尔曼滤波时,其状态方程和观测方程我们假设是已知的,对于多维变量,可以建立多维状态方程和观测方程
在这里插入图片描述
状态方程和观测方程可以用如下框图表示,以激励为输入,以观测量为输出
在这里插入图片描述

建立卡尔曼滤波评估方程

使用卡尔曼滤波器,状态方程和观测方程的系数矩阵为已知量,建立方程如(1-1)所示,在此基础上建立卡尔曼滤波评估方程
在这里插入图片描述
评估方程中,只有卡尔曼增益K是未知数,其他的都为已知量,卡尔曼增益是协调估计值与测量值信任度的系数,增益越大,则评估值越接近测量值,反之则越接近评估值。
在这里插入图片描述
卡尔曼滤波式(1-2)中有两种表达式,其实就是简单的和并了同类项,但其计算框图有所不同分别如下
在这里插入图片描述
在这里插入图片描述
卡尔曼滤波的计算流程如下图所示
在这里插入图片描述

卡尔曼滤波分类

卡尔曼滤波器,可以实现预测、滤波、平滑或插值三类功能,本文主要介绍的是其滤波的功能,其分类依据如下
在这里插入图片描述

六维力传感器滤波案例

应用场景:六维力传感器安装在机械臂末端,采用自适应导纳控制实现机械臂末端恒力控制,即期望末端六维力控制到稳定常值,但是由于机械臂绝对定位精度低、环境误差大等原因,导致六维力采集值波动大,直接加入导纳计算式容易引起发散。所以有必要加入滤波,去除噪音,下文将介绍如何建立卡尔曼滤波器在六维力矩传感器上的应用。

建立状态方程和观测方程

六维力我们一般用F表示,为与上文变量同名,我们取状态方程X=F,则观测方程也是Z=F,加入激励矢量和测量误差矢量后,获得表达式如下
在这里插入图片描述

求激励和误差协方差

卡尔曼增益与激励矢量的协方差矩阵、测量误差的协方差矩阵密切相关,所以需要先获得激励和误差的协方差矩阵,本文建设其为对角矩阵,并采用两个系数来衡量其大小
在这里插入图片描述

计算卡尔曼增益

卡尔曼滤波表达式中,唯一需要更新计算的只有卡尔曼增益,该增益与测量值无关,所以可以提前计算,当然也可以实时计算,计算增益的表达式如下
在这里插入图片描述
卡尔曼增益与状态协方差矩阵是一个自回归计算表达式。

卡尔曼滤波表达式

当上式计算完后,直接带入表达式,获得
在这里插入图片描述

算法代码实现

用python实现算法如下所示,六维力传感器的每维相互独立,所以计算按六维计算,但绘图仅绘制了第一维

#!/usr/bin/python
#-*-coding:utf-8-*-
#本文档用于书写卡尔曼滤波器算法
#程序员:陈永*
#版权:哈尔滨工业大学(深圳)
#日期:2020.10.4

import numpy as np
import matplotlib.pyplot as plt

#====建立全状态卡尔曼滤波方程=======#
class KalmanFilter(object):
    def __init__(self):
        pass

    #获取建立状态方程和观测方程的参数
    def get_state_measurement_matrix(self, A, B, C):
        #状态转移矩阵
        self.A = np.mat(A)
        #激励转移矩阵
        self.B = np.mat(B)
        #观测矩阵
        self.C = np.mat(C)

    #获取激励矢量和测量误差矢量的协方差
    def get_cov_matrix(self, R, Q = None):
        #误差协方差矩阵
        self.R = np.mat(R)
        #激励激励协方差矩阵
        self.Q = np.mat(Q)

    #获得转移状态协方差矩阵初值
    def get_state_cov_matrix(self, P0):
        self.P = np.mat(P0)

    #获取状态矢量初值
    def get_state_init(self, x0):
        self.x = np.array(x0)

    #计算卡尔曼增益
    def kalman_gain(self):
        #求取卡尔曼增益
        self.K = self.P*self.C.T*(self.C*self.P*self.C.T + self.R).I

        #更新状态转移协方差矩阵
        self.P = self.P - self.K*self.C*self.P

    #输出估计值
    def out_filter_value(self, z):
        # 计算卡尔曼增益
        self.kalman_gain()
        D = np.array(self.A - self.K*self.C*self.A)

        self.x = np.dot(D, self.x) + np.dot(np.array(self.K), z)
        return self.x

def wrench_filter():
    #从上文卡尔曼滤波建立六维力滤波器
    kalm_filt = KalmanFilter()

    #建立状态方程和观测方程:n=m=p
    n = 6
    I = np.eye(n)
    A = np.copy(I)
    B = 0.1*I
    C = np.copy(I)
    kalm_filt.get_state_measurement_matrix(A, B, C)

    #输入测量误差协方差方程
    R = 0.001*I
    kalm_filt.get_cov_matrix(R)

    #输入状态初值
    x0 = np.zeros(n)
    P0 = np.copy(I)
    kalm_filt.get_state_cov_matrix(P0)
    kalm_filt.get_state_init(x0)

    #获取滤波后的数据:本文制造一组虚拟数据
    num = 1000
    T = 0.01
    t = np.linspace(0, (num - 1)*T, num)
    F = np.zeros([num, n])
    for i in range(n):
        F[:, i] = 10 + 2*np.sin(np.pi * t) + 1*np.random.randn(num)

    #带入滤波器
    F_filt = np.zeros([num, n])
    for i in range(num):
        F_filt[i, :] = kalm_filt.out_filter_value(F[i, :])

    #绘画函数,仅考虑第一维
    plt.figure(1)
    plt.plot(t, F[:, 0], label='Fx', color='b')
    plt.plot(t, F_filt[:, 0], label='Fx_filt', color='r')
    plt.title("Kalman_filter")
    plt.xlabel("t/s")
    plt.ylabel("f/N")
    plt.legend()
    plt.show()

if __name__ == "__main__":
    wrench_filter()

计算结果如下
在这里插入图片描述在这里插入图片描述因为我们状态方程建立:假设下一时刻与当前时刻相同,所以导致观测值趋向一个恒定值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

卡尔曼滤波原理介绍及算法实现 的相关文章

  • taichi windows编译 build from source

    先编译 env span class token punctuation span PY span class token operator 61 span span class token string 34 3 10 34 span e
  • Neohooken PBD 文献笔记

    Neohooken的本构模型为 定义能量密度为cosntraint的函数 能量密度的负梯度就是力 以上的能量密度分为CH与CD两项 CH就是净水应力造成的弹性力 CD就是应力偏量造成的弹性力 H stands for Hydrostatic
  • houdini vex 查找最近点的距离

    i span class token punctuation span span class token punctuation span 64 nears span class token operator 61 span span cl
  • OpenFOAM后处理,paraview创建动画视频的三种方式

    首先在 paraView中保存图片序列 点击file gt save Animation xff0c 可以保存为tif png jpg等格式的图片序列 可以规定保存的帧数 xff0c 默认是每个timestep一帧 注 xff1a 图片很多
  • 总结入门学习OpenFOAM的资料(网址、论坛、帖子、博客等)

    为了自己记录学习OpenFOAM的过程 xff0c 把收藏夹里面的网页整理一下 来源 首先 xff0c 大部分资料来源自 放羊君的博客 里面有很多入门建议 xff0c 网址等等 有入门者应该进行的步骤等等 正文 1 官方文档 xff08 O
  • ONOS简介

    一 与ODL区别 ONOS与OpenDayLight 两个控制器之间的较量 ODL 立场 xff1a 设备厂商 xff1a Cisco Citrix Systems Red Hat Brocade Ericsson ClearPath HP
  • centos7中mysql的安装配置

    1 在命令行输入以下命令下载 rpm的安装包 执行以下命令下载rpm的安装包 cd usr local src wget https dev mysql com get mysql80 community release el7 1 noa
  • onos1.10安装 Ubuntu18 java1.8

    版本1 10 tar包安装 xff0c java8 onos2 2以上需要jdk11 1 10是apache karaf 3 0 8 xff0c karaf直接进入ONOS xff0c 2 0以上版本启动均产生ERROR不知为何 xff08
  • prometheus数据持久化 docker部署

    https segmentfault com a 1190000015710814 prometheus修改配置不需要停掉 xff0c 只要修改yml之后用docker restart重启 prometheus存储方式 prometheus
  • 什么是私有云?私有云有哪些优势和劣势?

    私有云也是云计算的一种 xff0c 它具有云计算的通用优势 xff0c 主要包括超强的扩展性和自助服务 我们通常讲的云服务器和云主机 xff0c 一般指的公有云 xff0c 私有云相比公有云价格较高 xff0c 一般大中型企业的首选 xff
  • BigDecimal类型 比较大小的方法

    1 转成int BigDecimal b1 61 new BigDecimal 34 121454125453 145 34 if b1 intValue lt 0 System out println 34 金额为负数 xff01 34
  • Git报错解决:OpenSSL SSL_read: Connection was reset, errno 10054 错误解决

    首先 xff0c 造成这个错误很有可能是网络不稳定 xff0c 连接超时导致的 xff0c 如果再次尝试后依然报错 xff0c 可以执行下面的命令 打开Git命令页面 xff0c 执行git命令脚本 xff1a 修改设置 xff0c 解除s
  • java小知识:http请求传输文件流

    前文 xff1a 项目里要给第三方传输图片 xff0c 对方接口要求传文件流 xff0c 而不是常用的base64编码 xff0c 在此记录一下 xff5e 直接贴代码吧 xff1a import com alibaba fastjson
  • SSH无法启动错误解决:Failed to start OpenSSH server daemon.

    一 错误信息如下 xff1a sshd service OpenSSH server daemon Loaded loaded usr lib systemd system sshd service enabled vendor prese
  • linux小知识:修改/etc/profile全局变量文件出错,导致服务命令全部失效解决方案

    现象 xff1a 由于修改profile文件时改错了 xff0c 导致所有的命令都失效了 赶紧解决赶紧解决 1 在当前窗口执行以下命令 export PATH 61 usr local sbin usr local bin sbin bin
  • docker容器如何迁移

    docker容器如何迁移 xff1f 前言 xff1a 迁移容器涉及到备份和恢复 xff0c 可以将任何一个docker容器从一台机器迁移到另一台机器 在迁移过程中 xff0c 首先将把容器备份为Docker镜像快照 然后 xff0c 该D
  • 缓存IO和直接IO的区别

    1 缓存IO 缓存I O又被称作标准I O xff0c 大多数文件系统的默认I O操作都是缓存I O 在Linux的缓存I O机制中 xff0c 数据先从磁盘复制到内核空间的缓冲区 xff0c 然后从内核空间缓冲区复制到应用程序的地址空间
  • 修改svn的配置文件并对密码加密

    svn管理 公司项目进出新人 xff0c 需要对代码管理工具进行增删 由于对linux不是很了解 对svn的配置有没有进行过交接 所有的操作都是自己在centos服务器上进行尝试 对于普通的svn的账号密码管理有了基本了解 但是在服务器上看
  • deepin安装微信qq

    在网页上下载最新微信或者qq env WINEPREFIX 61 deepinwine Deepin WeChat deepin wine WeChatSetup exe 该命令运行在WeChatSetup exe所在文件夹 xff0c 最
  • 在Java中,执行SQL查询到数据后,存储在哪里了?

    前言 xff1a 我们项目运行过程中 xff0c 肯定会有查询数据库这步操作 xff0c 无论你是MySQL还是Oracle 那么这种情况就必须搞清楚 xff0c 从数据库里查询得到的数据默认存储到哪了 xff0c 为什么一次查询过多的数据

随机推荐

  • Java小知识:摆脱BeanUtil.copyProperties!! 最优的替代方案 -Bean Converter插件使用方式来了~

    前言 xff1a 开发中为什么不推荐使用BeanUtil copyProperties xff1f 使用BeanUtil copyProperties会有哪些严重后果 xff1f 这些就不在这里眼神了哈 xff0c 大家可以自行查阅一下即可
  • Vue小知识: $ is not defined错误解决

    错误原因 xff1a 该错误是未安装JQuery依赖包导致 解决方案 xff1a 安装依赖包 1 执行安装jquery依赖包命令 cnpm install jquery save 2 webpack配置 xff08 1 xff09 在项目根
  • JVM小知识:linux 命令查看jvm堆内存信息

    1 查看当前java进程的pid pgrep lf java 2 查看java堆的详细信息 jmap heap PID 3 查看java堆中对象的相关信息 xff0c 包含数量以及占用的空间大小 jmap histo PID 4 查看监控
  • IDEA小知识:查看内存使用情况的步骤

    1 展示idea自带的内存指标 xff0c 如图 1 图 2 点击File gt 选择Setting gt 进入APPearance gt 勾选Show memory indicator 图 xff08 1 xff09 图 xff08 2
  • 【无标题】

    CMake Error at xxaipkg CMakeLists txt 50 add message files Unknown CMake command add message files Configuring incomplet
  • npm安装淘宝镜像报错

    npm install g cnpm registry 61 https registry npm taobao org 执行命令报错 无法安装cnpm 解决方案 xff1a 用管理员方式打开命令行 xff0c 就可以安装成功了
  • Leetcode——贪心算法(c++和java实现)

    本来有一段时间没有刷题了 xff0c 但是突然发现了这本书LeetCode 101 A LeetCode Grinding Guide C 43 43 Version xff0c 感觉真不错 xff0c 思路简单清晰 xff0c 没有过多的
  • 树莓派3B+安装c++版本opencv3.4.1,配置开发环境以及注意事项

    树莓派3B 43 安装c 43 43 版本opencv3 4 1 xff0c 配置开发环境以及注意事项 树莓派3B 43 ubuntu mate系统的安装 树莓派 xff0c Raspberry Pi xff0c 是一个只有信用卡大小的微型
  • 由frankmocap得到的.pkl文件转为.bvh或者.fbx

    需求 由Frankmocap所得到的 pkl文件转为blender里的 bvh或者Maya里的 fbx Frankmocap github项目地址 2D转3D转 bvh可以看VideoTo3dPoseAndBvh xff0c bvh转3D相
  • centos 安装docker

    查看系统内核版本 docker需要内核版本在3 8以上 centos7 版本是3 10 安装支持aufs CentOS7 默认不支持aufs文件系统 需要自己安装支持aufs的内核 进入repo目录 cd etc yum repo d 下载
  • echarts框架下大数据量展示的解决方案

    echarts 43 大数据量 这是个无解的问题 xff01 大数据量 xff0c 什么样的数据才算大呢 xff1f 在echart 4 5 0版本中 xff0c 画折线图 xff0c 数据线一共1001000条 xff0c 每条数据500
  • Open vSwitch介绍

    Open vSwitch介绍 1 vSwitch功能2 OvS架构3 OvS报文处理3 1 传统OvS方式3 2 OvS 43 DPDK处理方式 4 OvS补充说明4 1 基本概念4 2 匹配项与规则4 2 1 匹配项4 2 2 动作 本节
  • Python写ROS话题

    Python写ROS话题 导入ROS模块发送话题接收话题第一种方式 xff1a rospy Subscriber第二种方式 xff1a rospy wait for message完整程序 多线程处理同时接受多个话题 导入ROS模块 用py
  • Python写ROS程序常用数据结构std_msgs、geometry_msgs、sensor_msgs

    Python写ROS程序常用数据结构 std msgsFloat64MultiArray geometry msgsVector3TwistWrenchPointQuaternionPosePose2D Stamped sensor msg
  • ROS中gazebo配置教程详解

    ROS中gazebo配置教程详解 机器人模型文件获取原始URDF模型文件采用xacro格式改写文件增加gazebo插件描述增加传动transmission最后将上面三个文件合成一个文件 环境XX world文件配置文件 yaml启动文件la
  • gazebo添加末端六维力传感器

    gazebo添加末端六维力传感器 建立六维力矩传感器模型将传感器拼接到机器人模型配置传感器gazebo参数 常用的机器人只支持位置控制 xff0c 但实际运用中 xff0c 却对末端力控制有迫切的需求 xff0c 其中一种常用的方法是基于位
  • gazebo .world文件中导入dae模型的问题

    gazebo world文件中导入dae模型的问题 gazebo环境提供了很多可以直接导入的模型 xff0c 如果想往环境中导入自己的静态模型 xff0c 需将自己的模型转化为dae格式 xff0c 并编写相应的 world文件 准备好da
  • OpenCV单目视觉定位实现方法

    OpenCV单目视觉定位 xff08 测量 xff09 系统 The System of Vision Location with Signal Camera Abstract This passage mainly describes h
  • CMakeLists.txt 语法介绍与实例演练

    一 Cmake 简介 cmake 是一个跨平台 开源的构建系统 它是一个集软件构建 测试 打包于一身的软件 它使用与平台和编译器独立的配置文件来对软件编译过程进行控制 二 常用命令 1 指定 cmake 的最小版本 span class t
  • 卡尔曼滤波原理介绍及算法实现

    卡尔曼滤波原理介绍及算法实现 基础概念及理论状态方程和观测方程建立卡尔曼滤波评估方程卡尔曼滤波分类 六维力传感器滤波案例建立状态方程和观测方程求激励和误差协方差计算卡尔曼增益卡尔曼滤波表达式 算法代码实现 本文将参照教科书的介绍 xff0c