Application: icp-slam

1. Description

icp-slam is a front-end application to the MRPT C++ library class mrpt::slam::CMetricMapBuilderICP. This SLAM algorithm builds a map incrementally by aligning new range scans to either a point point or an occupancy grid map using the ICP algorithm. The ICP implementation itself can be found in the class mrpt::slam::CICP. See this tutorial describing the algorithm.


2. Demo

To run one of the demos included in MRPT, execute:

or to use that same configuration with your own data set:

Check out the comments in the configuration files provided in MRPT/share/mrpt/config_files/icp-slam/ for further reference. Note that both ICP can be configured to use either a points or occupancy grid map to perform the scan alignment. And even using one of them, the other map type can be also built simultaneously.

NOTE: The rawlog “2007-05MAY-17_SENA_Floor2.3_1laser.rawlog” used in the demo video below is not included by default in the MRPT package, please grab it separately from the collection of datasets..


2.1 Video2


2.2 Configuration files

Please, refer to the examples in MRPT/share/mrpt/config_files/icp-slam/


  • dhimas wicaksa

    sorry but im new to SLAM. just want to clarify, ICP slam only use laser output right? or is it also need odometry information? deeply sorry for this shallow question

    • cenbin

      Need odometry information as initial pose.Use the scan observation and odometry information as input of ICP,Then u can get the output which is the current pose.

  • Yanjun Cao

    Hi, the implementation in the video is cool. I am trying to use mrpt icp-slam in an simulator (argos3). But I encounted a problem which I can not solve. Could you give me some clue?

    I feed the ICP with scan observation and odometry. I can get the current position update from the odometry but I never get the real update from ICP because my “can_do_icp” is always false at last. I get warning of “Cannot do ICP: empty pointmap or not suitable gridmap..”. The weird thing is actually I get the right “anymap_update” which is true after “metricMap.insertObservationPtr(obs, &estimatedPose3D);” line. And I can see there is one element in “maps” deque. However when I try metricMap.isEmpty() with GDB, I still got true. Do you have any suggestion about what should I do? Thank you in advance!