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 ...
随机推荐
- Vue 项目 invalid host header 问题 配置 disableHostCheck:true报错
项目场景:解决 Vue 项目 invalid host header 问题disableHostCheck:true报错 问题描述使用内网穿透时出现 invalid host header找了好多都是 ...
- NL2SQL技术方案系列(1):NL2API、NL2SQL技术路径选择;LLM选型与Prompt工程技巧,揭秘项目落地优化之道
NL2SQL技术方案系列(1):NL2API.NL2SQL技术路径选择:LLM选型与Prompt工程技巧,揭秘项目落地优化之道 NL2SQL基础系列(1):业界顶尖排行榜.权威测评数据集及LLM大模型 ...
- 《领域驱动设计》:从领域视角深入仓储(Repository)的设计和实现
简介: <领域驱动设计>中的Repository(下面将用仓储表示)层实际上是极具有挑战性的,对于它的理解,也十分重要.本文讲大部分内容都在众多前辈理论基础上,从一个崭新的领域视觉开始探索 ...
- 地址标准化服务AI深度学习模型推理优化实践
简介: 深度学习已在面向自然语言处理等领域的实际业务场景中广泛落地,对它的推理性能优化成为了部署环节中重要的一环.推理性能的提升:一方面,可以充分发挥部署硬件的能力,降低用户响应时间,同时节省成本:另 ...
- MaxCompute 公共云多租户设计的技术要点详解及产品实现特色
简介:公共云大数据平台在多租户的设计和实现方式上有所差异.本文主要介绍在公共云大数据平台的多租实现方案中需要考虑的问题和挑战,重点介绍了MaxCompute在计算和存储多租实现上的特点.期望通过这些 ...
- DDD as Code:如何用代码诠释领域驱动设计?
简介: 相较于常规的MVC架构,DDD更抽象.更难以理解,各个开发者对DDD的解释也不尽相同.那么哪种设计方式才更好?在学习时如何知道哪种DDD更正统,没有被别人带歪?本文尝试使用"DDD ...
- 复杂推理模型从服务器移植到Web浏览器的理论和实战
简介: 随着机器学习的应用面越来越广,能在浏览器中跑模型推理的Javascript框架引擎也越来越多了.在项目中,前端同学可能会找到一些跑在服务端的python算法模型,很想将其直接集成到自己的代码 ...
- IoT Studio可视化搭建平台编辑历史功能的思考与探索
简介: 在前端可视化搭建领域中"重做"和"撤销"这两个功能已经是标配中的标配,毕竟只要有用户行为的地方就可能会有出错,这两个功能无疑就是为用户提供了" ...
- [Contract] 测试 Solidity 合约代码的两种方式 与 优缺点
第一种,使用 Truffle 这类继承了测试工具的框架,只要编写 js 脚本就可以测试 web3 与合约的逻辑. 优点是完全可控,粒度够细,便于集成测试:缺点是需要花费一些时间编写测试脚本,不过值得. ...
- 推荐一个使用 HardLink 硬链接减少重复文件占用磁盘空间的工具
在 NTFS 文件系统里面,咱可以使用 HardLink 硬链接的方式,将多个重复的文件链接到磁盘的同一份记录里面,从而减少在磁盘里面对重复文件存储多份记录,减少磁盘空间的占用.本文将和大家推荐我所做 ...