概念:
用于录制和回放 ROS 主题的一个工具集。
作用:
实现了数据的复用,方便调试、测试。
本质
rosbag本质也是ros的节点,当录制时,rosbag是一个订阅节点,可以订阅话题消息并将订阅到的数据写入磁盘文件;当重放时,rosbag是一个发布节点,可以读取磁盘文件,发布文件中的话题消息。
---------------------------------------------------------------------------------------------------------------------------------rosbag使用_命令行
需求:
ROS内置的乌龟案例并操作,操作过程中使用 rosbag 录制,录制结束后,实现重放。
1.准备
创建文件夹保存录制的文件
$mkdir ./xxx 新建文件夹
$cd xxx 进入文件夹
2.开始录制
$rosbag record -a -o 目标文件名称 -a:保存全部话题内容,-o:out,输出
操作小乌龟一段时间,结束录制使用 ctrl + c,在创建的目录中会生成bag文件。
3.查看文件
$rosbag info 文件名
4.回放文件
$rosbag play 文件名
重启乌龟节点,会发现,乌龟按照录制时的轨迹运动。
---------------------------------------------------------------------------------------------------------------------------------rosbag使用_编码
1.功能包依赖
roscpp rospy std_msgs rosbag
2.写bag
#include "ros/ros.h"
#include "rosbag/bag.h"
#include "std_msgs/String.h"
/*
需求:使用rosbag向磁盘文件写出数据(话题+消息)
流程:
1.导包
2.初始化
3.创建rosbag对象
4.打开文件流
5.写数据
6.关闭文件流
*/
int main(int argc, char *argv[])
{
//2.初始化
setlocale(LC_ALL,"");
ros::init(argc,argv,"bag_write");
ros::NodeHandle nh;
// 3.创建rosbag对象
rosbag::Bag bag;
// 4.打开文件流
bag.open("hello.bag",rosbag::BagMode::Write);
// 5.写数据
std_msgs::String msg;
msg.data = "hello xxx";
/*
参数1:话题
参数2:时间戳
参数3:消息
*/
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);
// 6.关闭文件流
bag.close();
return 0;
}
3.读bag
#include "ros/ros.h"
#include "rosbag/bag.h"
#include "rosbag/view.h"
#include "std_msgs/String.h"
/*
需求:使用rosbag读取磁盘上的bag文件
流程:
1.导包
2.初始化
3.创建rosbag对象
4.打开文件流(以读的方式打开)
5.读数据
6.关闭文件流
*/
int main(int argc, char *argv[])
{
// 2.初始化
setlocale(LC_ALL,"");
ros::init(argc,argv,"bag_read");
ros::NodeHandle nh;
// 3.创建rosbag对象
rosbag::Bag bag;
// 4.打开文件流(以读的方式打开)
bag.open("hello.bag",rosbag::BagMode::Read);
// 5.读数据
//取出话题、时间戳和消息
//可以先获取消息的集合,再迭代取出消息的字段
for (auto &&m:rosbag::View(bag))
{
//解析
std::string topic=m.getTopic();
ros::Time time=m.getTime();
std_msgs::StringPtr p=m.instantiate<std_msgs::String>();
ROS_INFO("解析的内容,话题:%s,时间戳:%.2f,消息值:%s",
topic.c_str(),
time.toSec(),
p->data.c_str());
}
// 6.关闭文件流
bag.close();
return 0;
}