位姿估计Robot_pose_efk的配置和使用

2023-05-16

Robot_pose_efk 用于融合里程计,惯性测量单元和视觉里程计的传感器输出,从而减少测量中的总体误差。

了解ROS的robot_pose_ekf软件包中扩展卡尔曼滤波器的用法:

robot_pose_ekf软件包用于基于来自不同来源的(部分)位姿测量值来估计机器人的3D姿势。它使用带有6D模型(3D位置和3D方向)的扩展卡尔曼滤波器,将来自车轮里程计,IMU传感器和视觉里程计的测量结果结合起来。基本思想是提供与不同传感器的松散耦合集成,其中传感器信号以ROS消息的形式接收。

主页:http://ros.org/wiki/robot_pose_ekf
Github:https://github.com/ros-planning/robot_pose_ekf

robot_pose_ekf软件包可用于融合里程计,惯性测量单元和视觉里程计的传感器输出,从而减少测量中的总体误差。

1 如何使用
1.1 配置
可以在robot_pose_ekf软件包目录中找到EKF节点的默认启动文件(launch)。启动文件包含许多可配置的参数:

freq:滤波器更新和发布频率(注意:较高的频率仅仅意味着一段时间可以获得更多机器人位姿信息,但是并不可以提高每次位姿估计的精度)
sensor_timeout:当传感器停止向滤波器发送信息时,滤波器在没有传感器的情况下等待多长时间才重新开始工作
odom_used, imu_used, vo_used:确认是否输入
可以在启动文件中修改配置,如下所示:

 <launch>
  <node pkg="robot_pose_ekf" type="robot_pose_ekf" name="robot_pose_ekf">
    <param name="output_frame" value="odom"/>
    <param name="freq" value="30.0"/>
    <param name="sensor_timeout" value="1.0"/>
    <param name="odom_used" value="true"/>
    <param name="imu_used" value="true"/>
    <param name="vo_used" value="true"/>
    <param name="debug" value="false"/>
    <param name="self_diagnose" value="false"/>
  </node>
 </launch>
1
2
3
4
5
6
7
8
9
10
11
12
1.2 运行
(1)编译

 $ rosdep install robot_pose_ekf
 $ roscd robot_pose_ekf
 $ rosmake
1
2
3
(2)运行

 $ roslaunch robot_pose_ekf.launch
1
2 节点
2.1 订阅的话题
odom (nav_msgs/Odometry)
2D pose (used by wheel odometry) :该2D pose包含了机器人在地面的位置(position)和方位(orientation)信息以及该位姿的协方差(covariance)。用来发送该2D位姿的消息实际上表示了一个3D位姿,只不过把z,pitch和roll分量简单忽略了。

imu_data (sensor_msgs/Imu)
3D orientation (used by the IMU):3D方位提供机器人底座相对于世界坐标系的Roll,Pitch和Yaw信息。 Roll和Pitch角是绝对角度(因为IMU具有重力参考),而Yaw角是相对角度。 协方差矩阵用来指定方位测量的不确定度。当仅仅收到这个话题消息时, robot_pose_ekf不会启动,因为它还需要来自话题vo或者odom的消息。

vo (nav_msgs/Odometry)
3D pose (used by Visual Odometry):3D位姿可以完整表示机器人的位置和方位,以及该位姿的协方差。当传感器只测量3D位姿的一部分(e.g. the wheel odometry only measures a 2D pose)时, 可以给3D位姿没有实际测量的部分指定一个较大的协方差。

robot_pose_ekf节点不需要所有三个传感器源始终都可用。每个源给出一个位姿估计和一个协方差。这些源以不同的速率和不同的延迟运行。源会随时间出现或消失,节点将自动检测并使用可用的传感器。要添加自己的传感器输入,请查看教程:添加GPS传感器。

总结:

Odometry message contains the 2D pose, ie x, y and yaw angle
IMU message contains the 3D orientation, ie. roll, pitch and yaw angles.
VO message contains the full 3D pose, ie. x,y,z and roll, pitch, yaw angles.
2.2 发布的话题
robot_pose_ekf/odom_combined (geometry_msgs/PoseWithCovarianceStamped)
滤波器的输出(估计的机器人3D位姿)。

注意:/odom和/robot_pose_ekf/odom_combined消息类型不同,前者是nav_msgs/Odometry,后者是geometry_msgs/PoseWithCovarianceStamped 。两者的区别:后者的内容是前者的一部分。

将geometry_msgs/PoseWithCovarianceStamped转换为nav_msgs/Odometry:

#!/usr/bin/env python
import rospy
from geometry_msgs.msg import PoseWithCovarianceStamped
from nav_msgs.msg import Odometry

class OdomEKF():
   def __init__(self):
       # Give the node a name
       rospy.init_node('odom_ekf', anonymous=False)

       # Publisher of type nav_msgs/Odometry
       self.ekf_pub = rospy.Publisher('output', Odometry, queue_size=10)
       
       # Wait for the /odom_combined topic to become available
       rospy.wait_for_message('input', PoseWithCovarianceStamped)
       
       # Subscribe to the /odom_combined topic
       rospy.Subscriber('input', PoseWithCovarianceStamped, self.pub_ekf_odom)
       
       rospy.loginfo("Publishing combined odometry on /odom_ekf")
       
   def pub_ekf_odom(self, msg):
       odom = Odometry()
       odom.header = msg.header
       odom.header.frame_id = '/odom'
       odom.child_frame_id = 'base_footprint'
       odom.pose = msg.pose
       
       self.ekf_pub.publish(odom)
       
if __name__ == '__main__':
   try:
       OdomEKF()
       rospy.spin()
   except:
       pass
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
2.3 提供的tf转换
odom_combined → base_footprint

3 如何工作
3.1 基本流程
从每个传感器获取数据
检查它们是否有效
如果它们有效,则将它们相对于参考基准坐标系进行转换
当获得传感器信息时,它将被存储,直到所有传感器的信息可用为止。收到的每个数据都有自己的时间戳
一旦所有数据都可用,则在所有传感器数据均可用时,针对每个可用传感器数据更新扩展卡尔曼滤波器(在Orocos-BFL库中定义)。即:如果来自里程计的数据在时间t_0(> 0)可用,则来自imu的数据在时间t_1(> t_0)处获得,而来自视觉里程计的数据在时间t_2(> t_1)处获得,则在时间t_1对所有三组数据进行滤波。
该融合的传感器数据被转换为里程计消息,并在话题/odom_combined上发布
3.2 位姿解释
给滤波器节点提供信息的所有传感器源都有自己的参考坐标系,并且随着时间推移都可能出现漂移现象。因此,每个传感器发出来的绝对位姿不能直接对比。 因此该节点使用每个传感器的相对位姿差异来更新扩展卡尔曼滤波器。

3.3 协方差解释
随着机器人的移动,其位姿的不确定性越来越大。随着时间的流逝,协方差将无限增长。因此,在位姿本身上发布协方差是没有用的,而是传感器源发布协方差如何随时间变化,即速度的协方差。请注意,使用对世界的观测(例如,测量到已知墙壁的距离)将减少机器人位姿的不确定性;但是,这是定位而不是里程计。

3.4 Timing
假定机器人上次更新位姿滤波器在t_0时刻, 该节点只有在收到每个传感器测量值(时间戳>t_0)之后才会进行下一次的滤波器更新。 例如,在odom话题收到一条消息时间戳(t_1 > t_0), 且在imu_data话题上也收到一条消息( 其时间戳t_2 > t_1 > t_0), 滤波器将被更新到所有传感器信息可用的最新时刻,这个时刻是t_1。 在t_1时刻odom位姿直接给出了,但是imu位姿需要通过在t_0和t_2两时刻之间进行线性插值求得。在t_0到 t_1时间段,机器人位姿滤波器使用odom和IMU相对位姿进行更新。

上图显示了PR2机器人从给定的初始位置(绿点)启动,四处行驶并返回初始位置时的实验结果。完美的里程计x-y图应显示出精确的回路闭合。蓝线显示来自车轮里程计的输入,蓝点表示估计的终点位置。红线显示robot_pose_ekf的输出,该输出结合了车轮里程计和imu的信息,红点表示估计的最终位置。

4 源码解读
https://blog.csdn.net/zhxue_11/article/details/83828877
https://blog.csdn.net/weixin_42048023/article/details/84550630
https://blog.csdn.net/shoufei403/article/details/102655696
5 总结
首先表明,通过测试,这个包可以用,而且效果还不错。但是,有些注意事项和踩坑环节,过不去就容易放弃,甚至说它无用。而且,这个高度依赖ROS和TF,虽然方便,但是如果要自己整合或者剥离ROS,也需要下一番功夫。
————————————————
版权声明:本文为CSDN博主「W_Tortoise」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/learning_tortosie/article/details/103179488

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

位姿估计Robot_pose_efk的配置和使用 的相关文章

随机推荐

  • 【Gazebo入门教程】第三讲 SDF文件的静/动态编程建模

    Gazebo入门教程 第三讲 SDF文件的静 动态编程建模 文章目录 Gazebo入门教程 第三讲 SDF文件的静 动态编程建模一 自定义模型并导入Gazebo1 基础操作准备2 建立模型基础部件 xff08 静态 xff09 3 创建关节
  • 【Gazebo入门教程】第四讲 场景建模/建筑编辑器

    Gazebo入门教程 第四讲 场景建模 建筑编辑器 文章目录 Gazebo入门教程 第四讲 场景建模 建筑编辑器一 场景编辑器1 1 打开方式 xff1a 1 2 UI界面分析 xff1a 二 导入平面图2 1 导入图片2 2 设置分辨率
  • 【Gazebo入门教程】第五讲 控制器插件的编写与配置(上)

    Gazebo入门教程 第五讲 控制器插件的编写与配置 xff08 上 xff09 文章目录 Gazebo入门教程 第五讲 控制器插件的编写与配置 xff08 上 xff09 一 控制插件的使用方法1 插件简介2 插件编写流程 二 模型插件与
  • 【Gazebo入门教程】第六讲 控制器插件的编写与配置(下)

    Gazebo入门教程 第六讲 控制器插件的编写与配置 xff08 下 xff09 qquad 文章目录 Gazebo入门教程 第六讲 控制器插件的编写与配置 xff08 下 xff09 一 系统插件二 Velodyne传感器插件1 基本插件
  • 一键式AI绘画,让你也能体验当画师的魅力(附原理分析)

    文章目录 讲在前面一 Novel AI1 网站介绍2 AI作画 二 AI绘画的内在原理1 Diffusion Model的基本过程2 扩散模型的兴起 讲在前面 大概在今年10月初期 xff0c AI作画的热潮突然被掀起 xff0c 这股潮流
  • 类与对象:C++编程知识回顾与拓展 第一篇

    类与对象 C 43 43 编程知识回顾与拓展 第一篇 前言 在步入研究生生涯以来 xff0c 痛感自身编程知识与能力的不足 xff0c 亟需重新回顾 xff0c 并重点学习关于C 43 43 中面向对象 类 STL等关键知识 xff0c 提
  • OpenStreetMap:对抗谷歌帝国的共享开源地图

    OpenStreetMap xff1a 对抗谷歌帝国的共享免费地图 讲在前面 在步入自动驾驶的学习之后 xff0c 不可避免地我需要去了解在驾驶领域中选择的地图格式 xff0c 而随着研究的进一步深入 xff0c 我逐步了解到两种较为主流的
  • Copilot:AI自动写代码,人工智能究竟还能取代什么?

    Copilot xff1a AI自动写代码 xff0c 人工智能究竟还能取代什么 xff1f 前言 在AI绘画掀起一阵热潮之后 xff0c AI写代码又逐渐进入了我们的视野 xff0c 似乎这一步我们还没想到就迅速到来了 xff0c 难道说
  • 关于SubSonic3.0生成的表名自动加复数(s)的“用户代码未处理SqlException,对象名‘xxxs‘无效”异常处理

    关于SubSonic3 0生成的表名自动加复数 xff08 s xff09 的 用户代码未处理SqlException xff0c 对象名 39 xxxs 39 无效 异常处理 参考文章 xff1a xff08 1 xff09 关于SubS
  • 互联网金融风控面试算法知识(三)

    资料来源于网络搜集和汇总 xff0c 把算法知识的总结放在业务知识后面也是为了说明实际工作业务落地应用的重要性大于算法创新 面试题依然是适用于3年经验以内的初学者 xff0c 希望大家在学习算法的同时不要一心只研究算法而脱离了业务 xff0
  • wiki树莓派安装ubuntu mate 和 ros

    两大步骤 1 安装ubuntu mate 2 安装ros 一 安装ubuntu mate 下载ubuntu mate 18 04 img 并制作系统盘 首先要说的就是树莓派支持的系统是很多样的 xff0c 但是针对ros xff0c 我们只
  • npm 的工作原理

    包 Package 和模块 Module 如何定义一个Package 满足如下条件都可以称为一个包 xff1a 一个文件夹包含应用程序 xff0c 使用package json来描述它 a 一个用gzip压缩的文件夹 xff0c 满足 a
  • 2023最全Postman安装使用详解

    一 Postman背景介绍 用户在开发或者调试网络程序或者是网页B S模式的程序的时候是需要一些方法来跟踪网页请求的 xff0c 用户可以使用一些网络的监视工具比如著名的Firebug等网页调试工具 今天给大家介绍的这款网页调试工具不仅可以
  • cmake 设置 debug release模式

    1 通过命令行的方式 cmake DCMAKE BUILD TYPE 61 Debug 2 set CMAKE BUILD TYPE Debug CACHE STRING 34 set build type to debug 34 或者 s
  • 华为笔试题(4)

    一 计算n x m的棋盘格子 xff08 n为横向的格子数 xff0c m为竖向的格子数 xff09 沿着各自边缘线从左上角走到右下角 xff0c 总共有多少种走法 xff0c 要求不能走回头路 xff0c 即 xff1a 只能往右和往下走
  • 安装RedisBloom插件

    前言 安装RedisBloom模块会遇到很多坑 xff0c 希望你不要和我一样踩的这么全 x1f60f 如果觉得编译麻烦 xff0c 我也上传了我编译的so文件 xff0c 可以直接加载使用 https download csdn net
  • ROS Catkin 教程之 CMakeLists.txt

    1 概览 CMakeLists txt 是用 CMake 构建系统构建 ROS 程序包的输入文件 任何兼容 CMake 的包都包含一个或多个 CMakeLists txt 文件 xff0c 用以描述怎样构建和安装代码 catkin 项目采用
  • Xsens Mti-g-710 IMU driver在Ubuntu18.04 ROS melodic中的安装使用

    Ubuntu18 04下安装的ROS melodic 如何使用Xsens Mti g 710 IMU driver xff1f 这里给出一个详细步骤说明 这里的IMU是USB接口 1安装 首先插入IMU的USB口 命令行运行 gt lsus
  • PYTHON -MYSQLDB安装遇到的问题和解决办法

    PYTHON MYSQLDB安装遇到的问题和解决办法 参考文章 xff1a xff08 1 xff09 PYTHON MYSQLDB安装遇到的问题和解决办法 xff08 2 xff09 https www cnblogs com gaosh
  • 位姿估计Robot_pose_efk的配置和使用

    Robot pose efk 用于融合里程计 xff0c 惯性测量单元和视觉里程计的传感器输出 xff0c 从而减少测量中的总体误差 了解ROS的robot pose ekf软件包中扩展卡尔曼滤波器的用法 xff1a robot pose