机器人状态估计:robot_localization 功能包使用方法

机器人状态估计:robot_localization 功能包基本使用

  • 前言
  • 功能包简介
  • 基本使用
    • 数据输入与数据输出
    • 坐标系设置
    • 性能参数调试

前言

在这里插入图片描述

移动机器人的状态估计需要用到很多传感器,因为对单一的传感器来讲,都存在各自的优缺点,所以需要一种多传感器融合技术,将机器人的状态估计出来。对于移动机器人来讲,自身可能携带:

  • 惯导
  • 轮速里程计
  • 激光里程计
  • 视觉里程计
  • gps等

如何利用各传感器的优点,将所有数据结合起来,取长补短,就用到了本篇博客介绍的内容 robot_localization ,一个移动机器人状态估计功能包。

功能包简介

robot_localization是状态估计节点的集合,每个节点都是非线性状态估计器的一种实现,用于在3D空间中移动的机器人。它包括两个状态估计节点ekf_localization_nodeukf_localization_node。另外,robot_localization提供navsat_transform_node,它有助于集成GPS数据。

功能包特点
robot_localization中的所有状态估计节点都具有共同的特征,即:

  • 融合任意数量的传感器。节点不限制传感器的数量。例如,如果您的机器人具有多个IMU或里程计信息,则robot_localization中的状态估计节点可以支持所有传感器。
  • 支持多种ROS消息类型。robot_localization中的所有状态估计节点都可以接收nav_msgs/Odometrysensor_msgs/Imugeometry_msgs/PoseWithCovarianceStamped,或geometry_msgs/TwistWithCovarianceStamped消息。
  • 自定义每个传感器的输入。如果给定的传感器消息包含您不希望包含在状态估计中的数据,则robot_localization中的状态估计节点允许您排除该数据。
  • 连续估计。robot_localization中的每个状态估计节点在收到一次测量结果后便开始估算车辆的状态。如果传感器数据中有间歇(即很长一段时间,没有收到任何数据),则滤波器将继续通过内部运动模型来估算机器人的状态。

所有状态估计节点都跟踪车辆的15维状态:
在这里插入图片描述

基本使用

数据输入与数据输出

想要基本使用任何的功能包或者算法,首先要清楚的是功能包或算法的数据输入与输出具体是什么。

也就是说功能包或者算法可以接收什么数据,通过其处理可以生成什么数据。
在这里插入图片描述
对于robot_localization功能包中的ekf节点,在简介中有提到,输入数据可以是任意数量的传感器。

输入数据
输入传感器的数据类型有:

  • nav_msgs/Odometry (ROS消息类型的规范)
  • sensor_msgs/Imu(ROS消息类型的规范)
  • geometry_msgs/PoseWithCovarianceStamped(ROS消息类型的规范)
  • geometry_msgs/TwistWithCovarianceStamped(ROS消息类型的规范)

nav_msgs/Odometry 可以来自轮速里程计数据、视觉里程计数据、激光里程计数据等
sensor_msgs/Imu 基本均来自惯导
geometry_msgs/PoseWithCovarianceStampedgeometry_msgs/PoseWithCovarianceStamped通常可以自己根据传感器的类型构建。

输出数据

输出数据有:

  • odometry/filtered (nav_msgs/Odometry)
  • accel/filtered (geometry_msgs/AccelWithCovarianceStamped) (if enabled)
  • tf

odometry/filtered (nav_msgs/Odometry)
在这里插入图片描述
accel/filtered (geometry_msgs/AccelWithCovarianceStamped) (if enabled)
在这里插入图片描述

发布的变换(tf)
如果用户的world_frame参数设置为odom_frame的值,则将转换从odom_frame参数给出的坐标系发布到base_link_frame参数给出的坐标系。如果用户的world_frame参数设置为map_frame的值,则将转换从map_frame参数给出的坐标系发布到odom_frame参数给出的坐标系。
注意:此模式假定另一个节点正在广播从odom_frame参数给定的坐标系到base_link_frame参数给定的坐标系的转换。这可以是robot_localization状态估计节点的另一个实例。

robot_localizationekf的输入输出总结如下图:
在这里插入图片描述

坐标系设置

robot_localization的坐标系遵守REP-105(ROS 坐标系约定)

REP-105指定了四个主要坐标系:base_linkodommapEarthbase_link坐标系固定在机器人上。mapodom是固定的世界坐标系,其原点通常与机器人的起始位置对齐。Earth坐标系用于为多个map坐标系(例如,分布在较大区域的机器人)提供公共参考坐标系。

robot_localization的状态估计节点会生成状态估计,其位姿状态在mapodom坐标系中给出,其速度状态在base_link坐标系中给出。在与状态融合之前,所有传入的数据都将转换为这些坐标系之一。每种消息类型中的数据如下转换:

nav_msgs/Odometry:所有位姿数据(位置和方向)都从消息头的frame_id转换为world_frame参数指定的坐标系(通常为mapodom)。在消息本身中,这特别是指pose属性中包含的所有内容。所有twist数据(线速度和角速度)都将从消息的child_frame_id转换为base_link_frame参数(通常为base_link)指定的坐标系。

将 map_frame、odom_frame 和 base_link 框架设置为适合您系统的框架名称。如果系统没有 map_frame,只需将其删除,并确保“world_frame”设置为odom_frame。
如果要融合连续位置数据,例如车轮编码器里程计、视觉里程计或 IMU 数据,设置"world_frame" 到 odom_frame 值。

base_link_frame 设置为imu数据中的frame_id,则默认为惯导的方向和base_link_frame重合,如果实际的惯导有偏移和旋转,则需要发布imu数据中的frame_idbase_link_frame的实际tf。
odom_frame设置为odom数据中的frame_id

由于需要将里程计中的速度数据转换为base_link_frame下的,所以需要有里程计坐标系到base_link_frame的坐标变换,即使里程计中仅有位置数据,但是通过差分也可以得到速度信息,所以需要上述的转换。

如果没有上述的坐标转换的话如下图:
在这里插入图片描述
则终端会输入报警信息:

Could not obtain transform from odom_mapping to firefly/imu_link. Error was “odom_mapping” passed to lookupTransform argument source_frame does not exist

性能参数调试

在坐标系配置正确,输入数据配置正确后,ekf即可正常输出数据,但是默认参数的输出结果肯定不理想
优化性能参数使输出结果更接近真值,则是下面要做的内容。

主要调整的数据包括:
process_noise_covariance,该值相当于ekf中的Q矩阵。
测量数据的协方差,该值相当于ekf中的R矩阵。
initial_estimate_covariance,该值相当于ekf中的P0矩阵。

参数不理想情况
在这里插入图片描述
在这里插入图片描述
其中红色曲线为真值,深蓝色曲线为一种估计算法输出值,浅蓝色曲线为ekf输出值。

参数优化后ekf曲线为:
在这里插入图片描述
可以看到浅蓝色曲线更加贴近真值了。

至此robot_localization功能包使用方法介绍完毕!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/24353.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简单工厂模式(Simple Factory)

简单工厂模式,又称为静态工厂方法(Static Factory Method)模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。简单工厂模式不属于GoF的23个…

嵌入式开发学习(STC51-7-矩阵按键)

内容 按下S1-S16键,对应数码管最左边显示0-F 矩阵按键简介 独立按键与单片机连接时,每一个按键都需要单片机的一个I/O 口,若某单片机系统需较多按键,如果用独立按键便会占用过多的I/O口资源;而单片机 系统中I/O口资…

Maven介绍-下载-安装-使用-基础知识

Maven介绍-下载-安装-使用-基础知识 Maven的进阶高级用法可查看这篇文章: Maven分模块-继承-聚合-私服的高级用法 文章目录 Maven介绍-下载-安装-使用-基础知识01. Maven1.1 初识Maven1.1.1 什么是Maven1.1.2 Maven的作用 02. Maven概述2.1 Maven介绍2.2 Maven模型…

hive编译报错整理

背景 最近在修hive-1.2.0的一个bug,需要修改后重新打包部署到集群,打包的时候报下面的错误,原因很简单,从远程仓库里面已经拉不到这个包了。 org.pentaho:pentaho-aggdesigner-algorithm:jar:5.1.5-jhyde was not found in http…

Unity进阶--通过PhotonServer实现联网登录注册功能(服务器端)--PhotonServer(二)

文章目录 Unity进阶--通过PhotonServer实现联网登录注册功能(服务器端)--PhotonServer(二)服务器端大体结构图BLL层(控制层)DAL层(数据控制层)模型层DLC 服务器配置类 发送消息类 以及消息类 Unity进阶–通过PhotonServer实现联网…

HCIP——STP

STP 一、STP概述二、二层环路带来的问题1、广播风暴问题2、MAC地址漂移问题3、多帧复制 三、802.1D生成树STP的BPDU1、配置BPDU2、RPC3、COST4、配置BPDU的工作过程5、TCN BPDU6、TCN BPDU的工作原理 四、STP的角色五、STP角色选举六、STP的接口状态七、接口状态的迁移八、STP的…

minio-分布式文件存储系统

minio-分布式文件存储系统 minio的简介 MinIO基于Apache License v2.0开源协议的对象存储服务,可以做为云存储的解决方案用来保存海量的图片,视频,文档。由于采用Golang实现,服务端可以工作在Windows,Linux, OS X和FreeBSD上。配置…

线程间的同步、如何解决线程冲突与死锁

一、线程同步概念: 线程同步是指在多线程编程中,为了保证多个线程之间的数据访问和操作的有序性以及正确性,需要采取一些机制来协调它们的执行。在多线程环境下,由于线程之间是并发执行的,可能会出现竞争条件&#xf…

RadioButton基本使用

作用:单选框,一般用于设置或者选择某项任务。 常用属性: 常用事件: 选中事件 后台代码: private void radioButton1_CheckedChanged(object sender, EventArgs e){if (radioButton1.Checked){MessageBox.Show(radioB…

AcWing 4310:树的DFS ← vector、auto、邻接表

【题目来源】https://www.acwing.com/problem/content/description/4313/【题目描述】 给定一棵 n 个节点的树。 节点的编号为 1∼n,其中 1 号节点为根节点,每个节点的编号都大于其父节点的编号。 现在,你需要回答 q 个询问。 每个询问给定两…

企业内网终端安全无客户端准入控制技术实践

终端无代理/无客户端准入控制技术因其良好的用户体验而倍受创新企业的青睐。无代理/无客户端准入控制技术,顾名思义,是一种在网络中对终端实施访问控制的方法,无需依赖特定的客户端软件。 不同于银行、医院等传统行业的终端准入控制需求&…

摄像头电池组和平衡车电池组

摄像头电池组 Wh~是电量 Wh V*Ah 毫安(mA)~是电流 电量是9.62Wh,电压是 3.7v 9.62 wh / 3.7v 2.6 Ah 2600mAH 4个并联电池:10400mAH / 4 2600mAH PH2.0mm-2Pins 平衡车 72 wh / 36v 2 Ah 2000mAH 对比自己买的单粒电池 vs 摄像头和平衡车的 …

java中io流、属性集Properties、缓冲流、转换流、序列化和反序列化、打印流、网络编程(TCP通信程序、文件复制案例、文件上传案例、B/S服务案例)

IO流: io流中i表示input输入,o表示output输出,流表示数据(字符,字节,1个字符2个字节8个位);这里的输入输出是以内存为基础,将数据从内存中输出到硬盘的过程称为输出&…

【JavaEE初阶】博客系统后端

文章目录 一. 创建项目 引入依赖二. 设计数据库三. 编写数据库代码四. 创建实体类五. 封装数据库的增删查改六. 具体功能书写1. 博客列表页2. 博客详情页3. 博客登录页4. 检测登录状态5. 实现显示用户信息的功能6. 退出登录状态7. 发布博客 一. 创建项目 引入依赖 创建blog_sy…

ffmpeg.c源码与函数关系分析

介绍 FFmpeg 是一个可以处理音视频的软件,功能非常强大,主要包括,编解码转换,封装格式转换,滤镜特效。FFmpeg支持各种网络协议,支持 RTMP ,RTSP,HLS 等高层协议的推拉流&#xff0c…

基于Java+SpringBoot+SpringCloud+Vue的智慧养老平台设计与实现(源码+LW+部署文档等)

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

Opencv-C++笔记 (15) : 像素重映射 与 图像扭曲

文章目录 一、重映射简介二、图像扭曲 一、重映射简介 重映射,就是把一幅图像中某位置的像素放置到另一图像指定位置的过程。即: 在重映射过程中,图像的大小也可以同时发生改变。此时像素与像素之间的关系就不是一一对应关系,因…

TCP Socket 基础知识点(实例是以Java进行演示)

本篇根据TCP & Socket 相关知识点和学习所得进行整理所得。 文章目录 前言1. TCP相关知识点1.1 双工/单工1.2 TCP协议的主要特点1.3 TCP的可靠性原理1.4 报文段1.4.1 端口1.4.2 seq序号1.4.3 ack确认号1.4.4 数据偏移1.4.5 保留1.4.6 控制位1.4.7 窗口1.4.8 校验和1.4.9 紧…

VS+Qt环境下解决中文乱码问题

目录 原因解决方案总结 原因 使用VSQt出现中文乱码的情况一般都是给控件添加中文文本时出现,而控件需要的字符串类型是QString,默认是utf-8。在 Visual Studio 中,源代码文件的默认执行字符集可能是 Windows 默认的 ANSI 字符集,…

【力扣】23. 合并 K 个升序链表 <链表指针、堆排序、分治>

目录 【力扣】23. 合并 K 个升序链表题解方法一:暴力,先遍历取出来值到数组中排序,再生成新链表方法二:基础堆排序(使用优先队列 PriorityQueue)方法三:基础堆排序(使用优先队列 Pri…