ROS中bag的录制、播放和使用

文章目录

  • 前言
  • 一、bag录制
  • 二、bag信息查看
  • 三、bag播放
  • 四、bag的使用(以A-LOAM为例)


前言

传感器获取到的信息,有时我们可能需要实时处理,有时可能只是采集数据,事后分析,比如:
机器人导航实现中,可能需要绘制导航所需的全局地图,地图绘制实现,有两种方式

  • 方式1:可以控制机器人运动,将机器人传感器感知到的数据时时处理,生成地图信息。
  • 方式2:同样是控制机器人运动,将机器人传感器感知到的数据留存,事后,再重新读取数据,生成地图信息。

两种方式比较,显然方式2使用上更为灵活方便。在ROS中关于数据的留存以及读取实现,提供了专门的工具: rosbag。rosbag本质也是ros的节点,当录制时,rosbag是一个订阅节点,可以订阅话题消息(这是ROS核心的数据通讯,ros开发每天都会打交道的话题通讯机制)并将订阅到的数据写入磁盘文件;当重放时,rosbag是一个发布节点,可以读取磁盘文件,发布文件中的话题消息。这就有助于我们基于离线数据快速重现曾经的实际场景,进行可重复、低成本的分析和调试。如果有ROS基础,下面的内容将很好理解,否则并不能快速学会使用:

一、bag录制

录制所有话题数据(此时会在当前路径下生成名称为当前时间的bag包):

rosbag record -a

录制指定话题数据:

rosbag record <topic_name1> <topic_name2> <topic_name3> ...

指定指定话题数据并指定保存bag的路径名称:

rosbag record  -O <bagname> <topic_name1> <topic_name2> <topic_name3> ...

例如:
在这里插入图片描述

二、bag信息查看

rosbag info指令可以数据包中包含的话题名称,话题数量,话题消息类型等信息:

rosbag info <bagname>

在这里插入图片描述

通过rqt_bag命令将bag进行(数据流)可视化

rqt_bag <bagname>

在这里插入图片描述

三、bag播放

bag的回放就像放视频一样,可以再现数据录制时的实时数据流,但是有一些命令可以控制播放时间、速率、话题等功能:
回放指定bag(一般最常用)

rosbag play <bagname> 

回放当前目录下所有bag

rosbag play *

从指定时间(n = 指定时间s)开始回放bag

rosbag play -s n <bagname>

延时指定时间(n = 延时时间s)开始回放bag

rosbag play -d n <bagname>

播放指定结束时间(n = 指定秒数)的bag

rosbag play -u n <bagname>

从指定时间(n = 开始时间s)开始播放到指定时间(m = 指定播放时间s)的bag

rosbag play -s n -u m <bagname>

按指定倍率(n = 倍率)回放bag

rosbag play -r n <bagname>

只播放感兴趣的 topic

rosbag play <bagname> --topic /topic1 /topic2 ...

播放bag的 topic重命名:

rosbag play <bagname> /topic1:=/topic1

回放包时,其他节点可以接受实时的话题数据,进行SLAM或者显示等处理,播放例如我们利用可视化工具rviz查看小车的点云和图像话题:
在这里插入图片描述
在这里插入图片描述

四、bag的使用(以A-LOAM为例)

A-LOAM是一个纯激光SALM,订阅一个激光消息进行SLAM处理,因此首先我们要获取点云话题,即需要知道其话题名以及消息类型,通过rosbag info查看即可:
在这里插入图片描述
通过rostopic可以在命令行订阅消息,查看其内容(每个话题都一定包含header消息,其中有消息的时间戳stamp和其对应的坐标系frame_id--noarr参数是把点云原始数据data折叠起来了,否则满屏显示"<array type: uint8, length: 460800>"看不到消息其他内容):
在这里插入图片描述

知道bag中的点云话题/point_raw后,在代码中订阅点云消息

ros::Subscriber subLaserCloud = nh.subscribe<sensor_msgs::PointCloud2>(/point_raw, 100, laserCloudHandler);

其中sensor_msgs::PointCloud2是点云消息类型,一些特殊的数据例如点云、IMU和图像等,ROS中有定义好的消息类型,我们还可以定义自己的消息(底层就是一个C++类);/point_raw就是要订阅的话题名称;100是缓存队列的长度,防止处理时间跟不上bag播放速度而丢失数据;laserCloudHandler是回调函数,用于保存或者处理接收的数据。
接下来同时播放包和运行SLAM节点,SLAM算法即可实时接收点云数据并实时处理:

# 分别打开两个终端,输入命令
roslaunch aloam_velodyne aloam_velodyne_VLP_16.launch
rosbag play autoware-20230608161607.bag

在这里插入图片描述

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

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

相关文章

【雕爷学编程】Arduino动手做(138)---64位WS2812点阵屏模块5

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

openssl源码编译输出库-guidance-傻瓜式教程

目标&#xff1a; 下载openssl源码 编译输出目标版本&#xff0c;例如使用Android NDK编译输出Android使用的32位的库 1、下载源码 git clone https://github.com/openssl/openssl.git -b openssl-3.0.9 2、 请下载Linux版本的Android NDK 请下载Linux版本的Android NDK, 并完…

CUDA11.1、cuDNN8.6.0、Tensorrt8.5.3,ubuntu20.04安装过程记录

CUD11.1 下载地址&#xff1a;CUDA Toolkit Archive | NVIDIA Developer 安装&#xff1a; wget https://developer.download.nvidia.com/compute/cuda/11.1.1/local_installers/cuda_11.1.1_455.32.00_linux.run sudo sh cuda_11.1.1_455.32.00_linux.run 对于不是sudo用户&…

46.声明类关键字 var new funcion let const

目录 1 var 2 new 3 function 4 let 4.1 let不能在同一作用域下重复声明 4.2 let无法进行变量提升 4.3 var的变量会跑出当前作用域&#xff0c;但是let不会 4.4 let与var的循环定时器问题 5 const 5.1 简单值 5.2 复杂值 1 var 使用var只能让函数内部使用…

融合ELO机制的销售能力评估方案

ELO排位赛算法 文章目录 ELO排位赛算法一. ELO机制二. 销售能力抽象为ELO排位赛设计2.1 基础设计2.2 存在问题 三. 优化措施3.1 如何解决新销售存在冷启动问题新老人动态K值调整假设检验衡量赢的程度 3.2 如何解决转化率存在不置信的问题ELO升级为MultiELO 一. ELO机制 ELO等级…

C语言结构体

一、结构体的定义&#xff1a; 结构体&#xff08;Struct&#xff09;是C语言中的一个重要数据类型&#xff0c;它可以用来存储多个不同类型的变量。结构体类似于一个自定义的数据类型&#xff0c;可以包含多个不同类型的成员变量&#xff0c;每个成员变量可以有自己的数据类型…

sqlite3交叉编译

1、交叉编译sqllite3可以先从官网下载最新最新的源码进行编译。sqlite3下载sqlite3有两种版本的源代码&#xff0c;sqlite-amalgamation-3420000.zip这种是将所有的操作放到sqlite3中进行使用的。虽然官方推荐使用这种方法。但是对于嵌入式移植还是使用sqlite-autoconf-3420000…

WebGPU实战3D电商

在过去的几年里&#xff0c;我们一直在为 WebGPU 编写新版本的 Babylon.js 引擎。 随着下一代 Web 3D 即将在Chrome 102~103版本上公开WebGPU 1.0 &#xff0c;人们的兴奋情绪与日俱增。 在这篇博文中&#xff0c;我将快速概述这个新的 Babylon.js WebGPU 引擎&#xff0c;并将…

go 爬虫速度控制

go 爬虫速度控制 使用go语言用原生net/http写爬虫如何优雅的控制并发和请求速度控制并发限流并发和限流的区别简单说明有了并发控制为什么还要限流 最总代码 使用go语言用原生net/http写爬虫如何优雅的控制并发和请求速度 go程序的执行效率相对python要快的多&#xff0c;且占…

今天实习第一天,用git

老板问了我是否用过gitee&#xff0c;并且是否用过git&#xff0c;在集成工具中&#xff0c;会git来提交代码。我说没有。 所以&#xff0c;先使用gitee。 01.登录gitee的官网&#xff0c;在此处登录。 02.绑定邮箱&#xff0c;我用的是QQ邮箱。 03.git的历史 git是分布式的…

用OpenCV进行图像分割--进阶篇

1. 引言 大家好&#xff0c;我的图像处理爱好者们&#xff01; 在上一篇幅中&#xff0c;我们简单介绍了图像分割领域中的基础知识&#xff0c;包含基于固定阈值的分割和基于OSTU的分割算法。这一次&#xff0c;我们将通过介绍基于色度的分割来进一步巩固大家的基础知识。 闲…

Java实现站内信

假如后台某个任务比较耗时&#xff0c;这时就需要任务完成时&#xff0c;通知一下用户&#xff0c;如下图&#xff0c;实现站内信的效果 两张表即可实现 t_message_content内容表 CREATE TABLE t_message_content (c_id int(11) NOT NULL AUTO_INCREMENT COMMENT 消息的id,se…