跳到主要内容

load_composite_map

服务类型: map_manager/srv/LoadCompositeMap

服务名: /load_composite_map

描述​

从 map_path 指定的归档目录加载地图,并将加载结果持久化。该服务不设置机器人初始位姿;服务成功后,必须向 /initialpose 发布初始位姿。

请求 (Request)​

字段类型描述
map_pathstring要加载的归档目录路径

响应 (Response)​

字段类型描述
successbool操作是否成功
messagestring结果消息或错误信息
map_infomap_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 地图归档目录,再通过本服务加载该目录。

相关接口​