1、上代码(关键部分):
#include <ros/ros.h>
#include <pcl/point_cloud.h>
#include <pcl_conversions/pcl_conversions.h>
#include <sensor_msgs/PointCloud2.h>
#include <pcl/io/ply_io.h>
#include "parameters.h"
using namespace std;
using namespace cv;
// ros::Publisher pub_ply_map;
int main (int argc, char **argv)
{
ros::init (argc, argv, "pcl_example");
ros::NodeHandle nh("~");
readParameters(nh);
ros::Publisher pub_ply_map;
pcl::PointCloud<pcl::PointXYZRGBA> cloud;
//pcl::PointCloud<pcl::PointXYZ> cloud;
// std::cout << "address :" << addressfile << std::endl;
ROS_INFO_STREAM ("address " << addressfile);
if (pcl::io::loadPLYFile<pcl::PointXYZRGBA>(addressfile, cloud) == -1)
{
PCL_ERROR("Couldn't read file1 \n");
return (-1);
}
sensor_msgs::PointCloud2 output;
//Convert the cloud to ROS message
pcl::toROSMsg(cloud, output);
output.header.frame_id = "odom";
pub_ply_map = nh.advertise<sensor_msgs::PointCloud2> ("pcl_output", 1);
//循环每秒发送一次
ros::Rate loop_rate(1);
while (ros::ok())
{
// ROS_INFO_STREAM ("address " << addressfile);
pub_ply_map.publish(output);
ros::spinOnce();
loop_rate.sleep();
}
return 0;
}
以上代码将addressfile修改为待加载的PLY文件的地址即可使用,或者写个参数读取的cpp,读入addressfile。
CMakeLists.txt:
cmake_minimum_required(VERSION 2.8.3)
project(load_ply)
#SET(CMAKE_CXX_COMPILER "g++")
SET( CMAKE_BUILD_TYPE Release )
SET( CMAKE_CXX_FLAGS "-std=c++11 -O3")
#set(cv_bridge_DIR /usr/local/cv_bridge341/share/cv_bridge/cmake)
find_package(PCL 1.8 REQUIRED)
find_package(catkin REQUIRED COMPONENTS
pcl_conversions
pcl_ros
roscpp
std_msgs
tf
cv_bridge
message_filters
)
catkin_package()
include_directories(include
${PCL_INCLUDE_DIRS}
${catkin_INCLUDE_DIRS}
)
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
add_executable(example Load_ply.cpp
parameters.cpp)
target_link_libraries(example ${PCL_INCLUDE_DIRS}
${catkin_LIBRARIES}
)
2、rviz配置及运行效果如下图:(使用以上code,按照下图修改即可)