PCD文件的读取以及可视化
在开发激光雷达相应算法的时候,经常需要生成或者读取pcd点云文件,因此本文主要编写了一个简单的读取pcd点云文件的功能包,并且能够实现可视化。
【源代码】
#include <iostream>
#include <ros/package.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/cloud_viewer.h>
#include <cstring>
using namespace std;
int main(int argc,char** argv)
{
/* ROS中读取pcd点云文件并在rviz显示 */
ros::init (argc, argv, "show_PCD");
ros::NodeHandle nh;
ros::Publisher pcl_pub = nh.advertise<sensor_msgs::PointCloud2> ("pcl_output", 1);
pcl::PointCloud<pcl::PointXYZ> rviz_cloud;
sensor_msgs::PointCloud2 rviz_output;
pcl::io::loadPCDFile<pcl::PointXYZ>(ros::package::getPath("reading_pcd") + "/pcd/pointcloud.pcd", rviz_cloud);
pcl::toROSMsg(rviz_cloud, rviz_output);
rviz_output.header.frame_id = "rslidar";
ros::Rate loop_rate(1);
while (ros::ok())
{
pcl_pub.publish(rviz_output);
ros::spinOnce();
loop_rate.sleep();
}
/****************************************************************************************************************/
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
if(pcl::io::loadPCDFile<pcl::PointXYZ>(ros::package::getPath("reading_pcd") + "/pcd/pointcloud.pcd", *cloud)==-1) // 打开点云文件
{
PCL_ERROR("Couldn't read file test_pcd.pcd\n");
return(-1);
}
std::cout<<"Loaded "<<cloud->width*cloud->height<<" data points from test_pcd.pcd with the following fields: "<<std::endl;
#if 0
for(size_t i=0; i<cloud->points.size(); ++i)
{
std::cout<<" "<<cloud->points[i].x<<" "<<cloud->points[i].y<<" "<<cloud->points[i].z<<std::endl;
}
#endif
pcl::visualization::CloudViewer viewer("viewer");
viewer.showCloud(cloud);
while (!viewer.wasStopped()) {}
system("pause");
return(0);
}
在使用上述代码的过程中需要注意,我在功能包文件夹下面创建了一个pcd文件夹用于存储pcd点云文件(如下图所示),并利用ros::package::getPath()
来获取绝对路径。读者在使用的过程中需要对文件的路径做相应的修改,其中ros::package::getPath()
的用法可以参考博主另一篇文章。
【CMakeLists.txt】
cmake_minimum_required(VERSION 3.0.2)
project(reading_pcd)
add_compile_options(-std=c++11)
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
roslib
)
find_package(PCL 1.8 REQUIRED)
include_directories(
# include
${catkin_INCLUDE_DIRS}
)
include_directories(${PCL_INCLUDE_DIRS})
add_definitions(${PCL_DEFINITIONS})
add_executable(pcd_read src/pcd_read.cpp)
target_link_libraries(pcd_read ${PCL_LIBRARIES} ${catkin_LIBRARIES})
结果如下所示: