Skip to content
Library for Constrained Deformable Coherent Point Drift
Python CMake C++
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.

Constrained Deformable Coherent Point Drift (CDCPD)

CDCPD is a implementation of Occlusion-robust Deformable Object Tracking without Physics Simulation by Cheng Chi and Dmitry Berenson.

This library includes object-oriented API for tracker, visualization utilities and a ROS node that subscribes and publishes PointCloud2.


  • Numpy
  • Scipy
  • Numexpr
  • scikit-learn
  • OpenCV
  • Gurobi
  • matplotlib*
  • glplotlib*
  • rospy
  • ros_numpy

*: (optional) for visualization only


Note: these instructions have been tested on Ubuntu 18.04 and ROS Melodic only.

Core Package

Clone the following repositories into your catkin workspace:

cd path/to/catkin_ws/src/
git clone
git clone

Build the project (tested with catkin build, not catkin_make)

catkin build

If you need tracking failure recovery, you will also need to compile the VFH feature library. Make sure you have PCL-1.8 installed. If you have ROS installed, it should be already there.

cd src/pcl_features
mkdir build
cd build
cmake ..
cd ..
ln -s build/

Conda configuration

Install miniconda; use the python 3 version

Create conda virtual enviornment with the packages that conda knows about, you must name it as shown for the roslaunch/scripts to run correctly. This environment is used to isolate python3 code from the default python2 code on Ubuntu 18.04 and ROS Melodic

conda create -c gurobi --name catkin_cdcpd python=3.7 opencv gurobi numpy scipy numexpr scikit-learn matplotlib ipython
conda activate catkin_cdcpd

For the following operations, make sure the newly created virtual environment is activated. The command line should show the name of virtual environment in brackets. Install the rest of the requirements via pip:

(catkin_cdcpd) user@host:path/to/catkin_ws/src/cdcpd$ pip install -r cdcpd/requirements.txt

Gurobi Licence

Gurobi is a proprietary optimization package that we use. Please obtain a free academic license. Note that Gurobi licence activation requires a university network. If you are not on campus, follow these instructions to setup a VPN: UMVPN.

Ensure that the conda environment is active, and install a Gurobi key with grbgetkey following the instructions here

(catkin_cdcpd) user@host:~$ grbgetkey 253e22f3-...

You may have noticed that a package named glplotlib is installed by pip. glplotlib is another opensource library developed by Cheng Chi for visualizing 3D point cloud with better performance (compared to matplotlib).

If you use a IDE such as PyCharm or VS Code, remember to set project interpreter to this virtual environment.


To run the demo, you will need to download some data into <project_root>/data folder. The files in the v0.1.0 folder are intended for use with the original version of this library. Follow instructions in the README there to use them.

To run the fully ROS integrated demo start all of the following from individual terminals, without activating the conda workspace:

  • Start ROS core: roscore
  • Start Rviz for visualization: rviz -d path/to/catkin_ws/src/cdcpd/config/cdcpd.rviz
  • Start the tracking nodes: roslaunch cdcpd tracker.launch
  • Start playing the rosbag: rosbag play -l data/placemat_stationary.bag

The following messages are a normal part of the initialization process:

[rosout]: Error: itemsize cannot be zero in type
/path/to/catkin_ws/src/cdcpd/src/cdcpd/ RuntimeWarning: divide by zero encountered in true_divide
  projected[:, 0] /= projected[:, 2]
/path/to/catkin_ws/src/cdcpd/src/cdcpd/ RuntimeWarning: invalid value encountered in true_divide
  projected[:, 0] /= projected[:, 2]
/path/to/catkin_ws/src/cdcpd/src/cdcpd/ RuntimeWarning: divide by zero encountered in true_divide
  projected[:, 1] /= projected[:, 2]
/path/to/catkin_ws/src/cdcpd/src/cdcpd/ RuntimeWarning: invalid value encountered in true_divide
  projected[:, 1] /= projected[:, 2]
You can’t perform that action at this time.