save_composite_map
服务类型: map_manager/srv/SaveCompositeMap
服务名: /save_composite_map
描述
将当前运行时地图保存到 map_path 指定的归档目录,并同时导出标准二维栅格地图文件 map.pgm 和 map.yaml。目标目录已存在时会被新归档覆盖。
请求 (Request)
| 字段 | 类型 | 描述 |
|---|---|---|
| map_path | string | 要写入的归档目录路径 |
| compress | bool | 接口兼容字段;当前 GRW 实现不使用它选择导出格式 |
响应 (Response)
| 字段 | 类型 | 描述 |
|---|---|---|
| success | bool | 操作是否成功 |
| message | string | 结果消息或错误信息 |
| saved_path | string | 保存路径;当前实现返回请求中的 map_path |
使用示例
运行前请先完成环境准备:命令行示例需设置
ROBOT_NAMESPACE;Python/C++ 示例使用相对服务名,运行时追加--ros-args -r __ns:=$ROBOT_NAMESPACE。
命令行调用
Bash
ros2 service call $ROBOT_NAMESPACE/save_composite_map map_manager/srv/SaveCompositeMap \
"{map_path: '/data/maps/office', compress: false}"
compress 目前不是 GRW 的导出格式选择开关。请传入归档目录,并以响应中的 saved_path 作为保存结果。
行为说明: 极端情况下本服务可能返回 success=false, message='save failed';重启机器人后重试通常可恢复。请保留已有可用归档作为兜底。注记(POI/虚拟墙/禁区)会随归档一起保存并在加载后恢复,见 ros_api.md 第 9.2 节的注记生命周期说明。
Python 示例
Python
import rclpy
from rclpy.node import Node
from map_manager.srv import SaveCompositeMap
class MapSaver(Node):
def __init__(self):
super().__init__('map_saver')
self.client = self.create_client(
SaveCompositeMap, 'save_composite_map')
def save(self, map_path: str):
self.client.wait_for_service()
request = SaveCompositeMap.Request()
request.map_path = map_path
request.compress = False
future = self.client.call_async(request)
rclpy.spin_until_future_complete(self, future)
return future.result()
rclpy.init()
node = MapSaver()
result = node.save('/data/maps/office')
print(result.message, result.saved_path)
node.destroy_node()
rclpy.shutdown()
C++ 示例
C++
#include <memory>
#include <rclcpp/rclcpp.hpp>
#include <map_manager/srv/save_composite_map.hpp>
auto node = std::make_shared<rclcpp::Node>("map_saver");
auto client = node->create_client<map_manager::srv::SaveCompositeMap>(
"save_composite_map");
client->wait_for_service();
auto request = std::make_shared<map_manager::srv::SaveCompositeMap::Request>();
request->map_path = "/data/maps/office";
request->compress = false;
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: %s",
response->message.c_str(), response->saved_path.c_str());
}
归档内容
- 可供本模块重新加载的地图归档数据
map.pgmmap.yaml
相关接口
- LoadCompositeMap - 加载归档
- ClearCompositeMap - 清空运行时地图
- DeleteMapArchive - 删除已保存归档