前言

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. c# seo 百度sitemap书写

    前言 我们知道对页面百度收录,有两种方式: 1.百度自己抓取. 2.自己提交sitemap让百度来抓取. sitemap 一般的一个业务逻辑是: 生成sitemap xml,然后每隔一段时间更新即可, ...

  2. 【进阶篇】Java 实际开发中积累的几个小技巧(二)

    目录 前言 六.自定义注解 6.1定义注解 6.2切面实现 6.3业务使用 七.抽象类和接口 7.1隔离业务层与 ORM 层 7.2隔离子系统的业务实现 7.3选择对比 文章小结 前言 笔者目前从事一 ...

  3. Mui 消息推送

    一.push通过H5+实现 简单实现方式:通过轮询服务器是否有新消息推送过来 mui.plusReady(function() {plus.navigator.closeSplashscreen(); ...

  4. git合并某分支上的单次提交(cherry-pick)

    1. 查找提交对应的hash值 git log 查看 d 查看下一页,q退出 vscode通过gitlens插件查看 2.合并提交 git cherry-pick hahs值

  5. 新零售标杆 SKG 全面拥抱 Serverless,实现敏捷交付

    简介: SKG CTO 王焱:以前需要 60 个人干的活,用 SAE 和大禹后 15 个人就可以! 作者:陈列昂.昕辰.龙琛.黛忻 项目背景   SKG 公司是一家专注于高端健康产品的研发.设计与制造 ...

  6. Java Map中那些巧妙的设计

    简介: 他山之石可以攻玉,这些巧妙的设计思想非常有借鉴价值,可谓是最佳实践.然而,大多数有关Java Map原理的科普类文章都是专注于"点",并没有连成"线", ...

  7. [HTML] 访问 a 链接不带 referer 的方式

    html5 新属性 referrerpolicy: referrerpolicy no-referrer no-referrer-when-downgrade origin origin-when-c ...

  8. JavaScript 如何实现一个响应式系统

    JavaScript 如何实现一个响应式系统 第一阶段目标 数据变化重新运行依赖数据的过程 第一阶段问题 如何知道数据发生了变化 如何知道哪些过程依赖了哪些数据 第一阶段问题的解决方案 我们可用参考现 ...

  9. dotnet 6 数组拷贝性能对比

    本文来对比多个不同的方法进行数组拷贝,和测试其性能 测试性能必须采用基准(标准)性能测试方法,否则测试结果不可信.在 dotnet 里面,可以采用 BenchmarkDotNet 进行性能测试.详细请 ...

  10. 10.Sidecar代理:日志架构

    官方文档:https://kubernetes.io/zh-cn/docs/concepts/cluster-administration/logging/ 题目:Sidecar代理 设置配置环境ku ...