@[TOC]PCL中K-Dtree模块的学习
学习背景
参考书籍:《点云库PCL从入门到精通》以及官方代码PCL官方代码链接
学习内容
PCL库中的智能指针和回调函数
智能指针
pcl::PointCloud<pcl::PointXYZRGBA>::Ptr CloudOut(new pcl::PointCloud<pcl::PointXYZRGBA>());//存储输出点云
这一行代码中pcl::PointCloud<pcl::PointXYZRGBA>::Ptr
是 PCL库中的一种智能指针类型,专门用于管理点云对象的内存。这种智能指针基于 boost 的 shared_ptr 实现,用于自动管理 pcl::PointCloud<pcl::PointXYZRGBA>
类型对象的生命周期。
具体到这句代码中
pcl::PointCloud<pcl::PointXYZRGBA>::Ptr
表示定义一个指向pcl::PointCloud<pcl::PointXYZRGBA>
类型的智能指针CloudOut
是这个智能指针的变量名。
new pcl::PointCloud<pcl::PointXYZRGBA>()
在堆上创建了一个新的 pcl::PointCloud<pcl::PointXYZRGBA>
类型的对象,并返回了一个指向这个新创建对象的原始指针。当指针超出其作用范围时,内存会被释放。
回调函数
- 一个普通函数A的输入变量改为了函数B的名字,此时函数B就叫做回调(diao)函数。举个例子,有一个WIN10闹钟的程序要求在六点播放音乐,消耗资源最大的做法就是一直循环获得系统时间当到六点播放音乐。另外一种就是调用系统提供的定时函数,当定时达到七点再调用播放音乐的函数,在为WIN10中调用一个定时函数比一直循环消耗的资源要少一些。
- 回到这一章
boost::function<void(const pcl::PointCloud<pcl::PointXYZRGBA>::ConstPtr&)> f = boost::bind(&SimpleOpenNIViewer::cloud_cd_,this,_1);
这里,boost::function
是一个泛型函数封装器,可以存储、调用任何类型的可调用实体(比如函数、lambda 表达式、绑定表达式、或其他函数对象)。void 表示这个函数不返回任何值。函数参数是一个指向常量 pcl::PointCloud<pcl::PointXYZRGBA>
对象的智能指针(ConstPtr),表示这个函数将被调用时需要提供一个点云对象的常量引用。
boost::bind 允许创建一个绑定表达式,它可以存储一个成员函数的调用,其中 &SimpleOpenNIViewer::cloud_cb_
是成员函数的地址,this 关键字表示当前对象的指针(即成员函数所属的对象),_1 是一个占位符,表示这个绑定表达式的第一个参数将在函数调用时被提供。
boost::signals2::connection c = interface->registerCallback(f);
这行代码调用了点云接口对象 interface 的 registerCallback
方法,传入之前定义的 f 作为参数。这个方法的作用是将 f 注册为一个回调函数,以便在新的点云数据到达时自动调用 f(即 cloud_cb_ 函数)。registerCallback
方法返回一个 boost::signals2::connection
对象,这个对象可以用于管理回调的连接状态(比如断开连接)。