PCL v1.3 Release Notes

Release Date: 2011-10-31 // over 12 years ago
  • ๐Ÿ‘ From 1.3 we are constructing the Changelist for each library separately, as they can in theory be mixed and matched with older versions (though we officially do not support this yet). The most notable overall changes are:

    • โœ‚ removed wxWidgets as a dependency from PCL and implemented the Image visualization classes using VTK
    • โœ‚ removed cminpack as a dependency from PCL and implemented the LM optimization functionality using Eigen
    • added a new library called PCL Search (libpcl_search) that has a more uniform API for nearest neighbor searches and stripped the unneeded functionality from libpcl_kdtree and libpcl_octree. Search now wraps KdTree and Octree for NN calls. This is a MINOR API BREAKING CHANGE. To change your code switch from: pcl::KdTree -> pcl::Search (if the purpose is to use one of its children for search) pcl::KdTreeFLANN -> pcl::search::KdTree pcl::OrganizedDataIndex -> pcl::search::OrganizedNeighbor
    • ๐Ÿ‘Œ improved MacOS support
    • ๐Ÿ‘Œ improved documentation and unit tests
    • โž• added lots of application examples and demos. Note: not all have a complete functionality... we will try to clean this up in 1.4 and future releases.

    ๐Ÿ‘ท Build system changes

    • define PCL_ROOT environment variable using the NSIS installer
    • โœ… removing test+python from the dependency graph
    • ๐Ÿ›  fixed bug #374
    • โœ‚ remove cminpack from PCLConfig.cmake cmake and 3rdparty (switched to Eigen's Levenberg-Marquardt implementation)
    • ๐Ÿ“ฆ update NSIS.template.in : use CPACK_PACKAGE_INSTALL_REGISTRY_KEY as the registry key
    • โž• added the capability to build an all-in-one installer
    • ๐Ÿ›  fixed the build system to work 100% on Android and MacOS

    libpcl_common

    • โž• add overriding for operator[] to shorten code
    • โž• add a setIndices method that computes indices of points in a region of interest
    • โž• add demeanPointCloud with indices as PointIndices as well
    • โž• added eigen allocator to correspondence vectors (pcl::Correspondences) and adapted all registration modules => be sure to use pcl::Correspondences instead of std::vector<pcl::Correspondence>
    • ๐Ÿ›  fixed a few doxygen errors
    • โž• added simple stop watch for non-scoped function time measurements and made ScodeTime derived from StopWatch
    • ๐Ÿ›  fixed a bug in getRejectedQueryIndices, wrong output when order of correspondences have been changed
    • ๐Ÿšš moved getRejectedQueryIndices to pcl/common/correspondence.h
    • โž• added more doxygen documentation to the registration components
    • ๐Ÿ—„ marked all getRemainingCorrespondences-functions as DEPRECATED, we should replace them with purely stateless version outside the class body
    • ๐Ÿ›  fixed a const missing in PolynomialCalculationsT (#388 - thanks Julian!)
    • โž• add PCL_DEPRECATED macro, closes #354.
    • โž• added PointXYZHSV type and the conversions for it
    • โž• added check for endianness for the Android platform

    libpcl_search

    • ๐Ÿšš BIG changes introduced - migration from KdTree to pcl::Search: moved OrganizedDataIndex and OrganizedNeighbor classes to libpcl_search
    • โž• added new templated methods for nearestKSearch and radiusSearch for situations when PointT is different than the one the KdTree object was created with (e.g., KdTree vs nearestKSearch (PointT2 &p...)
    • โž• added two new methods for getApproximateIndices where given a reference cloud of point type T1 we're trying to find the corresponding indices in a different cloud of point type T2
    • ๐Ÿ”จ refactorized a lot of code in search and octree to make it look more consistent with the rest of the API
    • fixed a bug in octree_search which was semantically doing something bad: for each radiusSearch/nearestKSearch/approxNearestSearch call with a PointCloudConstPtr, the octree was getting recreated. Changed the API to be consistent with the rest of PCL (including pcl_search and pcl_kdtree) where we pass in a PointCloud instead of a PointCloudConstPtr which simply calls searchMethod (cloud.points[i], ...)
    • minor code optimizations
    • renamed organized_neighbor.h header in pcl_search (unreleased, therefore API changes OK!) to organized.h
    • disabled the auto-search tuning as it wasn't really working. must clean this up further
    • โœ‚ remove all approxNearestSearch methods from the base pcl::Search class as they did not belong there

    libpcl_io

    • ๐Ÿ‘‰ use stringstream instead of atof because of locale issues in IO (note that we can't use the ifstream directly because we have to check for the nan value)
    • โž• added locale independent PCD ASCII i/o
    • ๐ŸŽ implemented setMapSynchronization for pcl::PCDWriter. When set, msync() will be called before munmap() in the pcl::PCDWriter::write* calls, which guarantees data reliability. Though I/O performance is 300% better when unset, data corruption might occur on NFS systems, as indicated by http://www.pcl-developers.org/PCD-IO-consistency-on-NFS-msync-needed-td4885942.html.
    • โž• added new writeBinaryCompressed functionality for general purpose sensor_msgs::PointCloud2 data (which is still our generic data container in PCL 1.x)
    • โž• added additional unit tests for binary_compressed
    • ๐Ÿ›  fixed a grave bug in PCDReader (most likely introduced a few releases ago due to code refactorization) where the data was incorrectly copied if a PCD ASCII file had a field with multiple count elements (field.count) as first. Binary files are not affected by this bug. Added an unit test to catch this in the future.
    • added functionality for openni_grab_frame (added optional command line options, optional output filename, chose output format)
    • ๐Ÿ”„ changed to new location of samplesconfig.xml for OpenNI
    • โž• added signal and slot blocking into grabber. Using blocking to skip first frame in openni_grabber, since it is corrupted
    • โž• added PLY format file support in binary and ascii mode (requires boost::iostreams library)

    libpcl_keypoints

    • โž• added 3D versions of Harris/Noble/Lowe/Tomasi and Curvature-based keypoint detection... scale space still missing
    • ๐Ÿ‘€ work on making SIFTKeypoint more flexible by saving scale only when the output point type contains "scale" (the catch is that all point types must be correctly declared via our macros - see the modifications in test_keypoints.cpp). This allows us to use a SIFTKeypoint<PointXYZRGB, PointXYZRGB> and thus removes the constraint on using copyPointCloud afterwards.
    • ๐Ÿ›  fixed an issue in SIFTKeypoint where width/height were not correctly set

    libpcl_features

    • โœ… specialize std::vector for Eigen::Matrix4f (alignment issue with msvc 32bit) in SHOTEstimation
    • โž• added a faster (eigen-based) integral image calculation => sped up normal estimation to 15Hz
    • โž• added Unique Shape Context (USC) feature descriptor
    • โž• added Shape Context 3D feature descriptor
    • ๐Ÿ›  fixed a bug in the normalization factor of VFH for the distance component (only affecting if set distance component is true)
    • ๐Ÿ›  fixed a few bugs regarding Windows build introduced in earlier commits
    • BIG changes introduced - migration from KdTree to pcl::Search
    • merged libpcl_range_image_border_extractor into libpcl_features. There's absolutely no reason why we should have 2 libraries generated from the features module.

    libpcl_filters

    • โž• added FilterIndices functionality #315
    • โž• added a RandomSample filter which makes use of indices #323
    • โž• added a new (very fast) class for data decimation: ApproximateVoxelGrid
    • ๐Ÿ›  fix for #369 (StatisticalOutlierRemoval crash when input dataset is empty)
    • implemented feature request #346

    libpcl_octree

    • โž• added function genVoxelBounds to octree pointcloud class
    • โž• added octree neighbor search class
    • โž• added octree-ray-tracing patch to octree_search class
    • buxfix in octree ray traversal function getIntersectedVoxelCentersRecursive
    • โž• added unit test for getIntersectedVoxelCentersRecursive
    • โž• added method getIntersectedVoxelIndices for getting indices of intersected voxels and updated unit test
    • ๐Ÿ”จ refactorized a lot of code in search and octree to make it look more consistent with the rest of the API
    • fixed a bug in octree_search which was semantically doing something bad: for each radiusSearch/nearestKSearch/approxNearestSearch call with a PointCloudConstPtr, the octree was getting recreated. Changed the API to be consistent with the rest of PCL (including pcl_search and pcl_kdtree) where we pass in a PointCloud instead of a PointCloudConstPtr which simply calls searchMethod (cloud.points[i], ...)
    • minor code optimizations
    • renamed organized_neighbor.h header in pcl_search (unreleased, therefore API changes OK!) to organized.h
    • disabled the auto-search tuning as it wasn't really working. must clean this up further
    • โœ‚ remove all approxNearestSearch methods from the base pcl::Search class as they did not belong there

    libpcl_registration

    • ๐Ÿ›  fixed a minor bug in CorrespondenceRejectorSampleConsensus: getRemainingCorrespondences tried to nput_ although it should only use the given input correspondences
    • โž• added missing implementation for TransformationEstimationLM on correspondence vectors
    • โž• added eigen allocator to correspondence vectors (pcl::Correspondences) and adapted all registration modules --> be sure to use pcl::Correspondences instead of std::vector<pcl::Correspondence>
    • ๐Ÿ›  fixing the API: a few left inconsistencies between vector<Correspondence> and Correspondences. The latter is to be preferred as it contains the Eigen aligned allocator.
    • โž• added new ELCH loop correction API (New pcl::registration::ELCH class (WIP), add Registration::Ptr typedef)
    • โž• added unit tests for the (new) registration API and all registration components
    • ๐Ÿ“š Further cleaning up registration code and writing documentation.
      • fixed bug in getRejectedQueryIndices, wrong output when order of correspondences have been changed
      • moved getRejectedQueryIndices to pcl/common/correspondence.h
      • added more doxygen documentation to the registration components
      • marked all "getRemainingCorrespondences"-functions as DEPRECATED, we should replace them with purely stateless version outside the class body
    • โšก๏ธ Update: remove ciminpack dependency and rely on eigen for LM
    • ๐Ÿ›  Fixed a bug in ICP-NL by modifying WarpPointRigid to preserve the value of the 4th coordinate when warping; Re-enabled missing unit tests for ICP and ICP-NL
    • โž• Added point-to-plane ICP
    • added nr_iterations_ and max_iterations_ to the initializer list (were missing)
    • ๐Ÿ›  Fixed bugs in WarpPointRigid3D and TransformationEstimationLM
    • ๐Ÿ›  fixed a problem where if no correspondences would be found via nearestKSearch, the RANSAC-based rejection scheme would fail (thanks to James for reporting this)
    • ๐Ÿ”„ changed the default LM implementation to use L2 instead of L2SQR
    • โž• Added a new TransformationEstimationPointToPlaneLLS class that uses a Linear Least-Squares approximation to minimize the point-to-plane distance between two point clouds
    • โž• Added the ability to specify the error function to be minimized in SAC-IA (see Feature #362)

    libpcl_sample_consensus

    • reimplemented the Levenberg Marquardt code that was using cminpack with Eigen, thus dropping the cminpack dependency for PCL

    libpcl_surface

    libpcl_segmentation

    • โž• added a labeled cluster euclidean segmentation method

    libpcl_visualization

    • ๐Ÿ›  fixed an issue where saveScreenshot was not correctly initialized with the proper renderer, thus not saving the data
    • ๐Ÿ‘Œ supporting fontsize in addText (per feature #365)
    • ๐Ÿ›  fixing the interactor style by ignoring all combinations in OnChar that we cover in OnKeyDown
    • โž• added removeAllShapes and removeAllPointClouds per #353
    • ๐Ÿšš renamed deleteText3D to removeText3D to consolidate the API
    • ๐Ÿ›  fixing the API: a few left inconsistencies between vector<Correspondence> and Correspondences. The latter is to be preferred as it contains the Eigen aligned allocator.
    • โž• added patch from Lucas Walter to fix pcl::visualization::PCLVisualizer::removeAllPointClouds and removeAllShapes
    • ๐Ÿ›  fixed a few doxygen errors
    • ๐Ÿšš cleaned up the PCLHistogramVisualizer API by moving to a vtk interactor instead of ours, and removed unnecessary calls such as saveScreenShot (never used with the histogram visualizer, and most likely buggy), wasStopped and resetStoppedFlag (never used).
    • โœ‚ removed PCLVisualizerInteractor and switched back to a better default vktWindowRenderInteractor for VTK >= 5.6. Adjusted and fixed the internal API. No public API changes were made (except the removal of the PCLVisualizerInteractor class which was never meant to be used externally anyway).
    • cleaned up and implemented the ImageViewer class properly and demonstrated it in a single thread via openni_viewer. The other tool (openni_viewer_simple) will not work due to CloudViewer starting its own thread and thus clashing on the same OpenGL context.
    • ๐Ÿ›  fixed the correct order in initializer list for ImageViewer
    • โœ‚ removed wxWidgets completely from the codebase
    • โž• added implementation for markPoint to ImageViewer to mimic older wxWidgets-based code
    • ๐Ÿ›  fixed an issue in PCLVisualizerInteractorStyle where mouse events were not properly mapped in Qt (#389 - thanks Adam!)
    • โž• added an extra field of view to the camera paramers (#392 - thanks Adam!)
    • ๐Ÿ›  small bugfix when the radius_sphere was different than 1 for renderViewTesselatedSphere