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 COMPONENTSroscpprosbag)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_sliceARCHIVE 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);
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安全、效率、成本:混合云数据库管理的三重挑战!

随着业务需求的不断演变&#xff0c;数据在多云平台之间流动&#xff0c;给数据库管控带来了新的层次和复杂性。这给数据库管控带来了前所未有的挑战。企业可能面临着一系列问题&#xff0c;包括安全性挑战、管理复杂性、性能与效率问题、成本控制难题、缺乏统一的管理视图以及…

Hardhat环境搭建(六)---无需翻墙

Hardhat环境搭建 官方地址 node环境 npm环境 git环境 安装hardhat npm init npminit是什么 在node开发中使用npm init会生成一个pakeage.json文件&#xff0c;这个文件主要是用来记录这个项目的详细信息的&#xff0c;它会将我们在项目开发中所要用到的包&#xff0c;以…

7.串口通信uart编写思路及自定义协议

前言&#xff1a; 串口是很重要的&#xff0c;有许多模块通信接口就是串口&#xff0c;例如gps模块&#xff0c;蓝牙模块&#xff0c;wifi模块还有一些精度比较高的陀螺仪模块等等&#xff0c;所以学会了串口之后&#xff0c;这些听起来很牛批的模块都能够用起来了。此外&#…

【Midjourney】Midjourney根据prompt提示词生成黑白色图片

目录 &#x1f347;&#x1f347;Midjourney是什么&#xff1f; &#x1f349;&#x1f349;Midjourney怎么用&#xff1f; &#x1f514;&#x1f514;提示词格式 &#x1f34b;&#x1f34b;应用示例——“秘密花园”式涂色书配图生成 &#x1f34c;&#x1f34c;例子1…

pycharm下执行conda命令提示无法识别解决方案

1 问题描述 win10环境命令行执行conda命令&#xff0c;报命令无法识别&#xff0c;错误信息如下&#xff1a; PS D:\code\cv> conda activate pt conda : 无法将“conda”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包括路径&a…

AI Native工程化:百度App AI互动技术实践

作者 | GodStart 导读 随着AI浪潮的兴起&#xff0c;越来越多的应用都在利用大模型重构业务形态&#xff0c;在设计和优化Prompt的过程中&#xff0c;我们发现整个Prompt测评和优化周期非常长&#xff0c;因此&#xff0c;我们提出了一种Prompt生成、评估与迭代的一体化解决方案…

华为OD机试 - 多段线数据压缩(Java JS Python C)

题目描述 下图中,每个方块代表一个像素,每个像素用其行号和列号表示。 为简化处理,多线段的走向只能是水平、竖直、斜向45度。 上图中的多线段可以用下面的坐标串表示:(2,8),(3,7),(3,6),(3,5),(4,4),(5,3),(6,2),(7,3),(8,4),(7,5)。 但可以发现,这种表示不是最简的,…

声音克隆:让你的声音变得无所不能

什么是声音克隆&#xff1f; 声音克隆是一种利用人工智能技术&#xff0c;根据一段声音样本&#xff0c;生成与之相似或完全相同的声音的过程。声音克隆可以用于多种场景。 声音克隆的原理是利用深度学习模型&#xff0c;从声音样本中提取声音特征&#xff0c;然后根据目标文…

在ClickHouse数据库中启用预测功能

在这篇博文中&#xff0c;我们将介绍如何将机器学习支持的预测功能与 ClickHouse 数据库集成。ClickHouse 是一个快速、开源、面向列的 SQL 数据库&#xff0c;对于数据分析和实时分析非常有用。该项目由 ClickHouse&#xff0c; Inc. 维护和支持。我们将探索它在需要数据准备以…

Nvm切换nodejs版本

下载地址 Releases coreybutler/nvm-windows GitHub 安装运行 双击安装运行即可 下载速度慢的&#xff0c;可以通过修改配置文件切换国内下载镜像 node_mirror: https://npm.taobao.org/mirrors/node/ npm_mirror: CNPM Binaries Mirror 打开安装目录&#xff0c;修改se…

云呼叫中心支持的通信渠道

1.电话通信 电话是云呼叫中心最常用的通信渠道之一。云呼叫中心可以通过电话与客户进行沟通&#xff0c;包括呼入和呼出电话。客户可以拨打企业提供的电话号码与企业联系&#xff0c;企业也可以通过云呼叫中心系统自动或手动拨打客户电话进行沟通。 2.短信通信 短信也是一种…

阿里云ECS配置IPv6后,如果无法访问该服务器上的网站,可检查如下配置

1、域名解析到这个IPv6地址,同一个子域名可以同时解析到IPv4和IPv6两个地址&#xff0c;这样就可以给网站配置ip4和ipv6双栈&#xff1b; 2、在安全组规则开通端口可访问&#xff0c;设定端口后注意授权对象要特殊设置“源:::/0” 3、到服务器nginx配置处&#xff0c;增加端口…