ROS-rosbag

2023-12-28 02:12
文章标签 ros rosbag

本文主要是介绍ROS-rosbag,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 一、命令行
    • 二、编码

机器人传感器获取到的信息,有时我们可能需要时时处理,有时可能只是采集数据,事后分析,比如:

机器人导航实现中,可能需要绘制导航所需的全局地图,地图绘制实现,有两种方式,方式1:可以控制机器人运动,将机器人传感器感知到的数据时时处理,生成地图信息。方式2:同样是控制机器人运动,将机器人传感器感知到的数据留存,事后,再重新读取数据,生成地图信息。两种方式比较,显然方式2使用上更为灵活方便。

在ROS中关于数据的留存以及读取实现,提供了专门的工具: rosbag。
ROS Bag通常用于以下场景:

  • 离线数据处理:在无法连接实时ROS系统时,可以使用ROS Bag记录消息,然后在离线状态下进行数据处理和算法开发。
  • 数据集收集:ROS Bag可以用于收集数据集,以用于机器学习和深度学习等应用。
  • 调试和测试:ROS Bag可以用于调试和测试ROS节点和程序的行为。

概念
是用于录制和回放 ROS 主题的一个工具集。

作用
实现了数据的复用,方便调试、测试。

本质
rosbag本质也是ros的节点,当录制时,rosbag是一个订阅节点,可以订阅话题消息并将订阅到的数据写入磁盘文件;当重放时,rosbag是一个发布节点,可以读取磁盘文件,发布文件中的话题消息。

需求
ROS 内置的乌龟案例并操作,操作过程中使用 rosbag 录制,录制结束后,实现重放

一、命令行

实现
1.准备
创建目录保存录制的文件

mkdir ./xxx
cd xxx

2.开始录制

rosbag record -a -O 目标文件
  • -a表示所有话题,-o表示输出
  • 操作小乌龟一段时间,结束录制使用 ctrl + c,在创建的目录中会生成bag文件。
    在这里插入图片描述

3.查看文件

rosbag info 文件名

在这里插入图片描述
4.回放文件

rosbag play 文件名

重启乌龟节点,会发现,乌龟按照录制时的轨迹运动。

如果想改变消息的发布速率,可以用下面的命令,-r 后面的数字对应播放速率。

rosbag play -r 2 文件名

如果希望 rosbag 循环播放,可以用命令

rosbag play -l  文件名  # -l== --loop

如果只播放感兴趣的 topic ,则用命令

rosbag play <bagfile> --topic /topic1

上述播放命令执行期间,空格键可以暂停播放。

二、编码

方案A:C++实现
1.写 bag

#include "ros/ros.h"
#include "rosbag/bag.h"
#include "std_msgs/String.h"int main(int argc, char *argv[])
{ros::init(argc,argv,"bag_write");ros::NodeHandle nh;//创建bag对象rosbag::Bag bag;//打开bag.open("/home/rosdemo/demo/test.bag",rosbag::BagMode::Write);//写std_msgs::String msg;msg.data = "hello world";bag.write("/chatter",ros::Time::now(),msg);bag.write("/chatter",ros::Time::now(),msg);bag.write("/chatter",ros::Time::now(),msg);bag.write("/chatter",ros::Time::now(),msg);//关闭bag.close();return 0;
}

在这里插入图片描述

2.读bag

/*  读取 bag 文件:*/
#include "ros/ros.h"
#include "rosbag/bag.h"
#include "rosbag/view.h"
#include "std_msgs/String.h"
#include "std_msgs/Int32.h"int main(int argc, char *argv[])
{setlocale(LC_ALL,"");ros::init(argc,argv,"bag_read");ros::NodeHandle nh;//创建 bag 对象rosbag::Bag bag;//打开 bag 文件bag.open("/home/rosdemo/demo/test.bag",rosbag::BagMode::Read);//读数据for (rosbag::MessageInstance const m : rosbag::View(bag)){std_msgs::String::ConstPtr p = m.instantiate<std_msgs::String>();if(p != nullptr){ROS_INFO("读取的数据:%s",p->data.c_str());}}//关闭文件流bag.close();return 0;
}
  • ros中的bag包是按逐帧序列存储的,解析的时候创建View类可以逐帧把数据读取出来
    在这里插入图片描述
  • rosbag::View是ROS Bag文件中的一组消息的视图,它提供了一些方便的方法来遍历和访问这些消息。

rosbag::View实际上是一个包含rosbag::Connection对象的集合,每个对象代表一个主题。rosbag::Connection对象包含一组时间戳和消息,表示该主题的所有消息。您可以使用以下方法来访问这些消息:

  • begin():返回指向第一条消息的迭代器。
  • end():返回指向最后一条消息后面的位置的迭代器。
  • rbegin():返回指向最后一条消息的迭代器。
  • rend():返回指向第一条消息前面的位置的迭代器。
  • size():返回视图中消息的数量。

在使用rosbag::View遍历Bag文件中的所有消息时,每个迭代器会返回一个rosbag::MessageInstance对象。这个对象包含了消息的时间戳、消息类型和消息数据等信息。您可以使用以下方法来访问这些信息:

  • getTime():返回消息的时间戳。
  • getTopic():返回消息所属的主题名称。
  • getDataType():返回消息的数据类型。
  • instantiate():将消息实例化为指定的数据类型。如果无法实例化,则返回空指针。

方案B:Python实现

1.写 bag

#! /usr/bin/env python
import rospy
import rosbag
from std_msgs.msg import Stringif __name__ == "__main__":#初始化节点 rospy.init_node("w_bag_p")# 创建 rosbag 对象bag = rosbag.Bag("/home/rosdemo/demo/test.bag",'w')# 写数据s = String()s.data= "hahahaha"bag.write("chatter",s)bag.write("chatter",s)bag.write("chatter",s)# 关闭流bag.close()

2.读bag

#! /usr/bin/env python
import rospy
import rosbag
from std_msgs.msg import Stringif __name__ == "__main__":#初始化节点 rospy.init_node("w_bag_p")# 创建 rosbag 对象bag = rosbag.Bag("/home/rosdemo/demo/test.bag",'r')# 读数据bagMessage = bag.read_messages("chatter")for topic,msg,t in bagMessage:rospy.loginfo("%s,%s,%s",topic,msg,t)# 关闭流bag.close()

参考:
[1]Autolabor-ROS机器人入门课程《ROS理论与实践》季基础教程
[2]【Autolabor初级教程】ROS机器人入门
[3]胡春旭.ROS机器人开发实践[M].机械工业出版社,2018.
[4]http://t.csdnimg.cn/6U3gV
[5]https://blog.csdn.net/weixin_40582034/article/details/129040895

这篇关于ROS-rosbag的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/544860

相关文章

ROS - C++实现RosBag包回放/提取

文章目录 1. 回放原理2. 回放/提取 多个话题3. 回放/提取数据包,并实时发布 1. 回放原理 #include <ros/ros.h>#include <rosbag/bag.h>#include <std_msgs/String.h>int main(int argc, char** argv){// 初始化ROS节点ros::init(argc, argv,

ROS - C++实现RosBag包录制

文章目录 1. 录制原理2. 录制多个话题3. 订阅ROS消息,实时录制 1. 录制原理 #include <ros/ros.h>#include <rosbag/bag.h>#include <std_msgs/String.h>int main(int argc, char** argv){// 初始化ROS节点ros::init(argc, argv, "reco

hector_quadrotor编译总结 | ubuntu 16.04 ros-kinetic版本

hector_quadrotor编译总结 | ubuntu 16.04 ros-kinetic版本 基于Ubuntu 16.04 LTS系统所用ROS版本为 Kinetic hector_quadrotor ROS包主要用于四旋翼无人机的建模、控制和仿真。 1.安装依赖库 所需系统及依赖库 Ubuntu 16.04|ros-kinetic|Gazebo|gazebo_ros_pkgs|ge

hector_quadrotor编译总结 | ubuntu 14.04 ros-indigo版本

hector_quadrotor编译总结 | ubuntu 14.04 ros-indigo版本 基于Ubuntu 14.04 LTS系统所用ROS版本为 Indigo hector_quadrotor ROS包主要用于四旋翼无人机的建模、控制和仿真。 备注:两种安装方式可选:install the binary packages | install the source files

Ubuntu20.04+ros-noetic配置Cartographer

一、概述         因为要配置激光SLAM,Cartographer属于激光雷达SLAM 中比较经典的一款,在学习之前先将其在Ubuntu20.04首先配置出来并成功运行demo。 二、具体操作 (一)概述         使用平台是Windows的wsl2上的Ubuntu20.04子系统,双系统与虚拟机的安装原理与这个相同。主要依照的安装操作是官方文档,链接如下所示。 Runni

ROS学习记录-ubuntu系统和ROS的安装

一、ubuntu安装 使用的是ubuntu14.04.4系统,从官网下载,也可以从国内镜像下载。 官网:http://cdimage.ubuntu.com/netboot/14.04/?_ga=1.178505383.2009389272.1483453317 国内镜像 网易:http://mirrors.163.com/ubuntu-releases/14.04/ 厦大:http://

linux(ubuntu)安装QT-ros插件

Linux下的qt安装ros插件 查看qt版本和对应的ros插件版本查看qt版本查看 qt creator 版本 qt creator进行更新升级下载版本对应的ros_qtc_plugin 插件插件安装安装成功 查看qt版本和对应的ros插件版本 想要qt与ros联合开发,我门需要在qt creator中添加ros的插件,之前查资料有哦 一个方法是直接下载安装带有ros插件版本的

roscore等ros命令执行后终端无输出,无反应

现象 在终端中输入 roscore 等 ros 命令,终端无输出,无反应。但是,Ctrl+C后终端还是有输出的。 解决措施 打开.barshrc文件 gedit ~/.bashrc 修改ROS_HOSTNAME和ROS_MASTER_URI变量的赋值语句,如果有ROS_IP变量也需要修改。用 localhost 替代具体的 IP地址。 修改前。 export ROS_HOSTNAM

QT运行ROS工程

文章目录 使用QT创建ROS工程项目配置修改cmake环境配置运行设置 运行 使用QT创建ROS工程 工程名字和路径 下一步(直接选择默认选项就可以)->完成 完成之后 是这样的 接下来在工作空间里面创建功能包 鼠标选中src点击右键->添加新文件 name::功能包的名字 path:路径,一般默认到src下即可 不用管 catkin:依赖的其他ros软件包的名字

ROS程序设计系列 - 5.实例helloworld

ROS程序设计系列 - 5.实例helloworld 1. 源由2. 步骤Step 1:安装ROS系统Step 2:创建框架工程Step 3:检查工程结构Step 4:创建CPP文件Step 5:修改配置文件Step 6:编译工程 3. 测试Step 1: 启动ROS CoreStep 2: 启动Hello程序 4. 总结5. 参考资料6. 补充 1. 源由 在做《Ardupil