Project 1: Moving Least Squares
The objective of this project is to implement an algorithm to estimate the surface underlying a "point cloud" of 3D points. This surface estimate allows for noisy points from sensors (e.g., laser rangefinding, depth camera) to be smoothened or downsampled. For this purpose, you will implement the Moving Least Squares (MLS) algorithm for 2D point clouds, and adjust parameters for kernel weights, choice of polynomial functions, and sampling of surface query points.
Github link to the data and code inside the "mls" directory:
This project requires implementation of 3 functions:
Given a set of input points P (stored in plist), you should be able to generate new samples that will serve as query points for estimating the underlying surface. The output of this function is a list of sample points R (stored in rlist). There are existing methods to do this sampling, which will be covered in class presentations. You are welcome to try your own ways and give the analysis.
Given input and sample query points, this function computes the local frame of reference for each sample point, as a point origin (q) and surface normal (H) from this origin. Computing the local reference frame for all the points in rlist will produce qlist and Hlist as the output of this method. This function will require some form of optimization to estimate each local reference frame.
Given estimated local reference frames, estimate (through an optimization routine) the parameters for a chosen polynomial of the input points (P) with respect to each reference frame. Points (Q) taken from these polynomials is the updated resampled point list q_list, or MLS smoothened point cloud.
Project 2: Mapping by Odometry
The objective of this project is to build a simple 3D RGBD mapping system using odometry. You become acquainted with 3D point cloud data and 3D geometric transforms. These concepts will allow building a 3D map from a synchronized sequence of point cloud frames and robot odometry. The implementation of this project will serve as the baseline for concepts in the course as well as the eventual mapping system you will produce this semester.
For this project, you will implement a mapping system that reads in a sequence of point cloud files and an odometry text file and outputs the resulting map to an interactive 3D display. The input point cloud files will be in the Point Cloud Data (PCD). The odometry text file will have a list 6 degree-of-freedom poses for the pose of the robot's camera (in the odometric frame) at each instance of the sequence. This project requires implementation of an interactive GUI that can display 3D points and change viewpoints in real time. Any programming language can be used for this assignment. We recommend using the Point Cloud Library, a C++ library for processing point cloud data, to import PCD files and interactive visualization of the resulting map. You will be introduced to the data and the processing methods in a lab sessions. You will also have to show the results in the PCL visualizer which has the properties to place the point clouds spacially at the specified locations in 3D using transforms.
Dropbox link to the data:
Totally you will implement 3 functions.
Given a sequence of point cloud data (pcd files) and odomotry file, read these files and store them into a data structure.
Build the 3D map from the imported point clouds and odometry. This function will involve computing the 3D matrix transform for each odometric pose and transforming its associated point cloud points into the frame of this pose.
Display the overall point cloud from the constructed map in the interactive 3D GUI. This function should be sure to display the color of each point as well as its location in space.
Project 3: SGD SLAM
The objective of this project is to implement a Simultaneous Localization and Mapping algorithm for estimating a robot's true trajectory from noisy odometry. The Stochastic Gradient Descent algorithm will be used to perform SLAM as an optimization of the robot's pose graph to match poses that form a loop closure. The input into this algorithm is a sequence of N robot poses and loop closures expressed as constraints between two poses. The output will be the corrected N pose sequence, where each iteration of the displayed through some user interface.
Github link to the data and code in the "sgd" directory: