• 二十六、rosbag功能包


    一、引言

    对于传感器获取到的信息,有两种处理方式,一种是实时处理,另一种是先存储起来,后期在进行处理。显然,第二种处理方式更加灵活,在ROS中,提供了rosbag功能包来进行数据的存储和读取。

    二、命令行实现

    2.1 启动ros相关节点,创建存储目录

    2.2 开始录制

    rosbag record -a -o xxx.bag
    ctrl+c 结束录制
    
    • 1
    • 2

    2.3 查看文件

    rosbag info xxx.bag
    
    • 1

    2.4 回放文件

    rosbag play xxx.bag
    
    • 1

    注:
    rosbag本质上也是一个节点,在录制信息时,是一个订阅者,在回放信息时是一个发布者,因此也可以用以下命令进行数据的录制回放

    rosrun rosbag play ./bags/xxx.bag
    rosrun rosbag record ./bags/xxx.bag
    
    • 1
    • 2

    三、代码实现

    3.1 C++实现

    • 添加依赖包:rospy roscpp std_msgs rosbag

    3.1.1 写bag

    • 代码实现:
      #include "ros/ros.h"
      #include "rosbag/bag.h"
      #include "std_msgs/String.h"
      
      int main(int argc, char *argv[])
      {
          setlocale(LC_ALL,"");
          ros::init(argc, argv, "record");
          ros::NodeHandle nh;
          // 创建bag对象
          rosbag::Bag bag;
          // 打开文件流
          bag.open("../bags/test.bag", rosbag::BagMode::Write);
          // 写入数据
          std_msgs::String msg;
          msg.data = "hello C++";
          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.write("/chatter", ros::Time::now(), msg);
          // 关闭文件
          bag.close();
          return 0;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
    • 运行结果:
      rosrun rosbag_demo demo01_record
      
      • 1

    3.1.2 读bag

    • 代码实现:
      #include "ros/ros.h"
      #include "rosbag/bag.h"
      #include "rosbag/view.h"
      #include "std_msgs/String.h"
      #include "std_msgs/Int32.h"
      
      int main(int argc, char *argv[])
      {
      
          setlocale(LC_ALL, "");
          ros::init(argc, argv, "play");
          ros::NodeHandle nh;
      
          // 创建bag对象
          rosbag::Bag bag;
      
          // 打开bag文件
          bag.open("../bags/test.bag", rosbag::BagMode::Read);
      
          // 读数据,遍历bag
          for (rosbag::MessageInstance const m : rosbag::View(bag))
          {
              std_msgs::String::ConstPtr p = m.instantiate<std_msgs::String>();
              if (p != nullptr)
              {
                  ROS_INFO("读取的数据:%s", p->data.c_str());
              }
          }
          // 关闭文件流
          bag.close();
          return 0;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
    • 运行结果:
      rosrun rosbag_demo demo02_play
      [ INFO] [1664592519.825306555]: 读取的数据:hello C++
      [ INFO] [1664592519.830824939]: 读取的数据:hello C++
      [ INFO] [1664592519.831062195]: 读取的数据:hello C++
      [ INFO] [1664592519.831401755]: 读取的数据:hello C++
      [ INFO] [1664592519.831540311]: 读取的数据:hello C++
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

    3.2 Python实现

    3.2.1 存bag

    #! /usr/bin/env python
    
    import string
    import rospy
    import rosbag
    from std_msgs.msg import String
    
    if __name__ == "__main__":
        rospy.init_node("record_p")
    
        # 创建bag对象
        bag = rosbag.Bag("../bags/test.bag",'w')
    
        # 写数据
        s = String()
        s.data = "hello python!"
        # 注意,话题名称要与读取名称一致
        bag.write("chatter1",s)
        bag.write("chatter1",s)
        bag.write("chatter1",s)
    
        # 关闭文件
        bag.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    3.2.2 读bag

    • 代码实现:
      #! /usr/bin/env python 
      from multiprocessing.managers import BaseManager
      import rospy
      import rosbag
      from std_msgs.msg import String
      
      if __name__ == "__main__":
          rospy.init_node("play_p")
      
          # 创建bag对象
          bag = rosbag.Bag("../bags/test.bag",'r')
      
          # 读数据,注意要与写入的名称一致,否则无法读取
          bagMessage = bag.read_messages("chatter1")
          for topic, msg, t, in bagMessage:
              rospy.loginfo("%s %s %s",topic,msg,t)
          # 关闭文件
          bag.close()
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
    • 运行结果:
      rosrun rosbag_demo demo02_play_p.py 
      
      [INFO] [1664594555.881108]: chatter1 data: "hello python!" 1664594549126395940
      [INFO] [1664594555.887100]: chatter1 data: "hello python!" 1664594549126732587
      [INFO] [1664594555.891773]: chatter1 data: "hello python!" 1664594549126883029
      
      • 1
      • 2
      • 3
      • 4
      • 5
  • 相关阅读:
    Ubuntu22.04版本侧边栏和顶部栏隐藏与其他版本不同
    金三银四好像消失了,IT行业何时复苏!
    防火墙安全策略
    微信小程序引入官方《评价组件》的一些坑点
    android系统定制三:Dialer禁止系统拉起来去电页面(InCallActivity);
    【人工智能/算法】搜索求解(Solving Problems by Searching)
    1024程序员狂欢节特辑 | ELK+ 协同过滤算法构建个性化推荐引擎,智能实现“千人千面”
    金融数字化转型落地实践,腾讯云数据库的三问三答
    ruby对比python,30分钟教程
    批量PDF转HTML:高效管理与优化文档格式
  • 原文地址:https://blog.csdn.net/qq_43280851/article/details/127132863