简介

通过rosbag实现对于数据的记录,生成.bag文件,再通过rosbag解析文件包含的信息。

代码实现

写入数据

#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[])
{
    //初始化
    setlocale(LC_ALL,"");
    ros::init(argc,argv,"rosbag_write");
    ros::NodeHandle nh;
    //创建rosbag对象
    rosbag::Bag bag;
    //打开文件流
        //参数1:文件名称   参数2:操作方式(读/写/追加)
    bag.open("hello.bag",rosbag::bagmode::Write);
    //写数据
    std_msgs::String msg;
    msg.data="this is a test!";
        //参数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);
    //关闭文件流
    bag.close();
    return 0;
}

写入基本现象

会在目录向生成.bag文件 ![Snipaste_2023-01-07_14-13-21.png][1]

读取数据

#include "ros/ros.h"
#include "rosbag/bag.h"
#include "std_msgs/String.h"
#include "rosbag/view.h"
/*

需求:使用rosbag向磁盘写入数据(话题+消息)
流程:
            1.导包
            2.初始化
            3.创建rosbag对象
            4.打开文件流(打开才可以读写数据)
            5.写/读数据
            6.关闭文件流
*/

int main(int argc, char  *argv[])
{
    //初始化
    setlocale(LC_ALL,"");
    ros::init(argc,argv,"rosbag_write");
    ros::NodeHandle nh;
    //创建rosbag对象
    rosbag::Bag bag;
    //打开文件流
        //参数1:文件名称   参数2:操作方式(读/写/追加)
    bag.open("hello.bag",rosbag::bagmode::Read);
    //读数据
   //取出话题、时间戳和消息内容
   //可以先获取消息的集合,再迭代取出消息的字段
   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());
   }
    //关闭文件流
    bag.close();
    return 0;
}

读取基本现象

Snipaste_2023-01-08_15-34-18.png

最后修改:2023 年 11 月 10 日
如果觉得我的文章对你有用,请随意赞赏