使用EKF融合odometry及imu数据

2023-11-09

      整理资料发现早前学习robot_pose_ekf的笔记,大抵是一些原理基础的东西加一些自己的理解,可能有不太正确的地方。当时做工程遇到的情况为机器人在一些如光滑的地面上打滑的情形,期望使用EKF利用imu对odom数据进行校正。就结果来看,机器人旋转性能得到改善,前进方向性能没有改善,符合程序原理。若需要提高前进方向的性能,可以考虑加入VO或gps模块。实际工程中应注意odom数据进行协方差矩阵初始化的问题,否则程序会报错。

      一、扩展卡尔曼滤波(EKF)原理

      当前状态的概率的概率分布是关于上一状态和将要执行的控制量的二元函数,再叠加一个高斯噪声,测量值同样是关于当前状态的函数叠加高斯噪声。系统可为非线性系统。

                                                                     

      对g(x_(t-1),u_t )和h(x_t )泰勒展开,将其线性化,只取一次项为一阶EKF滤波。

                                                  

      g(xt-1,ut )在上一状态估计的最优值μt-1处取一阶导数,h(xt)在当前时刻预测值μ ̅t处取一阶导数,得到Gt和Ht。
      结合通用的Kalman滤波公式如下:
      预测过程:

                                                                          

      更新过程:

                                                                    

      二、卡尔曼滤波的多传感器融合

      多传感器系统模型模型如下:

                                                                  

      和传统的卡尔曼滤波系统模型相比,多传感器系统的观测方程有多个,每个传感器的测量量都可以不同。
      单观测模型系统:

                                                    

      卡尔曼滤波的核心为卡尔曼系数K的选取。对于多传感器系统,y(k)-Cx ̅(k)无法直接计算。
      多传感器信息融合:
      状态预测方程依然为:

                                                                    

      第一个传感器的观测方程更新后得到系统的状态量x(k)及系统协方差矩阵Σ(k)。将二者作为下一个传感器更新过程的系统预测状态量x ̅(k)和系统预测协方差矩阵Σ ̅(k)进行状态更新。将最后一个传感器更新后得到的系统的状态量x(k)及系统协方差矩阵Σ(k)作为融合后输出,并将二者用于预测过程进行下一时刻的迭代。
      扩展卡尔曼滤波工具包robot_pose_ekf

      基于里程计系统建模:

      系统状态量:

      系统输入:

      系统方程:

                       

                                       

      过程激励协方差矩阵根据实际情况设定。同时在初始时刻,系统状态及系统协方差矩阵需要进行初始化。
      观测系统模型:
      通过topic信息分别得到轮式里程计(ODOMETRY)、IMU、视觉里程计(VO)、GPS各观测值和观测协方差矩阵,运用多传感器信息融合的原理对系统状态进行更新。
      其中,ODOMETRY的观测量为[x,y,z,pitch,roll,raw]^T,观测矩阵为:
[1 0 0 0 0 0;0 1 0 0 0 0;0 0 0 0 0 0;0 0 0 0 0 0;0 0 0 0 0 0;0 0 0 0 0 0 1]
      IMU的观测量为:[pitch,roll,raw]^T,观测矩阵为:
[0 0 0 1 0 0;0 0 0 0 1 0;0 0 0 0 0 1]
      VO的观测量为[x,y,z,pitch,roll,raw]^T,观测矩阵为:
[1 0 0 0 0 0;0 1 0 0 0 0;0 0 1 0 0 0;0 0 0 1 0 0;0 0 0 0 1 0;0 0 0 0 0 0 1]
      GPS的观测量为[x,y,z]^T,观测矩阵为:

[1 0 0 0 0 0;0 1 0 0 0 0;0 0 1 0 0 0]

      三、程序流程(默认系统模型及各测量模型已建立完毕):

      ①开始监听ODOMETRY、IMU、VO及GPS信息;

      ②构建扩展卡尔曼滤波器,具体可参考:https://blog.csdn.net/zhxue_11/article/details/83822625,扩展卡尔曼滤波器的非线性模型为上文提到的里程计模型;

      ③开始更新,起始只引入系统噪声;

      ④获取ODOMETRY信息作为观测量及观测协方差矩阵,进行状态更新,得到更新后的系统状态及系统协方差矩阵;

      ⑤获取IMU信息作为观测量及观测协方差矩阵,进行状态更新,得到更新后的系统状态及系统协方差矩阵;

      ⑥获取VO信息作为观测量及观测协方差矩阵,进行状态更新,得到更新后的系统状态及系统协方差矩阵;

      ⑦获取GPS信息作为观测量及观测协方差矩阵,进行状态更新,得到更新后的系统状态及系统协方差矩阵;

      ⑧发布更新后的状态量及协方差矩阵作为融合后的信息odom_combined。

      四、robot_pose_ekf包使用方法

      1、参数调整(odom_estimation_node.cpp中):

           ①设定系统过程激励协方差矩阵;

           ②初始化设定系统协方差矩阵;

       2、robot_pose_ekf.launch文件的设置:

           ①<param name="base_footprint_frame" value="base_footprint"/>将”base_footprint”替换为自身机器人坐标系;

           ②<param name="freq" value="30.0"/>EKF发布的频率为30Hz;

           ③<param name="sensor_timeout" value="1.0"/>传感器超时设置为1s;

  ④<param name="odom_used" value="true"/>启动轮式例程计信息作为观测量,”imu_used”,”vo_used”,”gps_used”同理;

           ⑤<remap from="odom" to="pr2_base_odometry/odom" />将”pr2_base_odometry/odom”替换为自身发布的odom的topic名称,该映射实现对自身机器人信息的监听,”imu”,”vo”,”gps”同理,注意其对应声明分别为“imu_data”、“vo”、“gps”。

      五、robot_pose_ekf官方文档

      http://wiki.ros.org/robot_pose_ekf?distro=kinetic

      http://wiki.ros.org/robot_pose_ekf/Tutorials/AddingGpsSensor

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

使用EKF融合odometry及imu数据 的相关文章

  • 每日浅读SLAM论文——简析Cartographer

    文章目录 二维激光SLAM 简单框架 前端 scan matching Submaps构建 后端 分支定界优化csm CorrelativeScanMatch 代码实现框架 Cartographer 论文名 Real Time Loop C
  • SLAM笔记(四)运动恢复结构的几何数学(本征矩阵、单应矩阵、基础矩阵)

    1 间接法进行运动恢复的前提假设 对于结构与运动或视觉三维重建中 通常假设已经通过特征匹配等方法获取了匹配好的点对 先求出匹配点对再获取结构和运动信息的方法称作间接法 间接法最重要的三个假设是 1 拥有一系列两帧之间的匹配点对 但同时假设匹
  • Ubuntu20.04编译安装opencv3.2和opencv_contrib-3.2

    图像特征提取中需要用到SIFT等算法 因此不得不安装从源码编译安装opencv contrib 网上有很多教程 但是在不同的环境下多少会出现一些错误 针对Ubuntu20 04 gcc 7环境下对opencv opencv contrib编
  • ubuntu系统下配置vscode编译cmake

    文章目录 一 配置vs code运行c 代码 三个关键文件介绍 1 tasks json run helloworld cpp 1 1 打开cpp文件 使其成为活动文件 1 2 按编辑器右上角的播放按钮 1 3生成task文件 1 4 此时
  • 《视觉SLAM十四讲》第一版源码slambook编译调试

    slambook master ch2 编译正常 log如下 slambook master ch2 mkdir build cd build cmake make j8 The C compiler identification is G
  • ROS激光SLAM导航理解

    ROS激光SLAM导航理解 注 最近学习ROS的激光导航知识 需要理清ROS的SLAM 环境感知 costmap 与导航算法 为防止自己忘记 将觉得有价值的内容收集于此 对AGV来说 SLAM是个大大坑 环境感知和局部运动控制也是大坑 学习
  • Ubuntu18.04 安装速腾聚创最新驱动RSLidar_SDK采集XYZIRT格式的激光点云数据 --SLAM不学无术小问题

    Ubuntu18 04 安装速腾聚创最新驱动RSLidar SDK采集XYZIRT格式的激光点云数据 新款驱动支持RS16 RS32 RSBP RS128 RS80 RSM1 B3 RSHELIOS等型号 注意 该教程旨在引导安装 可能现在
  • 【SLAM】卡尔曼滤波(Kalman Filter)

    卡尔曼滤波 Kalman filter 一种利用线性系统状态方程 通过系统输入输出观测数据 对系统状态进行最优估计的算法 由于观测数据中包括系统中的噪声和干扰的影响 所以最优估计也可看作是滤波过程 卡尔曼滤波器的原理解释如下 首先 我们先要
  • 视觉SLAM实践入门——(20)视觉里程计之直接法

    多层直接法的过程 1 读图 随机取点并计算深度 2 创建图像金字塔 相机内参也需要缩放 并计算对应点的像素坐标 3 应用单层直接法 使用G N L M等方法 或者使用g2o ceres库 进行优化 源码中有一些地方会引起段错误 修改方法见下
  • Difference Between LiDAR and RADAR——LiDAR和RADAR的不同

    Difference Between LiDAR and RADAR 原文连接 https www differencebetween com difference between lidar and vs radar 翻译 RADAR和L
  • 激光SLAM7-基于已知位姿的构图算法

    1 通过覆盖栅格建图算法进行栅格地图的构建 1 1 Theory 1 2 code 这里没有判断idx和hitPtIndex是否有效 start of TODO 对对应的map的cell信息进行更新 1 2 3题内容 GridIndex h
  • PnP 问题

    欢迎访问我的博客首页 PnP 问题 1 DLT 2 P3P 3 G2O 求解 PnP 3 1 单目 3 2 双目 4 自定义顶点与边优化内参 4 1 二元边 4 2 三元边 4 3 总结 5 参考 PnP Perspective n Poi
  • ORB-SLAM2:基于可识别特征的自主导航与地图构建

    目录 ORB SLAM2 基于可识别特征的自主导航与地图构建 简介 地图 A 地图特征点或3D ORB B 关键帧 C 可视化图像 位置识别 A 图像识别数据库 B 高效优化的ORB匹配 C 视觉一致性 自主导航追踪 A ORB特征获取 B
  • Ubuntu20.04安装各种库----简洁版

    目录 Eigen3 Sophus Pangolin Ceres g2o 建议先装anaconda再装ros python opencv啥该有的都有了 下面仅仅安装ros没有的库 Eigen3 作用 线性代数开源库 提供了有关线性代数 矩阵和
  • 无人车

    1 无人车四大核心技术 自动驾驶实际包含三个问题 一是我在哪 二是我要去哪 三是如何去 第一个问题是环境感知和精确定位 无人车需要的是厘米级定位 厘米级定位是无人驾驶的难点之一 不光是车辆本身的语义级定位 还有一个绝对坐标定位 第二个问题是
  • 【Pytorch论文相关代码】使用SOLD2预训练好的模型检测与匹配线段(自己的数据集)

    文章目录 前言 使用流程 检测与匹配结果 前言 论文链接 SOLD2 Self supervised Occlusion aware Line Description and Detection 论文源码 https github com
  • LOAM算法详解

    激光SLAM 帧间匹配方法 Point to Plane ICP NDT Feature based Method 回环检测方法 Scan to Scan Scan to Map LOAM创新点 定位和建图的分离 里程计模块 高频低质量的帧
  • SLAM练习题(十一)—— G2O实战

    SLAM 学习笔记 写在前面的话 算是一点小小的感悟吧 估计位姿的方法有线性方法和非线性方法 线性方法就是特征点法中的2D 2D的对极约束 3D 2D的PnP问题 非线性方法有BA优化 它将位姿的估计问题转换成了一个误差关于优化量的最小二乘
  • Todesk突然高速通道使用已结束

    今天使用Todesk直接报出如下错误 好像对于海外用户需要付费购买海外会员 大家有没有什么可以替换的远程控制软件的吗 能分享一下吗
  • 高翔博士Faster-LIO论文和算法解析

    说明 题目 Faster LIO 快速激光IMU里程计 参考链接 Faster LIO 快速激光IMU里程计 iVox Faster Lio 智行者高博团队开源的增量式稀疏体素结构 Faster Lio是高翔博士在Fast系列的新作 对标基

随机推荐

  • Activiti进阶(九)——接收任务(ReceiveTask)

    转载地址 http blog csdn net zjx86320 viewmode contents 接收任务 ReceiveTask 即等待任务 接收任务是一个简单任务 它会等待对应消息的到达 当前 官方只实现 了这个任务的Java语义
  • HwBinder驱动篇-Android10.0 HwBinder通信原理(十)

    Android取经之路 的源码都基于Android Q 10 0 进行分析 Android取经之路 系列文章 系统启动篇 Android系统架构Android是怎么启动的Android 10 0系统启动之init进程Android10 0系
  • 解决maven配置报错:The JAVA_HOME environment variable is not defined correctly(亲测有效)

    显然是环境变量的问题导致的 1 对于初学者而言 建议配置两个maven环境变量 2 添加至path 变量值是 MAVEN HOME bin M2 HOME bin 3 进入cmd 输入mvn v进行测试 如果是下面这样 说明就成功了 4 如
  • pytorch的语义分割------数据增广

    官方文档 https pytorch org docs stable torchvision transforms html highlight torchvision 20transforms 20functional module to
  • maven编译项目抛出out of memory

    是java堆内存过小的原因造成的 新增环境变量 MAVEN OPTS Xmx512m 问题解决
  • 【融职培训】Web前端学习 第11章 微信开发5 微信支付

    一 概述 如果需要实现微信支付功能 需要有一个已认证的微信服务号 并且开通微信支付 开通后微信会提供一个商户ID 有了这个ID才能成功调用微信支付接口 开通微信支付后 需要在微信支付后台 产品中心 gt 开发配置 中配置 JSAPI支付授权
  • 不小心在服务器上删了文件怎么恢复出厂设置,文件删除了怎么恢复?这样才能彻底清除彻底清除...

    现在人换手机就像换衣服 虽然不是一天一换 但大多数人一年一换已经成为常态 所以闲置的旧手机也越来越多 一般旧手机大家都是闲置 或者二手转卖 或是送给别人使用 如此一来 旧手机上各种数据就需要彻底清除 否则旧手机上个人信息一旦泄露 很可能会给
  • HTML教程

    第一章 HTML标签 网页格式 html 网页的开始与结束 body 网页的主体部分 显示在网页中用户可以浏览到的内容 head 网页的头部 大部分不显示在用户浏览界面 meta 网页的摘要信息 不会显示在浏览器浏览界面 title 网页标
  • 人工智能-Tansformer-全套讲解15-20章

    第21章 基于Bayesian Theory的MRC文本理解基础经典模型算法详解 1 Bayesian prior在模型训练时候对Weight控制 训练速度影响等功能详解 2 Bayesian prior能够提供模型训练速度和质量的数学原理
  • angular指令心得(ng-model)

    angular指令心得 ng model 在项目中编写指令 常常会依赖其他的指令来实现想要达到的功能 其中最常用到的便是ng model 它为我们明确了需要绑定的属性 虽然在指令中可以通过通过使用独立作用域的 来进行双向绑定 但使用ng m
  • 华清远见学习笔记—Level1—Day1—必备Linux命令和C语言基础

    本专栏为个人在华清远见嵌入式linux学习期间的笔记 希望能与各位读者共同进步 文章目录 前言 一 环境安装 1 Linux文件系统是树形结构 弱分区 重文件 2 常用EXT4分区格式 3 基础分区 二 文件和目录相关命令 1 嵌入式开发基
  • Linux进程地址空间——上篇

    目录 一 前言 二 进程地址空间 1 通过一个例子去初步的了解进程地址空间 使用VS写了一段代码 在Linux中使用vim编辑器写类似的代码 结果解析 2 什么是进程地址空间 举个例子大家就明白了画饼的意义 如何画大饼 3 详谈进程地址空间
  • nested exception is java.lang.IllegalStateException: RequestParam.value() was empty on parameter 0

    运行springcloud项目出现如下报错 FactoryBean threw exception on object creation nested exception is java lang IllegalStateException
  • spring boot logback debug日志不输出问题

    logback配置如下
  • Redis集群一致Waiting for the cluster to join

    这是由于集群不仅要求开放连接端口 6379 还要开放集群总线端口 16379 在连接端口 10000
  • 威胁情报平台(多个平台查询)

    国内平台 微步威胁平台 微步在线X情报社区 威胁情报查询 威胁分析平台 开放社区 奇安信威胁情报中心 奇安信威胁情报中心 360威胁情报中心 https ti 360 cn 绿盟 威胁情报中心 https nti nsfocus com 新
  • 毕业设计-基于深度学习的轮胎缺陷无损检测

    目录 前言 课题背景和意义 实现技术思路 一 基于深度学习的目标检测技术及研究 二 基于主成分残差逆变换的轮胎 X 射线图像缺陷检测方法 三 基于独立成分分析的轮胎缺陷特征提取及分类方法的研究 四 深度卷积神经网络技术 实现效果图样例 最后
  • 数据库文档管理化开源项目工具SmartSQL

    数据库文档管理化开源项目工具SmartSQL 为何写该博文 由于这段时间需要理清软件的相关表结构 以及在客户端操作时使用 SQL Server Profiler 来检索一些简单的CURD sql语句 为了更好高效的理清内部的一些表结构 视图
  • react eslint解决方案整理

    eslint 解决方案整理 最近在处理react项目中报的warning 进行了以下整理 参考文档 http eslint cn docs rules 项目中遇到warning的解决 xxx is defined but never use
  • 使用EKF融合odometry及imu数据

    整理资料发现早前学习robot pose ekf的笔记 大抵是一些原理基础的东西加一些自己的理解 可能有不太正确的地方 当时做工程遇到的情况为机器人在一些如光滑的地面上打滑的情形 期望使用EKF利用imu对odom数据进行校正 就结果来看