地图管理
地图的加载、建图和管理功能。
地图操作
加载地图
- load_map(map_name, auto_reload=True, block=False, timeout=30)
Load an existing map from the map resource directory.
- Parameters:
map_name (
str) – Name of the map to load (must exist in /root/data/daystar_api/maps)auto_reload (
bool) – Deprecated and kept only for backward compatibility (default: True). The navigation stack dropped /nav/relo_load_map, so the map is always loaded the same way regardless of this flag; passing False only logs a warning.block (
bool) – If True, block until the underlying reload service returns (up to the internal max wait); if False, use timeout (default: False)timeout (
int) – Timeout in seconds; only effective when block=False (default: 30)
- Return type:
- Returns:
LoadMapResponse.
Examples:
# Load a map result = load_map("office_floor1") if result.response.success: print("Map loaded successfully") # Load map with custom timeout (non blocking wait) result = load_map("large_map", block=False, timeout=60) # Switch between maps available = get_available_maps() for map_name in available.maps: print(f"Available: {map_name}") load_map("office_floor2")
Note
auto_reload has no effect anymore; do not rely on it to distinguish permanent and temporary map switching.
建图会话进行中会拒绝切图(切图意味着丢弃正在建的图):须先 stop_mapping 保存或放弃本次建图,再加载目标地图;导航任务进行中同样拒绝切图。
底层 ROS2 接口
通道 1(仅 ``auto_reload=False`` 时先调,切换重定位地图):
类型: Service
daystar_navigation_msgs/srv/LoadMap名称:
/nav/relo_load_map参数映射:
封装参数
原生字段(Request)
map_namerequest.map_dir(floor/init_pose留默认)timeout客户端行为,不下发(等待服务响应的时长)
通道 2(切换定位地图,始终调用):
类型: Service
daystar_navigation_msgs/srv/LoadMap名称:
/nav/load_map参数映射:
封装参数
原生字段(Request)
map_namerequest.map_dir(floor/init_pose留默认)block/timeout客户端行为,不下发(
block=True等到内部上限,否则等timeout秒)
获取可用地图
- get_available_maps(timeout=30)
Get all available maps from the map resource directory.
- Parameters:
timeout (
int) – Timeout in seconds for query (default: 30)- Return type:
- Returns:
GetAvailableMapsResponse.
Examples:
# Get all available maps result = get_available_maps() if result.success: print("Available maps:") for map_name in result.maps: print(f" - {map_name}") # Get maps with custom timeout result = get_available_maps(timeout=10) # Check if specific map exists before loading result = get_available_maps() if "office_map" in result.maps: load_map("office_map") else: print("Map not found") # List and select map interactively maps = get_available_maps() if maps.success: for i, name in enumerate(maps.maps): print(f"{i+1}. {name}") load_map(maps.maps[selection])
底层 ROS2 接口
类型: Service
daystar_navigation_msgs/srv/ListMaps名称:
/nav/list_maps参数映射:
封装参数 |
原生字段(Request) |
|---|---|
(无业务参数) |
Request 为空(服务端返回 |
|
客户端行为,不下发(等待服务响应的时长) |
建图模式
开始建图
- start_mapping(timeout=120, enable_loop_closure=True)
Start SLAM mapping mode to create a new map.
- Parameters:
- Return type:
- Returns:
StartMappingResponse.
response.already_mapping为 True 表示拒绝:调用时已在 建图会话,本次未启动(success=False;不清暂存点、不改闭环配置,enable_loop_closure 入参被忽略)。
Examples:
result = start_mapping() if result.response.success: print("Mapping mode started") # Drive robot around to build map time.sleep(300) stop_mapping("new_map") # Start mapping with custom timeout result = start_mapping(timeout=180) # Start mapping without loop closure (long-duration odometry mode) result = start_mapping(timeout=180, enable_loop_closure=False) # Complete mapping workflow if start_mapping().response.success: print("Drive the robot to map the area...") stop_mapping("office_map", auto_reload=True)
Note
enable_loop_closure=True 时后端存储局部地图帧用于回环检测,最多持续 15 分钟;False 时退化为纯里程计建图,适合超长距离建图场景。
底层 ROS2 接口
通道 1(切入 SLAM 模式):
类型: Service
daystar_navigation_msgs/srv/SetLocalizationMode名称:
/nav/set_localization_mode参数映射:
封装参数
原生字段(Request)
(固定值)
request.localization_mode = 1(SLAM)timeout客户端行为,不下发(等待服务响应的时长)
通道 2(仅 ``enable_loop_closure=False`` 时追加,关闭闭环检测):
类型: Service
std_srvs/srv/SetBool名称:
/nav/trigger_loop参数映射:
封装参数
原生字段(Request)
enable_loop_closurerequest.data = False(仅显式关闭时下发;True时不调用,依赖后端默认开启)说明: 另含纯本地动作——清除上次建图会话残留的暂存点位 (
points/.mapping_session/),不经 ROS2。
停止建图
- stop_mapping(map_name, auto_reload=True, need_2d_map=True, block=True, timeout=30)
Stop SLAM mapping, save the map, and switch back to MAP mode.
- Parameters:
map_name (
str) – Name for the saved mapauto_reload (
bool) – 存图后是否自动加载新地图(default: True)。置 False 时只保存地图并切回 MAP 模式,导航栈继续用原地图,也不做停图后快速重定位;新图上的点位需 load_map 之后才可见need_2d_map (
bool) – If True, generate 2D map in addition to 3D map; if False, only save 3D map (default: True)block (
bool) – If True, block until the underlying save service returns (up to the internal max wait); if False, use timeout (default: True)timeout (
int) – Timeout in seconds; only effective when block=False (default: 30)
- Return type:
- Returns:
StopMappingResponse.
response.map_saved标记本次是否真正保存了地图—— 若建图会话以enable_loop_closure=False启动(纯里程计模式,不积累地图数据), 则无图可存,本调用只切回 MAP 模式,map_saved=False``(success 仍为 True)。 失败语义:存图失败时放弃会话并尝试切回 MAP,``response.mode_reverted标记是否 切回成功(False=仍卡 SLAM);调用时不在建图会话则直接拒绝,response.not_mapping=True。
Examples:
# Stop mapping and save (with 2D map); the new map is loaded automatically result = stop_mapping("warehouse_map") if result.state.code == 0 and result.response.map_saved: print(f"Map saved: {result.response.message}") # Stop mapping without 2D map generation result = stop_mapping("new_office_map", auto_reload=True, need_2d_map=False) # Non-blocking save with custom timeout result = stop_mapping("quick_map", block=False, timeout=60) # Complete mapping session with all options start_mapping() print("Drive robot to map the area...") input("Press Enter when done") result = stop_mapping("my_map", auto_reload=True, need_2d_map=True, block=True) if result.state.code == 0: print("Mapping complete, new map loaded") # Fast save without waiting for 2D map generation result = stop_mapping("temp_map", auto_reload=True, need_2d_map=False, block=False, timeout=30)
底层 ROS2 接口
auto_reload 决定存图后是否加载新地图(默认 True)。置 False 时跳过
下方通道 3:地图照常保存、照常切回 MAP 模式,但导航栈继续用原地图,
停图后的快速重定位也一并跳过(新图上的点位要等显式 load_map 后才可见)。
按顺序调用(若建图会话以 enable_loop_closure=False 启动,则跳过
通道 1 与通道 3,仅走通道 2 切回 MAP 模式,map_saved=False):
通道 1(保存地图):
类型: Service
daystar_navigation_msgs/srv/SaveMap名称:
/nav/slam/save_map参数映射:
封装参数
原生字段(Request)
map_namerequest.file_destination = "/root/data/daystar_api/maps/<map_name>"need_2d_maprequest.need_2d_map(固定值)
request.resolution = 0.05block/timeout客户端行为,不下发(
block=True等到内部上限,否则等timeout秒)通道 2(切回 MAP 模式):
类型: Service
daystar_navigation_msgs/srv/SetLocalizationMode名称:
/nav/set_localization_mode参数映射: 固定
request.localization_mode = 0(MAP);block/timeout为客户端行为
通道 3(重载新图,仅 ``auto_reload=True`` 时调用):
类型: Service
daystar_navigation_msgs/srv/LoadMap名称:
/nav/load_map参数映射:
map_name→request.map_dir(floor/init_pose留默认);block/timeout为客户端行为
说明: 另含纯本地动作——地图保存成功后把建图会话暂存点位 (
points/.mapping_session/)迁移到points/<map_name>/,不经 ROS2。
切换定位模式
- set_localization_mode(localization_mode, block=True, timeout=30)
切换定位模式(0=MAP 地图定位、1=SLAM 建图、2=REFLECTOR 反光柱定位)。
用途:单独恢复 MAP 定位模式(如建图后未自动切回、或需要从反光柱定位切回地图定位)。
- Parameters:
- Return type:
- Returns:
SetLocalizationModeResponse.
Examples:
# 切回地图定位模式 result = set_localization_mode(0) if result.response.success: print("已切回 MAP 模式") # 切到反光柱定位 result = set_localization_mode(2)
Note
常规建图请用 start_mapping / stop_mapping(含闭环配置、打点会话与地图保存管理),不要用本接口切 SLAM。
切换离开 SLAM 而未经 stop_mapping 保存地图时,建图期间打的暂存点位会被清除(无图可归属)。
底层 ROS2 接口
类型: Service
daystar_navigation_msgs/srv/SetLocalizationMode名称:
/nav/set_localization_mode参数映射:
封装参数 |
原生字段(Request) |
|---|---|
|
|
|
客户端行为,不下发( |
说明: 切换成功后另含纯本地动作——同步维护建图会话状态与暂存点位 (进 SLAM 清残留、离开 SLAM 清孤儿暂存点),不经 ROS2。
相关数据类型
地图管理相关的响应类型详细说明请参见 数据结构 文档:
_lowlevel_skills.LoadMapResponse- 加载地图响应_lowlevel_skills.GetAvailableMapsResponse- 获取可用地图响应_lowlevel_skills.StartMappingResponse- 开始建图响应(already_mapping标记已在建图被拒:本次未启动、会话保持原样)_lowlevel_skills.StopMappingResponse- 停止建图响应(map_saved标记本次是否真正保存了地图;mode_reverted/not_mapping标记失败切回与未建图拒绝)_lowlevel_skills.SetLocalizationModeResponse- 切换定位模式响应