LiDAR SLAM using LeGO-LOAM

April – May 2022

Motivation: As a part of class project

Objective: To capture own dataset using 2 x VLP-16, IMU, and GPS sensors and perform LiDAR SLAM on it

Details: We were a team of four who contributed in this project under the guidance of our professor and TAs. The dataset was collected using NUance car (Lincoln Mkz) by driving it in Boston city for ~ 20 mins. We tried to capture areas with both wide and narrow roads, having buildings (tall and short), vegetation, people, and vehicles on the side of the road/ car to see how does the point cloud shows up in rviz and to see algorithm’s working.

Following path was taken in the City of Boston (Video fast forward @ 10X).

AlgorithmLeGO-LOAMLego-LOAM-BORSC-LeGO-LOAM
ObservationAccurate but slow (takes rosbag file’s duration to process complete dataset)
 
Can see z-drift in rviz
Faster (variable speed) than LeGO-LOAM but not accurate
 
Can only see top view. No way to visualize z-drift in rviz
Best (both accurate and fast)
 
Can visualize Z-drift in rviz

We observed that the algorithm were able to segment ground and non-ground points from the point cloud decently, detect cars/ people/ trees in the surroundings. Though it could take input from one point cloud only.

Next Steps: Combine point clouds from both VLP-16 lidars and re-run the algorithm.

Both VLP16 are separated from each other by 1.32 m (only translation and no rotation) which is obtained from transformation (/tf) between the two sensor’s frames. ros_numpy is used to convert the PointCloud2 messages to xyz array. message_filters.ApproximateTimeSynchronizer is used to sync data from both sensors (/ns1/velodyne_points and /ns2/velodyne_points) within a time accuracy of 9.99 ms. registerCallback is used to run a callback function when messages are received on both topics within the specified time accuracy. Second VLP-16’s data is then represented wrt first sensor with the help of translation + rotation matrix (homogeneous transformation), although only translation is used for this use case. It is then concatenated with first sensor’s data, only unique points are picked from this concatenated array and the published over the topic /velodyne_points

Source code: https://github.com/devvaibhav455/lego_loam