rosbag是用于录制和回放 ROS 主题的一个工具集,实现了数据的复用,方便调试和测试。rosbag本质也是ros的节点,当录制时,rosbag是一个订阅节点,可以订阅话题消息并将订阅到的数据写入磁盘文件;当重放时,rosbag是一个发布节点,可以读取磁盘文件,发布文件中的话题消息。
1、通过命令行使用rosbag
1.1 录制
rosbag record -a -O 目标文件
-a 录制所有话题
-O 文件命名时不带时间戳
若不想录制所有的话题,可以不使用 -a ,而是将所需话题跟在后面。结束录制使用 ctrl + c,在创建的目录中会生成bag文件。
1.2 查看文件
rosbag info 文件名
1.3 回放文件
rosbag play 文件名
rosbag的 参数远不止这些,可以通过 -h 进行查看。
2、通过编码使用rosbag
通过编码可以更加灵活的使用rosbag,下面通过rosbag实现文本的简单读写。
2.1 写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[])
{
/* code */
//2、初始化
setlocale(LC_ALL, "");
ros::init(argc, argv,"rosbag_write");
ros::NodeHandle nh;
//3、创建rosbag对象
rosbag::Bag bag;
//4、打开文件流
bag.open("test.bag",rosbag::BagMode::Write);
//5、写数据
std_msgs::String msgs;
msgs.data = "Come on! You are the best!";
/*
参数1:话题
参数1:时间戳
参数1:消息
*/
bag.write("/chatter",ros::Time::now(),msgs);
//6、关闭数据流
bag.close();
return 0;
}
2.2 读bag
#include "ros/ros.h"
#include "rosbag/bag.h"
#include "rosbag/view.h"
#include "std_msgs/String.h"
/*
需求:使用rosbag读取磁盘上的bag文件
流程:
1、导包
2、初始化
3、创建bag对象
4、打开文件流
5、读数据
6、关闭文件流
*/
int main(int argc, char *argv[])
{
/* code */
//2、初始化
setlocale(LC_ALL, "");
ros::init(argc, argv,"rosbag_read");
ros::NodeHandle nh;
//3、创建bag对象
rosbag::Bag bag;
//4、打开数据流
bag.open("test.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;
}