load_composite_map
服务类型: map_manager/srv/LoadCompositeMap
服务名: /load_composite_map
描述
从 map_path 指定的归档目录加载地图,并将加载结果持久化。该服务不设置机器人初始位姿;服务成功后,必须向 /initialpose 发布初始位姿。
请求 (Request)
| 字段 | 类型 | 描述 |
|---|---|---|
| map_path | string | 要加载的归档目录路径 |
响应 (Response)
| 字段 | 类型 | 描述 |
|---|---|---|
| success | bool | 操作是否成功 |
| message | string | 结果消息或错误信息 |
| map_info | map_manager/msg/CompositeMapInfo | 已加载地图信息;成功时包含归档目录名作为 map_id |
使用示例
运行前请先完成环境准备:命令行示例需设置
ROBOT_NAMESPACE;Python/C++ 示例使用相对服务名,运行时追加--ros-args -r __ns:=$ROBOT_NAMESPACE。
命令行调用
Bash
ros2 service call $ROBOT_NAMESPACE/load_composite_map map_manager/srv/LoadCompositeMap \
"{map_path: '/data/maps/office'}"
服务成功后,发布初始位姿:
Bash
# 订阅端为 BEST_EFFORT + TRANSIENT_LOCAL,发布 端必须匹配该 QoS;持续发布数秒以确保端点匹配
timeout 6 ros2 topic pub --qos-reliability best_effort --qos-durability transient_local -r 1 \
$ROBOT_NAMESPACE/initialpose geometry_msgs/msg/PoseWithCovarianceStamped \
"{header: {frame_id: 'map'}, pose: {pose: {position: {x: 1.0, y: 2.0, z: 0.0}, orientation: {z: 0.0, w: 1.0}}}}"
Python 示例
Python
import rclpy
from rclpy.node import Node
from map_manager.srv import LoadCompositeMap
class MapLoader(Node):
def __init__(self):
super().__init__('map_loader')
self.client = self.create_client(
LoadCompositeMap, 'load_composite_map')
def load(self, map_path: str):
self.client.wait_for_service()
request = LoadCompositeMap.Request()
request.map_path = map_path
future = self.client.call_async(request)
rclpy.spin_until_future_complete(self, future)
return future.result()
rclpy.init()
node = MapLoader()
result = node.load('/data/maps/office')
print(result.message)
node.destroy_node()
rclpy.shutdown()
C++ 示例
C++
#include <memory>
#include <rclcpp/rclcpp.hpp>
#include <map_manager/srv/load_composite_map.hpp>
auto node = std::make_shared<rclcpp::Node>("map_loader");
auto client = node->create_client<map_manager::srv::LoadCompositeMap>(
"load_composite_map");
client->wait_for_service();
auto request = std::make_shared<map_manager::srv::LoadCompositeMap::Request>();
request->map_path = "/data/maps/office";
auto future = client->async_send_request(request);
if (rclcpp::spin_until_future_complete(node, future) ==
rclcpp::FutureReturnCode::SUCCESS) {
const auto response = future.get();
RCLCPP_INFO(node->get_logger(), "%s", response->message.c_str());
}
支持的地图格式
目录格式
GRW 仅支持加载由 save_composite_map 保存的地图归档目录。map_path 必须指向该归档目录本身,而不是目录中的单个文件。
保存服务会在归档目录中生成地图元信息、导航地图数据,以及用于二维栅格地图使用的 map.pgm 和 map.yaml。加载时请保留整个目 录及其内部文件,不要仅复制其中的单个文件,也不要手动修改归档内容。
不支持的格式
当前不支持直接加载 .mmap 压缩包、点云地图文件或其他机器人型号生成的地图文件。如需在 GRW 设备之间迁移地图,请复制完整的 GRW 地图归档目录,再通过本服务加载该目录。
相关接口
- SaveCompositeMap - 保存归档
- ClearCompositeMap - 清空运行时地图
- 初始位姿话题 - 设置加载后的初始位姿