自学内容网 自学内容网

【ROS】rosbag

概念:

        用于录制和回放 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;
}

 


原文地址:https://blog.csdn.net/qq_45868001/article/details/142625945

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!