foxy与galactic解析rosbag的不同之处
前言
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的不同之处的更多相关文章
- MyBatis 源码分析 - 配置文件解析过程
		* 本文速览 由于本篇文章篇幅比较大,所以这里拿出一节对本文进行快速概括.本篇文章对 MyBatis 配置文件中常用配置的解析过程进行了较为详细的介绍和分析,包括但不限于settings,typeAl ... 
- C# Newtonsoft.Json解析数组的小例子[转]
		https://blog.csdn.net/Sayesan/article/details/79756738 C# Newtonsoft.Json解析数组的小例子 http://www.cnblog ... 
- Android 数据存储(XML解析)
		在androd手机中处理xml数据时很常见的事情,通常在不同平台传输数据的时候,我们就可能使用xml,xml是与平台无关的特性,被广泛运用于数据通信中,那么在android中如何解析xml文件数据 ... 
- 我该如何学习spring源码以及解析bean定义的注册
		如何学习spring源码 前言 本文属于spring源码解析的系列文章之一,文章主要是介绍如何学习spring的源码,希望能够最大限度的帮助到有需要的人.文章总体难度不大,但比较繁重,学习时一定要耐住 ... 
- Vue3全局APi解析-源码学习
		本文章共5314字,预计阅读时间5-15分钟. 前言 不知不觉Vue-next的版本已经来到了3.1.2,最近对照着源码学习Vue3的全局Api,边学习边整理了下来,希望可以和大家一起进步. 我们以官 ... 
- c#序列化json字符串及处理
		上面提到的第四篇文章最后有个解析数组的例子,出现了 .First.First.First.First.Children(); 我表示很晕,网上找的的例子大多数是关于JObject的,但是我很少看到JA ... 
- SVG DOM常用属性和方法介绍
		将以Adobe SVG Viewer提供的属性和方法为准,因为不同解析器对JavaScript以及相关的属性和方法支持的程度不同,有些方法和属性是某个解析器所特有的.SVG支持DOM2标准. 12.2 ... 
- Java_类文件及加载机制
		类文件及类加载机制 标签(空格分隔): Java 本篇博客的重点是分析JVM是如何进行类的加载的,但同时我们会捎带着说一下Class类文件结构,以便对类加载机制有更深的理解. 类文件结构 平台无关性 ... 
- PHP 系统常量及自定义常量
		__FILE__ 这个默认常量是 PHP 程序文件名.若引用文件 (include 或 require)则在引用文件内的该常量为引用文件名,而不是引用它的文件名. __LINE__ 这个默认常量是 P ... 
- scheme 阴阳谜题
		本篇分析continuation的一个著名例子"阴阳迷题",这是由David Madore先生提出的,原谜题如下: (let* ((yin ((lambda (foo) (disp ... 
随机推荐
- redis 简单整理——redis shell[九]
			前言 简单介绍一下redis的shell命令. 正文 redis 提供了一些工具,如redis-cli.redis-server.redis-benchmark等. redis-cli -r 对red ... 
- 【ESP32 IDF】用RMT控制 WS2812 彩色灯带
			在上一篇中,老周用 .NET Nano Framework 给大伙伴们演示了 WS2812 灯带的控制,包括用 SPI 和 红外RMT 的方式.利用 RMT 是一个很机灵的方案,不过,可能很多大伙伴对 ... 
- 牛客网-SQL专项训练3
			①这里有一张user表包含如下信息: 现在要把name列的所有值都转换为大写,并将字段重命名为names,像下面这样: SQL语句为:SELECT UCASE(name) AS names FROM ... 
- 【详谈 Delta Lake 】系列技术专题 之 Streaming(流式计算)
			简介: 本文翻译自大数据技术公司 Databricks 针对数据湖 Delta Lake 的系列技术文章.众所周知,Databricks 主导着开源大数据社区 Apache Spark.Delta ... 
- [FAQ] Quasar SSR: Hydration completed but contains mismatches.
			使用 Quasar SSR 模式在 build 编译目标代码时,如果模板里有在服务端渲染阶段可能无法识别的变量,一般会出现这类提示. 比如在 layout 模板里使用了 this.$q.this.$r ... 
- [FAQ] uni-app 不支持 v-cloak 情况下如何处理 v-if 页面闪烁问题
			在 Vue 中存在使用 v-if 决定元素显示隐藏的时候,会出现页面闪烁,那么当然 uni-app 中也存在了. 如果编译完后,需要满足 js 的某个条件才隐藏,页面元素必然会有闪烁的情况. 所以解决 ... 
- [Gin] 运行模式检测和设置 (mode.go)
			// 设置方式 gin.SetMode(gin.ReleaseMode) // 检测方式 if gin.Mode() == gin.DebugMode { } 更多相关信息,建议直接去看源代码. Re ... 
- WPF 编写一个测试 WM_TOUCH 触摸消息延迟的应用
			我听说在 Win10 到 Win11 的系统版本左右,微软加上了一大波触摸性能优化,准确来说是 HID 性能优化.我想测试一下在这些系统下,采用从 Windows 消息接收到 WM_TOUCH 触摸消 ... 
- 2019-8-31-C#-大端小端转换
			title author date CreateTime categories C# 大端小端转换 lindexi 2019-08-31 16:55:58 +0800 2018-05-28 10:21 ... 
- JAVA下唯一一款搞定OLTP+OLAP的强类型查询这就是最好用的ORM相见恨晚
			JAVA下唯一一款搞定OLTP+OLAP的强类型查询这就是最好用的ORM相见恨晚 介绍 首先非常感谢 FreeSQL 提供的部分源码,让我借鉴了不少功能点,整体设计并没有参考FreeSQL(因为jav ... 
