跳到主要内容

save_composite_map

服务类型: map_manager/srv/SaveCompositeMap

服务名: /save_composite_map

描述​

将当前运行时地图保存到 map_path 指定的归档目录,并同时导出标准二维栅格地图文件 map.pgm 和 map.yaml。目标目录已存在时会被新归档覆盖。

请求 (Request)​

字段类型描述
map_pathstring要写入的归档目录路径
compressbool接口兼容字段;当前 GRW 实现不使用它选择导出格式

响应 (Response)​

字段类型描述
successbool操作是否成功
messagestring结果消息或错误信息
saved_pathstring保存路径;当前实现返回请求中的 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.pgm
  • map.yaml

相关接口​