前言:
目前姐妹们对“三维点云算法研究现状”可能比较注重,姐妹们都需要知道一些“三维点云算法研究现状”的相关文章。那么小编同时在网络上搜集了一些对于“三维点云算法研究现状””的相关知识,希望咱们能喜欢,各位老铁们快快来学习一下吧!实验平台: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);
标签: #三维点云算法研究现状