机器人状态估计: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个…

AutoSAR系列讲解(实践篇)12.1-Diagnostics简介

目录 前言 一、UDS协议 1、Service Identifier(SID) 2、协议规范 3、举个例子 二、Aut

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

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

【elasticsearch】关于elasticsearch的max_result_window限制问题的解决方式思考

事情起因:我们使用es作为日志搜索引擎,客户收集到的业务日志非常之大,每次查询后,返回页数较多,由于我们web界面限制每页返回150条,当客户翻到66页之后就会报错。 文章目录 前言 二、实验 1.默认生成20条数…

2.13 Android ebpf非网络相关帮助函数API汇总(十二 本章完)

1.long bpf_user_ringbuf_drain(struct bpf_map *map, void *callback_fn, void *ctx, u64 flags) 描述:从指定的用户环形缓冲区中排出样本,并为每个此类样本调用提供的回调: long (*callback_fn)(struct bpf_dynptr *dynptr, void *ctx); 如果callback_fn返回0,帮助函数…

docker安装code-service在线开发vscode工具及node版本过低问题

docker安装code-service 拉去镜像 docker pull codercom/code-server创建项目存放映射路径 mkdir /data/code-service/project运行 这里不唯一,但注意密码 docker run -itd --name code-service -u root -p 1024:8080 -v /data/code-service/project:/home/cod…

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实现联网…

factoryBean.setTypeAliasesPackage()详解

示例代码 Bean public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) {SqlSessionFactoryBean factoryBean new SqlSessionFactoryBean();factoryBean.setDataSource(dataSource);factoryBean.setTypeAliasesPackage("com.itheima.domain");retu…

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上。配置…

没有jodatime,rust里怎么将字符串转为日期呢?

关注我,学习Rust不迷路!! 在 Rust 中,有多种方法可以在时间和字符串之间进行转换。以下是五种常见的方式: 1. 使用 chrono 库进行转换: use chrono::{NaiveDateTime, DateTime, Utc, TimeZone};fn main(…

Mysql函数

MySQL -函数 常用字符串函数SELECT... 函数 功能 CONCAT(S1,S2....Sn) 字符串拼接 LOWER(str) 将字符串str全部改成小写 UPPER(str) 将字符串str全部改成大写 LPAD(str,n,pad) 左填充,用字符串pa…

实验5-1 使用函数计算两个复数之积 (10 分)

本题要求现一个函数计算两个复数之积。 函数接口定义: double result_real, result_imag; void complex_prod( double x1, double y1, double x2, double y2 ); 其中用户传入的参数为两个复数x1y1i和x2y2i;函数complex_prod应将计算结果的实部存放在全局…

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

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

【WebRTC---源码篇】(三:一)音频轨

音频轨的创建时序在Conductor::AddTracks()中 rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track(peer_connection_factory_->CreateAudioTrack(kAudioLabel, peer_connection_factory_->CreateAudioSource(cricket::AudioOptions()))); 通过代码我们…

el-upload批量手动上传,并用form表单校验上传文件

手动上传设置:auto-upload"false" <el-formref"formData"class"formWidth":model"formData"label-width"120px":rules"rules"><el-form-itemlabel"数据"class"uploadClass"required…

RadioButton基本使用

作用&#xff1a;单选框&#xff0c;一般用于设置或者选择某项任务。 常用属性&#xff1a; 常用事件&#xff1a; 选中事件 后台代码&#xff1a; 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&#xff0c;其中 1 号节点为根节点&#xff0c;每个节点的编号都大于其父节点的编号。 现在&#xff0c;你需要回答 q 个询问。 每个询问给定两…