文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

ROS笔记(5)——Bag包概述与解析

2023-09-04 09:34

关注

目录

ROS Bag概念与使用场景

ROS Bag文件生成的两种方式

ROS Bag文件的解析 (C++实现)

1、rosbag::View

2、完整C++代码示例

ROS Bag文件的解析 (Python实现)

C++与Python 解析ROS Bag文件两种方式的对比


ROS Bag概念与使用场景

ROS Bag是一种文件格式,用于存储ROS系统中的消息。ROS Bag可以将ROS节点发布的消息记录下来,然后在需要的时候将这些消息再次播放回ROS系统中。

ROS Bag通常用于以下场景:

  1. 离线数据处理:在无法连接实时ROS系统时,可以使用ROS Bag记录消息,然后在离线状态下进行数据处理和算法开发。
  2. 数据集收集:ROS Bag可以用于收集数据集,以用于机器学习和深度学习等应用。
  3. 调试和测试:ROS Bag可以用于调试和测试ROS节点和程序的行为。

ROS Bag文件生成的两种方式

ROS Bag文件以 .bag 扩展名结尾,可以通过以下方法进行保存:

  1. 在终端中使用rosbag record命令来记录指定主题的消息,将消息保存到ROS Bag文件中。例如,以下命令将记录名为/scan的激光雷达数据并将其保存到名为scan.bag的文件中:

rosbag record /scan -O scan.bag

rosbag record 是一个用于记录 ROS 消息到 ROS Bag 文件中的命令行工具。它可以记录指定主题的消息,将消息保存到一个ROS Bag文件中。以下是 rosbag record 命令的常用参数:

  • -a, --all:记录所有主题。
  • -O, --output-name:指定输出的 ROS Bag 文件名。
  • -b, --buffer-size:设置ROS Bag文件的缓冲区大小。
  • -d, --duration:设置记录时间长度,以秒为单位。
  • -l, --limit:设置记录的消息数量限制。
  • -j, --bz2:使用bzip2压缩来压缩ROS Bag文件。
  • -z, --lz4:使用LZ4压缩来压缩ROS Bag文件。
  • -p, --split:设置ROS Bag文件的分段大小。
  • -t, --topics:指定要记录的主题列表。
  • -x, --exclude:指定要排除的主题列表。

        2.在ROS程序中使用ROS API来记录消息,将消息保存到ROS Bag文件中。例如,以下代码段将记录名为/scan的激光雷达数据并将其保存到名为scan.bag的文件中:

#include #include #include void scanCallback(const sensor_msgs::LaserScan::ConstPtr& msg){  static rosbag::Bag bag;  if (!bag.isOpen()) {    bag.open("scan.bag", rosbag::bagmode::Write);  }  bag.write("/scan", ros::Time::now(), *msg);  }int main(int argc, char** argv){  ros::init(argc, argv, "scan_logger");  ros::NodeHandle nh;  ros::Subscriber sub = nh.subscribe("/scan", 1, scanCallback);  ros::spin();  return 0;}

python实现

#!/usr/bin/env pythonimport rospyimport rosbagfrom sensor_msgs.msg import LaserScandef scanCallback(msg):    global bag    if bag is None:        bag = rosbag.Bag('scan.bag', 'w')    bag.write('/scan', msg)if __name__ == '__main__':    rospy.init_node('scan_logger')    bag = None    sub = rospy.Subscriber('/scan', LaserScan, scanCallback)    rospy.spin()    bag.close()

无论使用哪种方法保存 ROS Bag 文件,都可以使用 rosbag play 命令或ROS API来播放并查看记录的消息。

ROS Bag文件的解析 (C++实现)

1、rosbag::View

rosbag::View是ROS Bag文件中的一组消息的视图,它提供了一些方便的方法来遍历和访问这些消息。

rosbag::View实际上是一个包含rosbag::Connection对象的集合,每个对象代表一个主题。rosbag::Connection对象包含一组时间戳和消息,表示该主题的所有消息。您可以使用以下方法来访问这些消息:

在使用rosbag::View遍历Bag文件中的所有消息时,每个迭代器会返回一个rosbag::MessageInstance对象。这个对象包含了消息的时间戳、消息类型和消息数据等信息。您可以使用以下方法来访问这些信息:

2、完整C++代码示例

#include #include #include int main(int argc, char** argv) {    // 初始化ROS节点    ros::init(argc, argv, "rosbag_parser");    ros::NodeHandle n;    // 打开bag文件    rosbag::Bag bag;    bag.open("/path/to/bagfile.bag", rosbag::bagmode::Read);    // 遍历bag文件中的所有消息    rosbag::View view(bag);    for (rosbag::MessageInstance const m : view) {        std_msgs::String::ConstPtr msg = m.instantiate();        if (msg != nullptr && m.getTopic() == "/my_topic") {            // 打印消息内容            ROS_INFO("Message: %s", msg->data.c_str());        }    }    // 关闭bag文件    bag.close();    return 0;}

ROS Bag文件的解析 (Python实现)

import rosbagimport rospyfrom std_msgs.msg import String# 初始化ROS节点rospy.init_node('rosbag_parser')# 打开bag文件bag = rosbag.Bag('/path/to/bagfile.bag')# 遍历bag文件中的所有消息for topic, msg, t in bag.read_messages():    # 检查消息类型和主题名称    if topic == '/my_topic' and isinstance(msg, String):        # 打印消息内容        rospy.loginfo("Message: %s", msg.data)# 关闭bag文件bag.close()

请注意,在这个示例中,我们使用了ROS提供的rospy.loginfo函数来输出消息,它类似于Python的print函数,但是它会将消息输出到ROS的日志系统,这有助于调试和记录机器人的运行情况。

您可以将上面的代码保存为一个Python文件,然后用以下命令运行它:

rosrun

请将替换为你的ROS软件包的名称,将替换为你的Python文件的名称。

C++与Python 解析ROS Bag文件两种方式的对比

Python 中使用 rosbag.Bag 读取 Bag 文件,C++ 中使用 rosbag::Bag

Python 中使用 bag.read_messages() 方法遍历 Bag 文件中的消息,C++ 中使用 rosbag::View 类和 C++11 的范围 for 循环来遍历消息。

Python 中的 t 变量表示消息的时间戳,C++ 中使用 rosbag::MessageInstance::getTime() 方法来获取消息的时间戳。

Python 中使用 msg 变量来存储消息的内容,C++ 中使用 rosbag::MessageInstance::instantiate() 方法将消息实例化为指定的数据类型,如果无法实例化,则返回空指针。

Python 中使用 topic 变量来表示消息所属的主题,C++ 中使用 rosbag::MessageInstance::getTopic() 方法来获取消息所属的主题名称。

Python 中使用 rospy.loginfo 函数来输出消息,C++ 中可以使用 ROS 的日志系统来输出消息,例如使用 ROS_INFO 宏来输出消息。

因此,使用 C++ 代码来解析 ROS Bag 文件,大致流程如下:

  1. 打开 Bag 文件并创建 rosbag::Bag 对象。
  2. 创建 rosbag::View 对象并遍历 Bag 文件中的消息。
  3. 对于每条消息,使用 rosbag::MessageInstance::instantiate() 方法将消息实例化为指定的数据类型,并使用 rosbag::MessageInstance::getTopic() 方法获取消息所属的主题名称和 rosbag::MessageInstance::getTime() 方法获取消息的时间戳。
  4. 对于符合条件的消息,使用 ROS 的日志系统或其他方式输出消息内容。
  5. 关闭 Bag 文件。

来源地址:https://blog.csdn.net/weixin_40582034/article/details/129040895

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯