PCL Notes 1

来源:互联网 发布:和前任做朋友 知乎 编辑:程序博客网 时间:2024/06/06 03:58

Just start to learn PCL in C++. Previously I was justing using the PCL python bindings to do a little bit of calculations. However, encountered with the ray tracing problem, I did’t think Python PCL has it implemented.

Basic Structures

A point cloud is a C++ class which contains the following data fields:

  • width
  • height(set to 1 for unorganized datasets)
    However, there is a helper function: isOrganized to check whether the point cloud is organized rather than checking heigh equals to 1 or not.
  • points(std::vector < PointT >)
  • is_dense: specifies if all the data in points is finite(true) or whether the XYZ values of certain points might contain Inf/NaN values(false)
  • sensor_origin: specifies the sensor acquisition pose(origin/translation). This member is usually optional.
  • sensor_orientation:specifies the sensor acquisition pose(orientation). This member is usually optional.

Compiling the codes:

cmake_minimum_required(VERSION 2.6 FATAL_ERROR)project(MY_GRAND_PROJECT)find_package(PCL 1.3 REQUIRED COMPONENTS common io)include_directories(${PCL_INCLUDE_DIRS})link_directories(${PCL_LIBRARY_DIRS})add_definitions(${PCL_DEFINITIONS})add_executable(pcd_write_test pcd_write.cpp)target_link_libraries(pcd_write_test ${PCL_COMMON_LIBRARIES} ${PCL_IO_LIBRARIES})

cmake_minimum_required is mandatory for cmake
project(MY_GRAND_PROJECT) names your project and sets some useful make variables such as those to refer to the source directory(MY_GRAND_PROJECT_SOURCE_DIR) and the directory from which you are invoking cmake (MY_GRAND_PROJECT_BINARY_DIR).
`find_package(PCL 1.3 REQUIRED COMPONENTS common io): We are requesting to find the PCL package at minimum vision 1.3. We also say that it is REQUIRED meaning that cmake will fail gracefully if it can’t be found. As PCL is modular one can request:

  • only one component find_package(PCL 1.3 REQUIRED COMPONENTS io)
  • several: find_package(PCL 1.3 REQUIRED COMPONENTS io common)
  • all existing: find_package(PCL 1.3 REQUIRED)

include_directories, link_directories, add_definitions: When PCL is found, several related variables are set:

  • PCL_FOUND: set to 1 if PCL is found, otherwise unset
  • PCL_INCLUDE_DIRS: set to the paths to PCL installed headers and the dependency headers
  • PCL_LIBRARIES: set to the file names of the built and installed PCL libraries
  • PCL_LIBRARY_DIRS: set to the paths to where PCL libraries and 3rd party dependencies reside
  • PCL_VERSION: the version of the found PCL
  • PCL_COMPONENTS: lists all available components
  • PCL_DEFINITIONS: lists the needed preprocess definition and compiler flags
    To let cmake know about external headers you include in your project, one needs to use include_directories() macro. In our case PCL_INCLUDE_DIRS, contains exactly what we need, thus we ask cmake to search the path it contains for a header potentially included.

add_executable: Here, we tell cmake that we are trying to make an executable file named pcd_write\ _test from one single source file pcd_write.cpp. CMake will take care of the suffix and the permissions.
target_link_libraries() : The executable we are building makes call to PCL functions. So far, we have only included the PCL headers so the compilers knows about the methods we are calling. We need also to make the linker know about the libraries we are linking against. As said before, PCL found libraries referred to using PCL_LIBRARIES variables, all that remains is to trigger the link operation which we do calling target_link_libraries() macro.

#include <iostream>#include <pcl/io/pcd_io.h> #include <pcl/point_types.h>int main (int argc, char** argv){  pcl::PointCloud<pcl::PointXYZ> cloud;  // Fill in the cloud data  cloud.width    = 5;  cloud.height   = 1;  cloud.is_dense = false;  cloud.points.resize (cloud.width * cloud.height);  for (size_t i = 0; i < cloud.points.size (); ++i)  {    cloud.points[i].x = 1024 * rand () / (RAND_MAX + 1.0f);    cloud.points[i].y = 1024 * rand () / (RAND_MAX + 1.0f);    cloud.points[i].z = 1024 * rand () / (RAND_MAX + 1.0f);  }  pcl::io::savePCDFileASCII ("test_pcd.pcd", cloud);  std::cerr << "Saved " << cloud.points.size () << " data points to test_pcd.pcd." << std::endl;  for (size_t i = 0; i < cloud.points.size (); ++i)    std::cerr << "    " << cloud.points[i].x << " " << cloud.points[i].y << " " << cloud.points[i].z << std::endl;  return (0);}

We wrote the above codes in pcd_write.cpp.

0 0