一、简述

笔记 是 ROS 开发人员 Live Class n.51 的附加材料,由 The Construct 的 Alberto Ezquerro 和 Ricardo Tellez 免费创建和提供。 只要您提供本段的副本,您就可以分发此笔记本。

在今天的直播课中,我们将学习以下内容:

  1. 为什么需要融合传感器数据进行导航
  2. 什么是 robots_localization 包
  3. 如何使用robot_localization 包进行传感器融合

此直播课程的先决条件是:

  • ROS 概念的基础知识,如主题、发布和订阅、ROS 服务
  • 知道如何创建地图以及如何在其中定位机器人。 如果您不知道如何操作,请查看 Live Class n49
  • 对机器人的热爱

二、Robotnik 的 Summit XL 机器人

在本课程中,我们将使用 Robotnik 的 Summit XL 机器人。 即具有以下特点的机器人:

  • 四个轮子
  • 激光游侠
  • IMU
  • 相机
  • 全球定位系统

如果您对此机器人感兴趣,可以在此处找到更多信息。

三、如何使用这个 ROSject

ROSject 是一个 ROS 项目,其打包方式使其包含的所有材料(ROS 代码、Gazebo 模拟和笔记本)都可以仅使用 Web 链接与任何机构共享。 这就是我们对 Live Class 的所有参加者所做的,我们与他们共享了这个 ROSject(这样他们就可以访问他们包含的所有 ROS 材料)。

查看此网络研讨会以了解有关 ROSjects 以及如何创建自己的 ROSjects 的更多信息。

您需要在 ROS 开发工作室 (ROSDS) 拥有一个免费帐户。 获取帐户,然后按照以下指示进行操作。

3.1. 为什么我们需要融合传感器数据进行自主机器人导航?

  • 因为传感器数据有噪声,这会在机器人的定位中产生错误。
  • 在谈到里程计时,里程计越好,机器人的定位就越好。
  • 里程计误差的问题在于它们会随着时间的推移而累积。

3.2.什么是robot_localization包

它是一个包,用于将不同的里程计来源混合成一个更稳定的来源。

3.3.让我们启动Summit XL模拟

为此,您需要转到 Simulations->Summit XL。 之后,您应该得到以下模拟

3.4. 让我们启动为里程计添加噪声的代码

检查 Rviz 里程表的外观:

启动 Rviz 以在地图中定位机器人

rosrun rviz rviz

在 /home/user/odom_config.rviz 中加载此 rosject 中提供的 Rviz 配置文件

Launch the noisy_odom package

rosrun noisy_odom add_noise.py

四、.让我们配置robot_localization包

4.1 包生成

让我们创建一个新的 ROS 包,我们将其命名为 Summit_odometry。

cd ~/catkin_ws/src
$ catkin_create_pkg summit_odometry
$ cd summit_odometry
$ mkdir launch
$ mkdir config

然后创建一个名为 start_filter.launch 的启动文件,其内容如下:

<launch> <!-- Run the EKF Localization node --><node pkg="robot_localization" type="ekf_localization_node" name="ekf_localization"><rosparam command="load" file="$(find summit_odometry)/config/ekf_localization.yaml"/></node></launch>

基本上,我们在这里所做的是从具有名为 ekf_localization.yaml 的特定配置文件的 robots_localization 包中启动名为 ekf_localization_node 的 ROS 程序(它使用扩展卡尔曼滤波器)。

4.2 配置文件

现在,在这个文件夹中,创建名为 ekf_localization.yaml 的配置文件。 在此文件中,您将放置以下配置。 填写带有问号 (?) 的所有参数。

#Configuation for robot odometry EKF
#
frequency: 50two_d_mode: truepublish_tf: false# Complete the frames section
odom_frame: ?
base_link_frame: ?
world_frame: ?
map_frame: ?# Complete the odom0 configuration
odom0: ?
odom0_config: [?, ?, ?,?, ?, ?,?, ?, ?,?, ?, ?,?, ?, ?,]
odom0_differential: false# Complete the imu0 configuration
imu0: ?
imu0_config: [?, ?, ?,?, ?, ?,?, ?, ?,?, ?, ?,?, ?, ?,]
imu0_differential: falseprocess_noise_covariance": [0.05, 0,    0,    0,    0,    0,    0,     0,     0,    0,    0,    0,    0,    0,    0,0,    0.05, 0,    0,    0,    0,    0,     0,     0,    0,    0,    0,    0,    0,    0,0,    0,    0.06, 0,    0,    0,    0,     0,     0,    0,    0,    0,    0,    0,    0,0,    0,    0,    0.03, 0,    0,    0,     0,     0,    0,    0,    0,    0,    0,    0,0,    0,    0,    0,    0.03, 0,    0,     0,     0,    0,    0,    0,    0,    0,    0,0,    0,    0,    0,    0,    0.06, 0,     0,     0,    0,    0,    0,    0,    0,    0,0,    0,    0,    0,    0,    0,    0.025, 0,     0,    0,    0,    0,    0,    0,    0,0,    0,    0,    0,    0,    0,    0,     0.025, 0,    0,    0,    0,    0,    0,    0,0,    0,    0,    0,    0,    0,    0,     0,     0.04, 0,    0,    0,    0,    0,    0,0,    0,    0,    0,    0,    0,    0,     0,     0,    0.01, 0,    0,    0,    0,    0,0,    0,    0,    0,    0,    0,    0,     0,     0,    0,    0.01, 0,    0,    0,    0,0,    0,    0,    0,    0,    0,    0,     0,     0,    0,    0,    0.02, 0,    0,    0,0,    0,    0,    0,    0,    0,    0,     0,     0,    0,    0,    0,    0.01, 0,    0,0,    0,    0,    0,    0,    0,    0,     0,     0,    0,    0,    0,    0,    0.01, 0,0,    0,    0,    0,    0,    0,    0,     0,     0,    0,    0,    0,    0,    0,    0.015]initial_estimate_covariance: [1e-9, 0,    0,    0,    0,    0,    0,    0,    0,    0,     0,     0,     0,    0,    0,0,    1e-9, 0,    0,    0,    0,    0,    0,    0,    0,     0,     0,     0,    0,    0,0,    0,    1e-9, 0,    0,    0,    0,    0,    0,    0,     0,     0,     0,    0,    0,0,    0,    0,    1e-9, 0,    0,    0,    0,    0,    0,     0,     0,     0,    0,    0,0,    0,    0,    0,    1e-9, 0,    0,    0,    0,    0,     0,     0,     0,    0,    0,0,    0,    0,    0,    0,    1e-9, 0,    0,    0,    0,     0,     0,     0,    0,    0,0,    0,    0,    0,    0,    0,    1e-9, 0,    0,    0,     0,     0,     0,    0,    0,0,    0,    0,    0,    0,    0,    0,    1e-9, 0,    0,     0,     0,     0,    0,    0,0,    0,    0,    0,    0,    0,    0,    0,    1e-9, 0,     0,     0,     0,    0,    0,0,    0,    0,    0,    0,    0,    0,    0,    0,    1e-9,  0,     0,     0,    0,    0,0,    0,    0,    0,    0,    0,    0,    0,    0,    0,     1e-9,  0,     0,    0,    0,0,    0,    0,    0,    0,    0,    0,    0,    0,    0,     0,     1e-9,  0,    0,    0,0,    0,    0,    0,    0,    0,    0,    0,    0,    0,     0,     0,     1e-9, 0,    0,0,    0,    0,    0,    0,    0,    0,    0,    0,    0,     0,     0,     0,    1e-9, 0,0,    0,    0,    0,    0,    0,    0,    0,    0,    0,     0,     0,     0,    0,    1e-9]

4.3 相关的坐标框

  • base_link_frame:它是机器人本身的框架,任何传感器都可以参考。 它通常位于机器人的中心。 它和它一起旅行。
  • odom_frame:它是用于报告里程计的框架。
  • map_frame:它是用于从知道机器人位置的系统报告全局位置的框架。 例如 AMCL 系统。 如果您没有使用任何外部本地化系统,则可以忽略它。
  • world_frame:这是参考前两个帧中的哪一个将用于获取机器人在世界中的绝对坐标的帧。

在我们的例子中,这将是:

base_link_frame: base_link
odom_frame: odom
world_frame: odom

4.4  添加传感器以熔断

任何以这些格式生成消息的传感器都可以输入到 robots_localization 包中以估计机器人位置。

  • nav_msgs/里程计
  • sensor_msgs/Imu
  • geometry_msgs/PoseWithCovarianceStamped
  • geometry_msgs/TwistWithCovarianceStamped

而且,最重要的是,您可以拥有多个传感器。 这意味着,例如,您可以让两个不同的传感器(车轮编码器和视觉里程计)或两个不同的惯性测量单元提供里程计。

a. 先指明 关于传感器topic

In our case are:

  • /noisy_odom
  • /imu/data

b. 配置变量矩阵
        现在,对于每个输入传感器,我们必须指定其消息的哪些组件将在卡尔曼滤波器中合并(融合)以计算最终状态估计。 要指定这一点,您必须填写一个 3x5 值矩阵。 矩阵的含义如下:

[  X,        Y,       Zroll,    pitch,    yawX/dt,     Y/dt,    Z/dtroll/dt, pitch/dt, yaw/dtX/dt2,    Y/dt2,   Z/dt2]

上述值的含义如下:

X, Y, Z:这些是机器人的 [x,y,z] 坐标。
roll、pitch、yaw:这些是 rpy 轴,它们指定了机器人的方向。
X/dt、Y/dt、Z/dt:这些是机器人的速度。
roll/dt、pitch/dt、yaw/dt:这些是机器人的角速度
X/

ROS察微【51】:如何将里程计和 IMU 与 robots_localization 融合相关推荐

  1. 工作小笔记——机器人底盘上里程计和惯导的融合

    前言 本文针对双轮差动模型的底盘,简单描述里程计和IMU融合的方案. 1. 融合的输入信息 1.1 里程计信息 里程计得到的是原始的轮速信息,之后通过双轮差速模型转换得到车体线速度和角速度,假设: 车 ...

  2. 深度洞察:如何利用Matlab进行户外移动机器人GPS、里程计和IMU数据的后处理,实现全球定位和环境映射

    第一部分 我并不是一个知识无所不知的权威专家,我只是一名热爱技术,对Matlab和机器人技术有深厚兴趣的工程师.在这篇文章中,我会尽我最大的能力,解释如何使用Matlab处理户外移动机器人的GPS.里 ...

  3. ros(25):发布一个静态的里程计odom信息

    有时为了验证程序可以运行,需要给程序输入一个里程计信息:有时为了在实车实验前验证程序,需要修改不同的里程计数据(可以在下面代码中增加一个odom_tmp的数组,或者用循环来使odom_tmp值变化), ...

  4. 在ROS平台使用扩展卡尔曼融合里程计与IMU传感器

    里程计的问题 里程计在转弯的时候, 能容易发生飘移现象,而且精度也不高, 容易产生累积误差 因此, 笔者想到了能不能通过imu来提高机器人的定位效果, 本文采用扩展卡尔曼滤波, ros上的功能包为ro ...

  5. 【多传感器融合定位SLAM专栏】前端里程计、IMU预积分、滤波、图优化推导与应用(3)

    本专栏基于深蓝学院<多传感器融合定位>课程基础上进行拓展,对多传感器融合SLAM的学习过程进行记录 文章目录 第三章 惯性导航原理及误差分析 惯性器件 1. 机械陀螺 2. 激光陀螺 ME ...

  6. 视觉和Lidar里程计

    搬来一个自动驾驶相关 我就一个打酱油小弟哈 自动驾驶的发展需要研究和开发准确可靠的自定位方法.其中包括视觉里程计方法,在这种方法中,精度可能优于基于GNSS的技术,同时也适用于无GPS信号的区域.本文 ...

  7. 视觉和Lidar里程计SOTA方法一览!(Camera/激光雷达/多模态)

    点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 点击进入→自动驾驶之心[SLAM]技术交流群 后台回复[SLAM综述]获取视觉SLAM.激光SLAM.RGBD ...

  8. 【SLAM】LIO-SAM解析——获得高频的lidar里程计TransformFusion(6)

    系列文章链接: [SLAM]LIO-SAM解析--流程图(1) [SLAM]LIO-SAM解析--数据预处理imageProjection(2) [SLAM]LIO-SAM解析--特征提取featur ...

  9. 基于关键帧的RGB-D视觉惯性里程计

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|计算机视觉工坊 论文信息:Chu C , Yang S ...

最新文章

  1. lnmp一键包的thinkphp5 nginx配置分享
  2. 自学Zabbix3.0版本以上资产清单inventory
  3. netstat -an 查看端口
  4. python降级pip_1.2 pip降级selenium3.0
  5. UI2Code智能生成Flutter代码--整体设计篇
  6. 校运会计算机科学系大本营,计算机系团总支学生会学期总结大会
  7. JavaTutorialNetwork 中文系列教程 · 翻译完成
  8. gmm中隐变量是什么的_隐变量是什么?
  9. 代码整洁之道读书笔记----第三章---函数--第一节-专注且短小
  10. 实时数据流采集工具Flume
  11. 北方工业大学计算机科学与技术复试分数线,北方工业大学计算机学院 2016 年硕士生复试结果.pdf...
  12. 阿尔法贝塔阀原理_阿尔法(alpha)与贝塔(beta)
  13. Windows快捷键和基本DOS命令
  14. javasript的单线程和多线程
  15. Golang的Redis简单使用及集群配置(Win10)
  16. 不可多得的干货!互联网公司常用分库分表方案汇总!太完整了!
  17. SQL Server 缓存清除与内存释放
  18. 仿站小工具的使用---扒取别人前端代码
  19. TAU1312模块配置记录
  20. 凌云仓库管理系统常见问题解答(七)

热门文章

  1. 关于std::abs 和 abs在ACM中的避坑
  2. 【原创】Oracle CEO 埃里森 耶鲁演讲 (网易博客搬迁至此)
  3. wamp64显示黄色图标不能忍
  4. arm64 的ubutun20.04的wps及vscode,chrome的安装
  5. mac下chm文件打开乱码解决
  6. 布局器 拖拽拖拽表单设计器 厉害了
  7. cube 设置滴答定时器_stm32cubemx生成的代码总是进入滴答定时器中断
  8. 你听我说-HandyControl源码编译
  9. 入手评测 RTX3070ti和RTX3080对比 rtx3070ti和rtx3080选哪个好
  10. Docker开放2375TCP端口