ROS学习笔记13——rosbag功能包的简单使用
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;
}