Skip to main content

SaveCompositeMap

Service type: map_manager/srv/SaveCompositeMap

Service name: ${MM}/save_composite_map

Description

Save the current composite map as a directory or .mmap archive.

Request

FieldTypeDescription
map_pathstringPath to the map data.
compressboolWhether to save the map as a compressed archive.

Response

FieldTypeDescription
successboolWhether the operation succeeded.
messagestringResult details or an error message.
saved_pathstringPath where the data was saved.

Examples

Example 1

Bash
# Save in directory format
ros2 service call ${MM}/save_composite_map map_manager/srv/SaveCompositeMap \
"{map_path: '/opt/fftai/Navigation/Map/my_map', compress: false}"

# Save as a compressed archive
ros2 service call ${MM}/save_composite_map map_manager/srv/SaveCompositeMap \
"{map_path: '/opt/fftai/Navigation/Map/my_map', compress: true}"

# Use compression automatically when the path ends in .mmap
ros2 service call ${MM}/save_composite_map map_manager/srv/SaveCompositeMap \
"{map_path: '/opt/fftai/Navigation/Map/my_map.mmap'}"

Example 2

Python
from map_manager.srv import SaveCompositeMap
import rclpy
from rclpy.node import Node

class MapSaver(Node):
def __init__(self):
super().__init__('map_saver')
self.client = self.create_client(
SaveCompositeMap, '/save_composite_map')
self.client.wait_for_service()

def save(self, path: str, compress: bool = False):
request = SaveCompositeMap.Request()
request.map_path = path
request.compress = compress

future = self.client.call_async(request)
rclpy.spin_until_future_complete(self, future)
result = future.result()

if result.success:
print(f"Map saved successfully: {result.saved_path}")
else:
print(f"Failed to save: {result.message}")
return result

rclpy.init()
saver = MapSaver()

# Save as a directory
saver.save('/opt/fftai/Navigation/Map/my_map', compress=False)

# Save as a compressed archive
saver.save('/opt/fftai/Navigation/Map/my_map', compress=True)

rclpy.shutdown()

Example 3

C++
#include <rclcpp/rclcpp.hpp>
#include <map_manager/srv/save_composite_map.hpp>

class MapSaver : public rclcpp::Node {
public:
MapSaver() : Node("map_saver") {
client_ = create_client<map_manager::srv::SaveCompositeMap>(
"/save_composite_map");
client_->wait_for_service();
}

bool save(const std::string& path, bool compress = false) {
auto request = std::make_shared<map_manager::srv::SaveCompositeMap::Request>();
request->map_path = path;
request->compress = compress;

auto future = client_->async_send_request(request);
if (rclcpp::spin_until_future_complete(shared_from_this(), future) ==
rclcpp::FutureReturnCode::SUCCESS) {
auto result = future.get();
if (result->success) {
RCLCPP_INFO(get_logger(), "Map saved successfully: %s", result->saved_path.c_str());
}
return result->success;
}
return false;
}

private:
rclcpp::Client<map_manager::srv::SaveCompositeMap>::SharedPtr client_;
};

Compression Behavior

  • With compress=false, the map is saved as an editable directory structure.
  • With compress=true, the map is saved as a transferable .mmap tar.gz archive.
  • A map_path ending in .mmap enables compression automatically.

Saved Content

LayerContentFormat
localization3D point-cloud map.pcd
navigation2D occupancy-grid map.pgm and .yaml
semanticPOIs, rooms, and semantic objects.json
virtualVirtual walls, forbidden areas, and speed-restricted areas.json