ROS笔记之rosbag的快速切片(C++实现)

ROS笔记之rosbag的快速切片(C++实现)

—— 杭州 2023-12-21 夜


code review

文章目录

  • ROS笔记之rosbag的快速切片(C++实现)
    • 1.运行效果
    • 2.文件结构
    • 3.fast_rosbag_slice.cpp
    • 4.CMakeLists.txt
    • 5.package.xml
    • 6.对fast_rosbag_slice.cpp进行函数封装

正常该功能是ROS官方命令行:rosbag filter来实现,但速度太慢.

代码抄自大佬的Github:https://github.com/berndpfrommer/fast_rosbag_slice.git


图片名称

1.运行效果

  • input_bag的情况
    在这里插入图片描述

  • 运行,想得到后50s的bag

rosrun fast_rosbag_slice fast_rosbag_slice -i a.bag -o output.bag -s 1686903228.56 -e 1686903278.56

在这里插入图片描述

耗时8.68s(windows虚拟机环境)

  • output_bag的情况
    在这里插入图片描述

2.文件结构

在这里插入图片描述

3.fast_rosbag_slice.cpp

// -*-c++-*--------------------------------------------------------------------
// Copyright 2022 Bernd Pfrommer <bernd.pfrommer@gmail.com>
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include <rosbag/bag.h>
#include <rosbag/view.h>
#include <unistd.h>

#include <chrono>
#include <iostream>
#include <limits>

void usage()
{
  std::cout << "usage:" << std::endl;
  std::cout << "fast_rosbag_slice -i input_bag -o output_bag -s start_time -e stop_time "
            << std::endl;
}

static size_t process_bag(
  const std::string & inBagName, const std::string & outBagName, const double startTime,
  const double endTime)
{
  std::cout << "reading from bag: " << inBagName << std::endl;
  std::cout << "writing to bag: " << outBagName << std::endl;
  rosbag::Bag inBag;
  inBag.open(inBagName, rosbag::bagmode::Read);
  rosbag::Bag outBag;
  outBag.open(outBagName, rosbag::bagmode::Write);

  rosbag::View view(inBag);
  size_t numMessages(0);
  for (const rosbag::MessageInstance & m : view) {
    if (m.getTime().toSec() > endTime) {
      break;
    }
    if (m.getTime().toSec() >= startTime) {
      outBag.write(m.getTopic(), m.getTime(), m);
      numMessages++;
    }
  }
  inBag.close();
  outBag.close();
  return (numMessages);
}

int main(int argc, char ** argv)
{
  int opt;
  ros::Time::init();
  std::string inBag;
  std::string outBag;
  double startTime(0);
  double endTime(std::numeric_limits<double>::max());
  while ((opt = getopt(argc, argv, "i:o:s:e:h")) != -1) {
    switch (opt) {
      case 'i':
        inBag = optarg;
        break;
      case 'o':
        outBag = optarg;
        break;
      case 's':
        startTime = atof(optarg);
        break;
      case 'e':
        endTime = atof(optarg);
        break;
      case 'h':
        usage();
        return (-1);
      default:
        std::cout << "unknown option: " << opt << std::endl;
        usage();
        return (-1);
        break;
    }
  }
  if (inBag.empty() || outBag.empty()) {
    std::cout << "missing input or output bag name!" << std::endl;
    usage();
    return (-1);
  }
  const auto start = std::chrono::high_resolution_clock::now();

  size_t numMsg = process_bag(inBag, outBag, startTime, endTime);

  const auto end = std::chrono::high_resolution_clock::now();
  auto total_duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
  std::cout << "total time: " << total_duration * 1e-6 << " s" << std::endl;
  std::cout << "message processing rate: " << numMsg * 1e6 / total_duration << " hz" << std::endl;

  return (0);
}

4.CMakeLists.txt

#
# Copyright 2022 Bernd Pfrommer <bernd.pfrommer@gmail.com>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
cmake_minimum_required(VERSION 3.5)
project(fast_rosbag_slice)


set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -Wall -Wextra -Wpedantic -Werror")
set (CMAKE_CXX_STANDARD 14)

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rosbag
  )


catkin_package()

include_directories(
  ${catkin_INCLUDE_DIRS}
)

# --------- sync test
add_executable(fast_rosbag_slice src/fast_rosbag_slice.cpp)
target_link_libraries(fast_rosbag_slice ${catkin_LIBRARIES})
#
# volumetric tracking node and nodelet
#
install(TARGETS fast_rosbag_slice
  ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION}
)

5.package.xml

<?xml version="1.0"?>
<package format="3">
  <name>fast_rosbag_slice</name>
  <version>1.0.0</version>
  <description>fast rosbag time slicer</description>
  <maintainer email="bernd.pfrommer@gmail.com">Bernd Pfrommer</maintainer>
  <license>Apache2</license>

  <buildtool_depend condition="$ROS_VERSION == 1">catkin</buildtool_depend>
  <depend condition="$ROS_VERSION == 1">roscpp</depend>
  <depend condition="$ROS_VERSION == 1">rosbag</depend>

  <export>
    <build_type condition="$ROS_VERSION == 1">catkin</build_type>
  </export>

</package>

6.对fast_rosbag_slice.cpp进行函数封装

在这里插入图片描述

运行
在这里插入图片描述

代码

#include <chrono>
#include <iostream>
#include <limits>
#include <rosbag/bag.h>
#include <rosbag/view.h>

static size_t process_bag(
    const std::string &inBagName, const std::string &outBagName, const double startTime,
    const double endTime) {
    std::cout << "reading from bag: " << inBagName << std::endl;
    std::cout << "writing to bag: " << outBagName << std::endl;
    rosbag::Bag inBag;
    inBag.open(inBagName, rosbag::bagmode::Read);
    rosbag::Bag outBag;
    outBag.open(outBagName, rosbag::bagmode::Write);

    rosbag::View view(inBag);
    size_t numMessages(0);
    for (const rosbag::MessageInstance &m : view) {
        if (m.getTime().toSec() > endTime) {
            break;
        }
        if (m.getTime().toSec() >= startTime) {
            outBag.write(m.getTopic(), m.getTime(), m);
            numMessages++;
        }
    }
    inBag.close();
    outBag.close();
    return (numMessages);
}

int main() {
    std::string inBag = "/home/user/bag/a.bag";
    std::string outBag = "/home/user/bag/output.bag";
    double startTime = 1686903228.56;
    double endTime = 1686903278.56;

    const auto start = std::chrono::high_resolution_clock::now();

    size_t numMsg = process_bag(inBag, outBag, startTime, endTime);

    const auto end = std::chrono::high_resolution_clock::now();
    auto total_duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
    std::cout << "total time: " << total_duration * 1e-6 << " s" << std::endl;
    std::cout << "message processing rate: " << numMsg * 1e6 / total_duration << " hz" << std::endl;

    return (0);
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/262898.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【easy-ES使用】1.基础操作:增删改查、批量操作、分词查询、聚合处理。

easy-es、elasticsearch、分词器 与springboot 结合的代码我这里就不放了&#xff0c;我这里直接是使用代码。 基础准备&#xff1a; 创建实体类&#xff1a; Data // 索引名 IndexName("test_jc") public class TestJcES {// id注解IndexId(type IdType.CUSTOMI…

wordpress主题modown v8.81+erphpdown v16.0无限制无授权开心版

修复bug&#xff08;v8.81 2023.03.07&#xff09; 新增文章页正文下面常见问题手风琴模块&#xff0c;可设置显示文章的更新日期而不是发布日期&#xff0c;首页幻灯片支持指定文章、支持一个大图4个小图显示&#xff0c;grid网格列表支持显示简介&#xff0c;前台个人中心里显…

mask rcnn训练基于labelme生成的数据集

1.下载mask rcnn源码 此处使用的mask rcnn源码来自于B站博主霹雳吧啦Wz 2.安装labelme sudo apt install python3-pyqt5 pip install labelme如果运行出现QT的错误&#xff0c;可能是与我一样遇到自己装了C版本的QT 解决&#xff1a;运行命令 unset LD_LIBRARY_PATH2.使用lab…

Find My帐篷|苹果Find My技术与帐篷结合,智能防丢,全球定位

帐篷是撑在地上遮蔽风雨﹑日光并供临时居住的棚子。多用帆布做成&#xff0c;连同支撑用的东西&#xff0c;可随时拆下转移。帐篷是以部件的方式携带&#xff0c;到达现场后才加以组装&#xff0c;所以&#xff0c;需要各种部件和工具。了解各个部件的名称和使用方法&#xff0…

图像ISP处理——自动对焦AF算法

自动对焦算法是在数码相机、摄像机和其他图像采集设备中常见的技术之一&#xff0c;它通过调整镜头位置或其他光学参数来确保拍摄的图像在焦点上清晰。 以下是一些常见的自动对焦算法&#xff1a; 对比度检测对焦&#xff08;Contrast Detection Autofocus&#xff0c;CDAF&am…

找到最佳优惠券组合!Java算法助力电商平台策略优化

大家好&#xff0c;我是小米&#xff0c;一个热爱分享技术的小伙伴。最近我们电商平台迎来了一个新的需求&#xff0c;需要在用户下单时&#xff0c;高效地计算出多张平台券和店铺券的最优组合&#xff0c;使用户享受到最大的优惠。为了满足这一需求&#xff0c;我研究了一下动…

通过宝塔面板部署一个SpringBoot+Vue前后端分离项目的指南(三更)

采取的部署方案 阿里云服务器->FinalShell->宝塔面板。 近期需要将自己的一个SpringBootVue前后端分离项目&#xff0c;并且是分模块开发的项目部署到服务器上&#xff0c;记录一下踩坑的地方&#xff0c;结合C站大佬的解决方案&#xff0c;循循善诱一步步部署到服务器上…

QQ群发邮件的技巧?QQ邮箱邮件群发怎么发?

QQ群发邮件怎么设置&#xff1f;QQ邮件群发必备利器有哪些&#xff1f; QQ群发邮件&#xff0c;作为当下最流行的通讯方式之一&#xff0c;已经被广大网友所熟知。但是&#xff0c;要想真正掌握QQ群发邮件的技巧&#xff0c;却不是一件容易的事情。下面&#xff0c;就让蜂邮ED…

CloudCanal x Debezium 打造实时数据流动新范式

简述 Debezium 是一个开源的数据订阅工具&#xff0c;主要功能为捕获数据库变更事件发送到 Kafka。 CloudCanal 近期实现了从 Kafka 消费 Debezium 格式数据&#xff0c;将其 同步到 StarRocks、Doris、Elasticsearch、MongoDB、ClickHouse 等 12 种数据库和数仓&#xff0c;…

【保姆级教程】使用Mediapipe进行Face Landmark Detection实践和Hand Landmark实践

目录 1 Mediapipe 2 Solutions 3 安装依赖库 4 实践 1 Mediapipe Mediapipe是google的一个开源项目,可以提供开源的、跨平台的常用机器学习(machine learning,ML)方案。MediaPipe是一个用于构建机器学习管道的框架,用于处理视频、音频等时间序列数据。与资源消耗型的机…

研究生课程 |《数值分析》复习

搭配往年真题册食用最佳。

美好蕴育润康:为孕产期女性量身定制的专业营养

如今&#xff0c;孕产期是女性人生中特别而又重要的阶段。这段时间&#xff0c;孕期妈妈经常饱受许多痛苦和不适&#xff0c;更需要额外的关爱和呵护&#xff0c;以确保母婴健康。为了满足孕产期女性特殊的营养需求&#xff0c;美好蕴育润康应运而生&#xff0c;成为她们身边的…

【论文笔记】3D Gaussian Splatting for Real-Time Radiance Field Rendering

原文链接&#xff1a;https://arxiv.org/abs/2308.04079 1. 引言 网孔和点是最常见的3D场景表达&#xff0c;因其是显式的且适合基于GPU/CUDA的快速栅格化。神经辐射场&#xff08;NeRF&#xff09;则建立连续的场景表达便于优化&#xff0c;但渲染时的随机采样耗时且引入噪声…

Android13 Wifi启动流程分析

Android13 Wifi启动流程分析 文章目录 Android13 Wifi启动流程分析一、正常开关wifi 启动流程1、WifiManager2、WifiServiceImpl3、ActiveModeWarden4、ConcreteClientModeManager5、WifiNative6、WifiVendorHal7、HalDeviceManager8、wifi.cpp 二、重启设备时自动开启wifi流程…

结构型模式 | 适配器模式

一、适配器模式 1、原理 适配器模式&#xff08;Adapter&#xff09;&#xff0c;将一个类的接口转换成客户希望的另外一个接口&#xff0c;使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器模式主要分为三类&#xff1a;类适配器模式、对象适配器模式、接口…

智能优化算法应用:基于冠状病毒群体免疫算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于冠状病毒群体免疫算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于冠状病毒群体免疫算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.冠状病毒群体免疫算法4.…

程序员的自我修养:链接、装载与库-3 目标文件里有什么

1 目标文件的格式 2 目标文件是什么样的 3 挖掘SimpleSection.o 3.1 代码段 3.2 数据段和只读数据段 3.3 BSS段 3.4 其他段 4 ELF文件结构描述 4.1 文件头 4.2 段表 4.3 重定位表 4.4 字符串表 5 链接的接口-符号 待补充 107

MySQL数据库 索引

目录 索引概述 索引结构 二叉树 B-Tree BTree Hash 索引分类 索引语法 慢查询日志 索引概述 索引 (index&#xff09;是帮助MySQL高效获取数据的数据结构(有序)。在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种…

【银行测试】银行金融测试+金融项目测试点汇总...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、银行金融测试是…

Pycharm报的一些Python语法错误

Pycharm报的一些Python语法错误 1、PEP8:Expected 2 blank less:found 1 意思是&#xff1a;类和上面的行要间隔两行&#xff0c;现在只有一行 解决办法&#xff1a; 间隔2行 2、Remove redundant parentheses 意思是&#xff1a;删除多余的括号 解决&#xff1a;删掉外面括…