LoadCompositeMap
Service type: map_manager/srv/LoadCompositeMap
Service name: ${MM}/load_composite_map
Description
Load a composite map from a directory or .mmap archive.
Request
| Field | Type | Description |
|---|---|---|
map_path | string | Path to the map data. |
Response
| Field | Type | Description |
|---|---|---|
success | bool | Whether the operation succeeded. |
message | string | Result details or an error message. |
map_info | map_manager/msg/CompositeMapInfo | Composite-map information. |
Examples
Example 1
Bash
# Load a map in directory format
ros2 service call ${MM}/load_composite_map map_manager/srv/LoadCompositeMap \
"{map_path: '/opt/fftai/Navigation/Map/office'}"
# Load a map from a compressed archive
ros2 service call ${MM}/load_composite_map map_manager/srv/LoadCompositeMap \
"{map_path: '/opt/fftai/Navigation/Map/office.mmap'}"
Example 2
Python
from map_manager.srv import LoadCompositeMap
import rclpy
from rclpy.node import Node
class MapLoader(Node):
def __init__(self):
super().__init__('map_loader')
self.client = self.create_client(
LoadCompositeMap, '/load_composite_map')
self.client.wait_for_service()
def load(self, path: str):
request = LoadCompositeMap.Request()
request.map_path = path
future = self.client.call_async(request)
rclpy.spin_until_future_complete(self, future)
result = future.result()
if result.success:
info = result.map_info
print(f"Map loaded successfully: {info.name}")
print(f"Floor count: {len(info.floors)}")
for floor in info.floors:
print(f" - {floor.floor_id}: {floor.name}")
else:
print(f"Failed to load: {result.message}")
return result
rclpy.init()
loader = MapLoader()
loader.load('/opt/fftai/Navigation/Map/office')
rclpy.shutdown()
Example 3
C++
#include <rclcpp/rclcpp.hpp>
#include <map_manager/srv/load_composite_map.hpp>
class MapLoader : public rclcpp::Node {
public:
MapLoader() : Node("map_loader") {
client_ = create_client<map_manager::srv::LoadCompositeMap>(
"/load_composite_map");
client_->wait_for_service();
}
bool load(const std::string& path) {
auto request = std::make_shared<map_manager::srv::LoadCompositeMap::Request>();
request->map_path = path;
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 loaded successfully: %s, Floor count: %zu",
result->map_info.name.c_str(), result->map_info.floors.size());
}
return result->success;
}
return false;
}
private:
rclcpp::Client<map_manager::srv::LoadCompositeMap>::SharedPtr client_;
};
Example 4
Text
map_directory/
├── map_info.json # Composite-map metadata
├── floors/
│ ├── 1F/
│ │ ├ ── localization/ # Localization layer (3D point cloud)
│ │ ├── navigation/ # Navigation layer (2D occupancy grid)
│ │ ├── semantic/ # Semantic layer (POIs, rooms, and objects)
│ │ └── virtual/ # Virtual layer (virtual walls and restricted areas)
│ └── 2F/
│ └── ...
└── transitions.json # Floor transitions
Supported Map Formats
Directory Format
The directory structure shown above contains composite-map metadata, per-floor layers, and floor transitions.
Compressed .mmap Format
An .mmap file is a tar.gz archive of the directory format. It is extracted automatically when loaded.