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
| Field | Type | Description |
|---|---|---|
map_path | string | Path to the map data. |
compress | bool | Whether to save the map as a compressed archive. |
Response
| Field | Type | Description |
|---|---|---|
success | bool | Whether the operation succeeded. |
message | string | Result details or an error message. |
saved_path | string | Path 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.mmaptar.gz archive. - A
map_pathending in.mmapenables compression automatically.
Saved Content
| Layer | Content | Format |
|---|---|---|
localization | 3D point-cloud map | .pcd |
navigation | 2D occupancy-grid map | .pgm and .yaml |
semantic | POIs, rooms, and semantic objects | .json |
virtual | Virtual walls, forbidden areas, and speed-restricted areas | .json |