龙空技术网

3D点云处理 PCL稀疏处理

ai视觉实验室 83

前言:

目前姐妹们对“三维点云算法研究现状”可能比较注重,姐妹们都需要知道一些“三维点云算法研究现状”的相关文章。那么小编同时在网络上搜集了一些对于“三维点云算法研究现状””的相关知识,希望咱们能喜欢,各位老铁们快快来学习一下吧!

实验平台:ubuntu20.04

实验目的:使用pcl订阅雷达数据实现数据的稀疏处理

实验数据:ros 激光雷达数据

PCL的VoxelGrid滤波器下采样

本次用到的主要的类是CloudViewer,是一个简单的点云可视化工具。

原理:

使用体素化网格方法实现下采样,即保存点云的形状特征的同时实现减少点的数量 减少点云数据,在提高配准,曲面重建,形状识别等算法速度中非常实用,PCL是实现的VoxelGrid类通过输入的点云数据创建一个三维体素栅格,容纳后每个体素内用体素中所有点的重心来近似显示体素中其他点,这样该体素内所有点都用一个重心点最终表示,对于所有体素处理后得到的过滤后的点云,这种方法比用体素中心逼近的方法更慢,但是对于采样点对应曲面的表示更为准确。

代码:

1.ROS数据订阅

修改CmakeLists.txt 在PCL基础上加载ROS功能包

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)project(test)find_package(PCL 1.13 REQUIRED)find_package(catkin REQUIRED COMPONENTS ${PACKAGE_DEPENDENCIES})include_directories(${PCL_INCLUDE_DIRS} ${catkin_INCLUDE_DIRS})link_directories(${PCL_LIBRARY_DIRS})add_definitions(${PCL_DEFINITIONS})add_executable(test main.cpp)target_link_libraries(test ${PCL_LIBRARIES} ${catkin_LIBRARIES})

2.写一个类pcl_me 实现ROS 数据的订阅和数据的回调

#include <iostream>                         //标准输入输出头文件申明#include <ros/ros.h>#include <pcl/point_types.h>#include <pcl_conversions/pcl_conversions.h>#include <sensor_msgs/PointCloud2.h>#include <pcl/visualization/cloud_viewer.h> //类cloud_viewer头文件申明#include <pcl/filters/voxel_grid.h> #include <sensor_msgs/PointCloud2.h>class pcl_me{private:  ros::NodeHandle n;  ros::Subscriber subCloud;  ros::Publisher pubCloud;  sensor_msgs::PointCloud2 msg;  //接收到的点云消息  sensor_msgs::PointCloud2 adjust_msg;  //等待发送的点云消息  pcl::PointCloud<pcl::PointXYZRGB> adjust_pcl;   //建立了一个pcl的点云,作为中间过程public:  pcl_me():    n("~"){    subCloud = n.subscribe<sensor_msgs::PointCloud2>("/rslidar_points", 1, &pcl_me::getcloud, this); //接收点云数据,进入回调函数getcloud()    pubCloud = n.advertise<sensor_msgs::PointCloud2>("/adjustd_cloud", 1000);  //建立了一个发布器,主题是/adjusted_cloud,方便之后发布调整后的点云  }  //回调函数  void getcloud(const sensor_msgs::PointCloud2ConstPtr& laserCloudMsg){    pcl::PointCloud<pcl::PointXYZI>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZI>);   //放在这里是因为,每次都需要重新初始化    pcl::PointCloud<pcl::PointXYZI>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZI>);    pcl::fromROSMsg(*laserCloudMsg, *cloud);  //把msg消息转化为点云 /******************************************************************************  创建一个voxel叶大小为1cm的pcl::VoxelGrid滤波器,**********************************************************************************/    pcl::VoxelGrid<pcl::PointXYZI> sor;  //创建滤波对象    sor.setInputCloud (cloud);            //设置需要过滤的点云给滤波对象    sor.setLeafSize (10.0f, 10.0f, 10.0f);  //设置滤波时创建的体素体积为1cm的立方体    sor.filter (*cloud_filtered);           //执行滤波处理,存储输出    sensor_msgs::PointCloud2 pub_pc;    pcl::toROSMsg(*cloud_filtered, pub_pc);    pub_pc.header = laserCloudMsg->header;    pubCloud.publish(pub_pc);   }  ~pcl_me(){}};

主函数 初始化ROS节点 实例化类 开启ROS的循环 等待雷达数据实现回调函数的

int main(int argc, char** argv) {  ros::init(argc, argv, "colored");  //初始化了一个节点,名字为colored  pcl_me ps;  ros::spin();  return 0;  }

3.编译 运行

mkdir bui;dcd buildcmake ..make

运行test可执行程序

4.稀疏的点云数据已经输出:

总结:

主要使用点云稀疏是降采样方法或者滤波算法,VoxelGrid滤波器下采样.

主要步骤:

创建滤波对象

pcl::VoxelGrid<pcl::PCLPointCloud2> sor;

设置需要过滤的点云给滤波对象

sor.setInputCloud (cloud);

设置滤波时创建的体素体积为1cm的立方体

sor.setLeafSize (10.0f, 10.0f, 10.0f);

执行滤波处理,存储输出

sor.filter (*cloud_filtered);

标签: #三维点云算法研究现状