# Paper: Subjective Local Maps for Hybrid Metric-Topological SLAM

**Subjective Local Maps for Hybrid Metric-Topological SLAM**, *Robotics and Autonomous Systems*, 2009 – (PDF).

**Abstract:** *Hybrid maps where local metric sub-maps are kept in the nodes of a graph-based topological structure are gaining relevance as the focus of robot Simultaneous Localization and Mapping (SLAM) shifts towards spatial scalability and long-term operation. In this paper we examine the applicability of spectral graph partitioning techniques to automatically generate metric sub-maps by establishing groups in the sequence of observations gathered by the robot. One of the main aims of this work is to provide a probabilistically grounded interpretation of such a partitioning technique in the context of generating these local maps. We also discuss how to apply it to different kinds of sensory data (stereo images and laser range scans) and how to consider them simultaneously. An important feature of our approach is that it implicitly takes into account the intrinsic characteristics of the sensors, such as the sensor field of view, to perform the partitioning instead of applying heuristics supplied by a human as in other works, and thus the robot builds “subjective” local maps. The ideas presented here are supported by experimental results from a real mobile robot as well as simulations for statistical analysis. We discuss the effects of considering different combinations of sensors in the resulting clustering of the environment.*

**Bibtex:**

1 2 3 4 5 6 7 8 9 10 |
@article{blanco2009slm, title={{Subjective local maps for hybrid metric-topological SLAM}}, author={Blanco, JL and Gonz{\'a}lez, J. and Fern{\'a}ndez-Madrigal, J.A.}, journal={Robotics and Autonomous Systems}, volume={57}, number={1}, pages={64--74}, year={2009}, publisher={Elsevier} } |

## 2. Source code

The main method described in the paper, partitioning a map using a spectral graph-cut technique, is implemented in the class mrpt::slam::CIncrementalMapPartitioner. The generic algorithm for partitioning any graph given its adjacency matrix is implemented in mrpt::math::CGraphPartitioner.

There is a ready-to-use application, map-partition, which takes a map as input (a “.simplemap” file), and processes it to build the adjacency matrix and generate the partitions. It also shows graphically the original and the rearranged weight matrix (Ω in the paper).

## 3. The experiments

### 3.1. Statistical results

The statistical experiments reported in the paper have been obtained by invoking 150 times the following MRPT programs:

1 2 |
$ simul-landmarks $ kf-slam ./partition_EKF-SLAM_test.ini |

The first program simul-landmarks, takes its parameters from “config.ini” and generates a synthetic dataset “out.rawlog”.

Next, the application kf-slam executes the EKF filter and generates a file “OUT_KF-SLAM/ERRORS.txt” with an analysis of the information losses for each partitioning algorithm (refer to the paper for details).

The contents of the configuration files is:

**config.ini**

1 |
<pre class=\"lang:c++ decode:true\"><br />; Parameters for the Landmark-Map Rawlog simulator.<br />[Params] nSteps=250 ; Number of steps to simulate<br />circularPath=0 ; Circular/Square paths<br />squarePathLength=10000 ; "Steps" or length of the square path (integer)<br />; If file is empty, generate them at random from parameters below:<br />; file contains one row X Y Z per landmark.<br />loadLandmarksFromFile=<br />odometryNoiseXY_std=0.01 ; In meters (1 sigma)<br />odometryNoisePhi_std_deg=0.1 ; In degs (1 sigma)<br />minSensorDistance=0<br />maxSensorDistance=5<br />fieldOfView_deg=180<br />stdRange=0.01 ; The "sigma" of the sensor in range<br />stdYaw_deg=0.1 ; The "sigma" of the sensor in yaw (degrees)<br />stdPitch_deg=0.0 ; The "sigma" of the sensor in pitch (degrees)<br />outFile=simLandmarkPath.rawlog<br />outDir=OUT <br /><br />[RANDOMSET_1]<br />; Number of landmarks if there is no file<br />nLandmarks=60<br />min_x=0<br />max_x=55<br />min_y=-2<br />max_y=2<br />min_z=0<br />max_z=0<br /> |

**partition_EKF-SLAM_test.ini**

1 |
<pre class=\"lang:c++ decode:true\"><br />;------------------------------------------------------<br />; Config file for the KF-SLAM application<br />; ~ The MRPT Library ~<br />;------------------------------------------------------<br />; Section: [MappingApplication]<br />; Use: Here comes global parameters for the app.<br />;-------------------------------------------------<br />[MappingApplication]<br />; The source file (RAW-LOG) with action/observation pairs<br />rawlog_file=./OUT/simLandmarkPath.rawlog<br />; The directory where the log files will be saved (left in blank if no log is required)<br />logOutput_dir=LOG_EKF-SLAM SAVE_3D_SCENES=0<br />;-------------------------------------------------<br />; Options defined by CRangeBearingKFSLAM class<br />;-------------------------------------------------<br />[RangeBearingKFSLAM]<br />stdXY_no_odo=0.1<br />stdPhi_no_odo_deg=2 ; degs<br />std_odo_z_additional=0.05<br />; Additional uncertainty in z<br />doPartitioningExperiment=1 ; 0: Automatic spectral graph cut, &gt;1: Fixed size submaps partitioning Method=0<br />quantiles_3D_representation=3<br />partitionThreshold=THRESHOLD_PARTITION<br /> |

### 3.2. Real dataset

In this experiment the input is a map built from data gathered by one of our mobile robots, Sancho. The raw data is available for download with the name “dataset_malaga_floor2.3_2lasers_stereo”.

However, for this experiment the data has been already processed and maps have been built using positions corrected through laser scans (using rbpf-slam). The already made maps, in the “.simplemap” file format can be downloaded here: 2007-05MAY-22_simplemaps.zip

This package contains the following files:

- 2007-05MAY-22_Floor2.3_1laser.simplemap
- 2007-05MAY-22_Floor2.3_2laser.simplemap
- 2007-05MAY-22_Floor2.3_2laser+visual_LM.simplemap
- 2007-05MAY-22_Floor2.3_visual_LM.simplemap

Each of the maps contains one, two, or more sensor data (laser scanners & stereo images). To generate the partitions, the program map-partition is invoked with the map file as its argument on the command line, e.g:

1 |
$ map-partition 2007-05MAY-22_Floor2.3_1laser.simplemap [THRESHOLD] |

The optional parameter “THRESHOLD” can be used to provide a different Ncut partitioning threshold in the range [0,2] (\tau in the paper). This will generate the sub-maps and also the auxiliary graph weight matrix, before and after rearranging it according to the partitioning, as in the attached screenshot.