PCL v1.5.0 Release Notes

Release Date: 2012-02-22 // about 12 years ago
  • The most notable overall changes are:

    • 🆕 new framework for PCL examples in the example/ folder
    • ➕ added the ICCV 2011 tutorial code to the list of bundled applications
    • a brand new PCL tracking library (libpcl_tracking)
    • 🆕 new, well-tested implementations for OrganizedNeighbor and BruteForceSearch in libpcl_search
    • considerable speedups for: eigendecomposition, covariance matrix estimation, and normal estimation (now running at 30Hz on VGA data)
    • 🔨 a lot of bug fixes and code refactorizations and optimizations (thanks to everyone that contributed!)
    • 0️⃣ compilation now defaults to Eigen column major again, but all the code in PCL should compile and work against both row major and column major matrices.
    • libpcl_range_image is now incorporated into pcl_common, no extra linking required.

    libpcl_common

    • ➕ added two new methods to compute centroid and covariance at once. Both are faster than calculating first the centroid and afterwards the covariance matrix. The float versions of the new methods are twice as fast but less accurate, whereas the double versions are more accurate and about 35% faster.
    • 🛠 fixed a few issues in our ScopeTime class where the creation of the string as well as the cerr were contributing negatively to the time measurements
    • ➕ added empty() to PointCloud<Eigen::MatrixXf> to return whether the matrix is empty or not
    • ➕ added size to PointCloud<Eigen::MatrixXf> and fixed the constructor warnings exposed by -pedantic
    • ➕ added two new Point Types: Axis and ReferenceFrame as they are used in the Reference Frame calculations
    • ➕ added a helper functor (CopyIfFieldExists) for copying out specific data out of a PointT field. See test_common.cpp for usage examples
    • ✅ implemented and tested a fix for feature request #558: Implement IO for PointCloud

    libpcl_filters

    • 🔨 refactored RandomSample to return sorted indices. In addition it now runs nearly twice as fast at it did previously.
    • 🛠 fixed and implemented feature #518: VoxelGrid<> performance improvement (roughly 50+ times)

    libpcl_kdtree

    • ✂ removed unneeded mutices, added asserts instead of constant checks (the user is responsible for passing in valid data!) and sped up a few other things in KDTreeFLANN

    libpcl_search

    • adapted use of flann::Matrix to new semantics of the 'stride' parameter, fixing incorrect results and a crash in FlannSearch
    • 🔋 changes that affect pcl_features, pcl_search, pcl_octree, pcl_registration, pcl_surface:

      • we used to have 3 "overloads" for nearestKSearch and 3 for radiusSearch that every class inheriting from pclk::KdTree or pcl::search::Search needed to implement. Because most of the children always had the same implementation (copy&paste) we moved it up in the base class, made the methods virtual, and only children that need to change that behavior will overwrite it.
      • the max_nn parameter from radiusSearch has been changed from int with a default value of -1 to an unsigned int with a default value of 0. Each radiusSearch implementation should check for 0 or >= max_points_in_cloud and branch accordingly (if needed).
      • const correctness is now implemented everywhere in all nearestKSearch and radiusSearch operations
    • ➕ added an implementation of KdTreeFLANN for PointCloud<Eigen::MatrixXf> data structures

    • FlannSearch: don't include flann/matrix.h, move all FLANN includes to impl/flann_search.hpp. Also adapt max_nn parameter in radius search to change r3962 (pass 0 to search for all neighbors instead of -1)

    • completely new and shiny BruteForceSearch and OrganizedNeighbor classes

    libpcl_octree

    • 🛠 fixed issue #513 (bug in octree iterator)
    • 🛠 fixed octree bounding box adaption
    • 🛠 fixed range test in getPointByIndex method (octree)
    • 🛠 fixed bug #604 & removed compiler warnings in Visual Studio 10
    • 🛠 fixed numerical problem in octree pointcloud class when points lie very close to the bounding box bounds
    • 👌 improved performance with std::deque in OctreeBreadthFirstIterator class
    • ➕ added breadth-first octree iterator and depth-first octree iterator classes, restructured octree iterator classes, moved "getVoxelBounds" method from OctreeIterator class to OctreePointCloud class

    libpcl_sample_consensus

    • ➕ added explicit checks + errors for NaN covariance matrices
    • 🛠 fixed a crash on 32bit platforms (thanks bharath)
    • fix for #498: Bug in setOptimizeCoefficients for pcl::SACMODEL_SPHERE. The issue actually exposed a grave bug introduced with r2755, when we switched from CMinPack to Eigen. The fix touches all segmentation models in pcl_sample_consensus using Levenberg-Marquardt, and TransformationEstimationLM in libpcl_registration. Also added unit test to catch this in the future.

    libpcl_io

    • 🛠 fix row-major/column-major issues in I/O (#578 related)
    • 🛠 fixed #593 by removing unimplemented method declarations
    • ➕ added a saveVTKFile method helper for saving sensor_msgs::PointCloud2 data
    • ➕ added support for reading PCD ascii and binary files (binary_compressed not implemented yet!) for pcl::PointCloud<Eigen::MatrixXf> datatypes.
    • ✅ implemented and tested a fix for feature request #558: Implement IO for PointCloud
    • ➕ added PointXYZRGBA callbacks for OpenNIGrabber and PCLVisualizer
    • 🛠 fixed issue #565
    • 🛠 fixed a few bugs in PCDReader regarding uint8/int8 data values and added a comprehensive unit test for all possible combinations of data types that we support in PCL
    • ➕ added isValueFinite for checking whether a value T is finite or not, and rewrote the PCDReader bits of code that perform the is_dense checks
    • ↔ integrated libply written by Ares Lagae as an independent component in io
    • 🚚 rely on ply library for PLY parsing, remove the old parser and use the freshly integrated libply, change the namespace ::ply to ::pcl::io::ply to avoid any potential issue

    libpcl_surface

    • ⚡️ Updated convex hull. It should now be somewhat faster, and allows users to optionally specify if the input is 2D or 3D, so the input dimension need not be calculated every time.
    • 🛠 fix for #562: pcl::ConcaveHull crashes on an empty cloud (thanks Mourad!)
    • ➕ added option to ensure that triangle vertices are ordered in the positive direction around the normals in GreedyProjectionTriangulation
    • 🛠 fixed issue #489 in GreedyProjectionTriangulation
    • 🛠 fixed triangle vertex ordering issues in OrganizedFastMesh
    • MarchingCubes now adheres to the new pcl_surface base class architecture
    • ➕ added PCLSurfaceBase base class for MeshConstruction and SurfaceReconstruction, to unify the API around setSearchMethod(&Search) and reconstruct(&PolygonMesh)
    • added marching_cubes_reconstruction tool

    libpcl_features

    • 🛠 fixed issue #550: Uninformative error in VFHEstimation (thanks David!)
    • 🛠 fix for #504: Make ShapeContext and SpinImage uniform (thanks David!). Note: this is an API breaking change, as setInputCloudWithNormals, which was deviating from the FeatureEstimation API is now replaced with patched setInputCloud and setInputNormals, thus no longer causing an error. However, we are confident with this change as the API was broken, so this is a bug fix.
    • 🛠 fixed a bug in the PointCloud<MatrixXf> feature estimation and I/O regarding the fields count property
    • 🛠 fixed an issue where the header stamp should only be copied from a PointCloud into a PointCloud in PCL standalone, and not in PCL in ROS
    • ⚡️ optimized RSD computation
    • speeded up normal estimation in IntegralImageNormalEstimation
    • 📇 renamed computeFeature (MatrixXf&) into computeFeatureEigen (MatrixXf&) and compute (MatrixXf&) into computeEigen (MatrixXf&) to keep the compiler happy, avoid multiple inheritance, and use clearer semantics between the two different output estimation methods
    • 🛠 fixed an issue where if radius would be defined for VFHEstimation, Feature::initCompute would error out
    • 🛠 fixed issue #539 (fpfh_estimation tutorial)
    • 🛠 fixed issue #544 (overflow in implicit constant conversion warnings)
    • 🛠 fixed issue #527 (bug in IntegralImageNormalEstimation)
    • 🛠 fixed issue #514 (SpinImages segfault when using setKSearch)

    libpcl_registration

    • ➕ added TransformationValidation base class and TransformationValidationEuclidean as a measure to validate whether a final transformation obtained via TransformationEstimation when registering a pair of clouds was correct or not
    • ➕ added getter/setter for maximum number of inner iterations to control number of optimizations in GeneralizedIterativeClosestPoint
    • 🛠 fixed issue #507
    • 👉 fixed issue #533 (WarpPointRigid missing EIGEN_MAKE_ALIGNED_OPERATOR_NEW)
    • 🛠 fixed issue #464 (already defined function pointers)
    • 🛠 fixed a grave bug on 32bit architectures where MapAligned was used incorrectly

    libpcl_segmentation

    • 🛠 fixed a segmentation fault in SACSegmentationFromNormals caused by calling segment without passing the input XYZ or normal data
    • added a missing setDistanceFromOrigin to SACSegmentationFromNormals for SACMODEL_NORMAL_PARALLEL_PLANE (thanks A. Barral)

    libpcl_visualization

    • ➕ added PointXYZRGBA callbacks for OpenNIGrabber and PCLVisualizer
    • 🛠 fixed two bugs where a segfault would occur in addPolygonMesh when the input cloud would be empty, as well as #563 : PCLVisualizer::addPolygonMesh crash (thanks Mourad!)
    • ➕ added the capability to remove a cloud when removeShape is called, to preserve API backward compatibility (a PolygonMesh is not treated as a CloudActor inside PCLVisualizer)
    • 🛠 fix #472: at startup the camera view pointis set to last added point cloud, but with the key combination ALT+r on can iterate through the view points of the visualized point clouds.
    • added addPointCloud method for sensor_msgs::PointCloud2 data (useful to bypass the conversion to XYZ for pcd_viewer)
    • added PCL_VISUALIZER_IMMEDIATE_RENDERING for processing large datasets
    • 🔨 refactorized pcd_viewer to consume less memory by skipping the intermediate conversion to PointCloud<PointXYZ>, clearing the PointCloud2 data once converted to VTK, and enabling intermediate mode
    • ➕ added setPosition to pcl::visualization::ImageViewer for allowing the image viewer to be moved somewhere else on screen
    • 🔄 changed the openni_image viewer tool to display both RGB and depth images
    • 🛠 fixed a nasty bug where the scalars range were not correctly updated in the mapper on updatePointCloud thus causing weird VTK warnings at the console
    • ➕ added setupInteractor to allow QVTK customizations
    • pcd_grabber_viewer now shows the recorded images in PointXYZRGB clouds, and can use fps=0 and trigger each new frame manually by pressing SPACE
    • 🛠 fixed an BGR/RGB issue in image_viewer
    • ➕ added setKeyboardModifier to change the default keyboard modifier from Alt to Shift or Ctrl so that in QVTK or other widgets, we can still use shortcuts like Mod+r, Mod+f, etc
    • PCLVisualizer is now working with VTK compiled for cocoa, no X11 necessary on OS X
    • 🏗 build bundle executable for pcd_viewer if VTK is compiled with Cocoa. With that the keyboard events are handled by the application
    • modified openni_passthrough to use QVTK instead of VTK
    • ➕ added PCLVisualizer zoom in/out via /- [ alt]
    • implemented feature #516 (pcd_viewer multiview with .vtk files)
    • ➕ added showMonoImage for displaying a monochrome unsigned char 2D image in PCLVisualizer
    • ➕ added setFullScreen and setWindowBorders methods to allow an user to change the full screen/border properties of the PCLVisualizer GUI
    • 🛠 fix for issue #519 (set the minimum number of cloud points to 1 in vtkLODActor)
    • 🛠 fix for issue #524 (ctrl problem with pcd_viewer)
    • 🛠 fix for issue #532 (PCLVizualizer::addCoordinateSystem() switch from Eigen::Matrix4f to Eigen::Affine3f)
    • bug fix in pcd_grabber_viewer: now sorting the read .pcd file by name before showing them (was in random order before)
    • 🛠 fixed issue #525 (pcd_viewer did not handle nan values correctly in fields other than x, y, z)
    • 🛠 fixed a bug where changing the point color using setPointCloudRenderingProperties would not update the actor's colors on screen
    • ↪ workaround for displaying FPS rate on PCLVisualizer - disabled backface culling because of known VTK issue