当前位置: 首页 > news >正文

ROS 中的 rosbag

主要介绍了 ROS 中的rosbag工具,包括其基本命令、C++ API使用方法、以及一个完整的示例项目(example_333)的代码和运行效果。

1. 理论


一、rosbag 概述

rosbag 是 ROS 中用于录制、回放和管理话题数据的工具,常用于调试、测试和事后分析。

常用命令:

命令功能
record录制指定话题的数据包(bag)
info显示 bag 文件的基本信息
play回放一个或多个 bag 文件
check检查 bag 文件在当前系统中是否可回放
compress压缩 bag 文件
decompress解压 bag 文件
reindex重新索引损坏的 bag 文件

🛠️ 二、rosbag 命令示例

录制数据

# 录制所有话题rosbag record-a# 录制指定话题,并指定包名rosbag record-Osubset /turtle1/cmd_vel /turtle1/pose

查看数据

rosbag info<bag文件>

回放数据

rosbag play<bag文件>

三、rosbag C++ API

1. Bag 模式与压缩方式

  • 模式

    • Write:写入模式
    • Read:读取模式
    • Append:追加模式
  • 压缩方式

    • BZ2
    • LZ4(高效压缩,常用于 Android/iOS)

2. 常用 API

voidopen(std::stringconst&filename,uint32_tmode);voidBag::write(std::stringconst&topic,ros::MessageEvent<T>const&event);voidclose();

3. 读取指定话题示例

rosbag::Bag bag;bag.open("test.bag",rosbag::bagmode::Read);std::vector<std::string>topics;topics.push_back("chatter");rosbag::Viewview(bag,rosbag::TopicQuery(topics));foreach(rosbag::MessageInstanceconstm,view){std_msgs::String::ConstPtr s=m.instantiate<std_msgs::String>();if(s!=NULL)std::cout<<s->data<<std::endl;}

4. 读取所有话题

rosbag::Viewview(bag);

四、编译配置

package.xml

<build_depend>rosbag</build_depend><build_export_depend>rosbag</build_export_depend><exec_depend>rosbag</exec_depend>

CMakeLists.txt

find_package(catkin REQUIRED COMPONENTS rosbag)

五、示例项目:example_33

该项目演示了如何使用 rosbag 录制和回放自定义消息类型example_33/Info

文件结构

example_33/ ├── include/ ├── msg/ # 自定义消息 Info.msg ├── src/ │ ├── talker.cpp # 发布者 │ └── listener.cpp # 订阅者 ├── CMakeLists.txt └── package.xml

录制与回放过程

  1. 启动发布者

    rosrun example_33 talker
  2. 录制话题

    rosbag record-Obagfiles/test.bag /chatter
  3. 查看 bag 信息

    rosbag info bagfiles/test.bag

    输出示例:

    path: bagfiles/test.bag version: 2.0 duration: 2.45s start: Mar 30 10:42:57.50 (1617072177.50) end: Mar 30 10:42:59.90 (1617072179.90) size: 6.5 KB messages: 25 compression: lz4 [1/1 chunks; 35.56%] topics: chatter 25 msgs : example_33/Info
  4. 回放数据

    rosbag play bagfiles/test.bag
  5. 订阅并查看回放内容

    rosrun example_33 listener

    输出示例:

    [INFO] I heard: header frame id is info_msg, Fabio Miao, his age is 36

附:截图内容

  • 展示了talker.cpp中初始化 bag 对象并使用 LZ4 压缩写入的代码片段。
  • 显示了CMakeLists.txt中 C++11 编译选项和依赖项配置。
  • 终端输出中包含rosbag inforosbag playlistener的实时监听结果。

2. 实践

完整目录结构

~/catkin_ws/src/example_33/ ├── CMakeLists.txt # 编译配置文件 ├── package.xml # 包配置文件 ├── include/ # 头文件目录 ├── msg/ # 自定义消息目录 │ └── Info.msg # 自定义消息类型 └── src/ # 源代码目录 ├── talker.cpp # 发布者节点 └── listener.cpp # 订阅者节点

以及,

# 创建目录结构mkdir-p~/catkin_ws/src/example_33/{include,msg,src}# 创建空文件touch~/catkin_ws/src/example_33/CMakeLists.txttouch~/catkin_ws/src/example_33/package.xmltouch~/catkin_ws/src/example_33/msg/Info.msgtouch~/catkin_ws/src/example_33/src/talker.cpptouch~/catkin_ws/src/example_33/src/listener.cpp# 查看创建结果echo"✅ 目录结构和空文件创建完成:"tree ~/catkin_ws/src/example_33/

文件内容详解

1.msg/Info.msg- 自定义消息类型

# 个人信息消息类型 Header header string name uint8 age

2.package.xml- 包配置文件

<?xml version="1.0"?><packageformat="2"><name>example_33</name><version>0.0.1</version><description>The example_33 package</description><maintaineremail="ubuntu@todo.todo">ubuntu</maintainer><license>BSD</license><buildtool_depend>catkin</buildtool_depend><build_depend>message_generation</build_depend><build_depend>rosbag</build_depend><build_depend>roscpp</build_depend><build_depend>std_msgs</build_depend><build_export_depend>rosbag</build_export_depend><build_export_depend>roscpp</build_export_depend><build_export_depend>std_msgs</build_export_depend><exec_depend>message_runtime</exec_depend><exec_depend>rosbag</exec_depend><exec_depend>roscpp</exec_depend><exec_depend>std_msgs</exec_depend></package>

3.CMakeLists.txt- 编译配置文件

cmake_minimum_required(VERSION 3.0.2) project(example_33) ## Compile as C++11, supported in ROS Kinetic and newer add_compile_options(-std=c++11) ## Find catkin macros and libraries find_package(catkin REQUIRED COMPONENTS roscpp std_msgs message_generation rosbag ) ## Generate messages add_message_files( FILES Info.msg ) ## Generate added messages and services generate_messages( DEPENDENCIES std_msgs ) ## Catkin package configuration catkin_package( INCLUDE_DIRS include CATKIN_DEPENDS roscpp std_msgs message_runtime ) ## Include directories include_directories( include ${catkin_INCLUDE_DIRS} ) ## Declare talker node add_executable(talker src/talker.cpp) target_link_libraries(talker ${catkin_LIBRARIES}) add_dependencies(talker ${PROJECT_NAME}_generate_messages_cpp) ## Declare listener node add_executable(listener src/listener.cpp) target_link_libraries(listener ${catkin_LIBRARIES}) add_dependencies(listener ${PROJECT_NAME}_generate_messages_cpp)

4.src/talker.cpp- 发布者节点

#include<ros/ros.h>#include<rosbag/bag.h>#include<std_msgs/String.h>#include<example_33/Info.h>intmain(intargc,char**argv){ros::init(argc,argv,"talker");ros::NodeHandle nh;// 创建发布者ros::Publisher pub=nh.advertise<example_33::Info>("chatter",1000);// 创建bag文件用于录制rosbag::Bag bag;bag.open("bagfiles/test.bag",rosbag::bagmode::Write);bag.setCompression(rosbag::CompressionType::LZ4);// 使用LZ4压缩ros::Rateloop_rate(10);// 10Hzintcount=0;while(ros::ok()){// 创建自定义消息example_33::Info msg;msg.header.stamp=ros::Time::now();msg.header.frame_id="info_msg";msg.name="Fabio Miao";msg.age=36;// 发布消息pub.publish(msg);ROS_INFO("publish message: name=%s, age=%d",msg.name.c_str(),msg.age);// 写入bag文件bag.write("chatter",ros::Time::now(),msg);ros::spinOnce();loop_rate.sleep();count++;}bag.close();return0;}

5.src/listener.cpp- 订阅者节点

#include<ros/ros.h>#include<rosbag/bag.h>#include<rosbag/view.h>#include<example_33/Info.h>#include<boost/foreach.hpp>// 回调函数voidchatterCallback(constexample_33::Info::ConstPtr&msg){ROS_INFO("I heard: header frame id is %s, %s, his age is %d",msg->header.frame_id.c_str(),msg->name.c_str(),msg->age);}intmain(intargc,char**argv){ros::init(argc,argv,"listener");ros::NodeHandle nh;// 订阅实时话题ros::Subscriber sub=nh.subscribe("chatter",1000,chatterCallback);// 读取bag文件示例ROS_INFO("Opening bagfiles/test.bag");rosbag::Bag bag;bag.open("bagfiles/test.bag",rosbag::bagmode::Read);// 读取所有话题rosbag::Viewview(bag);// 遍历bag中的消息BOOST_FOREACH(rosbag::MessageInstanceconstm,view){example_33::Info::ConstPtr msg=m.instantiate<example_33::Info>();if(msg!=NULL){ROS_INFO("Bag replay: header frame id is %s, %s, his age is %d",msg->header.frame_id.c_str(),msg->name.c_str(),msg->age);}}bag.close();ros::spin();return0;}

使用流程

1. 编译包

cd~/catkin_ws catkin_makesourcedevel/setup.bash

2. 创建bag文件目录

mkdir-p~/catkin_ws/bagfiles

3. 运行发布者并录制数据

# 启动发布者rosrun example_33 talker# 在另一个终端录制bagcd~/catkin_ws rosbag record-Obagfiles/test.bag /chatter

4. 查看bag信息

rosbag info bagfiles/test.bag

5. 回放数据

# 回放bagrosbag play bagfiles/test.bag# 启动监听器(实时接收或查看bag回放)rosrun example_33 listener

代码特点

  1. 自定义消息:使用Info.msg自定义类型
  2. LZ4压缩:在写入bag时使用高效压缩
  3. 实时录制:发布消息的同时写入bag
  4. 两种读取方式
    • 实时订阅话题
    • 从bag文件回放读取
  5. 完整的消息头:包含时间戳和frame_id

这个示例完整展示了ROS bag的基本使用方法,从消息定义、发布订阅到bag文件的读写操作。

http://www.jsqmd.com/news/461611/

相关文章:

  • 2026年质量好的磁吸粉饼盒品牌推荐:亚克力粉饼盒厂家选购完整指南 - 品牌宣传支持者
  • 的加密世界权威指南_第一部分
  • Linux 常用目录及其用途
  • PWN手的成长之路--int_overflow
  • 盘点舟山资质齐全的工商注册企业,十大排名情况如何 - 工业设备
  • 云原生全球广域网架构深度科普:从单点集中到全域互联
  • 书是一个暗号,人类中的某一些靠这样的暗号,从茫茫人海中认出对方
  • Mysticbinary
  • 阿里云oss挂载
  • BeanFactory和FactoryBean区别
  • DP遍历避坑:索引遍历 vs 长度遍历,该怎么选?
  • 玩泥巴的|mudtools.cn
  • 网站视频下载工具VideoDownloadStudio
  • 分析2026年好用的双碳数字化源头厂家,大连地区哪家口碑好 - 工业品网
  • 初学者必读:快门速度的奥妙与应用指南
  • 抄书 2901️⃣天
  • 先扔个效果图镇楼。板子上电后打开串口助手,发送“0x55“直接回显,实测115200波特率下收发稳定。下面咱们掰开揉碎说代码实现
  • 记录 | 个人开发库推送至PyPi流程梳理(ChatGPT to Markdown 工具发布完整流程)
  • 软考高项通关实测:拒绝论文套路,3个月从焦虑到持证的真实备考经验
  • 2026年剖析唐山华冶钢管制造基本信息,看它为何受市场认可 - 工业品牌热点
  • 我把一个生产Bug的排查过程,交给AI处理——20分钟后我关掉了它
  • 2026年权威盘点:钢塑复合管行业TOP5机构,谁才是性价比
  • Linux内核SLUB调试功能
  • 【Agent Skills】教程!大模型入门到进阶,一套全解决(10)
  • 探讨双工位木纹转印机价格,华宜家在广东费用多少? - 工业设备
  • Docker单容器部署Dify
  • 什么是MIPI SoundWire
  • 28 超越默认:深入理解 Byte Buddy 的自定义 Assigner 与类型转换魔法
  • 2026年山东靠谱的管道支架制造厂排名揭晓 - myqiye
  • 总结国强和茂公司信誉、环保方面及物流配送,如何选择 - 工业推荐榜