
An ExplorationMap represents a description of Pepper’s environment, used by Pepper to localize
itself relatively to his surroundings.
An ExplorationMap is obtained by dumping a representation of the environment Pepper has explored
during the run of a LocalizeAndMap action.
// Build a LocalizeAndMap action.
val localizeAndMap: LocalizeAndMap = ...
// Run it.
localizeAndMap.async().run()
// When localized, dump the current description of the explored environment.
val explorationMap: ExplorationMap = localizeAndMap.dumpMap()
// Build a LocalizeAndMap action.
LocalizeAndMap localizeAndMap = ...;
// Run it.
localizeAndMap.async().run();
// When localized, dump the current description of the explored environment.
ExplorationMap explorationMap = localizeAndMap.dumpMap();
The ExplorationMap can then be used by a Localize action, so that Pepper keeps track of his
position relatively to where he was when he started the LocalizeAndMap action.
// Get an exploration map.
val explorationMap: ExplorationMap = ...
// Build a Localize action.
val localize: Localize = LocalizeBuilder.with(qiContext)
                              .withMap(explorationMap)
                              .build()
// Get an exploration map.
ExplorationMap explorationMap = ...;
// Build a Localize action.
Localize localize = LocalizeBuilder.with(qiContext)
                                   .withMap(explorationMap)
                                   .build();
An ExplorationMap can be serialized to text, for example to save it to a file and store it
persistently.
// Get an exploration map.
val explorationMap: ExplorationMap = ...
// Serialize the ExplorationMap data.
val mapData: String = explorationMap.serialize()
// Get an exploration map.
ExplorationMap explorationMap = ...;
// Serialize the ExplorationMap data.
String mapData = explorationMap.serialize();

An ExplorationMap can also be converted to a StreamableBuffer.
// Get an exploration map.
val explorationMap: ExplorationMap = ...
// Convert the ExplorationMap to StreamableBuffer.
val streamableBuffer: StreamableBuffer = explorationMap.serializeAsStreamableBuffer()
// Get an exploration map.
ExplorationMap explorationMap = ...;
// Convert the ExplorationMap to StreamableBuffer.
StreamableBuffer streamableBuffer = explorationMap.serializeAsStreamableBuffer();
Important
The StreamableBuffer conversion should be preferred over the String conversion,
as it prevents OutOfMemoryError due to loading the entire ExplorationMap data at once.
To re-use the content of a serialized ExplorationMap, one can build a new ExplorationMap
object from the content.
// Retrieve a serialized ExplorationMap.
val mapData: String = ...
// Build a new ExplorationMap.
val explorationMap: ExplorationMap = ExplorationMapBuilder.with(qiContext)
                                          .withMapString(mapData)
                                          .build()
// Retrieve a serialized ExplorationMap.
String mapData = ...;
// Build a new ExplorationMap.
ExplorationMap explorationMap = ExplorationMapBuilder.with(qiContext)
                                                     .withMapString(mapData)
                                                     .build();

One can also build an ExplorationMap from a StreamableBuffer.
// Retrieve a StreamableBuffer.
val streamableBuffer: StreamableBuffer = ...
// Build a new ExplorationMap.
val explorationMap: ExplorationMap = ExplorationMapBuilder.with(qiContext)
                                          .withStreamableBuffer(streamableBuffer)
                                          .build()
// Retrieve a StreamableBuffer.
StreamableBuffer streamableBuffer = ...;
// Build a new ExplorationMap.
ExplorationMap explorationMap = ExplorationMapBuilder.with(qiContext)
                                                     .withStreamableBuffer(streamableBuffer)
                                                     .build();

It is possible to display the result of the ExplorationMap on a UI.
The image is stored in an EncodedImage.
val explorationMap: ExplorationMap = ...
// Get the image data
val mapGraphicalRepresentation: MapTopGraphicalRepresentation =
    explorationMap.topGraphicalRepresentation
val encodedImage: EncodedImage = mapGraphicalRepresentation.image
ExplorationMap explorationMap = ...
// Get the image data
MapTopGraphicalRepresentation mapGraphicalRepresentation =
    explorationMap.getTopGraphicalRepresentation();
EncodedImage encodedImage = mapGraphicalRepresentation.getImage();
The coordinates in an image and those in the mapFrame are not in the same frame of reference. To compute the change of one referential to another, 4 parameters are given:
To get the position in mapFrame of a point from its pixels coordinate \((x_{img}, y_{img})\) , use:
To retrieve pixels coordinates of a point from its coordinates \((x_{map}, y_{map})\) in ExplorationMap, use:
For example, if you want to display on the image of the map a point which is 2 meters in front of mapFrame, (\(x_{map} = 2.0, y_{map} = 0.0\)), you need to get its coordinates in pixel:
fun getPixelFromMapPosition(xMap: Float, yMap: Float,
    mapGraphicalRepresentation: MapTopGraphicalRepresentation): Pair<Int, Int> {
  val scale: Float = mapGraphicalRepresentation.scale
  val theta: Float = mapGraphicalRepresentation.theta
  val x = mapGraphicalRepresentation.x
  val y = mapGraphicalRepresentation.y
  val xPixel = (1 / scale * (cos(theta) * (xMap - x) + sin(theta) * (yMap - y))).toInt()
  val yPixel = (1 / scale * (sin(theta) * (xMap - x) - cos(theta) * (yMap - y))).toInt()
  return Pair(xPixel, yPixel)
}
val mapGraphicalRepresentation: MapTopGraphicalRepresentation =
    explorationMap.topGraphicalRepresentation
val (xPixel, yPixel) = getPixelFromMapPosition(2.0f, 0.0f, mapGraphicalRepresentation)
public Pair<Integer, Integer> getPixelFromMapPosition(float xMap, float yMap, MapTopGraphicalRepresentation mapGraphicalRepresentation) {
    float scale = mapGraphicalRepresentation.getScale();
    float theta = mapGraphicalRepresentation.getTheta();
    float x = mapGraphicalRepresentation.getX();
    float y = mapGraphicalRepresentation.getY();
    int xPixel = (int) (1 / scale * (cos(theta) * (xMap - x) + sin(theta) * (yMap - y)));
    int yPixel = (int) (1 / scale * (sin(theta) * (xMap - x) - cos(theta) * (yMap - y)));
    return new Pair<>(xPixel, yPixel);
}
MapTopGraphicalRepresentation mapGraphicalRepresentation =
    explorationMap.getTopGraphicalRepresentation();
Pair<Integer, Integer> pixelCoordinates =
    getPixelFromMapPosition(2.0f, 0.0f, mapGraphicalRepresentation);
The format of a map is not definitive and may change as improvements are made to this functionality. It is advised to remap the environment after a system upgrade.
A map, made by a robot may be shared with another robot provided that their hardware are fully compatible.