PCL基本数据类型—PointCloud

PointCloud

在PCL中最基本的数据类型就是PointCloud了。它是一个C++类,包含了如下的数据成员(括号中是这个数据的数据类型): 
一、width(int) 
指定了点云数据中的宽度。width有两层含义: 
1) 可以指定点云的数量,但是只是对于无序点云而言。 
2) 指定有序点云中,一行点云的数量。

有序点云(organized point cloud ):有序点云中的点排列情况类似图片(或矩阵),是按照行和列的结构排列的。这样的点云数据通常来自立体相机或TOF相机。有序点云的优势在于,通过知道两个相邻点的关系,最近邻点操作会变得更加有效,因此可以加速计算,并且降低PCL中一些算法的开销。

投影点云(projectable point cloud):投影点云首先属于有序点云,并且投影点云中点的下标表示–(u,v)类似图片中像素的坐标,与这个点的3D坐标(x,y,z)有一定的关系。这个关系可以由针孔相机模型导出: 

u=fx/z 和 v=fy/z。

二、height(int) 

指定了点云数据中的高度。height有两层含义: 

1)指定有序点云中,点云行的数量。

2)对于无序点云,将height设为1(它的width即为点云的大小),以此来区分点云是否有序。

// 有序点云--类似图片中像素的组织结构,拥有640行,480列,总共有640*480 = 307200个点
cloud.width = 640; 
cloud.height = 480;
// 无序点云--高度为1,宽度与点云大小相同为307200
cloud.width = 307200;
cloud.height = 1;

三、points(std::vector) 

points是存储类型为PointT的点的向量。举例来说,对于一个包含XYZ数据的点云,points成员就是由pcl::PointXYZ类型的点构成的向量:

pcl::PointCloud<pcl::PointXYZ> cloud;
std::vector<pcl::PointXYZ> data = cloud.points;

四、is_dense(bool) 

指定点云中的所有数据都是有限的(true),还是其中的一些点不是有限的,它们的XYZ值可能包含inf/NaN 这样的值(false)。

五、sensor_origin_(Eigen::Vector4f) 
指定传感器的采集位姿(==origin/translation==)这个成员通常是可选的,并且在PCL的主流算法中用不到。

六、sensor_orientaion_(Eigen::Quaternionf) 

指定传感器的采集位姿(方向)。这个成员通常是可选的,并且在PCL的主流算法中用不到。 
为了简化开发,PointCloud类包含许多帮助成员函数。举个例子,如果你想判断一个点云是否有序,不用检查height是否等于1,而可以使用isOrganized()函数来判断:

if (!cloud.isOrganized ())

      ...

 

PointT代表了点云中的单元-点的类型。

对不起,我之前的回答有误。在PCL中,`PointCloud`是一个模板类,你需要为其指定点云的类型。以下是一个修正后的示例代码: ```cpp #include <ros/ros.h> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl_conversions/pcl_conversions.h> #include <sensor_msgs/PointCloud2.h> void pointCloudCallback(const sensor_msgs::PointCloud2::ConstPtr& cloud_msg) { pcl::PointCloud<pcl::PointXYZ> pcl_cloud; pcl::fromROSMsg(*cloud_msg, pcl_cloud); pcl::io::savePLYFile("point_cloud.ply", pcl_cloud); } int main(int argc, char** argv) { ros::init(argc, argv, "pcl_example"); ros::NodeHandle nh; ros::Subscriber sub = nh.subscribe("/your_point_cloud_topic", 1, pointCloudCallback); ros::spin(); return 0; } ``` 在这个修正后的例子中,我们使用了`pcl::PointCloud<pcl::PointXYZ>`作为点云数据类型。你可以根据实际情况选择适合的点云类型,比如`pcl::PointXYZRGB`等。 请确保你的ROS环境中已经安装了PCL库,并在CMakeLists.txt文件中添加了相应的依赖。 对于python版本,你可以使用以下代码: ```python import rospy from sensor_msgs.msg import PointCloud2 import pcl from pcl import pcl_visualization def point_cloud_callback(cloud_msg): pcl_cloud = pcl.PointCloud() pcl_cloud.from_message(cloud_msg) pcl.save(pcl_cloud, "point_cloud.ply") def main(): rospy.init_node("pcl_example") rospy.Subscriber("/your_point_cloud_topic", PointCloud2, point_cloud_callback) rospy.spin() if __name__ == "__main__": main() ``` 这样修正后的代码应该可以正常工作。对于C++版本和Python版本都提供了修正后的代码,希望对你有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值