1 PCL创建点云
//定义点云类型
pcl::PointCloud<pcl::PointXYZ> cloud;
// 添加点云数据
cloud.width = 50000;
cloud.height = 2; //点集总共2*50000 = 10 0000个点
cloud.points.resize(cloud.width * cloud.height);
for (size_t i = 0; i < cloud.points.size (); ++i)
{
cloud.points[i].x = 512 * rand () / (RAND_MAX + 1.0f); //512 (-1,-1,-1 --- 1,1,1)? //1 (0,0,0---1,1,1) //int float
cloud.points[i].y = 512 * rand () / (RAND_MAX + 1.0f);
cloud.points[i].z = 512 * rand () / (RAND_MAX + 1.0f);
}
(1) 对于无组织或者说无结构的点云来说,height=1,width就是指点云中点的个数。
(2) 对于有结构的点云来说,width是指点云数据集一行上点的个数。有结构的点云可以理解成这个点云像image(或者说是一个矩阵)一样进行组织,数据被分为行和列,如立体相机或者TOF相机获得的点云数据就属于这一类。对于有结构点云的一大好处就是能知道点云中点的相邻关系,最近邻操作效率就非常高,可以大大提高PCL中相应算法的效率。
2编写节点发布点云
ros::Publisher pcl_pub = nh.advertise<sensor_msgs::PointCloud2> ("pcl_output", 1);
//定义发布的消息
sensor_msgs::PointCloud2 output;
//把点云转化为ros消息
pcl::toROSMsg(cloud, output);
output.header.frame_id = "point_cloud";
ros::Rate loop_rate(1);
while (ros::ok())
{
pcl_pub.publish(output);
ros::spinOnce();
loop_rate.sleep();
}
3显示点云
运行ros节点:
$rosrun pcl_ros_tutorial pcl_pub
启动rviz显示pcl_output话题:
转载请注明出处!