自定义速腾激光雷达点云XYZIRT格式并调用PCL库进行滤波

2023-10-29


Windows 10 + Ubuntu 20.04 + VS Code
激光雷达速腾RS-LiDAR-32 + sdk v1.5.7

速腾激光雷达的ROS程序包可以输出XYZIRT格式,但是PCL库的点没有这种类型,需要进行自定义,并可以进行直通滤波和体素滤波等下采样处理。

一、试验程序源代码

1.1需要包含的头文件

#include <iostream>	
#include <cmath>

#include <pcl/common/transforms.h>
#include <pcl/io/pcd_io.h>	        
#include <pcl/point_types.h>	    

#include <pcl/filters/passthrough.h>
#include <pcl/filters/extract_indices.h>

1.2定义点云结构

struct MyPointType
{
  PCL_ADD_POINT4D;
  float intensity;
  uint16_t ring = 0;
  double timestamp = 0;
  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
} EIGEN_ALIGN16;

POINT_CLOUD_REGISTER_POINT_STRUCT(MyPointType,    //注册点类型宏
    (float ,x,x)
    (float ,y,y)
    (float ,z,z)
    (float ,intensity,intensity)
    (uint16_t ,ring,ring)
    (double ,timestamp,timestamp)
)

1.3主函数

int main(int argc, char** argv)
{
	pcl::PCLPointCloud2::Ptr cloud_in(new pcl::PCLPointCloud2());
    pcl::PCLPointCloud2::Ptr cloud_filtered(new pcl::PCLPointCloud2());
    pcl::PointCloud<MyPointType>::Ptr cloud_voxel(new pcl::PointCloud<MyPointType>);
    pcl::PointCloud<MyPointType>::Ptr cloud_pass(new pcl::PointCloud<MyPointType>);

    pcl::PCDReader reader;
    reader.read("../111.pcd", *cloud_in); // Remember to download the file first!
 
    pcl::VoxelGrid<pcl::PCLPointCloud2> sor;
    sor.setInputCloud(cloud_in);
    sor.setLeafSize(0.1f, 0.1f, 0.1f);
    sor.filter(*cloud_filtered);
 
    pcl::fromPCLPointCloud2(*cloud_filtered, *cloud_voxel);
    pcl::io::savePCDFile("../voxel.pcd", *cloud_voxel);

    pcl::PassThrough <pcl::PCLPointCloud2> pass;
    pass.setInputCloud (cloud_in);
    pass.setFilterFieldName ("y");
    pass.setFilterLimits (5, 100);
    pass.setFilterLimitsNegative (false);
    pass.filter (*cloud_filtered);
    
    pcl::fromPCLPointCloud2(*cloud_filtered, *cloud_pass);
    pcl::io::savePCDFile("../pass.pcd", *cloud_pass);
}

1.4 CMake文件

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)

project(ring_time)

find_package(PCL 1.2 REQUIRED)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread")
set(CMAKE_CXX_STANDARD 14)

find_package(Boost REQUIRED COMPONENTS thread)
include_directories(${Boost_INCLUDE_DIR})
link_directories(${Boost_LIBRARY_DIRS})
add_definitions(-DBOOST_ALL_DYN_LINK)

include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

aux_source_directory(. ALL_SRCS)

add_executable (ring_time ring_time.cpp ${ALL_SRCS})
target_link_libraries (ring_time ${PCL_LIBRARIES})

二、学习pcl::PCLPointCloud2::Ptr

直接用pcl::PointCloud<MyPointType>::Ptr 无法调用PCL的滤波函数。

2.1区别

pcl::PCLPointCloud2是为了与ROS更加兼容的PCL数据结构
pcl::PointCloud<T>是PCL数据标准结构
用pcl::PCLPointCloud2处理完后,转换成pcl::PointCloud<T>进行保存。

2.2转换

PCL中有两个函数直接解决了两者的转换关系:
1.pcl::fromPCLPointCloud2()
2.pcl::toPCLPointCloud2()
//cloud_filtered转换为cloud_pass,从pcl::PCLPointCloud2格式转换为模板点云pcl::PointCloud<pointT>
1、pcl::fromPCLPointCloud2(*cloud_filtered, *cloud_pass);
2、与1相反

  fromPCLPointCloud2 (const pcl::PCLPointCloud2& msg, pcl::PointCloud<PointT>& cloud)
  {
    MsgFieldMap field_map;
    createMapping<PointT> (msg.fields, field_map);    //创建一个field索引表
    fromPCLPointCloud2 (msg, cloud, field_map);       //转换点云
  }

2.3心得

1、处理带ring的点云需要自定义格式,而且要用到pcl::PCLPointCloud2::Ptr进行处理
2、直通滤波只能XYZI,不能滤除intensity和timestamp信息
3、发现一个VS Code里一个好用的pcd点云查看拓展vscode-3d-preview

参考资料:
链接: PCL自定义点和点云使用
链接: pcl::PCLPointCloud2 Struct Reference
链接: PCL点云类型之间相互转换
链接: PCL点云滤波

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自定义速腾激光雷达点云XYZIRT格式并调用PCL库进行滤波 的相关文章

随机推荐

  • ubuntu安装qt

    ubuntu安装qt 第一步 下载安装包https download qt io archive qt 5 14 5 14 2 第二步 更改权限 sudo chmod x qt opensource linux x64 5 12 12 ru
  • JS中使用正则表达式g模式和非g模式的区别

    g是global的缩写啊 就是匹配全部可匹配结果 如果你不带g 在正则过程中 字符串是从左至右匹配的 如果匹配成功就不再继续向右匹配了 如果你带g 它会重头到尾的把正确匹配的字符串挑选出来 例如 1 2 3 4 5 var str aaaa
  • C++ std::vector删除元素的几种方式及区别

    容器vector在删除过程中 常用的函数 函数 作用 pop back 删除 vector 容器中最后一个元素 该容器的大小 size 会减 1 但容量 capacity 不会发生改变 erase iter 删除 vector 容器中ite
  • 机器学习——Kmeans聚类算法

    目录 简介 手肘法 手肘法核心思想 轮廓系数 代码举例1 代码举例2 实例 简介 K均值聚类算法是先随机选取K个对象作为初始的聚类中心 然后计算每个对象与各个种子聚类中心之间的距离 把每个对象分配给距离它最近的聚类中心 聚类中心以及分配给它
  • Qt之对话框设计——利用QPalette改变控件颜色

    QPalette类相当于对话框或控件的调色板 它管理着控件或窗体的所有颜色信息 每个窗体或控件都包含一个QPalette对象 在显示时按照它的QPalette对象中对各部分各状态下的颜色的描述来进行绘制 QPalette类有两个基本的概念
  • 【数学建模】混合整数规划MIP(Python+Gurobi代码实现)

    目录 1 概述 2 入门算例 2 1 算例 2 2 求解 Pulp库和cvxpy 3 进阶算例 3 1 算例 3 2 Python Gurobi代码实现 3 3 运行结果 1 概述 混合整数规划 MIP 是 NP hard 问题中的一类 它
  • ASP.NET MVC 之View相关

    VS2015 新建一个MVC工程 验证改成No Authentication 界面大致如下 得到一个解决方案如下 下面分析一下View ViewBag Title ViewPageOne Layout Views Shared Layout
  • 什么是数据挖掘,给出一个你在生活中应用数据挖掘技术的例子,分析数据挖掘的意义。...

    数据挖掘是指从大量数据中自动或半自动地发现有用的信息 模式和知识的过程 数据挖掘通常包括预处理数据 选择适当的数据挖掘技术 应用算法和模型 评估结果和解释发现的知识 一个我在生活中应用数据挖掘技术的例子是使用社交媒体平台的推荐算法 社交媒体
  • 【SQL触发器】类型 FOR 、AFTER、 Instead of到底是什么鬼

    前言 上一篇博客 博客连接 https blog csdn net jerry11112 article details 82924714 讲述了触发器的基本概念 触发器什么时候用 为什么用 这篇博客将简述触发器的类型 由于FOR触发器与A
  • GD32F330搭建工程记录: cannot open source input file “RTE_Components.h“: No such file or director

    有网友提出了解决方案 GD32F103搭建工程记录 cannot open source input file RTE Components h No such file or director 但没有确认原因 因此对此解决方案不是很满意
  • push代码时git did not exit cleanly (exit code 1).

    先缓存代码 stash changes 接着将代码拉下来 最后在把缓存读回去
  • 全力冲unreal了

    顺利辞职 其实 自己没想象中的那么重要 哈哈 交接清楚了 自然就批准离职了 以前种种 已成过往云烟 如今 再次全职unreal 再次两万五 该雪耻了 两年前的今天 好像也是全职unreal 两万五 哈哈 自以为这次准备充足了 全力冲就是了
  • 抽象类,接口,以及两者的区别

    1抽象类 含有abstract修饰符的class即为抽象类 abstract 类不能创建的实例对象 含有abstract方法的类必须定义为abstract class abstract class类中的方法不必是抽象的 abstract c
  • Python Mako

    git clone https bitbucket org zzzeek mako git Mako是用python语言开发的开源模板引擎 功能很强大 使用起来也很方便 下面介绍一下安装步骤 下载 请到官方网站http www makote
  • vue项目国际化 vue-i18n以及踩坑解决 小姐姐手把手教你VUE国际化~

    1 安装配置 安装 npm install vue i18n 或者 import VueI18n from vue i18n Vue use VueI18n 通过插件的形式挂载 const i18n new VueI18n locale z
  • 5分钟搞懂池化的本质

    大家好啊 我是董董灿 在很多与计算机视觉相关的神经网络中 我们往往都会看到池化这一算法 它一般跟在卷积层后面 神经网络中用到最多的池化方式无外乎是最大池化和平均池化 两者运算接近 区别在于是在kernel范围内取最大值还是取平均值来作为池化
  • docker-compose安装jenkins

    一 下载安装docker compose 拉取docker compose curl L https get daocloud io docker compose releases download 1 22 0 docker compos
  • 使用javassist生成新类

    javassist javassist是一个开源的分析 编辑和创建Java字节码的类库 不需要了解虚拟机指令 就能动态生成类或者改变类的结构 ClassPool ClassPool是缓存CtClass对象的容器 所有的CtClass对象都在
  • C++标准库头文件(工具库->csignal)

    参考网址 https zh cppreference com w cpp header https www runoob com cplusplus cpp standard library html 工具库 csignal 信号管理的函数
  • 自定义速腾激光雷达点云XYZIRT格式并调用PCL库进行滤波

    目录 一 试验程序源代码 1 1需要包含的头文件 1 2定义点云结构 1 3主函数 1 4 CMake文件 二 学习pcl PCLPointCloud2 Ptr 2 1区别 2 2转换 2 3心得 Windows 10 Ubuntu 20