Saturday, July 21, 2012

Photoconsistency Visual Odometry

It's has been a long time since my last entry, but I have been working hard on a new open source project called Photoconsistency-Visual-Odometry. With this project I wanted to develop an algorithm to estimate the 3DoF/6DoF motion of a Kinect sensor using the depth and intensity information from a RGBD dataset.

Reconstructed 3D global map of an indoor scene using the Photoconsistency Visual Odometry as a first pose approximation and GICP for pose refinement.
The project is licensed under the BSD license and the source code is available in the following SVN repository: http://code.google.com/p/photoconsistency-visual-odometry/

To estimate the rigid transformation, this implementation uses a coarse to fine optimization approach, trying to find the warping function that maximizes the photoconsistency between two consecutive RGBD frames at different image scales. That is, the optimizer starts computing a first pose approximation at a low resolution image scale, and then uses the estimated solution to initialize the optimization at a greater resolution image scale to refine the solution.

Conceptual flow diagram of the Photoconsistency rigid transformation estimation algorithm.
To estimate the visual odometry, the algorithm composes the estimated rigid transformation between each pair of consecutive RGBD frames to compute the global pose of the sensor.
Estimated trajectory using the implemented Photoconsistency Visual Odometry algorithm (blue) compared to the ground-truth (black).

Estimated trajectory compared to the ground-truth showing the trajectory error. Figure generated using the CVPR tools.
The provided solution has been implemented using the Ceres Solver auto-diff framework. This is a very powerful yet easy to use framework for error function optimization that uses dual numbers to compute the jacobians. The project also uses OpenCV for image processing and other open source libraries (PCL and MRPT) for the GICP implementation and dataset streaming respectively.

To finish this entry, take a look a one of the videos I have uploaded to Youtube. Hope you like this project and find it useful :).