前言

foxy和galactic版本在rosbag2_storage这个包的调整有点大(头文件及接口的命名空间),下面的代码仅供参考使用

foxy

#include "db3_reader.h"

#include <pcl/common/transforms.h>
#include <pcl/point_types.h>
#include <pcl_conversions/pcl_conversions.h> #include <rosbag2_cpp/converter_interfaces/serialization_format_converter.hpp>
#include <rosbag2_cpp/reader.hpp>
#include <rosbag2_cpp/readers/sequential_reader.hpp>
#include <rosbag2_cpp/typesupport_helpers.hpp>
#include <rosbag2_storage/metadata_io.hpp>
#include <rosbag2_storage/storage_factory.hpp>
#include <rosbag2_storage/serialized_bag_message.hpp>
#include <sensor_msgs/point_cloud2_iterator.hpp>
#include <rclcpp/serialization.hpp> namespace LidarViewRos2 {
namespace SensorProc { void Db3Reader::Init(const Config& conf)
{
const std::string slash = (conf.db3FilePath.back() == '/') ? "" : "/";
const std::string filePath = conf.db3FilePath + slash + conf.db3FileName;
ReadDatas(filePath, conf);
} void Db3Reader::ReadDatas(const std::string& file_path, const Config& conf)
{
rosbag2_cpp::StorageOptions storage_options{}; storage_options.uri = file_path;
storage_options.storage_id = "sqlite3"; rosbag2_cpp::ConverterOptions converter_options{};
converter_options.input_serialization_format = "cdr";
converter_options.output_serialization_format = "cdr"; rosbag2_cpp::readers::SequentialReader reader;
reader.open(storage_options, converter_options); rosbag2_storage::StorageFilter storage_filter;
storage_filter.topics = conf.topics;
reader.set_filter(storage_filter); const auto topics = reader.get_all_topics_and_types(); for (const auto& topic : topics) {
topics_name2type_[topic.name] = topic.type;
} int num = 1; while (reader.has_next()) {
auto message = reader.read_next();
auto serialized_message = rclcpp::SerializedMessage(*message->serialized_data);
auto type = topics_name2type_[message->topic_name];
auto frame_id = conf.frameIdMap.at(message->topic_name);
if (type == "sensor_msgs/msg/PointCloud2") {
auto serializer = rclcpp::Serialization<sensor_msgs::msg::PointCloud2>();
sensor_msgs::msg::PointCloud2 pc2;
serializer.deserialize_message(&serialized_message, &pc2);
pc2.header.frame_id = frame_id;
Eigen::Affine3d transform = conf.extrinsicMap.at(message->topic_name);
TransformPointCloud(pc2, transform);
pc_proc_->Input(message->topic_name, std::move(pc2));
continue;
}
if (type == "sensor_msgs/msg/Imu") {
// sensor_msgs::msg::Imu
auto serializer = rclcpp::Serialization<sensor_msgs::msg::Imu>();
sensor_msgs::msg::Imu imu_data;
serializer.deserialize_message(&serialized_message, &imu_data);
imu_data.header.frame_id = frame_id;
pc_proc_->Input(message->topic_name, std::move(imu_data));
continue;
}
}
pc_proc_->SetEndTime();
} void Db3Reader::TransformPointCloud(sensor_msgs::msg::PointCloud2& pc, Eigen::Affine3d& affine)
{
sensor_msgs::PointCloud2Iterator<float> iter_x(pc, "x");
sensor_msgs::PointCloud2Iterator<float> iter_y(pc, "y");
sensor_msgs::PointCloud2Iterator<float> iter_z(pc, "z"); while (iter_x != iter_x.end() && iter_y != iter_y.end() && iter_z != iter_z.end()) {
Eigen::Vector3d point(*iter_x, *iter_y, *iter_z);
auto new_point = affine * point;
*iter_x = new_point[0];
*iter_y = new_point[1];
*iter_z = new_point[2];
++iter_x;
++iter_y;
++iter_z;
}
} } // namespace SensorProc
} // namespace LidarViewRos2

galactic

#include "db3_reader.h"

#include <pcl/common/transforms.h>
#include <pcl/point_types.h>
#include <pcl_conversions/pcl_conversions.h> #include <rosbag2_cpp/converter_interfaces/serialization_format_converter.hpp>
#include <rosbag2_cpp/reader.hpp>
#include <rosbag2_cpp/readers/sequential_reader.hpp>
#include <rosbag2_cpp/typesupport_helpers.hpp>
#include <rosbag2_storage/metadata_io.hpp>
#include <rosbag2_storage/storage_factory.hpp>
#include <rosbag2_storage/storage_options.hpp>
#include <sensor_msgs/point_cloud2_iterator.hpp> namespace LidarViewRos2 {
namespace SensorProc { void Db3Reader::Init(const Config& conf)
{
const std::string slash = (conf.db3FilePath.back() == '/') ? "" : "/";
const std::string filePath = conf.db3FilePath + slash + conf.db3FileName;
ReadDatas(filePath, conf);
} void Db3Reader::ReadDatas(const std::string& file_path, const Config& conf)
{
rosbag2_storage::StorageOptions storage_options{}; storage_options.uri = file_path;
storage_options.storage_id = "sqlite3"; rosbag2_cpp::ConverterOptions converter_options{};
converter_options.input_serialization_format = "cdr";
converter_options.output_serialization_format = "cdr"; rosbag2_cpp::readers::SequentialReader reader;
reader.open(storage_options, converter_options); rosbag2_storage::StorageFilter storage_filter;
storage_filter.topics = conf.topics;
reader.set_filter(storage_filter); const auto topics = reader.get_all_topics_and_types(); for (const auto& topic : topics) {
topics_name2type_[topic.name] = topic.type;
} int num = 1; while (reader.has_next()) {
auto message = reader.read_next();
auto serialized_message = rclcpp::SerializedMessage(*message->serialized_data);
auto type = topics_name2type_[message->topic_name];
auto frame_id = conf.frameIdMap.at(message->topic_name);
if (type == "sensor_msgs/msg/PointCloud2") {
auto serializer = rclcpp::Serialization<sensor_msgs::msg::PointCloud2>();
sensor_msgs::msg::PointCloud2 pc2;
serializer.deserialize_message(&serialized_message, &pc2);
pc2.header.frame_id = frame_id;
Eigen::Affine3d transform = conf.extrinsicMap.at(message->topic_name);
TransformPointCloud(pc2, transform);
pc_proc_->Input(message->topic_name, std::move(pc2));
continue;
}
if (type == "sensor_msgs/msg/Imu") {
// sensor_msgs::msg::Imu
auto serializer = rclcpp::Serialization<sensor_msgs::msg::Imu>();
sensor_msgs::msg::Imu imu_data;
serializer.deserialize_message(&serialized_message, &imu_data);
imu_data.header.frame_id = frame_id;
pc_proc_->Input(message->topic_name, std::move(imu_data));
continue;
}
}
pc_proc_->SetEndTime();
} void Db3Reader::TransformPointCloud(sensor_msgs::msg::PointCloud2& pc, Eigen::Affine3d& affine)
{
sensor_msgs::PointCloud2Iterator<float> iter_x(pc, "x");
sensor_msgs::PointCloud2Iterator<float> iter_y(pc, "y");
sensor_msgs::PointCloud2Iterator<float> iter_z(pc, "z"); while (iter_x != iter_x.end() && iter_y != iter_y.end() && iter_z != iter_z.end()) {
Eigen::Vector3d point(*iter_x, *iter_y, *iter_z);
auto new_point = affine * point;
*iter_x = new_point[0];
*iter_y = new_point[1];
*iter_z = new_point[2];
++iter_x;
++iter_y;
++iter_z;
}
} } // namespace SensorProc
} // namespace LidarViewRos2

foxy与galactic解析rosbag的不同之处的更多相关文章

  1. MyBatis 源码分析 - 配置文件解析过程

    * 本文速览 由于本篇文章篇幅比较大,所以这里拿出一节对本文进行快速概括.本篇文章对 MyBatis 配置文件中常用配置的解析过程进行了较为详细的介绍和分析,包括但不限于settings,typeAl ...

  2. C# Newtonsoft.Json解析数组的小例子[转]

    https://blog.csdn.net/Sayesan/article/details/79756738 C# Newtonsoft.Json解析数组的小例子  http://www.cnblog ...

  3. Android 数据存储(XML解析)

      在androd手机中处理xml数据时很常见的事情,通常在不同平台传输数据的时候,我们就可能使用xml,xml是与平台无关的特性,被广泛运用于数据通信中,那么在android中如何解析xml文件数据 ...

  4. 我该如何学习spring源码以及解析bean定义的注册

    如何学习spring源码 前言 本文属于spring源码解析的系列文章之一,文章主要是介绍如何学习spring的源码,希望能够最大限度的帮助到有需要的人.文章总体难度不大,但比较繁重,学习时一定要耐住 ...

  5. Vue3全局APi解析-源码学习

    本文章共5314字,预计阅读时间5-15分钟. 前言 不知不觉Vue-next的版本已经来到了3.1.2,最近对照着源码学习Vue3的全局Api,边学习边整理了下来,希望可以和大家一起进步. 我们以官 ...

  6. c#序列化json字符串及处理

    上面提到的第四篇文章最后有个解析数组的例子,出现了 .First.First.First.First.Children(); 我表示很晕,网上找的的例子大多数是关于JObject的,但是我很少看到JA ...

  7. SVG DOM常用属性和方法介绍

    将以Adobe SVG Viewer提供的属性和方法为准,因为不同解析器对JavaScript以及相关的属性和方法支持的程度不同,有些方法和属性是某个解析器所特有的.SVG支持DOM2标准. 12.2 ...

  8. Java_类文件及加载机制

    类文件及类加载机制 标签(空格分隔): Java 本篇博客的重点是分析JVM是如何进行类的加载的,但同时我们会捎带着说一下Class类文件结构,以便对类加载机制有更深的理解. 类文件结构 平台无关性 ...

  9. PHP 系统常量及自定义常量

    __FILE__ 这个默认常量是 PHP 程序文件名.若引用文件 (include 或 require)则在引用文件内的该常量为引用文件名,而不是引用它的文件名. __LINE__ 这个默认常量是 P ...

  10. scheme 阴阳谜题

    本篇分析continuation的一个著名例子"阴阳迷题",这是由David Madore先生提出的,原谜题如下: (let* ((yin ((lambda (foo) (disp ...

随机推荐

  1. pyaudio音频录制python

    python3.7不支持pyaudio pip在线安装 whl下载地址:https://github.com/intxcc/pyaudio_portaudio/releases 下载后使用pip离线安 ...

  2. C内存操作API的实现原理

    我们在编写C代码时,会使用两种类型的内存,一种是栈内存,另外一种是堆内存,其中栈内存的申请和释放是由编译器来隐式管理的,我们也称为自动内存,这种变量是最简单而且最常用的,然后就是堆内存,堆的申请和释放 ...

  3. 探索Kimi智能助手:如何用超长文本解锁高效信息处理新境界

    目前,Kimi备受瞩目,不仅在社交平台上引起了广泛关注,而且在解决我们的实际问题方面也显示出了巨大潜力.其支持超长文本的特性使得我们能够更加灵活地配置信息,避免了频繁与向量数据库进行交互以及编写提示词 ...

  4. 力扣506(java)-相对名次(简单)

    题目: 给你一个长度为 n 的整数数组 score ,其中 score[i] 是第 i 位运动员在比赛中的得分.所有得分都互不相同 . 运动员将根据得分 决定名次 ,其中名次第 1 的运动员得分最高, ...

  5. Dubbo-go 优雅上下线设计与实践

    ​简介:在分布式场景下,微服务进程都是以容器的形式存在,在容器调度系统例如 k8s 的支持下运行,容器组 Pod 是 K8S 的最小资源单位.随着服务的迭代和更新,当新版本上线后,需要针对线上正在运行 ...

  6. 5G 和云原生时代的技术下半场,视频化是最大最新的确定性

    ------------恢复内容开始------------ null ------------恢复内容结束------------

  7. [FE] Quasar BEX 所有位置类型 types

    科普:[FE] Quasar BEX 预览版指南 New Tab Quasar BEX 的默认类型是 New Tab,在新 tab 栏里打开内容. Dev Tools 也就是在开发者栏里面的内容. O ...

  8. STM32【HAL库】使用外部SRAM程序

    #include <board.h> #ifdef BSP_USING_SRAM #include <drv_common.h> #include <rtthread.h ...

  9. XYCTF pwn部分题解 (部分题目详解)

    hello_world(签到) 思路: 这道题就是利用printf函数泄露libc的基地址,然后再次进行栈溢出通过system,/bin/sh来获取shell wp: invisible_flag 思 ...

  10. Uncaught TypeError: (intermediate value)(intermediate value)(intermediate value)(intermediate value)...is not a function

    之前写完前端部分的时候总是会出现这个错误 对应代码 解决方法,在后面加上分号即可解决