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 ...
随机推荐
- NG 转发配置
ng的用途就不用说了,反向代理么,都知道,不过以前一直不太理解怎没配,现在终于理解点了 1.下载ng,如图: 2.先解压,解压后的路径不建议有空格和中文,其次配置环境变量,加到系统path 3.启动n ...
- 力扣206(java&python)-反转链表(简单)
题目: 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表. 示例1: 输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1] 示例2: 输入:head = [1,2] ...
- 社区首款 OAM 可视化平台发布!
作者 | 徐运元,杭州谐云科技合伙人及资深架构师,云计算行业和 Kubernetes 生态资深从业者 导读:什么是 OAM?2019 年 10 月 17 日,阿里巴巴合伙人.阿里云智能基础产品事业部总 ...
- 如何使用 Serverless Devs 部署静态网站到函数计算
简介:手把手教你:如何使用 Serverless Devs 部署静态网站到函数计算. 前言 公司经常有一些网站需要发布上线,对比了几款不同的产品后,决定使用阿里云的函数计算(FC)来托管构建出来的静 ...
- 用手机写代码:基于 Serverless 的在线编程能力探索
简介:Serverless 架构的按量付费模式,可以在保证在线编程功能性能的前提下,进一步降低成本.本文将会以阿里云函数计算为例,通过 Serverless 架构实现一个 Python 语言的在线编 ...
- [FAQ] IDE: Goland 注释符后面添加空行
如图所示,Code Style 对应语言 Go 勾选上注释空行的选项. Refer:Goland官网 Goland下载 Link:https://www.cnblogs.com/farwish/p/1 ...
- [FAQ] curl SSL_connect: SSL_ERROR_SYSCALL / wget Unable to establish SSL connection
当客户端访问 https 网站时遇到这些错误提示,通常问题出在服务器,而不是客户端. 因为你换一个 https 网站进行请求,可以验证这一点. 通过浏览器访问正常,大多数浏览器通过重试较低的 TLS ...
- 2018-12-27-WPF-从-DrawingVisual-转-BitmapImage-图片
title author date CreateTime categories WPF 从 DrawingVisual 转 BitmapImage 图片 lindexi 2018-12-27 11:3 ...
- SQL server 数据库巡检
SELECT name FROM sysobjects where xtype='u' and name <>'XzryGzGrant' AND name LIKE 'XzryGzGran ...
- k3s入门与实战---适配边缘计算场景的轻量级的k8s(一)
一.k3s介绍 1.1 什么是k3s? k3s 是经过 CNCF 认证的由 Rancher 公司开发维护的一个轻量级的 Kubernetes 发行版,内核机制还是和 k8s 一样,但是剔除了很多外部依 ...