|
mapoi_server package from mapoi repomapoi mapoi_interfaces mapoi_rviz_plugins mapoi_server mapoi_turtlebot3_example mapoi_webui |
ROS Distro
|
Package Summary
| Version | 0.6.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/shimz-robotics/mapoi.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-07-15 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Shunsuke Kimura
Authors
- Shunsuke Kimura
mapoi_server
English version (primary): README.md 本ファイルは日本語スナップショットです。最新の内容は英語版を参照してください。
mapoi のメインパッケージです。 地図と POI の情報を管理し、他のパッケージにサービスとして提供します。また、POI 名を指定した自律走行やPOI半径イベントの検知を行います。
自分のロボットへの組み込み方
4 つの core node (mapoi_server / mapoi_nav2_bridge / mapoi_amcl_localization_bridge / mapoi_rviz2_publisher) と、必要に応じてシミュレータ連動 bridge をまとめて起動する bringup launch を提供しています。自前の launch から以下のように include してください:
- include:
file: "$(find-pkg-share mapoi_server)/launch/mapoi_bringup.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"} # REQUIRED
- {name: map_name, value: "initial_map_name"} # REQUIRED
- {name: config_file, value: "mapoi_config.yaml"} # optional
- {name: state_path, value: "/var/lib/mapoi"} # optional (実機運用では推奨、#297)
- {name: simulator, value: "none"} # gazebo|gz|none (default: none)
- {name: robot_entity_name, value: "burger"} # simulator=gazebo|gz のとき必要
- {name: robot_sdf_path, value: "/path/.../model.sdf"} # simulator=gazebo のとき必要
- {name: init_world_name, value: "default"} # simulator=gz のとき必要 (gz_sim 起動時の world 名)
maps_path と map_name は 必須 です。maps_path 未指定 / 存在しないパス / ディレクトリでない場合は RCLCPP_FATAL ログ + 終了コード 1 で起動失敗します (#163)。mapoi_turtlebot3_example の sample を流用するなら $(find-pkg-share mapoi_turtlebot3_example)/maps を指定してください。
CLI から直接起動する例
include せず ros2 launch を直接叩く場合の最小例:
# mapoi_turtlebot3_example の sample maps を流用 (apt / 配布 install 後にも動く)
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(ros2 pkg prefix --share mapoi_turtlebot3_example)/maps \
map_name:=turtlebot3_world
# ソースツリーから直接 (ros2_ws 内で source 後)
# 注: 本 repo を `<ws>/src/mapoi/` に clone している前提 (ws 直下で `git clone .../mapoi.git src/mapoi`)。
# パッケージを `<ws>/src/mapoi_turtlebot3_example/` のようにフラット展開している場合は
# パスを調整するか、上の `pkg prefix --share` 形式を使う方が確実。
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(pwd)/src/mapoi/mapoi_turtlebot3_example/maps \
map_name:=turtlebot3_dqn_stage1
引数の取り違え注意
各 launch arg のセマンティクスは以下のとおり ({maps_path}/{map_name}/{config_file} でアクセスする 3 レベルの分割):
| arg | 渡すもの | 例 |
|---|---|---|
maps_path |
地図群を束ねる親ディレクトリ (各地図は配下のサブディレクトリ) | /path/to/maps |
map_name |
maps_path 直下の地図サブディレクトリ名 |
turtlebot3_world |
config_file |
地図サブディレクトリ内の設定ファイル名 (default: mapoi_config.yaml) |
mapoi_config.yaml |
実際にロードされるパスは {maps_path}/{map_name}/{config_file} で、上記例なら /path/to/maps/turtlebot3_world/mapoi_config.yaml となります。
maps_path / map_name 必須 (上節参照) の検証は 2 段階: map_name 自体未指定なら ros2 launch が Required launch argument 'map_name' was not provided で fail (node 起動前 / launch system 側)、maps_path がディレクトリでない等のセマンティクス違反は mapoi_server ノード起動時に RCLCPP_FATAL で fail します。
❌ よくある間違い: maps_path に config.yaml ファイルパスを直接指定 してしまう:
# WRONG: maps_path はファイルではなくディレクトリ
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=./maps/turtlebot3_dqn_stage1/mapoi_config.yaml \
map_name:=turtlebot3_dqn_stage1
→ 起動時に mapoi_server ノードが以下を 1 行で出力して FATAL 終了します (mapoi_server.cpp 内の RCLCPP_FATAL の実ログ文字列そのまま・英日混在):
[FATAL] maps_path '...mapoi_config.yaml' does not exist or is not a directory. 正しい maps ディレクトリ path を指定してください (例: $(find-pkg-share mapoi_turtlebot3_example)/maps)。
maps_path は 地図群を束ねる親ディレクトリ で、特定の地図ディレクトリやファイルではありません。ディレクトリ構成は本 README 末尾の ディレクトリ構成 節を参照してください。
simulator arg はシミュレータ連動 bridge の起動を制御します:
-
gazebo(Gazebo Classic / Humble):mapoi_gazebo_bridgeを起動。operator map switch 時に Gazebo 内のworld_modelentity を入れ替え + ロボットを delete + spawn で POI list 先頭 の座標に再生成 (#144 で旧initial_posesystem tag を廃止し、yaml 順序で表現する semantics に変更) -
gz(gz-sim / Jazzy):mapoi_gz_bridge+parameter_bridge(ros_gz_bridge) を起動。operator map switch 時に gz-sim 内のworld_modelentity を入れ替え + ロボットをSetEntityPoseで POI list 先頭 の座標に teleport (gz-sim では Classic と異なり set_pose service が使えるため delete + spawn は不要) -
none(default): bridge 起動なし (実機運用)
Web UI も使う場合は mapoi_webui.launch.yaml も併せて include:
- include:
file: "$(find-pkg-share mapoi_webui)/launch/mapoi_webui.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"}
- {name: map_name, value: "initial_map_name"}
NOTE:
mapoi_webuiはシステムタグをmapoi_serverのmapoi/get_tag_definitionsservice 経由で取得します。mapoi_webui単体を起動しても system tags の表示は service 通信になるため、mapoi_serverの package install 自体は不要 (ただし service responder としてmapoi_serverノードが起動している必要あり)。
TurtleBot3 を使った動作例は mapoi_turtlebot3_example パッケージを参照してください。
ノード
mapoi_server
File truncated at 100 lines see the full file
Changelog for package mapoi_server
This per-package file lists only the changes affecting mapoi_server
(including its mapoi_nav2_bridge / mapoi_amcl_localization_bridge /
mapoi_rviz2_publisher / mapoi_gazebo_bridge / mapoi_gz_bridge
nodes), in the flat format expected by bloom / buildfarm. Full
project-level narrative: root CHANGELOG.rst / the GitHub Releases
page.
Forthcoming
0.6.0 (2026-07-15)
-
mapoi_rviz2_publisher: rebuild the marker arrays only when the underlying data changed (POIs, routes, highlights, display parameters), republishing the cached arrays with a refreshed stamp on unchanged ticks — the 1 Hz republish itself is kept so late-joiningvolatilesubscribers still receive markers — and skip the tick entirely while both marker topics have zero subscribers (#402).
0.5.0 (2026-07-10)
- Add the
request_initial_poseservice onmapoi_serveras the sole writer ofmapoi/initialpose_poi; other nodes request a publish instead of publishing directly, unifying the latched cache (#211). - Reject
request_initial_posewhen a non-emptymap_namedoes not match the server's current map, closing the stale-initial-pose map-switch race (#299). - Optionally persist and restore the last-selected map across a
restart via the new
state_pathparameter (default empty = disabled), avoiding a teleport to the launch-parameter map's POI (#297). - Validate the
select_mapservicemap_nameas a single path segment, rejecting path-traversal config loads (#328). - Namespace all eight
mapoi_serverservices undermapoi/(e.g.get_pois_info->mapoi/get_pois_info); no compatibility alias (#341). - Return
success=falsefromget_route_pois(GetRoutePois) for an unknown route instead of silently returning empty lists;mapoi_nav2_bridge/mapoi_rviz2_publishercheckresponse.success(#342). - Add
waypoint_arrival_modeparameter ("nav2"default /"mapoi") onmapoi_nav2_bridge;"mapoi"sends per-waypointNavigateToPosegoals and advances on tolerance match (#243, #259, #260, #261, #263, #264, #265, #266). - Add topic
mapoi/nav/command_rejected(std_msgs/String) onmapoi_nav2_bridgeas an unconditional rejected-command event, independent of the latchedmapoi/nav/status(#354). - Add
auto_resume_timeout_secparameter (default0.0= disabled) onmapoi_nav2_bridgeto auto-resume a paused route after a timeout (#231, #232). - Publish
rejected:<target>onmapoi/nav/statusfor commands rejected while idle (unknown goal/route, landmark-as-goal, service not ready) so operators can see they were ignored (#339, #355, #352, #356). - Fix Jazzy
EVENT_PAUSEDno longer firing by adding acmd_vel_msg_typeparameter (default"auto") that selectsTwistvsTwistStampedfromROS_DISTRO(#249). - Narrow
PoiEventpublishing toROUTEnavigation only (waypoints/landmarks on the active route), removeEVENT_STOPPED/EVENT_RESUMED, addEVENT_PAUSEDfiring on a realcmd_veldwell (#220, #227). - Render a yaw-agnostic POI tolerance (
tolerance.yaw >= pi) as a filled disc inmapoi_rviz2_publisherinstead of omitting the sector (#267, #268, #271). - Split
mapoi_nav2_bridge.cpp(1,712 lines) into five translation units (route / goal / map-switch / backend-status / core) compiling into one executable; internal refactor, no behavior change (#345).
0.4.0 (2026-05-08)
- Rename the Nav2 bridge node from
mapoi_nav_servertomapoi_nav2_bridge(executable, node, C++ class, header, and thewith_nav_server->with_nav2_bridgelaunch arg); no compatibility alias (#204). - Split the AMCL adapter out of the bridge into a new
mapoi_amcl_localization_bridgeexecutable; theinitialpose_*parameters and/initialposepublishing move to it, and it publishesLocalizationBackendStatus(#209). - Hardcode the system tag definitions in
system_tags.hpp(mapoi::kSystemTags) and remove themaps/tag_definitions.yamlfile /maps/directory;get_tag_definitionscontract unchanged (#191). - Publish
NavigationBackendStatusat 1 Hz onmapoi/nav/backend_status(transient_localQoS) as the navigation readiness contract (#198). - Use
MANUAL_BY_TOPICliveliness (5 s lease) on bothbackend_statustopics so consumers detect bridge death; reject infinite-lease publishers via QoS incompatibility (#208). - Keep the 1 Hz
backend_statuspublish running during blockingLoadMapcalls by moving the timer to a separate callback group under aMultiThreadedExecutor(#213). -
mapoi_gazebo_bridge: fix AMCL drift on operator map switch by teleporting via Gazebo Classicdelete_entity+spawn_entityto the first non-landmark POI (#91, #200). - Add CLI launch examples and
maps_path/map_nameargument semantics tomapoi_server/README.md(#172).
0.3.0 (2026-05-02)
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| mapoi | |
| mapoi_turtlebot3_example | |
| mapoi_webui |
Launch files
Messages
Services
Plugins
Recent questions tagged mapoi_server at Robotics Stack Exchange
|
mapoi_server package from mapoi repomapoi mapoi_interfaces mapoi_rviz_plugins mapoi_server mapoi_turtlebot3_example mapoi_webui |
ROS Distro
|
Package Summary
| Version | 0.6.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/shimz-robotics/mapoi.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-07-15 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Shunsuke Kimura
Authors
- Shunsuke Kimura
mapoi_server
English version (primary): README.md 本ファイルは日本語スナップショットです。最新の内容は英語版を参照してください。
mapoi のメインパッケージです。 地図と POI の情報を管理し、他のパッケージにサービスとして提供します。また、POI 名を指定した自律走行やPOI半径イベントの検知を行います。
自分のロボットへの組み込み方
4 つの core node (mapoi_server / mapoi_nav2_bridge / mapoi_amcl_localization_bridge / mapoi_rviz2_publisher) と、必要に応じてシミュレータ連動 bridge をまとめて起動する bringup launch を提供しています。自前の launch から以下のように include してください:
- include:
file: "$(find-pkg-share mapoi_server)/launch/mapoi_bringup.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"} # REQUIRED
- {name: map_name, value: "initial_map_name"} # REQUIRED
- {name: config_file, value: "mapoi_config.yaml"} # optional
- {name: state_path, value: "/var/lib/mapoi"} # optional (実機運用では推奨、#297)
- {name: simulator, value: "none"} # gazebo|gz|none (default: none)
- {name: robot_entity_name, value: "burger"} # simulator=gazebo|gz のとき必要
- {name: robot_sdf_path, value: "/path/.../model.sdf"} # simulator=gazebo のとき必要
- {name: init_world_name, value: "default"} # simulator=gz のとき必要 (gz_sim 起動時の world 名)
maps_path と map_name は 必須 です。maps_path 未指定 / 存在しないパス / ディレクトリでない場合は RCLCPP_FATAL ログ + 終了コード 1 で起動失敗します (#163)。mapoi_turtlebot3_example の sample を流用するなら $(find-pkg-share mapoi_turtlebot3_example)/maps を指定してください。
CLI から直接起動する例
include せず ros2 launch を直接叩く場合の最小例:
# mapoi_turtlebot3_example の sample maps を流用 (apt / 配布 install 後にも動く)
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(ros2 pkg prefix --share mapoi_turtlebot3_example)/maps \
map_name:=turtlebot3_world
# ソースツリーから直接 (ros2_ws 内で source 後)
# 注: 本 repo を `<ws>/src/mapoi/` に clone している前提 (ws 直下で `git clone .../mapoi.git src/mapoi`)。
# パッケージを `<ws>/src/mapoi_turtlebot3_example/` のようにフラット展開している場合は
# パスを調整するか、上の `pkg prefix --share` 形式を使う方が確実。
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(pwd)/src/mapoi/mapoi_turtlebot3_example/maps \
map_name:=turtlebot3_dqn_stage1
引数の取り違え注意
各 launch arg のセマンティクスは以下のとおり ({maps_path}/{map_name}/{config_file} でアクセスする 3 レベルの分割):
| arg | 渡すもの | 例 |
|---|---|---|
maps_path |
地図群を束ねる親ディレクトリ (各地図は配下のサブディレクトリ) | /path/to/maps |
map_name |
maps_path 直下の地図サブディレクトリ名 |
turtlebot3_world |
config_file |
地図サブディレクトリ内の設定ファイル名 (default: mapoi_config.yaml) |
mapoi_config.yaml |
実際にロードされるパスは {maps_path}/{map_name}/{config_file} で、上記例なら /path/to/maps/turtlebot3_world/mapoi_config.yaml となります。
maps_path / map_name 必須 (上節参照) の検証は 2 段階: map_name 自体未指定なら ros2 launch が Required launch argument 'map_name' was not provided で fail (node 起動前 / launch system 側)、maps_path がディレクトリでない等のセマンティクス違反は mapoi_server ノード起動時に RCLCPP_FATAL で fail します。
❌ よくある間違い: maps_path に config.yaml ファイルパスを直接指定 してしまう:
# WRONG: maps_path はファイルではなくディレクトリ
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=./maps/turtlebot3_dqn_stage1/mapoi_config.yaml \
map_name:=turtlebot3_dqn_stage1
→ 起動時に mapoi_server ノードが以下を 1 行で出力して FATAL 終了します (mapoi_server.cpp 内の RCLCPP_FATAL の実ログ文字列そのまま・英日混在):
[FATAL] maps_path '...mapoi_config.yaml' does not exist or is not a directory. 正しい maps ディレクトリ path を指定してください (例: $(find-pkg-share mapoi_turtlebot3_example)/maps)。
maps_path は 地図群を束ねる親ディレクトリ で、特定の地図ディレクトリやファイルではありません。ディレクトリ構成は本 README 末尾の ディレクトリ構成 節を参照してください。
simulator arg はシミュレータ連動 bridge の起動を制御します:
-
gazebo(Gazebo Classic / Humble):mapoi_gazebo_bridgeを起動。operator map switch 時に Gazebo 内のworld_modelentity を入れ替え + ロボットを delete + spawn で POI list 先頭 の座標に再生成 (#144 で旧initial_posesystem tag を廃止し、yaml 順序で表現する semantics に変更) -
gz(gz-sim / Jazzy):mapoi_gz_bridge+parameter_bridge(ros_gz_bridge) を起動。operator map switch 時に gz-sim 内のworld_modelentity を入れ替え + ロボットをSetEntityPoseで POI list 先頭 の座標に teleport (gz-sim では Classic と異なり set_pose service が使えるため delete + spawn は不要) -
none(default): bridge 起動なし (実機運用)
Web UI も使う場合は mapoi_webui.launch.yaml も併せて include:
- include:
file: "$(find-pkg-share mapoi_webui)/launch/mapoi_webui.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"}
- {name: map_name, value: "initial_map_name"}
NOTE:
mapoi_webuiはシステムタグをmapoi_serverのmapoi/get_tag_definitionsservice 経由で取得します。mapoi_webui単体を起動しても system tags の表示は service 通信になるため、mapoi_serverの package install 自体は不要 (ただし service responder としてmapoi_serverノードが起動している必要あり)。
TurtleBot3 を使った動作例は mapoi_turtlebot3_example パッケージを参照してください。
ノード
mapoi_server
File truncated at 100 lines see the full file
Changelog for package mapoi_server
This per-package file lists only the changes affecting mapoi_server
(including its mapoi_nav2_bridge / mapoi_amcl_localization_bridge /
mapoi_rviz2_publisher / mapoi_gazebo_bridge / mapoi_gz_bridge
nodes), in the flat format expected by bloom / buildfarm. Full
project-level narrative: root CHANGELOG.rst / the GitHub Releases
page.
Forthcoming
0.6.0 (2026-07-15)
-
mapoi_rviz2_publisher: rebuild the marker arrays only when the underlying data changed (POIs, routes, highlights, display parameters), republishing the cached arrays with a refreshed stamp on unchanged ticks — the 1 Hz republish itself is kept so late-joiningvolatilesubscribers still receive markers — and skip the tick entirely while both marker topics have zero subscribers (#402).
0.5.0 (2026-07-10)
- Add the
request_initial_poseservice onmapoi_serveras the sole writer ofmapoi/initialpose_poi; other nodes request a publish instead of publishing directly, unifying the latched cache (#211). - Reject
request_initial_posewhen a non-emptymap_namedoes not match the server's current map, closing the stale-initial-pose map-switch race (#299). - Optionally persist and restore the last-selected map across a
restart via the new
state_pathparameter (default empty = disabled), avoiding a teleport to the launch-parameter map's POI (#297). - Validate the
select_mapservicemap_nameas a single path segment, rejecting path-traversal config loads (#328). - Namespace all eight
mapoi_serverservices undermapoi/(e.g.get_pois_info->mapoi/get_pois_info); no compatibility alias (#341). - Return
success=falsefromget_route_pois(GetRoutePois) for an unknown route instead of silently returning empty lists;mapoi_nav2_bridge/mapoi_rviz2_publishercheckresponse.success(#342). - Add
waypoint_arrival_modeparameter ("nav2"default /"mapoi") onmapoi_nav2_bridge;"mapoi"sends per-waypointNavigateToPosegoals and advances on tolerance match (#243, #259, #260, #261, #263, #264, #265, #266). - Add topic
mapoi/nav/command_rejected(std_msgs/String) onmapoi_nav2_bridgeas an unconditional rejected-command event, independent of the latchedmapoi/nav/status(#354). - Add
auto_resume_timeout_secparameter (default0.0= disabled) onmapoi_nav2_bridgeto auto-resume a paused route after a timeout (#231, #232). - Publish
rejected:<target>onmapoi/nav/statusfor commands rejected while idle (unknown goal/route, landmark-as-goal, service not ready) so operators can see they were ignored (#339, #355, #352, #356). - Fix Jazzy
EVENT_PAUSEDno longer firing by adding acmd_vel_msg_typeparameter (default"auto") that selectsTwistvsTwistStampedfromROS_DISTRO(#249). - Narrow
PoiEventpublishing toROUTEnavigation only (waypoints/landmarks on the active route), removeEVENT_STOPPED/EVENT_RESUMED, addEVENT_PAUSEDfiring on a realcmd_veldwell (#220, #227). - Render a yaw-agnostic POI tolerance (
tolerance.yaw >= pi) as a filled disc inmapoi_rviz2_publisherinstead of omitting the sector (#267, #268, #271). - Split
mapoi_nav2_bridge.cpp(1,712 lines) into five translation units (route / goal / map-switch / backend-status / core) compiling into one executable; internal refactor, no behavior change (#345).
0.4.0 (2026-05-08)
- Rename the Nav2 bridge node from
mapoi_nav_servertomapoi_nav2_bridge(executable, node, C++ class, header, and thewith_nav_server->with_nav2_bridgelaunch arg); no compatibility alias (#204). - Split the AMCL adapter out of the bridge into a new
mapoi_amcl_localization_bridgeexecutable; theinitialpose_*parameters and/initialposepublishing move to it, and it publishesLocalizationBackendStatus(#209). - Hardcode the system tag definitions in
system_tags.hpp(mapoi::kSystemTags) and remove themaps/tag_definitions.yamlfile /maps/directory;get_tag_definitionscontract unchanged (#191). - Publish
NavigationBackendStatusat 1 Hz onmapoi/nav/backend_status(transient_localQoS) as the navigation readiness contract (#198). - Use
MANUAL_BY_TOPICliveliness (5 s lease) on bothbackend_statustopics so consumers detect bridge death; reject infinite-lease publishers via QoS incompatibility (#208). - Keep the 1 Hz
backend_statuspublish running during blockingLoadMapcalls by moving the timer to a separate callback group under aMultiThreadedExecutor(#213). -
mapoi_gazebo_bridge: fix AMCL drift on operator map switch by teleporting via Gazebo Classicdelete_entity+spawn_entityto the first non-landmark POI (#91, #200). - Add CLI launch examples and
maps_path/map_nameargument semantics tomapoi_server/README.md(#172).
0.3.0 (2026-05-02)
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| mapoi | |
| mapoi_turtlebot3_example | |
| mapoi_webui |
Launch files
Messages
Services
Plugins
Recent questions tagged mapoi_server at Robotics Stack Exchange
|
mapoi_server package from mapoi repomapoi mapoi_interfaces mapoi_rviz_plugins mapoi_server mapoi_turtlebot3_example mapoi_webui |
ROS Distro
|
Package Summary
| Version | 0.6.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/shimz-robotics/mapoi.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-07-15 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Shunsuke Kimura
Authors
- Shunsuke Kimura
mapoi_server
English version (primary): README.md 本ファイルは日本語スナップショットです。最新の内容は英語版を参照してください。
mapoi のメインパッケージです。 地図と POI の情報を管理し、他のパッケージにサービスとして提供します。また、POI 名を指定した自律走行やPOI半径イベントの検知を行います。
自分のロボットへの組み込み方
4 つの core node (mapoi_server / mapoi_nav2_bridge / mapoi_amcl_localization_bridge / mapoi_rviz2_publisher) と、必要に応じてシミュレータ連動 bridge をまとめて起動する bringup launch を提供しています。自前の launch から以下のように include してください:
- include:
file: "$(find-pkg-share mapoi_server)/launch/mapoi_bringup.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"} # REQUIRED
- {name: map_name, value: "initial_map_name"} # REQUIRED
- {name: config_file, value: "mapoi_config.yaml"} # optional
- {name: state_path, value: "/var/lib/mapoi"} # optional (実機運用では推奨、#297)
- {name: simulator, value: "none"} # gazebo|gz|none (default: none)
- {name: robot_entity_name, value: "burger"} # simulator=gazebo|gz のとき必要
- {name: robot_sdf_path, value: "/path/.../model.sdf"} # simulator=gazebo のとき必要
- {name: init_world_name, value: "default"} # simulator=gz のとき必要 (gz_sim 起動時の world 名)
maps_path と map_name は 必須 です。maps_path 未指定 / 存在しないパス / ディレクトリでない場合は RCLCPP_FATAL ログ + 終了コード 1 で起動失敗します (#163)。mapoi_turtlebot3_example の sample を流用するなら $(find-pkg-share mapoi_turtlebot3_example)/maps を指定してください。
CLI から直接起動する例
include せず ros2 launch を直接叩く場合の最小例:
# mapoi_turtlebot3_example の sample maps を流用 (apt / 配布 install 後にも動く)
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(ros2 pkg prefix --share mapoi_turtlebot3_example)/maps \
map_name:=turtlebot3_world
# ソースツリーから直接 (ros2_ws 内で source 後)
# 注: 本 repo を `<ws>/src/mapoi/` に clone している前提 (ws 直下で `git clone .../mapoi.git src/mapoi`)。
# パッケージを `<ws>/src/mapoi_turtlebot3_example/` のようにフラット展開している場合は
# パスを調整するか、上の `pkg prefix --share` 形式を使う方が確実。
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(pwd)/src/mapoi/mapoi_turtlebot3_example/maps \
map_name:=turtlebot3_dqn_stage1
引数の取り違え注意
各 launch arg のセマンティクスは以下のとおり ({maps_path}/{map_name}/{config_file} でアクセスする 3 レベルの分割):
| arg | 渡すもの | 例 |
|---|---|---|
maps_path |
地図群を束ねる親ディレクトリ (各地図は配下のサブディレクトリ) | /path/to/maps |
map_name |
maps_path 直下の地図サブディレクトリ名 |
turtlebot3_world |
config_file |
地図サブディレクトリ内の設定ファイル名 (default: mapoi_config.yaml) |
mapoi_config.yaml |
実際にロードされるパスは {maps_path}/{map_name}/{config_file} で、上記例なら /path/to/maps/turtlebot3_world/mapoi_config.yaml となります。
maps_path / map_name 必須 (上節参照) の検証は 2 段階: map_name 自体未指定なら ros2 launch が Required launch argument 'map_name' was not provided で fail (node 起動前 / launch system 側)、maps_path がディレクトリでない等のセマンティクス違反は mapoi_server ノード起動時に RCLCPP_FATAL で fail します。
❌ よくある間違い: maps_path に config.yaml ファイルパスを直接指定 してしまう:
# WRONG: maps_path はファイルではなくディレクトリ
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=./maps/turtlebot3_dqn_stage1/mapoi_config.yaml \
map_name:=turtlebot3_dqn_stage1
→ 起動時に mapoi_server ノードが以下を 1 行で出力して FATAL 終了します (mapoi_server.cpp 内の RCLCPP_FATAL の実ログ文字列そのまま・英日混在):
[FATAL] maps_path '...mapoi_config.yaml' does not exist or is not a directory. 正しい maps ディレクトリ path を指定してください (例: $(find-pkg-share mapoi_turtlebot3_example)/maps)。
maps_path は 地図群を束ねる親ディレクトリ で、特定の地図ディレクトリやファイルではありません。ディレクトリ構成は本 README 末尾の ディレクトリ構成 節を参照してください。
simulator arg はシミュレータ連動 bridge の起動を制御します:
-
gazebo(Gazebo Classic / Humble):mapoi_gazebo_bridgeを起動。operator map switch 時に Gazebo 内のworld_modelentity を入れ替え + ロボットを delete + spawn で POI list 先頭 の座標に再生成 (#144 で旧initial_posesystem tag を廃止し、yaml 順序で表現する semantics に変更) -
gz(gz-sim / Jazzy):mapoi_gz_bridge+parameter_bridge(ros_gz_bridge) を起動。operator map switch 時に gz-sim 内のworld_modelentity を入れ替え + ロボットをSetEntityPoseで POI list 先頭 の座標に teleport (gz-sim では Classic と異なり set_pose service が使えるため delete + spawn は不要) -
none(default): bridge 起動なし (実機運用)
Web UI も使う場合は mapoi_webui.launch.yaml も併せて include:
- include:
file: "$(find-pkg-share mapoi_webui)/launch/mapoi_webui.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"}
- {name: map_name, value: "initial_map_name"}
NOTE:
mapoi_webuiはシステムタグをmapoi_serverのmapoi/get_tag_definitionsservice 経由で取得します。mapoi_webui単体を起動しても system tags の表示は service 通信になるため、mapoi_serverの package install 自体は不要 (ただし service responder としてmapoi_serverノードが起動している必要あり)。
TurtleBot3 を使った動作例は mapoi_turtlebot3_example パッケージを参照してください。
ノード
mapoi_server
File truncated at 100 lines see the full file
Changelog for package mapoi_server
This per-package file lists only the changes affecting mapoi_server
(including its mapoi_nav2_bridge / mapoi_amcl_localization_bridge /
mapoi_rviz2_publisher / mapoi_gazebo_bridge / mapoi_gz_bridge
nodes), in the flat format expected by bloom / buildfarm. Full
project-level narrative: root CHANGELOG.rst / the GitHub Releases
page.
Forthcoming
0.6.0 (2026-07-15)
-
mapoi_rviz2_publisher: rebuild the marker arrays only when the underlying data changed (POIs, routes, highlights, display parameters), republishing the cached arrays with a refreshed stamp on unchanged ticks — the 1 Hz republish itself is kept so late-joiningvolatilesubscribers still receive markers — and skip the tick entirely while both marker topics have zero subscribers (#402).
0.5.0 (2026-07-10)
- Add the
request_initial_poseservice onmapoi_serveras the sole writer ofmapoi/initialpose_poi; other nodes request a publish instead of publishing directly, unifying the latched cache (#211). - Reject
request_initial_posewhen a non-emptymap_namedoes not match the server's current map, closing the stale-initial-pose map-switch race (#299). - Optionally persist and restore the last-selected map across a
restart via the new
state_pathparameter (default empty = disabled), avoiding a teleport to the launch-parameter map's POI (#297). - Validate the
select_mapservicemap_nameas a single path segment, rejecting path-traversal config loads (#328). - Namespace all eight
mapoi_serverservices undermapoi/(e.g.get_pois_info->mapoi/get_pois_info); no compatibility alias (#341). - Return
success=falsefromget_route_pois(GetRoutePois) for an unknown route instead of silently returning empty lists;mapoi_nav2_bridge/mapoi_rviz2_publishercheckresponse.success(#342). - Add
waypoint_arrival_modeparameter ("nav2"default /"mapoi") onmapoi_nav2_bridge;"mapoi"sends per-waypointNavigateToPosegoals and advances on tolerance match (#243, #259, #260, #261, #263, #264, #265, #266). - Add topic
mapoi/nav/command_rejected(std_msgs/String) onmapoi_nav2_bridgeas an unconditional rejected-command event, independent of the latchedmapoi/nav/status(#354). - Add
auto_resume_timeout_secparameter (default0.0= disabled) onmapoi_nav2_bridgeto auto-resume a paused route after a timeout (#231, #232). - Publish
rejected:<target>onmapoi/nav/statusfor commands rejected while idle (unknown goal/route, landmark-as-goal, service not ready) so operators can see they were ignored (#339, #355, #352, #356). - Fix Jazzy
EVENT_PAUSEDno longer firing by adding acmd_vel_msg_typeparameter (default"auto") that selectsTwistvsTwistStampedfromROS_DISTRO(#249). - Narrow
PoiEventpublishing toROUTEnavigation only (waypoints/landmarks on the active route), removeEVENT_STOPPED/EVENT_RESUMED, addEVENT_PAUSEDfiring on a realcmd_veldwell (#220, #227). - Render a yaw-agnostic POI tolerance (
tolerance.yaw >= pi) as a filled disc inmapoi_rviz2_publisherinstead of omitting the sector (#267, #268, #271). - Split
mapoi_nav2_bridge.cpp(1,712 lines) into five translation units (route / goal / map-switch / backend-status / core) compiling into one executable; internal refactor, no behavior change (#345).
0.4.0 (2026-05-08)
- Rename the Nav2 bridge node from
mapoi_nav_servertomapoi_nav2_bridge(executable, node, C++ class, header, and thewith_nav_server->with_nav2_bridgelaunch arg); no compatibility alias (#204). - Split the AMCL adapter out of the bridge into a new
mapoi_amcl_localization_bridgeexecutable; theinitialpose_*parameters and/initialposepublishing move to it, and it publishesLocalizationBackendStatus(#209). - Hardcode the system tag definitions in
system_tags.hpp(mapoi::kSystemTags) and remove themaps/tag_definitions.yamlfile /maps/directory;get_tag_definitionscontract unchanged (#191). - Publish
NavigationBackendStatusat 1 Hz onmapoi/nav/backend_status(transient_localQoS) as the navigation readiness contract (#198). - Use
MANUAL_BY_TOPICliveliness (5 s lease) on bothbackend_statustopics so consumers detect bridge death; reject infinite-lease publishers via QoS incompatibility (#208). - Keep the 1 Hz
backend_statuspublish running during blockingLoadMapcalls by moving the timer to a separate callback group under aMultiThreadedExecutor(#213). -
mapoi_gazebo_bridge: fix AMCL drift on operator map switch by teleporting via Gazebo Classicdelete_entity+spawn_entityto the first non-landmark POI (#91, #200). - Add CLI launch examples and
maps_path/map_nameargument semantics tomapoi_server/README.md(#172).
0.3.0 (2026-05-02)
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| mapoi | |
| mapoi_turtlebot3_example | |
| mapoi_webui |
Launch files
Messages
Services
Plugins
Recent questions tagged mapoi_server at Robotics Stack Exchange
|
mapoi_server package from mapoi repomapoi mapoi_interfaces mapoi_rviz_plugins mapoi_server mapoi_turtlebot3_example mapoi_webui |
ROS Distro
|
Package Summary
| Version | 0.6.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/shimz-robotics/mapoi.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-07-15 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Shunsuke Kimura
Authors
- Shunsuke Kimura
mapoi_server
English version (primary): README.md 本ファイルは日本語スナップショットです。最新の内容は英語版を参照してください。
mapoi のメインパッケージです。 地図と POI の情報を管理し、他のパッケージにサービスとして提供します。また、POI 名を指定した自律走行やPOI半径イベントの検知を行います。
自分のロボットへの組み込み方
4 つの core node (mapoi_server / mapoi_nav2_bridge / mapoi_amcl_localization_bridge / mapoi_rviz2_publisher) と、必要に応じてシミュレータ連動 bridge をまとめて起動する bringup launch を提供しています。自前の launch から以下のように include してください:
- include:
file: "$(find-pkg-share mapoi_server)/launch/mapoi_bringup.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"} # REQUIRED
- {name: map_name, value: "initial_map_name"} # REQUIRED
- {name: config_file, value: "mapoi_config.yaml"} # optional
- {name: state_path, value: "/var/lib/mapoi"} # optional (実機運用では推奨、#297)
- {name: simulator, value: "none"} # gazebo|gz|none (default: none)
- {name: robot_entity_name, value: "burger"} # simulator=gazebo|gz のとき必要
- {name: robot_sdf_path, value: "/path/.../model.sdf"} # simulator=gazebo のとき必要
- {name: init_world_name, value: "default"} # simulator=gz のとき必要 (gz_sim 起動時の world 名)
maps_path と map_name は 必須 です。maps_path 未指定 / 存在しないパス / ディレクトリでない場合は RCLCPP_FATAL ログ + 終了コード 1 で起動失敗します (#163)。mapoi_turtlebot3_example の sample を流用するなら $(find-pkg-share mapoi_turtlebot3_example)/maps を指定してください。
CLI から直接起動する例
include せず ros2 launch を直接叩く場合の最小例:
# mapoi_turtlebot3_example の sample maps を流用 (apt / 配布 install 後にも動く)
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(ros2 pkg prefix --share mapoi_turtlebot3_example)/maps \
map_name:=turtlebot3_world
# ソースツリーから直接 (ros2_ws 内で source 後)
# 注: 本 repo を `<ws>/src/mapoi/` に clone している前提 (ws 直下で `git clone .../mapoi.git src/mapoi`)。
# パッケージを `<ws>/src/mapoi_turtlebot3_example/` のようにフラット展開している場合は
# パスを調整するか、上の `pkg prefix --share` 形式を使う方が確実。
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(pwd)/src/mapoi/mapoi_turtlebot3_example/maps \
map_name:=turtlebot3_dqn_stage1
引数の取り違え注意
各 launch arg のセマンティクスは以下のとおり ({maps_path}/{map_name}/{config_file} でアクセスする 3 レベルの分割):
| arg | 渡すもの | 例 |
|---|---|---|
maps_path |
地図群を束ねる親ディレクトリ (各地図は配下のサブディレクトリ) | /path/to/maps |
map_name |
maps_path 直下の地図サブディレクトリ名 |
turtlebot3_world |
config_file |
地図サブディレクトリ内の設定ファイル名 (default: mapoi_config.yaml) |
mapoi_config.yaml |
実際にロードされるパスは {maps_path}/{map_name}/{config_file} で、上記例なら /path/to/maps/turtlebot3_world/mapoi_config.yaml となります。
maps_path / map_name 必須 (上節参照) の検証は 2 段階: map_name 自体未指定なら ros2 launch が Required launch argument 'map_name' was not provided で fail (node 起動前 / launch system 側)、maps_path がディレクトリでない等のセマンティクス違反は mapoi_server ノード起動時に RCLCPP_FATAL で fail します。
❌ よくある間違い: maps_path に config.yaml ファイルパスを直接指定 してしまう:
# WRONG: maps_path はファイルではなくディレクトリ
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=./maps/turtlebot3_dqn_stage1/mapoi_config.yaml \
map_name:=turtlebot3_dqn_stage1
→ 起動時に mapoi_server ノードが以下を 1 行で出力して FATAL 終了します (mapoi_server.cpp 内の RCLCPP_FATAL の実ログ文字列そのまま・英日混在):
[FATAL] maps_path '...mapoi_config.yaml' does not exist or is not a directory. 正しい maps ディレクトリ path を指定してください (例: $(find-pkg-share mapoi_turtlebot3_example)/maps)。
maps_path は 地図群を束ねる親ディレクトリ で、特定の地図ディレクトリやファイルではありません。ディレクトリ構成は本 README 末尾の ディレクトリ構成 節を参照してください。
simulator arg はシミュレータ連動 bridge の起動を制御します:
-
gazebo(Gazebo Classic / Humble):mapoi_gazebo_bridgeを起動。operator map switch 時に Gazebo 内のworld_modelentity を入れ替え + ロボットを delete + spawn で POI list 先頭 の座標に再生成 (#144 で旧initial_posesystem tag を廃止し、yaml 順序で表現する semantics に変更) -
gz(gz-sim / Jazzy):mapoi_gz_bridge+parameter_bridge(ros_gz_bridge) を起動。operator map switch 時に gz-sim 内のworld_modelentity を入れ替え + ロボットをSetEntityPoseで POI list 先頭 の座標に teleport (gz-sim では Classic と異なり set_pose service が使えるため delete + spawn は不要) -
none(default): bridge 起動なし (実機運用)
Web UI も使う場合は mapoi_webui.launch.yaml も併せて include:
- include:
file: "$(find-pkg-share mapoi_webui)/launch/mapoi_webui.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"}
- {name: map_name, value: "initial_map_name"}
NOTE:
mapoi_webuiはシステムタグをmapoi_serverのmapoi/get_tag_definitionsservice 経由で取得します。mapoi_webui単体を起動しても system tags の表示は service 通信になるため、mapoi_serverの package install 自体は不要 (ただし service responder としてmapoi_serverノードが起動している必要あり)。
TurtleBot3 を使った動作例は mapoi_turtlebot3_example パッケージを参照してください。
ノード
mapoi_server
File truncated at 100 lines see the full file
Changelog for package mapoi_server
This per-package file lists only the changes affecting mapoi_server
(including its mapoi_nav2_bridge / mapoi_amcl_localization_bridge /
mapoi_rviz2_publisher / mapoi_gazebo_bridge / mapoi_gz_bridge
nodes), in the flat format expected by bloom / buildfarm. Full
project-level narrative: root CHANGELOG.rst / the GitHub Releases
page.
Forthcoming
0.6.0 (2026-07-15)
-
mapoi_rviz2_publisher: rebuild the marker arrays only when the underlying data changed (POIs, routes, highlights, display parameters), republishing the cached arrays with a refreshed stamp on unchanged ticks — the 1 Hz republish itself is kept so late-joiningvolatilesubscribers still receive markers — and skip the tick entirely while both marker topics have zero subscribers (#402).
0.5.0 (2026-07-10)
- Add the
request_initial_poseservice onmapoi_serveras the sole writer ofmapoi/initialpose_poi; other nodes request a publish instead of publishing directly, unifying the latched cache (#211). - Reject
request_initial_posewhen a non-emptymap_namedoes not match the server's current map, closing the stale-initial-pose map-switch race (#299). - Optionally persist and restore the last-selected map across a
restart via the new
state_pathparameter (default empty = disabled), avoiding a teleport to the launch-parameter map's POI (#297). - Validate the
select_mapservicemap_nameas a single path segment, rejecting path-traversal config loads (#328). - Namespace all eight
mapoi_serverservices undermapoi/(e.g.get_pois_info->mapoi/get_pois_info); no compatibility alias (#341). - Return
success=falsefromget_route_pois(GetRoutePois) for an unknown route instead of silently returning empty lists;mapoi_nav2_bridge/mapoi_rviz2_publishercheckresponse.success(#342). - Add
waypoint_arrival_modeparameter ("nav2"default /"mapoi") onmapoi_nav2_bridge;"mapoi"sends per-waypointNavigateToPosegoals and advances on tolerance match (#243, #259, #260, #261, #263, #264, #265, #266). - Add topic
mapoi/nav/command_rejected(std_msgs/String) onmapoi_nav2_bridgeas an unconditional rejected-command event, independent of the latchedmapoi/nav/status(#354). - Add
auto_resume_timeout_secparameter (default0.0= disabled) onmapoi_nav2_bridgeto auto-resume a paused route after a timeout (#231, #232). - Publish
rejected:<target>onmapoi/nav/statusfor commands rejected while idle (unknown goal/route, landmark-as-goal, service not ready) so operators can see they were ignored (#339, #355, #352, #356). - Fix Jazzy
EVENT_PAUSEDno longer firing by adding acmd_vel_msg_typeparameter (default"auto") that selectsTwistvsTwistStampedfromROS_DISTRO(#249). - Narrow
PoiEventpublishing toROUTEnavigation only (waypoints/landmarks on the active route), removeEVENT_STOPPED/EVENT_RESUMED, addEVENT_PAUSEDfiring on a realcmd_veldwell (#220, #227). - Render a yaw-agnostic POI tolerance (
tolerance.yaw >= pi) as a filled disc inmapoi_rviz2_publisherinstead of omitting the sector (#267, #268, #271). - Split
mapoi_nav2_bridge.cpp(1,712 lines) into five translation units (route / goal / map-switch / backend-status / core) compiling into one executable; internal refactor, no behavior change (#345).
0.4.0 (2026-05-08)
- Rename the Nav2 bridge node from
mapoi_nav_servertomapoi_nav2_bridge(executable, node, C++ class, header, and thewith_nav_server->with_nav2_bridgelaunch arg); no compatibility alias (#204). - Split the AMCL adapter out of the bridge into a new
mapoi_amcl_localization_bridgeexecutable; theinitialpose_*parameters and/initialposepublishing move to it, and it publishesLocalizationBackendStatus(#209). - Hardcode the system tag definitions in
system_tags.hpp(mapoi::kSystemTags) and remove themaps/tag_definitions.yamlfile /maps/directory;get_tag_definitionscontract unchanged (#191). - Publish
NavigationBackendStatusat 1 Hz onmapoi/nav/backend_status(transient_localQoS) as the navigation readiness contract (#198). - Use
MANUAL_BY_TOPICliveliness (5 s lease) on bothbackend_statustopics so consumers detect bridge death; reject infinite-lease publishers via QoS incompatibility (#208). - Keep the 1 Hz
backend_statuspublish running during blockingLoadMapcalls by moving the timer to a separate callback group under aMultiThreadedExecutor(#213). -
mapoi_gazebo_bridge: fix AMCL drift on operator map switch by teleporting via Gazebo Classicdelete_entity+spawn_entityto the first non-landmark POI (#91, #200). - Add CLI launch examples and
maps_path/map_nameargument semantics tomapoi_server/README.md(#172).
0.3.0 (2026-05-02)
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| mapoi | |
| mapoi_turtlebot3_example | |
| mapoi_webui |
Launch files
Messages
Services
Plugins
Recent questions tagged mapoi_server at Robotics Stack Exchange
|
mapoi_server package from mapoi repomapoi mapoi_interfaces mapoi_rviz_plugins mapoi_server mapoi_turtlebot3_example mapoi_webui |
ROS Distro
|
Package Summary
| Version | 0.6.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/shimz-robotics/mapoi.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-07-15 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Shunsuke Kimura
Authors
- Shunsuke Kimura
mapoi_server
English version (primary): README.md 本ファイルは日本語スナップショットです。最新の内容は英語版を参照してください。
mapoi のメインパッケージです。 地図と POI の情報を管理し、他のパッケージにサービスとして提供します。また、POI 名を指定した自律走行やPOI半径イベントの検知を行います。
自分のロボットへの組み込み方
4 つの core node (mapoi_server / mapoi_nav2_bridge / mapoi_amcl_localization_bridge / mapoi_rviz2_publisher) と、必要に応じてシミュレータ連動 bridge をまとめて起動する bringup launch を提供しています。自前の launch から以下のように include してください:
- include:
file: "$(find-pkg-share mapoi_server)/launch/mapoi_bringup.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"} # REQUIRED
- {name: map_name, value: "initial_map_name"} # REQUIRED
- {name: config_file, value: "mapoi_config.yaml"} # optional
- {name: state_path, value: "/var/lib/mapoi"} # optional (実機運用では推奨、#297)
- {name: simulator, value: "none"} # gazebo|gz|none (default: none)
- {name: robot_entity_name, value: "burger"} # simulator=gazebo|gz のとき必要
- {name: robot_sdf_path, value: "/path/.../model.sdf"} # simulator=gazebo のとき必要
- {name: init_world_name, value: "default"} # simulator=gz のとき必要 (gz_sim 起動時の world 名)
maps_path と map_name は 必須 です。maps_path 未指定 / 存在しないパス / ディレクトリでない場合は RCLCPP_FATAL ログ + 終了コード 1 で起動失敗します (#163)。mapoi_turtlebot3_example の sample を流用するなら $(find-pkg-share mapoi_turtlebot3_example)/maps を指定してください。
CLI から直接起動する例
include せず ros2 launch を直接叩く場合の最小例:
# mapoi_turtlebot3_example の sample maps を流用 (apt / 配布 install 後にも動く)
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(ros2 pkg prefix --share mapoi_turtlebot3_example)/maps \
map_name:=turtlebot3_world
# ソースツリーから直接 (ros2_ws 内で source 後)
# 注: 本 repo を `<ws>/src/mapoi/` に clone している前提 (ws 直下で `git clone .../mapoi.git src/mapoi`)。
# パッケージを `<ws>/src/mapoi_turtlebot3_example/` のようにフラット展開している場合は
# パスを調整するか、上の `pkg prefix --share` 形式を使う方が確実。
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(pwd)/src/mapoi/mapoi_turtlebot3_example/maps \
map_name:=turtlebot3_dqn_stage1
引数の取り違え注意
各 launch arg のセマンティクスは以下のとおり ({maps_path}/{map_name}/{config_file} でアクセスする 3 レベルの分割):
| arg | 渡すもの | 例 |
|---|---|---|
maps_path |
地図群を束ねる親ディレクトリ (各地図は配下のサブディレクトリ) | /path/to/maps |
map_name |
maps_path 直下の地図サブディレクトリ名 |
turtlebot3_world |
config_file |
地図サブディレクトリ内の設定ファイル名 (default: mapoi_config.yaml) |
mapoi_config.yaml |
実際にロードされるパスは {maps_path}/{map_name}/{config_file} で、上記例なら /path/to/maps/turtlebot3_world/mapoi_config.yaml となります。
maps_path / map_name 必須 (上節参照) の検証は 2 段階: map_name 自体未指定なら ros2 launch が Required launch argument 'map_name' was not provided で fail (node 起動前 / launch system 側)、maps_path がディレクトリでない等のセマンティクス違反は mapoi_server ノード起動時に RCLCPP_FATAL で fail します。
❌ よくある間違い: maps_path に config.yaml ファイルパスを直接指定 してしまう:
# WRONG: maps_path はファイルではなくディレクトリ
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=./maps/turtlebot3_dqn_stage1/mapoi_config.yaml \
map_name:=turtlebot3_dqn_stage1
→ 起動時に mapoi_server ノードが以下を 1 行で出力して FATAL 終了します (mapoi_server.cpp 内の RCLCPP_FATAL の実ログ文字列そのまま・英日混在):
[FATAL] maps_path '...mapoi_config.yaml' does not exist or is not a directory. 正しい maps ディレクトリ path を指定してください (例: $(find-pkg-share mapoi_turtlebot3_example)/maps)。
maps_path は 地図群を束ねる親ディレクトリ で、特定の地図ディレクトリやファイルではありません。ディレクトリ構成は本 README 末尾の ディレクトリ構成 節を参照してください。
simulator arg はシミュレータ連動 bridge の起動を制御します:
-
gazebo(Gazebo Classic / Humble):mapoi_gazebo_bridgeを起動。operator map switch 時に Gazebo 内のworld_modelentity を入れ替え + ロボットを delete + spawn で POI list 先頭 の座標に再生成 (#144 で旧initial_posesystem tag を廃止し、yaml 順序で表現する semantics に変更) -
gz(gz-sim / Jazzy):mapoi_gz_bridge+parameter_bridge(ros_gz_bridge) を起動。operator map switch 時に gz-sim 内のworld_modelentity を入れ替え + ロボットをSetEntityPoseで POI list 先頭 の座標に teleport (gz-sim では Classic と異なり set_pose service が使えるため delete + spawn は不要) -
none(default): bridge 起動なし (実機運用)
Web UI も使う場合は mapoi_webui.launch.yaml も併せて include:
- include:
file: "$(find-pkg-share mapoi_webui)/launch/mapoi_webui.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"}
- {name: map_name, value: "initial_map_name"}
NOTE:
mapoi_webuiはシステムタグをmapoi_serverのmapoi/get_tag_definitionsservice 経由で取得します。mapoi_webui単体を起動しても system tags の表示は service 通信になるため、mapoi_serverの package install 自体は不要 (ただし service responder としてmapoi_serverノードが起動している必要あり)。
TurtleBot3 を使った動作例は mapoi_turtlebot3_example パッケージを参照してください。
ノード
mapoi_server
File truncated at 100 lines see the full file
Changelog for package mapoi_server
This per-package file lists only the changes affecting mapoi_server
(including its mapoi_nav2_bridge / mapoi_amcl_localization_bridge /
mapoi_rviz2_publisher / mapoi_gazebo_bridge / mapoi_gz_bridge
nodes), in the flat format expected by bloom / buildfarm. Full
project-level narrative: root CHANGELOG.rst / the GitHub Releases
page.
Forthcoming
0.6.0 (2026-07-15)
-
mapoi_rviz2_publisher: rebuild the marker arrays only when the underlying data changed (POIs, routes, highlights, display parameters), republishing the cached arrays with a refreshed stamp on unchanged ticks — the 1 Hz republish itself is kept so late-joiningvolatilesubscribers still receive markers — and skip the tick entirely while both marker topics have zero subscribers (#402).
0.5.0 (2026-07-10)
- Add the
request_initial_poseservice onmapoi_serveras the sole writer ofmapoi/initialpose_poi; other nodes request a publish instead of publishing directly, unifying the latched cache (#211). - Reject
request_initial_posewhen a non-emptymap_namedoes not match the server's current map, closing the stale-initial-pose map-switch race (#299). - Optionally persist and restore the last-selected map across a
restart via the new
state_pathparameter (default empty = disabled), avoiding a teleport to the launch-parameter map's POI (#297). - Validate the
select_mapservicemap_nameas a single path segment, rejecting path-traversal config loads (#328). - Namespace all eight
mapoi_serverservices undermapoi/(e.g.get_pois_info->mapoi/get_pois_info); no compatibility alias (#341). - Return
success=falsefromget_route_pois(GetRoutePois) for an unknown route instead of silently returning empty lists;mapoi_nav2_bridge/mapoi_rviz2_publishercheckresponse.success(#342). - Add
waypoint_arrival_modeparameter ("nav2"default /"mapoi") onmapoi_nav2_bridge;"mapoi"sends per-waypointNavigateToPosegoals and advances on tolerance match (#243, #259, #260, #261, #263, #264, #265, #266). - Add topic
mapoi/nav/command_rejected(std_msgs/String) onmapoi_nav2_bridgeas an unconditional rejected-command event, independent of the latchedmapoi/nav/status(#354). - Add
auto_resume_timeout_secparameter (default0.0= disabled) onmapoi_nav2_bridgeto auto-resume a paused route after a timeout (#231, #232). - Publish
rejected:<target>onmapoi/nav/statusfor commands rejected while idle (unknown goal/route, landmark-as-goal, service not ready) so operators can see they were ignored (#339, #355, #352, #356). - Fix Jazzy
EVENT_PAUSEDno longer firing by adding acmd_vel_msg_typeparameter (default"auto") that selectsTwistvsTwistStampedfromROS_DISTRO(#249). - Narrow
PoiEventpublishing toROUTEnavigation only (waypoints/landmarks on the active route), removeEVENT_STOPPED/EVENT_RESUMED, addEVENT_PAUSEDfiring on a realcmd_veldwell (#220, #227). - Render a yaw-agnostic POI tolerance (
tolerance.yaw >= pi) as a filled disc inmapoi_rviz2_publisherinstead of omitting the sector (#267, #268, #271). - Split
mapoi_nav2_bridge.cpp(1,712 lines) into five translation units (route / goal / map-switch / backend-status / core) compiling into one executable; internal refactor, no behavior change (#345).
0.4.0 (2026-05-08)
- Rename the Nav2 bridge node from
mapoi_nav_servertomapoi_nav2_bridge(executable, node, C++ class, header, and thewith_nav_server->with_nav2_bridgelaunch arg); no compatibility alias (#204). - Split the AMCL adapter out of the bridge into a new
mapoi_amcl_localization_bridgeexecutable; theinitialpose_*parameters and/initialposepublishing move to it, and it publishesLocalizationBackendStatus(#209). - Hardcode the system tag definitions in
system_tags.hpp(mapoi::kSystemTags) and remove themaps/tag_definitions.yamlfile /maps/directory;get_tag_definitionscontract unchanged (#191). - Publish
NavigationBackendStatusat 1 Hz onmapoi/nav/backend_status(transient_localQoS) as the navigation readiness contract (#198). - Use
MANUAL_BY_TOPICliveliness (5 s lease) on bothbackend_statustopics so consumers detect bridge death; reject infinite-lease publishers via QoS incompatibility (#208). - Keep the 1 Hz
backend_statuspublish running during blockingLoadMapcalls by moving the timer to a separate callback group under aMultiThreadedExecutor(#213). -
mapoi_gazebo_bridge: fix AMCL drift on operator map switch by teleporting via Gazebo Classicdelete_entity+spawn_entityto the first non-landmark POI (#91, #200). - Add CLI launch examples and
maps_path/map_nameargument semantics tomapoi_server/README.md(#172).
0.3.0 (2026-05-02)
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| mapoi | |
| mapoi_turtlebot3_example | |
| mapoi_webui |
Launch files
Messages
Services
Plugins
Recent questions tagged mapoi_server at Robotics Stack Exchange
|
mapoi_server package from mapoi repomapoi mapoi_interfaces mapoi_rviz_plugins mapoi_server mapoi_turtlebot3_example mapoi_webui |
ROS Distro
|
Package Summary
| Version | 0.6.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/shimz-robotics/mapoi.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-07-15 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Shunsuke Kimura
Authors
- Shunsuke Kimura
mapoi_server
English version (primary): README.md 本ファイルは日本語スナップショットです。最新の内容は英語版を参照してください。
mapoi のメインパッケージです。 地図と POI の情報を管理し、他のパッケージにサービスとして提供します。また、POI 名を指定した自律走行やPOI半径イベントの検知を行います。
自分のロボットへの組み込み方
4 つの core node (mapoi_server / mapoi_nav2_bridge / mapoi_amcl_localization_bridge / mapoi_rviz2_publisher) と、必要に応じてシミュレータ連動 bridge をまとめて起動する bringup launch を提供しています。自前の launch から以下のように include してください:
- include:
file: "$(find-pkg-share mapoi_server)/launch/mapoi_bringup.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"} # REQUIRED
- {name: map_name, value: "initial_map_name"} # REQUIRED
- {name: config_file, value: "mapoi_config.yaml"} # optional
- {name: state_path, value: "/var/lib/mapoi"} # optional (実機運用では推奨、#297)
- {name: simulator, value: "none"} # gazebo|gz|none (default: none)
- {name: robot_entity_name, value: "burger"} # simulator=gazebo|gz のとき必要
- {name: robot_sdf_path, value: "/path/.../model.sdf"} # simulator=gazebo のとき必要
- {name: init_world_name, value: "default"} # simulator=gz のとき必要 (gz_sim 起動時の world 名)
maps_path と map_name は 必須 です。maps_path 未指定 / 存在しないパス / ディレクトリでない場合は RCLCPP_FATAL ログ + 終了コード 1 で起動失敗します (#163)。mapoi_turtlebot3_example の sample を流用するなら $(find-pkg-share mapoi_turtlebot3_example)/maps を指定してください。
CLI から直接起動する例
include せず ros2 launch を直接叩く場合の最小例:
# mapoi_turtlebot3_example の sample maps を流用 (apt / 配布 install 後にも動く)
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(ros2 pkg prefix --share mapoi_turtlebot3_example)/maps \
map_name:=turtlebot3_world
# ソースツリーから直接 (ros2_ws 内で source 後)
# 注: 本 repo を `<ws>/src/mapoi/` に clone している前提 (ws 直下で `git clone .../mapoi.git src/mapoi`)。
# パッケージを `<ws>/src/mapoi_turtlebot3_example/` のようにフラット展開している場合は
# パスを調整するか、上の `pkg prefix --share` 形式を使う方が確実。
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(pwd)/src/mapoi/mapoi_turtlebot3_example/maps \
map_name:=turtlebot3_dqn_stage1
引数の取り違え注意
各 launch arg のセマンティクスは以下のとおり ({maps_path}/{map_name}/{config_file} でアクセスする 3 レベルの分割):
| arg | 渡すもの | 例 |
|---|---|---|
maps_path |
地図群を束ねる親ディレクトリ (各地図は配下のサブディレクトリ) | /path/to/maps |
map_name |
maps_path 直下の地図サブディレクトリ名 |
turtlebot3_world |
config_file |
地図サブディレクトリ内の設定ファイル名 (default: mapoi_config.yaml) |
mapoi_config.yaml |
実際にロードされるパスは {maps_path}/{map_name}/{config_file} で、上記例なら /path/to/maps/turtlebot3_world/mapoi_config.yaml となります。
maps_path / map_name 必須 (上節参照) の検証は 2 段階: map_name 自体未指定なら ros2 launch が Required launch argument 'map_name' was not provided で fail (node 起動前 / launch system 側)、maps_path がディレクトリでない等のセマンティクス違反は mapoi_server ノード起動時に RCLCPP_FATAL で fail します。
❌ よくある間違い: maps_path に config.yaml ファイルパスを直接指定 してしまう:
# WRONG: maps_path はファイルではなくディレクトリ
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=./maps/turtlebot3_dqn_stage1/mapoi_config.yaml \
map_name:=turtlebot3_dqn_stage1
→ 起動時に mapoi_server ノードが以下を 1 行で出力して FATAL 終了します (mapoi_server.cpp 内の RCLCPP_FATAL の実ログ文字列そのまま・英日混在):
[FATAL] maps_path '...mapoi_config.yaml' does not exist or is not a directory. 正しい maps ディレクトリ path を指定してください (例: $(find-pkg-share mapoi_turtlebot3_example)/maps)。
maps_path は 地図群を束ねる親ディレクトリ で、特定の地図ディレクトリやファイルではありません。ディレクトリ構成は本 README 末尾の ディレクトリ構成 節を参照してください。
simulator arg はシミュレータ連動 bridge の起動を制御します:
-
gazebo(Gazebo Classic / Humble):mapoi_gazebo_bridgeを起動。operator map switch 時に Gazebo 内のworld_modelentity を入れ替え + ロボットを delete + spawn で POI list 先頭 の座標に再生成 (#144 で旧initial_posesystem tag を廃止し、yaml 順序で表現する semantics に変更) -
gz(gz-sim / Jazzy):mapoi_gz_bridge+parameter_bridge(ros_gz_bridge) を起動。operator map switch 時に gz-sim 内のworld_modelentity を入れ替え + ロボットをSetEntityPoseで POI list 先頭 の座標に teleport (gz-sim では Classic と異なり set_pose service が使えるため delete + spawn は不要) -
none(default): bridge 起動なし (実機運用)
Web UI も使う場合は mapoi_webui.launch.yaml も併せて include:
- include:
file: "$(find-pkg-share mapoi_webui)/launch/mapoi_webui.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"}
- {name: map_name, value: "initial_map_name"}
NOTE:
mapoi_webuiはシステムタグをmapoi_serverのmapoi/get_tag_definitionsservice 経由で取得します。mapoi_webui単体を起動しても system tags の表示は service 通信になるため、mapoi_serverの package install 自体は不要 (ただし service responder としてmapoi_serverノードが起動している必要あり)。
TurtleBot3 を使った動作例は mapoi_turtlebot3_example パッケージを参照してください。
ノード
mapoi_server
File truncated at 100 lines see the full file
Changelog for package mapoi_server
This per-package file lists only the changes affecting mapoi_server
(including its mapoi_nav2_bridge / mapoi_amcl_localization_bridge /
mapoi_rviz2_publisher / mapoi_gazebo_bridge / mapoi_gz_bridge
nodes), in the flat format expected by bloom / buildfarm. Full
project-level narrative: root CHANGELOG.rst / the GitHub Releases
page.
Forthcoming
0.6.0 (2026-07-15)
-
mapoi_rviz2_publisher: rebuild the marker arrays only when the underlying data changed (POIs, routes, highlights, display parameters), republishing the cached arrays with a refreshed stamp on unchanged ticks — the 1 Hz republish itself is kept so late-joiningvolatilesubscribers still receive markers — and skip the tick entirely while both marker topics have zero subscribers (#402).
0.5.0 (2026-07-10)
- Add the
request_initial_poseservice onmapoi_serveras the sole writer ofmapoi/initialpose_poi; other nodes request a publish instead of publishing directly, unifying the latched cache (#211). - Reject
request_initial_posewhen a non-emptymap_namedoes not match the server's current map, closing the stale-initial-pose map-switch race (#299). - Optionally persist and restore the last-selected map across a
restart via the new
state_pathparameter (default empty = disabled), avoiding a teleport to the launch-parameter map's POI (#297). - Validate the
select_mapservicemap_nameas a single path segment, rejecting path-traversal config loads (#328). - Namespace all eight
mapoi_serverservices undermapoi/(e.g.get_pois_info->mapoi/get_pois_info); no compatibility alias (#341). - Return
success=falsefromget_route_pois(GetRoutePois) for an unknown route instead of silently returning empty lists;mapoi_nav2_bridge/mapoi_rviz2_publishercheckresponse.success(#342). - Add
waypoint_arrival_modeparameter ("nav2"default /"mapoi") onmapoi_nav2_bridge;"mapoi"sends per-waypointNavigateToPosegoals and advances on tolerance match (#243, #259, #260, #261, #263, #264, #265, #266). - Add topic
mapoi/nav/command_rejected(std_msgs/String) onmapoi_nav2_bridgeas an unconditional rejected-command event, independent of the latchedmapoi/nav/status(#354). - Add
auto_resume_timeout_secparameter (default0.0= disabled) onmapoi_nav2_bridgeto auto-resume a paused route after a timeout (#231, #232). - Publish
rejected:<target>onmapoi/nav/statusfor commands rejected while idle (unknown goal/route, landmark-as-goal, service not ready) so operators can see they were ignored (#339, #355, #352, #356). - Fix Jazzy
EVENT_PAUSEDno longer firing by adding acmd_vel_msg_typeparameter (default"auto") that selectsTwistvsTwistStampedfromROS_DISTRO(#249). - Narrow
PoiEventpublishing toROUTEnavigation only (waypoints/landmarks on the active route), removeEVENT_STOPPED/EVENT_RESUMED, addEVENT_PAUSEDfiring on a realcmd_veldwell (#220, #227). - Render a yaw-agnostic POI tolerance (
tolerance.yaw >= pi) as a filled disc inmapoi_rviz2_publisherinstead of omitting the sector (#267, #268, #271). - Split
mapoi_nav2_bridge.cpp(1,712 lines) into five translation units (route / goal / map-switch / backend-status / core) compiling into one executable; internal refactor, no behavior change (#345).
0.4.0 (2026-05-08)
- Rename the Nav2 bridge node from
mapoi_nav_servertomapoi_nav2_bridge(executable, node, C++ class, header, and thewith_nav_server->with_nav2_bridgelaunch arg); no compatibility alias (#204). - Split the AMCL adapter out of the bridge into a new
mapoi_amcl_localization_bridgeexecutable; theinitialpose_*parameters and/initialposepublishing move to it, and it publishesLocalizationBackendStatus(#209). - Hardcode the system tag definitions in
system_tags.hpp(mapoi::kSystemTags) and remove themaps/tag_definitions.yamlfile /maps/directory;get_tag_definitionscontract unchanged (#191). - Publish
NavigationBackendStatusat 1 Hz onmapoi/nav/backend_status(transient_localQoS) as the navigation readiness contract (#198). - Use
MANUAL_BY_TOPICliveliness (5 s lease) on bothbackend_statustopics so consumers detect bridge death; reject infinite-lease publishers via QoS incompatibility (#208). - Keep the 1 Hz
backend_statuspublish running during blockingLoadMapcalls by moving the timer to a separate callback group under aMultiThreadedExecutor(#213). -
mapoi_gazebo_bridge: fix AMCL drift on operator map switch by teleporting via Gazebo Classicdelete_entity+spawn_entityto the first non-landmark POI (#91, #200). - Add CLI launch examples and
maps_path/map_nameargument semantics tomapoi_server/README.md(#172).
0.3.0 (2026-05-02)
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| mapoi | |
| mapoi_turtlebot3_example | |
| mapoi_webui |
Launch files
Messages
Services
Plugins
Recent questions tagged mapoi_server at Robotics Stack Exchange
|
mapoi_server package from mapoi repomapoi mapoi_interfaces mapoi_rviz_plugins mapoi_server mapoi_turtlebot3_example mapoi_webui |
ROS Distro
|
Package Summary
| Version | 0.6.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/shimz-robotics/mapoi.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-07-15 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Shunsuke Kimura
Authors
- Shunsuke Kimura
mapoi_server
English version (primary): README.md 本ファイルは日本語スナップショットです。最新の内容は英語版を参照してください。
mapoi のメインパッケージです。 地図と POI の情報を管理し、他のパッケージにサービスとして提供します。また、POI 名を指定した自律走行やPOI半径イベントの検知を行います。
自分のロボットへの組み込み方
4 つの core node (mapoi_server / mapoi_nav2_bridge / mapoi_amcl_localization_bridge / mapoi_rviz2_publisher) と、必要に応じてシミュレータ連動 bridge をまとめて起動する bringup launch を提供しています。自前の launch から以下のように include してください:
- include:
file: "$(find-pkg-share mapoi_server)/launch/mapoi_bringup.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"} # REQUIRED
- {name: map_name, value: "initial_map_name"} # REQUIRED
- {name: config_file, value: "mapoi_config.yaml"} # optional
- {name: state_path, value: "/var/lib/mapoi"} # optional (実機運用では推奨、#297)
- {name: simulator, value: "none"} # gazebo|gz|none (default: none)
- {name: robot_entity_name, value: "burger"} # simulator=gazebo|gz のとき必要
- {name: robot_sdf_path, value: "/path/.../model.sdf"} # simulator=gazebo のとき必要
- {name: init_world_name, value: "default"} # simulator=gz のとき必要 (gz_sim 起動時の world 名)
maps_path と map_name は 必須 です。maps_path 未指定 / 存在しないパス / ディレクトリでない場合は RCLCPP_FATAL ログ + 終了コード 1 で起動失敗します (#163)。mapoi_turtlebot3_example の sample を流用するなら $(find-pkg-share mapoi_turtlebot3_example)/maps を指定してください。
CLI から直接起動する例
include せず ros2 launch を直接叩く場合の最小例:
# mapoi_turtlebot3_example の sample maps を流用 (apt / 配布 install 後にも動く)
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(ros2 pkg prefix --share mapoi_turtlebot3_example)/maps \
map_name:=turtlebot3_world
# ソースツリーから直接 (ros2_ws 内で source 後)
# 注: 本 repo を `<ws>/src/mapoi/` に clone している前提 (ws 直下で `git clone .../mapoi.git src/mapoi`)。
# パッケージを `<ws>/src/mapoi_turtlebot3_example/` のようにフラット展開している場合は
# パスを調整するか、上の `pkg prefix --share` 形式を使う方が確実。
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(pwd)/src/mapoi/mapoi_turtlebot3_example/maps \
map_name:=turtlebot3_dqn_stage1
引数の取り違え注意
各 launch arg のセマンティクスは以下のとおり ({maps_path}/{map_name}/{config_file} でアクセスする 3 レベルの分割):
| arg | 渡すもの | 例 |
|---|---|---|
maps_path |
地図群を束ねる親ディレクトリ (各地図は配下のサブディレクトリ) | /path/to/maps |
map_name |
maps_path 直下の地図サブディレクトリ名 |
turtlebot3_world |
config_file |
地図サブディレクトリ内の設定ファイル名 (default: mapoi_config.yaml) |
mapoi_config.yaml |
実際にロードされるパスは {maps_path}/{map_name}/{config_file} で、上記例なら /path/to/maps/turtlebot3_world/mapoi_config.yaml となります。
maps_path / map_name 必須 (上節参照) の検証は 2 段階: map_name 自体未指定なら ros2 launch が Required launch argument 'map_name' was not provided で fail (node 起動前 / launch system 側)、maps_path がディレクトリでない等のセマンティクス違反は mapoi_server ノード起動時に RCLCPP_FATAL で fail します。
❌ よくある間違い: maps_path に config.yaml ファイルパスを直接指定 してしまう:
# WRONG: maps_path はファイルではなくディレクトリ
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=./maps/turtlebot3_dqn_stage1/mapoi_config.yaml \
map_name:=turtlebot3_dqn_stage1
→ 起動時に mapoi_server ノードが以下を 1 行で出力して FATAL 終了します (mapoi_server.cpp 内の RCLCPP_FATAL の実ログ文字列そのまま・英日混在):
[FATAL] maps_path '...mapoi_config.yaml' does not exist or is not a directory. 正しい maps ディレクトリ path を指定してください (例: $(find-pkg-share mapoi_turtlebot3_example)/maps)。
maps_path は 地図群を束ねる親ディレクトリ で、特定の地図ディレクトリやファイルではありません。ディレクトリ構成は本 README 末尾の ディレクトリ構成 節を参照してください。
simulator arg はシミュレータ連動 bridge の起動を制御します:
-
gazebo(Gazebo Classic / Humble):mapoi_gazebo_bridgeを起動。operator map switch 時に Gazebo 内のworld_modelentity を入れ替え + ロボットを delete + spawn で POI list 先頭 の座標に再生成 (#144 で旧initial_posesystem tag を廃止し、yaml 順序で表現する semantics に変更) -
gz(gz-sim / Jazzy):mapoi_gz_bridge+parameter_bridge(ros_gz_bridge) を起動。operator map switch 時に gz-sim 内のworld_modelentity を入れ替え + ロボットをSetEntityPoseで POI list 先頭 の座標に teleport (gz-sim では Classic と異なり set_pose service が使えるため delete + spawn は不要) -
none(default): bridge 起動なし (実機運用)
Web UI も使う場合は mapoi_webui.launch.yaml も併せて include:
- include:
file: "$(find-pkg-share mapoi_webui)/launch/mapoi_webui.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"}
- {name: map_name, value: "initial_map_name"}
NOTE:
mapoi_webuiはシステムタグをmapoi_serverのmapoi/get_tag_definitionsservice 経由で取得します。mapoi_webui単体を起動しても system tags の表示は service 通信になるため、mapoi_serverの package install 自体は不要 (ただし service responder としてmapoi_serverノードが起動している必要あり)。
TurtleBot3 を使った動作例は mapoi_turtlebot3_example パッケージを参照してください。
ノード
mapoi_server
File truncated at 100 lines see the full file
Changelog for package mapoi_server
This per-package file lists only the changes affecting mapoi_server
(including its mapoi_nav2_bridge / mapoi_amcl_localization_bridge /
mapoi_rviz2_publisher / mapoi_gazebo_bridge / mapoi_gz_bridge
nodes), in the flat format expected by bloom / buildfarm. Full
project-level narrative: root CHANGELOG.rst / the GitHub Releases
page.
Forthcoming
0.6.0 (2026-07-15)
-
mapoi_rviz2_publisher: rebuild the marker arrays only when the underlying data changed (POIs, routes, highlights, display parameters), republishing the cached arrays with a refreshed stamp on unchanged ticks — the 1 Hz republish itself is kept so late-joiningvolatilesubscribers still receive markers — and skip the tick entirely while both marker topics have zero subscribers (#402).
0.5.0 (2026-07-10)
- Add the
request_initial_poseservice onmapoi_serveras the sole writer ofmapoi/initialpose_poi; other nodes request a publish instead of publishing directly, unifying the latched cache (#211). - Reject
request_initial_posewhen a non-emptymap_namedoes not match the server's current map, closing the stale-initial-pose map-switch race (#299). - Optionally persist and restore the last-selected map across a
restart via the new
state_pathparameter (default empty = disabled), avoiding a teleport to the launch-parameter map's POI (#297). - Validate the
select_mapservicemap_nameas a single path segment, rejecting path-traversal config loads (#328). - Namespace all eight
mapoi_serverservices undermapoi/(e.g.get_pois_info->mapoi/get_pois_info); no compatibility alias (#341). - Return
success=falsefromget_route_pois(GetRoutePois) for an unknown route instead of silently returning empty lists;mapoi_nav2_bridge/mapoi_rviz2_publishercheckresponse.success(#342). - Add
waypoint_arrival_modeparameter ("nav2"default /"mapoi") onmapoi_nav2_bridge;"mapoi"sends per-waypointNavigateToPosegoals and advances on tolerance match (#243, #259, #260, #261, #263, #264, #265, #266). - Add topic
mapoi/nav/command_rejected(std_msgs/String) onmapoi_nav2_bridgeas an unconditional rejected-command event, independent of the latchedmapoi/nav/status(#354). - Add
auto_resume_timeout_secparameter (default0.0= disabled) onmapoi_nav2_bridgeto auto-resume a paused route after a timeout (#231, #232). - Publish
rejected:<target>onmapoi/nav/statusfor commands rejected while idle (unknown goal/route, landmark-as-goal, service not ready) so operators can see they were ignored (#339, #355, #352, #356). - Fix Jazzy
EVENT_PAUSEDno longer firing by adding acmd_vel_msg_typeparameter (default"auto") that selectsTwistvsTwistStampedfromROS_DISTRO(#249). - Narrow
PoiEventpublishing toROUTEnavigation only (waypoints/landmarks on the active route), removeEVENT_STOPPED/EVENT_RESUMED, addEVENT_PAUSEDfiring on a realcmd_veldwell (#220, #227). - Render a yaw-agnostic POI tolerance (
tolerance.yaw >= pi) as a filled disc inmapoi_rviz2_publisherinstead of omitting the sector (#267, #268, #271). - Split
mapoi_nav2_bridge.cpp(1,712 lines) into five translation units (route / goal / map-switch / backend-status / core) compiling into one executable; internal refactor, no behavior change (#345).
0.4.0 (2026-05-08)
- Rename the Nav2 bridge node from
mapoi_nav_servertomapoi_nav2_bridge(executable, node, C++ class, header, and thewith_nav_server->with_nav2_bridgelaunch arg); no compatibility alias (#204). - Split the AMCL adapter out of the bridge into a new
mapoi_amcl_localization_bridgeexecutable; theinitialpose_*parameters and/initialposepublishing move to it, and it publishesLocalizationBackendStatus(#209). - Hardcode the system tag definitions in
system_tags.hpp(mapoi::kSystemTags) and remove themaps/tag_definitions.yamlfile /maps/directory;get_tag_definitionscontract unchanged (#191). - Publish
NavigationBackendStatusat 1 Hz onmapoi/nav/backend_status(transient_localQoS) as the navigation readiness contract (#198). - Use
MANUAL_BY_TOPICliveliness (5 s lease) on bothbackend_statustopics so consumers detect bridge death; reject infinite-lease publishers via QoS incompatibility (#208). - Keep the 1 Hz
backend_statuspublish running during blockingLoadMapcalls by moving the timer to a separate callback group under aMultiThreadedExecutor(#213). -
mapoi_gazebo_bridge: fix AMCL drift on operator map switch by teleporting via Gazebo Classicdelete_entity+spawn_entityto the first non-landmark POI (#91, #200). - Add CLI launch examples and
maps_path/map_nameargument semantics tomapoi_server/README.md(#172).
0.3.0 (2026-05-02)
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| mapoi | |
| mapoi_turtlebot3_example | |
| mapoi_webui |
Launch files
Messages
Services
Plugins
Recent questions tagged mapoi_server at Robotics Stack Exchange
|
mapoi_server package from mapoi repomapoi mapoi_interfaces mapoi_rviz_plugins mapoi_server mapoi_turtlebot3_example mapoi_webui |
ROS Distro
|
Package Summary
| Version | 0.6.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/shimz-robotics/mapoi.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-07-15 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Shunsuke Kimura
Authors
- Shunsuke Kimura
mapoi_server
English version (primary): README.md 本ファイルは日本語スナップショットです。最新の内容は英語版を参照してください。
mapoi のメインパッケージです。 地図と POI の情報を管理し、他のパッケージにサービスとして提供します。また、POI 名を指定した自律走行やPOI半径イベントの検知を行います。
自分のロボットへの組み込み方
4 つの core node (mapoi_server / mapoi_nav2_bridge / mapoi_amcl_localization_bridge / mapoi_rviz2_publisher) と、必要に応じてシミュレータ連動 bridge をまとめて起動する bringup launch を提供しています。自前の launch から以下のように include してください:
- include:
file: "$(find-pkg-share mapoi_server)/launch/mapoi_bringup.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"} # REQUIRED
- {name: map_name, value: "initial_map_name"} # REQUIRED
- {name: config_file, value: "mapoi_config.yaml"} # optional
- {name: state_path, value: "/var/lib/mapoi"} # optional (実機運用では推奨、#297)
- {name: simulator, value: "none"} # gazebo|gz|none (default: none)
- {name: robot_entity_name, value: "burger"} # simulator=gazebo|gz のとき必要
- {name: robot_sdf_path, value: "/path/.../model.sdf"} # simulator=gazebo のとき必要
- {name: init_world_name, value: "default"} # simulator=gz のとき必要 (gz_sim 起動時の world 名)
maps_path と map_name は 必須 です。maps_path 未指定 / 存在しないパス / ディレクトリでない場合は RCLCPP_FATAL ログ + 終了コード 1 で起動失敗します (#163)。mapoi_turtlebot3_example の sample を流用するなら $(find-pkg-share mapoi_turtlebot3_example)/maps を指定してください。
CLI から直接起動する例
include せず ros2 launch を直接叩く場合の最小例:
# mapoi_turtlebot3_example の sample maps を流用 (apt / 配布 install 後にも動く)
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(ros2 pkg prefix --share mapoi_turtlebot3_example)/maps \
map_name:=turtlebot3_world
# ソースツリーから直接 (ros2_ws 内で source 後)
# 注: 本 repo を `<ws>/src/mapoi/` に clone している前提 (ws 直下で `git clone .../mapoi.git src/mapoi`)。
# パッケージを `<ws>/src/mapoi_turtlebot3_example/` のようにフラット展開している場合は
# パスを調整するか、上の `pkg prefix --share` 形式を使う方が確実。
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(pwd)/src/mapoi/mapoi_turtlebot3_example/maps \
map_name:=turtlebot3_dqn_stage1
引数の取り違え注意
各 launch arg のセマンティクスは以下のとおり ({maps_path}/{map_name}/{config_file} でアクセスする 3 レベルの分割):
| arg | 渡すもの | 例 |
|---|---|---|
maps_path |
地図群を束ねる親ディレクトリ (各地図は配下のサブディレクトリ) | /path/to/maps |
map_name |
maps_path 直下の地図サブディレクトリ名 |
turtlebot3_world |
config_file |
地図サブディレクトリ内の設定ファイル名 (default: mapoi_config.yaml) |
mapoi_config.yaml |
実際にロードされるパスは {maps_path}/{map_name}/{config_file} で、上記例なら /path/to/maps/turtlebot3_world/mapoi_config.yaml となります。
maps_path / map_name 必須 (上節参照) の検証は 2 段階: map_name 自体未指定なら ros2 launch が Required launch argument 'map_name' was not provided で fail (node 起動前 / launch system 側)、maps_path がディレクトリでない等のセマンティクス違反は mapoi_server ノード起動時に RCLCPP_FATAL で fail します。
❌ よくある間違い: maps_path に config.yaml ファイルパスを直接指定 してしまう:
# WRONG: maps_path はファイルではなくディレクトリ
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=./maps/turtlebot3_dqn_stage1/mapoi_config.yaml \
map_name:=turtlebot3_dqn_stage1
→ 起動時に mapoi_server ノードが以下を 1 行で出力して FATAL 終了します (mapoi_server.cpp 内の RCLCPP_FATAL の実ログ文字列そのまま・英日混在):
[FATAL] maps_path '...mapoi_config.yaml' does not exist or is not a directory. 正しい maps ディレクトリ path を指定してください (例: $(find-pkg-share mapoi_turtlebot3_example)/maps)。
maps_path は 地図群を束ねる親ディレクトリ で、特定の地図ディレクトリやファイルではありません。ディレクトリ構成は本 README 末尾の ディレクトリ構成 節を参照してください。
simulator arg はシミュレータ連動 bridge の起動を制御します:
-
gazebo(Gazebo Classic / Humble):mapoi_gazebo_bridgeを起動。operator map switch 時に Gazebo 内のworld_modelentity を入れ替え + ロボットを delete + spawn で POI list 先頭 の座標に再生成 (#144 で旧initial_posesystem tag を廃止し、yaml 順序で表現する semantics に変更) -
gz(gz-sim / Jazzy):mapoi_gz_bridge+parameter_bridge(ros_gz_bridge) を起動。operator map switch 時に gz-sim 内のworld_modelentity を入れ替え + ロボットをSetEntityPoseで POI list 先頭 の座標に teleport (gz-sim では Classic と異なり set_pose service が使えるため delete + spawn は不要) -
none(default): bridge 起動なし (実機運用)
Web UI も使う場合は mapoi_webui.launch.yaml も併せて include:
- include:
file: "$(find-pkg-share mapoi_webui)/launch/mapoi_webui.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"}
- {name: map_name, value: "initial_map_name"}
NOTE:
mapoi_webuiはシステムタグをmapoi_serverのmapoi/get_tag_definitionsservice 経由で取得します。mapoi_webui単体を起動しても system tags の表示は service 通信になるため、mapoi_serverの package install 自体は不要 (ただし service responder としてmapoi_serverノードが起動している必要あり)。
TurtleBot3 を使った動作例は mapoi_turtlebot3_example パッケージを参照してください。
ノード
mapoi_server
File truncated at 100 lines see the full file
Changelog for package mapoi_server
This per-package file lists only the changes affecting mapoi_server
(including its mapoi_nav2_bridge / mapoi_amcl_localization_bridge /
mapoi_rviz2_publisher / mapoi_gazebo_bridge / mapoi_gz_bridge
nodes), in the flat format expected by bloom / buildfarm. Full
project-level narrative: root CHANGELOG.rst / the GitHub Releases
page.
Forthcoming
0.6.0 (2026-07-15)
-
mapoi_rviz2_publisher: rebuild the marker arrays only when the underlying data changed (POIs, routes, highlights, display parameters), republishing the cached arrays with a refreshed stamp on unchanged ticks — the 1 Hz republish itself is kept so late-joiningvolatilesubscribers still receive markers — and skip the tick entirely while both marker topics have zero subscribers (#402).
0.5.0 (2026-07-10)
- Add the
request_initial_poseservice onmapoi_serveras the sole writer ofmapoi/initialpose_poi; other nodes request a publish instead of publishing directly, unifying the latched cache (#211). - Reject
request_initial_posewhen a non-emptymap_namedoes not match the server's current map, closing the stale-initial-pose map-switch race (#299). - Optionally persist and restore the last-selected map across a
restart via the new
state_pathparameter (default empty = disabled), avoiding a teleport to the launch-parameter map's POI (#297). - Validate the
select_mapservicemap_nameas a single path segment, rejecting path-traversal config loads (#328). - Namespace all eight
mapoi_serverservices undermapoi/(e.g.get_pois_info->mapoi/get_pois_info); no compatibility alias (#341). - Return
success=falsefromget_route_pois(GetRoutePois) for an unknown route instead of silently returning empty lists;mapoi_nav2_bridge/mapoi_rviz2_publishercheckresponse.success(#342). - Add
waypoint_arrival_modeparameter ("nav2"default /"mapoi") onmapoi_nav2_bridge;"mapoi"sends per-waypointNavigateToPosegoals and advances on tolerance match (#243, #259, #260, #261, #263, #264, #265, #266). - Add topic
mapoi/nav/command_rejected(std_msgs/String) onmapoi_nav2_bridgeas an unconditional rejected-command event, independent of the latchedmapoi/nav/status(#354). - Add
auto_resume_timeout_secparameter (default0.0= disabled) onmapoi_nav2_bridgeto auto-resume a paused route after a timeout (#231, #232). - Publish
rejected:<target>onmapoi/nav/statusfor commands rejected while idle (unknown goal/route, landmark-as-goal, service not ready) so operators can see they were ignored (#339, #355, #352, #356). - Fix Jazzy
EVENT_PAUSEDno longer firing by adding acmd_vel_msg_typeparameter (default"auto") that selectsTwistvsTwistStampedfromROS_DISTRO(#249). - Narrow
PoiEventpublishing toROUTEnavigation only (waypoints/landmarks on the active route), removeEVENT_STOPPED/EVENT_RESUMED, addEVENT_PAUSEDfiring on a realcmd_veldwell (#220, #227). - Render a yaw-agnostic POI tolerance (
tolerance.yaw >= pi) as a filled disc inmapoi_rviz2_publisherinstead of omitting the sector (#267, #268, #271). - Split
mapoi_nav2_bridge.cpp(1,712 lines) into five translation units (route / goal / map-switch / backend-status / core) compiling into one executable; internal refactor, no behavior change (#345).
0.4.0 (2026-05-08)
- Rename the Nav2 bridge node from
mapoi_nav_servertomapoi_nav2_bridge(executable, node, C++ class, header, and thewith_nav_server->with_nav2_bridgelaunch arg); no compatibility alias (#204). - Split the AMCL adapter out of the bridge into a new
mapoi_amcl_localization_bridgeexecutable; theinitialpose_*parameters and/initialposepublishing move to it, and it publishesLocalizationBackendStatus(#209). - Hardcode the system tag definitions in
system_tags.hpp(mapoi::kSystemTags) and remove themaps/tag_definitions.yamlfile /maps/directory;get_tag_definitionscontract unchanged (#191). - Publish
NavigationBackendStatusat 1 Hz onmapoi/nav/backend_status(transient_localQoS) as the navigation readiness contract (#198). - Use
MANUAL_BY_TOPICliveliness (5 s lease) on bothbackend_statustopics so consumers detect bridge death; reject infinite-lease publishers via QoS incompatibility (#208). - Keep the 1 Hz
backend_statuspublish running during blockingLoadMapcalls by moving the timer to a separate callback group under aMultiThreadedExecutor(#213). -
mapoi_gazebo_bridge: fix AMCL drift on operator map switch by teleporting via Gazebo Classicdelete_entity+spawn_entityto the first non-landmark POI (#91, #200). - Add CLI launch examples and
maps_path/map_nameargument semantics tomapoi_server/README.md(#172).
0.3.0 (2026-05-02)
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| mapoi | |
| mapoi_turtlebot3_example | |
| mapoi_webui |
Launch files
Messages
Services
Plugins
Recent questions tagged mapoi_server at Robotics Stack Exchange
|
mapoi_server package from mapoi repomapoi mapoi_interfaces mapoi_rviz_plugins mapoi_server mapoi_turtlebot3_example mapoi_webui |
ROS Distro
|
Package Summary
| Version | 0.6.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/shimz-robotics/mapoi.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-07-15 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Shunsuke Kimura
Authors
- Shunsuke Kimura
mapoi_server
English version (primary): README.md 本ファイルは日本語スナップショットです。最新の内容は英語版を参照してください。
mapoi のメインパッケージです。 地図と POI の情報を管理し、他のパッケージにサービスとして提供します。また、POI 名を指定した自律走行やPOI半径イベントの検知を行います。
自分のロボットへの組み込み方
4 つの core node (mapoi_server / mapoi_nav2_bridge / mapoi_amcl_localization_bridge / mapoi_rviz2_publisher) と、必要に応じてシミュレータ連動 bridge をまとめて起動する bringup launch を提供しています。自前の launch から以下のように include してください:
- include:
file: "$(find-pkg-share mapoi_server)/launch/mapoi_bringup.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"} # REQUIRED
- {name: map_name, value: "initial_map_name"} # REQUIRED
- {name: config_file, value: "mapoi_config.yaml"} # optional
- {name: state_path, value: "/var/lib/mapoi"} # optional (実機運用では推奨、#297)
- {name: simulator, value: "none"} # gazebo|gz|none (default: none)
- {name: robot_entity_name, value: "burger"} # simulator=gazebo|gz のとき必要
- {name: robot_sdf_path, value: "/path/.../model.sdf"} # simulator=gazebo のとき必要
- {name: init_world_name, value: "default"} # simulator=gz のとき必要 (gz_sim 起動時の world 名)
maps_path と map_name は 必須 です。maps_path 未指定 / 存在しないパス / ディレクトリでない場合は RCLCPP_FATAL ログ + 終了コード 1 で起動失敗します (#163)。mapoi_turtlebot3_example の sample を流用するなら $(find-pkg-share mapoi_turtlebot3_example)/maps を指定してください。
CLI から直接起動する例
include せず ros2 launch を直接叩く場合の最小例:
# mapoi_turtlebot3_example の sample maps を流用 (apt / 配布 install 後にも動く)
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(ros2 pkg prefix --share mapoi_turtlebot3_example)/maps \
map_name:=turtlebot3_world
# ソースツリーから直接 (ros2_ws 内で source 後)
# 注: 本 repo を `<ws>/src/mapoi/` に clone している前提 (ws 直下で `git clone .../mapoi.git src/mapoi`)。
# パッケージを `<ws>/src/mapoi_turtlebot3_example/` のようにフラット展開している場合は
# パスを調整するか、上の `pkg prefix --share` 形式を使う方が確実。
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(pwd)/src/mapoi/mapoi_turtlebot3_example/maps \
map_name:=turtlebot3_dqn_stage1
引数の取り違え注意
各 launch arg のセマンティクスは以下のとおり ({maps_path}/{map_name}/{config_file} でアクセスする 3 レベルの分割):
| arg | 渡すもの | 例 |
|---|---|---|
maps_path |
地図群を束ねる親ディレクトリ (各地図は配下のサブディレクトリ) | /path/to/maps |
map_name |
maps_path 直下の地図サブディレクトリ名 |
turtlebot3_world |
config_file |
地図サブディレクトリ内の設定ファイル名 (default: mapoi_config.yaml) |
mapoi_config.yaml |
実際にロードされるパスは {maps_path}/{map_name}/{config_file} で、上記例なら /path/to/maps/turtlebot3_world/mapoi_config.yaml となります。
maps_path / map_name 必須 (上節参照) の検証は 2 段階: map_name 自体未指定なら ros2 launch が Required launch argument 'map_name' was not provided で fail (node 起動前 / launch system 側)、maps_path がディレクトリでない等のセマンティクス違反は mapoi_server ノード起動時に RCLCPP_FATAL で fail します。
❌ よくある間違い: maps_path に config.yaml ファイルパスを直接指定 してしまう:
# WRONG: maps_path はファイルではなくディレクトリ
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=./maps/turtlebot3_dqn_stage1/mapoi_config.yaml \
map_name:=turtlebot3_dqn_stage1
→ 起動時に mapoi_server ノードが以下を 1 行で出力して FATAL 終了します (mapoi_server.cpp 内の RCLCPP_FATAL の実ログ文字列そのまま・英日混在):
[FATAL] maps_path '...mapoi_config.yaml' does not exist or is not a directory. 正しい maps ディレクトリ path を指定してください (例: $(find-pkg-share mapoi_turtlebot3_example)/maps)。
maps_path は 地図群を束ねる親ディレクトリ で、特定の地図ディレクトリやファイルではありません。ディレクトリ構成は本 README 末尾の ディレクトリ構成 節を参照してください。
simulator arg はシミュレータ連動 bridge の起動を制御します:
-
gazebo(Gazebo Classic / Humble):mapoi_gazebo_bridgeを起動。operator map switch 時に Gazebo 内のworld_modelentity を入れ替え + ロボットを delete + spawn で POI list 先頭 の座標に再生成 (#144 で旧initial_posesystem tag を廃止し、yaml 順序で表現する semantics に変更) -
gz(gz-sim / Jazzy):mapoi_gz_bridge+parameter_bridge(ros_gz_bridge) を起動。operator map switch 時に gz-sim 内のworld_modelentity を入れ替え + ロボットをSetEntityPoseで POI list 先頭 の座標に teleport (gz-sim では Classic と異なり set_pose service が使えるため delete + spawn は不要) -
none(default): bridge 起動なし (実機運用)
Web UI も使う場合は mapoi_webui.launch.yaml も併せて include:
- include:
file: "$(find-pkg-share mapoi_webui)/launch/mapoi_webui.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"}
- {name: map_name, value: "initial_map_name"}
NOTE:
mapoi_webuiはシステムタグをmapoi_serverのmapoi/get_tag_definitionsservice 経由で取得します。mapoi_webui単体を起動しても system tags の表示は service 通信になるため、mapoi_serverの package install 自体は不要 (ただし service responder としてmapoi_serverノードが起動している必要あり)。
TurtleBot3 を使った動作例は mapoi_turtlebot3_example パッケージを参照してください。
ノード
mapoi_server
File truncated at 100 lines see the full file
Changelog for package mapoi_server
This per-package file lists only the changes affecting mapoi_server
(including its mapoi_nav2_bridge / mapoi_amcl_localization_bridge /
mapoi_rviz2_publisher / mapoi_gazebo_bridge / mapoi_gz_bridge
nodes), in the flat format expected by bloom / buildfarm. Full
project-level narrative: root CHANGELOG.rst / the GitHub Releases
page.
Forthcoming
0.6.0 (2026-07-15)
-
mapoi_rviz2_publisher: rebuild the marker arrays only when the underlying data changed (POIs, routes, highlights, display parameters), republishing the cached arrays with a refreshed stamp on unchanged ticks — the 1 Hz republish itself is kept so late-joiningvolatilesubscribers still receive markers — and skip the tick entirely while both marker topics have zero subscribers (#402).
0.5.0 (2026-07-10)
- Add the
request_initial_poseservice onmapoi_serveras the sole writer ofmapoi/initialpose_poi; other nodes request a publish instead of publishing directly, unifying the latched cache (#211). - Reject
request_initial_posewhen a non-emptymap_namedoes not match the server's current map, closing the stale-initial-pose map-switch race (#299). - Optionally persist and restore the last-selected map across a
restart via the new
state_pathparameter (default empty = disabled), avoiding a teleport to the launch-parameter map's POI (#297). - Validate the
select_mapservicemap_nameas a single path segment, rejecting path-traversal config loads (#328). - Namespace all eight
mapoi_serverservices undermapoi/(e.g.get_pois_info->mapoi/get_pois_info); no compatibility alias (#341). - Return
success=falsefromget_route_pois(GetRoutePois) for an unknown route instead of silently returning empty lists;mapoi_nav2_bridge/mapoi_rviz2_publishercheckresponse.success(#342). - Add
waypoint_arrival_modeparameter ("nav2"default /"mapoi") onmapoi_nav2_bridge;"mapoi"sends per-waypointNavigateToPosegoals and advances on tolerance match (#243, #259, #260, #261, #263, #264, #265, #266). - Add topic
mapoi/nav/command_rejected(std_msgs/String) onmapoi_nav2_bridgeas an unconditional rejected-command event, independent of the latchedmapoi/nav/status(#354). - Add
auto_resume_timeout_secparameter (default0.0= disabled) onmapoi_nav2_bridgeto auto-resume a paused route after a timeout (#231, #232). - Publish
rejected:<target>onmapoi/nav/statusfor commands rejected while idle (unknown goal/route, landmark-as-goal, service not ready) so operators can see they were ignored (#339, #355, #352, #356). - Fix Jazzy
EVENT_PAUSEDno longer firing by adding acmd_vel_msg_typeparameter (default"auto") that selectsTwistvsTwistStampedfromROS_DISTRO(#249). - Narrow
PoiEventpublishing toROUTEnavigation only (waypoints/landmarks on the active route), removeEVENT_STOPPED/EVENT_RESUMED, addEVENT_PAUSEDfiring on a realcmd_veldwell (#220, #227). - Render a yaw-agnostic POI tolerance (
tolerance.yaw >= pi) as a filled disc inmapoi_rviz2_publisherinstead of omitting the sector (#267, #268, #271). - Split
mapoi_nav2_bridge.cpp(1,712 lines) into five translation units (route / goal / map-switch / backend-status / core) compiling into one executable; internal refactor, no behavior change (#345).
0.4.0 (2026-05-08)
- Rename the Nav2 bridge node from
mapoi_nav_servertomapoi_nav2_bridge(executable, node, C++ class, header, and thewith_nav_server->with_nav2_bridgelaunch arg); no compatibility alias (#204). - Split the AMCL adapter out of the bridge into a new
mapoi_amcl_localization_bridgeexecutable; theinitialpose_*parameters and/initialposepublishing move to it, and it publishesLocalizationBackendStatus(#209). - Hardcode the system tag definitions in
system_tags.hpp(mapoi::kSystemTags) and remove themaps/tag_definitions.yamlfile /maps/directory;get_tag_definitionscontract unchanged (#191). - Publish
NavigationBackendStatusat 1 Hz onmapoi/nav/backend_status(transient_localQoS) as the navigation readiness contract (#198). - Use
MANUAL_BY_TOPICliveliness (5 s lease) on bothbackend_statustopics so consumers detect bridge death; reject infinite-lease publishers via QoS incompatibility (#208). - Keep the 1 Hz
backend_statuspublish running during blockingLoadMapcalls by moving the timer to a separate callback group under aMultiThreadedExecutor(#213). -
mapoi_gazebo_bridge: fix AMCL drift on operator map switch by teleporting via Gazebo Classicdelete_entity+spawn_entityto the first non-landmark POI (#91, #200). - Add CLI launch examples and
maps_path/map_nameargument semantics tomapoi_server/README.md(#172).
0.3.0 (2026-05-02)
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| mapoi | |
| mapoi_turtlebot3_example | |
| mapoi_webui |
Launch files
Messages
Services
Plugins
Recent questions tagged mapoi_server at Robotics Stack Exchange
|
mapoi_server package from mapoi repomapoi mapoi_interfaces mapoi_rviz_plugins mapoi_server mapoi_turtlebot3_example mapoi_webui |
ROS Distro
|
Package Summary
| Version | 0.6.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/shimz-robotics/mapoi.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-07-15 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Shunsuke Kimura
Authors
- Shunsuke Kimura
mapoi_server
English version (primary): README.md 本ファイルは日本語スナップショットです。最新の内容は英語版を参照してください。
mapoi のメインパッケージです。 地図と POI の情報を管理し、他のパッケージにサービスとして提供します。また、POI 名を指定した自律走行やPOI半径イベントの検知を行います。
自分のロボットへの組み込み方
4 つの core node (mapoi_server / mapoi_nav2_bridge / mapoi_amcl_localization_bridge / mapoi_rviz2_publisher) と、必要に応じてシミュレータ連動 bridge をまとめて起動する bringup launch を提供しています。自前の launch から以下のように include してください:
- include:
file: "$(find-pkg-share mapoi_server)/launch/mapoi_bringup.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"} # REQUIRED
- {name: map_name, value: "initial_map_name"} # REQUIRED
- {name: config_file, value: "mapoi_config.yaml"} # optional
- {name: state_path, value: "/var/lib/mapoi"} # optional (実機運用では推奨、#297)
- {name: simulator, value: "none"} # gazebo|gz|none (default: none)
- {name: robot_entity_name, value: "burger"} # simulator=gazebo|gz のとき必要
- {name: robot_sdf_path, value: "/path/.../model.sdf"} # simulator=gazebo のとき必要
- {name: init_world_name, value: "default"} # simulator=gz のとき必要 (gz_sim 起動時の world 名)
maps_path と map_name は 必須 です。maps_path 未指定 / 存在しないパス / ディレクトリでない場合は RCLCPP_FATAL ログ + 終了コード 1 で起動失敗します (#163)。mapoi_turtlebot3_example の sample を流用するなら $(find-pkg-share mapoi_turtlebot3_example)/maps を指定してください。
CLI から直接起動する例
include せず ros2 launch を直接叩く場合の最小例:
# mapoi_turtlebot3_example の sample maps を流用 (apt / 配布 install 後にも動く)
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(ros2 pkg prefix --share mapoi_turtlebot3_example)/maps \
map_name:=turtlebot3_world
# ソースツリーから直接 (ros2_ws 内で source 後)
# 注: 本 repo を `<ws>/src/mapoi/` に clone している前提 (ws 直下で `git clone .../mapoi.git src/mapoi`)。
# パッケージを `<ws>/src/mapoi_turtlebot3_example/` のようにフラット展開している場合は
# パスを調整するか、上の `pkg prefix --share` 形式を使う方が確実。
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(pwd)/src/mapoi/mapoi_turtlebot3_example/maps \
map_name:=turtlebot3_dqn_stage1
引数の取り違え注意
各 launch arg のセマンティクスは以下のとおり ({maps_path}/{map_name}/{config_file} でアクセスする 3 レベルの分割):
| arg | 渡すもの | 例 |
|---|---|---|
maps_path |
地図群を束ねる親ディレクトリ (各地図は配下のサブディレクトリ) | /path/to/maps |
map_name |
maps_path 直下の地図サブディレクトリ名 |
turtlebot3_world |
config_file |
地図サブディレクトリ内の設定ファイル名 (default: mapoi_config.yaml) |
mapoi_config.yaml |
実際にロードされるパスは {maps_path}/{map_name}/{config_file} で、上記例なら /path/to/maps/turtlebot3_world/mapoi_config.yaml となります。
maps_path / map_name 必須 (上節参照) の検証は 2 段階: map_name 自体未指定なら ros2 launch が Required launch argument 'map_name' was not provided で fail (node 起動前 / launch system 側)、maps_path がディレクトリでない等のセマンティクス違反は mapoi_server ノード起動時に RCLCPP_FATAL で fail します。
❌ よくある間違い: maps_path に config.yaml ファイルパスを直接指定 してしまう:
# WRONG: maps_path はファイルではなくディレクトリ
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=./maps/turtlebot3_dqn_stage1/mapoi_config.yaml \
map_name:=turtlebot3_dqn_stage1
→ 起動時に mapoi_server ノードが以下を 1 行で出力して FATAL 終了します (mapoi_server.cpp 内の RCLCPP_FATAL の実ログ文字列そのまま・英日混在):
[FATAL] maps_path '...mapoi_config.yaml' does not exist or is not a directory. 正しい maps ディレクトリ path を指定してください (例: $(find-pkg-share mapoi_turtlebot3_example)/maps)。
maps_path は 地図群を束ねる親ディレクトリ で、特定の地図ディレクトリやファイルではありません。ディレクトリ構成は本 README 末尾の ディレクトリ構成 節を参照してください。
simulator arg はシミュレータ連動 bridge の起動を制御します:
-
gazebo(Gazebo Classic / Humble):mapoi_gazebo_bridgeを起動。operator map switch 時に Gazebo 内のworld_modelentity を入れ替え + ロボットを delete + spawn で POI list 先頭 の座標に再生成 (#144 で旧initial_posesystem tag を廃止し、yaml 順序で表現する semantics に変更) -
gz(gz-sim / Jazzy):mapoi_gz_bridge+parameter_bridge(ros_gz_bridge) を起動。operator map switch 時に gz-sim 内のworld_modelentity を入れ替え + ロボットをSetEntityPoseで POI list 先頭 の座標に teleport (gz-sim では Classic と異なり set_pose service が使えるため delete + spawn は不要) -
none(default): bridge 起動なし (実機運用)
Web UI も使う場合は mapoi_webui.launch.yaml も併せて include:
- include:
file: "$(find-pkg-share mapoi_webui)/launch/mapoi_webui.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"}
- {name: map_name, value: "initial_map_name"}
NOTE:
mapoi_webuiはシステムタグをmapoi_serverのmapoi/get_tag_definitionsservice 経由で取得します。mapoi_webui単体を起動しても system tags の表示は service 通信になるため、mapoi_serverの package install 自体は不要 (ただし service responder としてmapoi_serverノードが起動している必要あり)。
TurtleBot3 を使った動作例は mapoi_turtlebot3_example パッケージを参照してください。
ノード
mapoi_server
File truncated at 100 lines see the full file
Changelog for package mapoi_server
This per-package file lists only the changes affecting mapoi_server
(including its mapoi_nav2_bridge / mapoi_amcl_localization_bridge /
mapoi_rviz2_publisher / mapoi_gazebo_bridge / mapoi_gz_bridge
nodes), in the flat format expected by bloom / buildfarm. Full
project-level narrative: root CHANGELOG.rst / the GitHub Releases
page.
Forthcoming
0.6.0 (2026-07-15)
-
mapoi_rviz2_publisher: rebuild the marker arrays only when the underlying data changed (POIs, routes, highlights, display parameters), republishing the cached arrays with a refreshed stamp on unchanged ticks — the 1 Hz republish itself is kept so late-joiningvolatilesubscribers still receive markers — and skip the tick entirely while both marker topics have zero subscribers (#402).
0.5.0 (2026-07-10)
- Add the
request_initial_poseservice onmapoi_serveras the sole writer ofmapoi/initialpose_poi; other nodes request a publish instead of publishing directly, unifying the latched cache (#211). - Reject
request_initial_posewhen a non-emptymap_namedoes not match the server's current map, closing the stale-initial-pose map-switch race (#299). - Optionally persist and restore the last-selected map across a
restart via the new
state_pathparameter (default empty = disabled), avoiding a teleport to the launch-parameter map's POI (#297). - Validate the
select_mapservicemap_nameas a single path segment, rejecting path-traversal config loads (#328). - Namespace all eight
mapoi_serverservices undermapoi/(e.g.get_pois_info->mapoi/get_pois_info); no compatibility alias (#341). - Return
success=falsefromget_route_pois(GetRoutePois) for an unknown route instead of silently returning empty lists;mapoi_nav2_bridge/mapoi_rviz2_publishercheckresponse.success(#342). - Add
waypoint_arrival_modeparameter ("nav2"default /"mapoi") onmapoi_nav2_bridge;"mapoi"sends per-waypointNavigateToPosegoals and advances on tolerance match (#243, #259, #260, #261, #263, #264, #265, #266). - Add topic
mapoi/nav/command_rejected(std_msgs/String) onmapoi_nav2_bridgeas an unconditional rejected-command event, independent of the latchedmapoi/nav/status(#354). - Add
auto_resume_timeout_secparameter (default0.0= disabled) onmapoi_nav2_bridgeto auto-resume a paused route after a timeout (#231, #232). - Publish
rejected:<target>onmapoi/nav/statusfor commands rejected while idle (unknown goal/route, landmark-as-goal, service not ready) so operators can see they were ignored (#339, #355, #352, #356). - Fix Jazzy
EVENT_PAUSEDno longer firing by adding acmd_vel_msg_typeparameter (default"auto") that selectsTwistvsTwistStampedfromROS_DISTRO(#249). - Narrow
PoiEventpublishing toROUTEnavigation only (waypoints/landmarks on the active route), removeEVENT_STOPPED/EVENT_RESUMED, addEVENT_PAUSEDfiring on a realcmd_veldwell (#220, #227). - Render a yaw-agnostic POI tolerance (
tolerance.yaw >= pi) as a filled disc inmapoi_rviz2_publisherinstead of omitting the sector (#267, #268, #271). - Split
mapoi_nav2_bridge.cpp(1,712 lines) into five translation units (route / goal / map-switch / backend-status / core) compiling into one executable; internal refactor, no behavior change (#345).
0.4.0 (2026-05-08)
- Rename the Nav2 bridge node from
mapoi_nav_servertomapoi_nav2_bridge(executable, node, C++ class, header, and thewith_nav_server->with_nav2_bridgelaunch arg); no compatibility alias (#204). - Split the AMCL adapter out of the bridge into a new
mapoi_amcl_localization_bridgeexecutable; theinitialpose_*parameters and/initialposepublishing move to it, and it publishesLocalizationBackendStatus(#209). - Hardcode the system tag definitions in
system_tags.hpp(mapoi::kSystemTags) and remove themaps/tag_definitions.yamlfile /maps/directory;get_tag_definitionscontract unchanged (#191). - Publish
NavigationBackendStatusat 1 Hz onmapoi/nav/backend_status(transient_localQoS) as the navigation readiness contract (#198). - Use
MANUAL_BY_TOPICliveliness (5 s lease) on bothbackend_statustopics so consumers detect bridge death; reject infinite-lease publishers via QoS incompatibility (#208). - Keep the 1 Hz
backend_statuspublish running during blockingLoadMapcalls by moving the timer to a separate callback group under aMultiThreadedExecutor(#213). -
mapoi_gazebo_bridge: fix AMCL drift on operator map switch by teleporting via Gazebo Classicdelete_entity+spawn_entityto the first non-landmark POI (#91, #200). - Add CLI launch examples and
maps_path/map_nameargument semantics tomapoi_server/README.md(#172).
0.3.0 (2026-05-02)
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| mapoi | |
| mapoi_turtlebot3_example | |
| mapoi_webui |
Launch files
Messages
Services
Plugins
Recent questions tagged mapoi_server at Robotics Stack Exchange
|
mapoi_server package from mapoi repomapoi mapoi_interfaces mapoi_rviz_plugins mapoi_server mapoi_turtlebot3_example mapoi_webui |
ROS Distro
|
Package Summary
| Version | 0.6.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/shimz-robotics/mapoi.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-07-15 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Shunsuke Kimura
Authors
- Shunsuke Kimura
mapoi_server
English version (primary): README.md 本ファイルは日本語スナップショットです。最新の内容は英語版を参照してください。
mapoi のメインパッケージです。 地図と POI の情報を管理し、他のパッケージにサービスとして提供します。また、POI 名を指定した自律走行やPOI半径イベントの検知を行います。
自分のロボットへの組み込み方
4 つの core node (mapoi_server / mapoi_nav2_bridge / mapoi_amcl_localization_bridge / mapoi_rviz2_publisher) と、必要に応じてシミュレータ連動 bridge をまとめて起動する bringup launch を提供しています。自前の launch から以下のように include してください:
- include:
file: "$(find-pkg-share mapoi_server)/launch/mapoi_bringup.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"} # REQUIRED
- {name: map_name, value: "initial_map_name"} # REQUIRED
- {name: config_file, value: "mapoi_config.yaml"} # optional
- {name: state_path, value: "/var/lib/mapoi"} # optional (実機運用では推奨、#297)
- {name: simulator, value: "none"} # gazebo|gz|none (default: none)
- {name: robot_entity_name, value: "burger"} # simulator=gazebo|gz のとき必要
- {name: robot_sdf_path, value: "/path/.../model.sdf"} # simulator=gazebo のとき必要
- {name: init_world_name, value: "default"} # simulator=gz のとき必要 (gz_sim 起動時の world 名)
maps_path と map_name は 必須 です。maps_path 未指定 / 存在しないパス / ディレクトリでない場合は RCLCPP_FATAL ログ + 終了コード 1 で起動失敗します (#163)。mapoi_turtlebot3_example の sample を流用するなら $(find-pkg-share mapoi_turtlebot3_example)/maps を指定してください。
CLI から直接起動する例
include せず ros2 launch を直接叩く場合の最小例:
# mapoi_turtlebot3_example の sample maps を流用 (apt / 配布 install 後にも動く)
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(ros2 pkg prefix --share mapoi_turtlebot3_example)/maps \
map_name:=turtlebot3_world
# ソースツリーから直接 (ros2_ws 内で source 後)
# 注: 本 repo を `<ws>/src/mapoi/` に clone している前提 (ws 直下で `git clone .../mapoi.git src/mapoi`)。
# パッケージを `<ws>/src/mapoi_turtlebot3_example/` のようにフラット展開している場合は
# パスを調整するか、上の `pkg prefix --share` 形式を使う方が確実。
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(pwd)/src/mapoi/mapoi_turtlebot3_example/maps \
map_name:=turtlebot3_dqn_stage1
引数の取り違え注意
各 launch arg のセマンティクスは以下のとおり ({maps_path}/{map_name}/{config_file} でアクセスする 3 レベルの分割):
| arg | 渡すもの | 例 |
|---|---|---|
maps_path |
地図群を束ねる親ディレクトリ (各地図は配下のサブディレクトリ) | /path/to/maps |
map_name |
maps_path 直下の地図サブディレクトリ名 |
turtlebot3_world |
config_file |
地図サブディレクトリ内の設定ファイル名 (default: mapoi_config.yaml) |
mapoi_config.yaml |
実際にロードされるパスは {maps_path}/{map_name}/{config_file} で、上記例なら /path/to/maps/turtlebot3_world/mapoi_config.yaml となります。
maps_path / map_name 必須 (上節参照) の検証は 2 段階: map_name 自体未指定なら ros2 launch が Required launch argument 'map_name' was not provided で fail (node 起動前 / launch system 側)、maps_path がディレクトリでない等のセマンティクス違反は mapoi_server ノード起動時に RCLCPP_FATAL で fail します。
❌ よくある間違い: maps_path に config.yaml ファイルパスを直接指定 してしまう:
# WRONG: maps_path はファイルではなくディレクトリ
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=./maps/turtlebot3_dqn_stage1/mapoi_config.yaml \
map_name:=turtlebot3_dqn_stage1
→ 起動時に mapoi_server ノードが以下を 1 行で出力して FATAL 終了します (mapoi_server.cpp 内の RCLCPP_FATAL の実ログ文字列そのまま・英日混在):
[FATAL] maps_path '...mapoi_config.yaml' does not exist or is not a directory. 正しい maps ディレクトリ path を指定してください (例: $(find-pkg-share mapoi_turtlebot3_example)/maps)。
maps_path は 地図群を束ねる親ディレクトリ で、特定の地図ディレクトリやファイルではありません。ディレクトリ構成は本 README 末尾の ディレクトリ構成 節を参照してください。
simulator arg はシミュレータ連動 bridge の起動を制御します:
-
gazebo(Gazebo Classic / Humble):mapoi_gazebo_bridgeを起動。operator map switch 時に Gazebo 内のworld_modelentity を入れ替え + ロボットを delete + spawn で POI list 先頭 の座標に再生成 (#144 で旧initial_posesystem tag を廃止し、yaml 順序で表現する semantics に変更) -
gz(gz-sim / Jazzy):mapoi_gz_bridge+parameter_bridge(ros_gz_bridge) を起動。operator map switch 時に gz-sim 内のworld_modelentity を入れ替え + ロボットをSetEntityPoseで POI list 先頭 の座標に teleport (gz-sim では Classic と異なり set_pose service が使えるため delete + spawn は不要) -
none(default): bridge 起動なし (実機運用)
Web UI も使う場合は mapoi_webui.launch.yaml も併せて include:
- include:
file: "$(find-pkg-share mapoi_webui)/launch/mapoi_webui.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"}
- {name: map_name, value: "initial_map_name"}
NOTE:
mapoi_webuiはシステムタグをmapoi_serverのmapoi/get_tag_definitionsservice 経由で取得します。mapoi_webui単体を起動しても system tags の表示は service 通信になるため、mapoi_serverの package install 自体は不要 (ただし service responder としてmapoi_serverノードが起動している必要あり)。
TurtleBot3 を使った動作例は mapoi_turtlebot3_example パッケージを参照してください。
ノード
mapoi_server
File truncated at 100 lines see the full file
Changelog for package mapoi_server
This per-package file lists only the changes affecting mapoi_server
(including its mapoi_nav2_bridge / mapoi_amcl_localization_bridge /
mapoi_rviz2_publisher / mapoi_gazebo_bridge / mapoi_gz_bridge
nodes), in the flat format expected by bloom / buildfarm. Full
project-level narrative: root CHANGELOG.rst / the GitHub Releases
page.
Forthcoming
0.6.0 (2026-07-15)
-
mapoi_rviz2_publisher: rebuild the marker arrays only when the underlying data changed (POIs, routes, highlights, display parameters), republishing the cached arrays with a refreshed stamp on unchanged ticks — the 1 Hz republish itself is kept so late-joiningvolatilesubscribers still receive markers — and skip the tick entirely while both marker topics have zero subscribers (#402).
0.5.0 (2026-07-10)
- Add the
request_initial_poseservice onmapoi_serveras the sole writer ofmapoi/initialpose_poi; other nodes request a publish instead of publishing directly, unifying the latched cache (#211). - Reject
request_initial_posewhen a non-emptymap_namedoes not match the server's current map, closing the stale-initial-pose map-switch race (#299). - Optionally persist and restore the last-selected map across a
restart via the new
state_pathparameter (default empty = disabled), avoiding a teleport to the launch-parameter map's POI (#297). - Validate the
select_mapservicemap_nameas a single path segment, rejecting path-traversal config loads (#328). - Namespace all eight
mapoi_serverservices undermapoi/(e.g.get_pois_info->mapoi/get_pois_info); no compatibility alias (#341). - Return
success=falsefromget_route_pois(GetRoutePois) for an unknown route instead of silently returning empty lists;mapoi_nav2_bridge/mapoi_rviz2_publishercheckresponse.success(#342). - Add
waypoint_arrival_modeparameter ("nav2"default /"mapoi") onmapoi_nav2_bridge;"mapoi"sends per-waypointNavigateToPosegoals and advances on tolerance match (#243, #259, #260, #261, #263, #264, #265, #266). - Add topic
mapoi/nav/command_rejected(std_msgs/String) onmapoi_nav2_bridgeas an unconditional rejected-command event, independent of the latchedmapoi/nav/status(#354). - Add
auto_resume_timeout_secparameter (default0.0= disabled) onmapoi_nav2_bridgeto auto-resume a paused route after a timeout (#231, #232). - Publish
rejected:<target>onmapoi/nav/statusfor commands rejected while idle (unknown goal/route, landmark-as-goal, service not ready) so operators can see they were ignored (#339, #355, #352, #356). - Fix Jazzy
EVENT_PAUSEDno longer firing by adding acmd_vel_msg_typeparameter (default"auto") that selectsTwistvsTwistStampedfromROS_DISTRO(#249). - Narrow
PoiEventpublishing toROUTEnavigation only (waypoints/landmarks on the active route), removeEVENT_STOPPED/EVENT_RESUMED, addEVENT_PAUSEDfiring on a realcmd_veldwell (#220, #227). - Render a yaw-agnostic POI tolerance (
tolerance.yaw >= pi) as a filled disc inmapoi_rviz2_publisherinstead of omitting the sector (#267, #268, #271). - Split
mapoi_nav2_bridge.cpp(1,712 lines) into five translation units (route / goal / map-switch / backend-status / core) compiling into one executable; internal refactor, no behavior change (#345).
0.4.0 (2026-05-08)
- Rename the Nav2 bridge node from
mapoi_nav_servertomapoi_nav2_bridge(executable, node, C++ class, header, and thewith_nav_server->with_nav2_bridgelaunch arg); no compatibility alias (#204). - Split the AMCL adapter out of the bridge into a new
mapoi_amcl_localization_bridgeexecutable; theinitialpose_*parameters and/initialposepublishing move to it, and it publishesLocalizationBackendStatus(#209). - Hardcode the system tag definitions in
system_tags.hpp(mapoi::kSystemTags) and remove themaps/tag_definitions.yamlfile /maps/directory;get_tag_definitionscontract unchanged (#191). - Publish
NavigationBackendStatusat 1 Hz onmapoi/nav/backend_status(transient_localQoS) as the navigation readiness contract (#198). - Use
MANUAL_BY_TOPICliveliness (5 s lease) on bothbackend_statustopics so consumers detect bridge death; reject infinite-lease publishers via QoS incompatibility (#208). - Keep the 1 Hz
backend_statuspublish running during blockingLoadMapcalls by moving the timer to a separate callback group under aMultiThreadedExecutor(#213). -
mapoi_gazebo_bridge: fix AMCL drift on operator map switch by teleporting via Gazebo Classicdelete_entity+spawn_entityto the first non-landmark POI (#91, #200). - Add CLI launch examples and
maps_path/map_nameargument semantics tomapoi_server/README.md(#172).
0.3.0 (2026-05-02)
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| mapoi | |
| mapoi_turtlebot3_example | |
| mapoi_webui |
Launch files
Messages
Services
Plugins
Recent questions tagged mapoi_server at Robotics Stack Exchange
|
mapoi_server package from mapoi repomapoi mapoi_interfaces mapoi_rviz_plugins mapoi_server mapoi_turtlebot3_example mapoi_webui |
ROS Distro
|
Package Summary
| Version | 0.6.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/shimz-robotics/mapoi.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-07-15 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Shunsuke Kimura
Authors
- Shunsuke Kimura
mapoi_server
English version (primary): README.md 本ファイルは日本語スナップショットです。最新の内容は英語版を参照してください。
mapoi のメインパッケージです。 地図と POI の情報を管理し、他のパッケージにサービスとして提供します。また、POI 名を指定した自律走行やPOI半径イベントの検知を行います。
自分のロボットへの組み込み方
4 つの core node (mapoi_server / mapoi_nav2_bridge / mapoi_amcl_localization_bridge / mapoi_rviz2_publisher) と、必要に応じてシミュレータ連動 bridge をまとめて起動する bringup launch を提供しています。自前の launch から以下のように include してください:
- include:
file: "$(find-pkg-share mapoi_server)/launch/mapoi_bringup.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"} # REQUIRED
- {name: map_name, value: "initial_map_name"} # REQUIRED
- {name: config_file, value: "mapoi_config.yaml"} # optional
- {name: state_path, value: "/var/lib/mapoi"} # optional (実機運用では推奨、#297)
- {name: simulator, value: "none"} # gazebo|gz|none (default: none)
- {name: robot_entity_name, value: "burger"} # simulator=gazebo|gz のとき必要
- {name: robot_sdf_path, value: "/path/.../model.sdf"} # simulator=gazebo のとき必要
- {name: init_world_name, value: "default"} # simulator=gz のとき必要 (gz_sim 起動時の world 名)
maps_path と map_name は 必須 です。maps_path 未指定 / 存在しないパス / ディレクトリでない場合は RCLCPP_FATAL ログ + 終了コード 1 で起動失敗します (#163)。mapoi_turtlebot3_example の sample を流用するなら $(find-pkg-share mapoi_turtlebot3_example)/maps を指定してください。
CLI から直接起動する例
include せず ros2 launch を直接叩く場合の最小例:
# mapoi_turtlebot3_example の sample maps を流用 (apt / 配布 install 後にも動く)
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(ros2 pkg prefix --share mapoi_turtlebot3_example)/maps \
map_name:=turtlebot3_world
# ソースツリーから直接 (ros2_ws 内で source 後)
# 注: 本 repo を `<ws>/src/mapoi/` に clone している前提 (ws 直下で `git clone .../mapoi.git src/mapoi`)。
# パッケージを `<ws>/src/mapoi_turtlebot3_example/` のようにフラット展開している場合は
# パスを調整するか、上の `pkg prefix --share` 形式を使う方が確実。
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(pwd)/src/mapoi/mapoi_turtlebot3_example/maps \
map_name:=turtlebot3_dqn_stage1
引数の取り違え注意
各 launch arg のセマンティクスは以下のとおり ({maps_path}/{map_name}/{config_file} でアクセスする 3 レベルの分割):
| arg | 渡すもの | 例 |
|---|---|---|
maps_path |
地図群を束ねる親ディレクトリ (各地図は配下のサブディレクトリ) | /path/to/maps |
map_name |
maps_path 直下の地図サブディレクトリ名 |
turtlebot3_world |
config_file |
地図サブディレクトリ内の設定ファイル名 (default: mapoi_config.yaml) |
mapoi_config.yaml |
実際にロードされるパスは {maps_path}/{map_name}/{config_file} で、上記例なら /path/to/maps/turtlebot3_world/mapoi_config.yaml となります。
maps_path / map_name 必須 (上節参照) の検証は 2 段階: map_name 自体未指定なら ros2 launch が Required launch argument 'map_name' was not provided で fail (node 起動前 / launch system 側)、maps_path がディレクトリでない等のセマンティクス違反は mapoi_server ノード起動時に RCLCPP_FATAL で fail します。
❌ よくある間違い: maps_path に config.yaml ファイルパスを直接指定 してしまう:
# WRONG: maps_path はファイルではなくディレクトリ
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=./maps/turtlebot3_dqn_stage1/mapoi_config.yaml \
map_name:=turtlebot3_dqn_stage1
→ 起動時に mapoi_server ノードが以下を 1 行で出力して FATAL 終了します (mapoi_server.cpp 内の RCLCPP_FATAL の実ログ文字列そのまま・英日混在):
[FATAL] maps_path '...mapoi_config.yaml' does not exist or is not a directory. 正しい maps ディレクトリ path を指定してください (例: $(find-pkg-share mapoi_turtlebot3_example)/maps)。
maps_path は 地図群を束ねる親ディレクトリ で、特定の地図ディレクトリやファイルではありません。ディレクトリ構成は本 README 末尾の ディレクトリ構成 節を参照してください。
simulator arg はシミュレータ連動 bridge の起動を制御します:
-
gazebo(Gazebo Classic / Humble):mapoi_gazebo_bridgeを起動。operator map switch 時に Gazebo 内のworld_modelentity を入れ替え + ロボットを delete + spawn で POI list 先頭 の座標に再生成 (#144 で旧initial_posesystem tag を廃止し、yaml 順序で表現する semantics に変更) -
gz(gz-sim / Jazzy):mapoi_gz_bridge+parameter_bridge(ros_gz_bridge) を起動。operator map switch 時に gz-sim 内のworld_modelentity を入れ替え + ロボットをSetEntityPoseで POI list 先頭 の座標に teleport (gz-sim では Classic と異なり set_pose service が使えるため delete + spawn は不要) -
none(default): bridge 起動なし (実機運用)
Web UI も使う場合は mapoi_webui.launch.yaml も併せて include:
- include:
file: "$(find-pkg-share mapoi_webui)/launch/mapoi_webui.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"}
- {name: map_name, value: "initial_map_name"}
NOTE:
mapoi_webuiはシステムタグをmapoi_serverのmapoi/get_tag_definitionsservice 経由で取得します。mapoi_webui単体を起動しても system tags の表示は service 通信になるため、mapoi_serverの package install 自体は不要 (ただし service responder としてmapoi_serverノードが起動している必要あり)。
TurtleBot3 を使った動作例は mapoi_turtlebot3_example パッケージを参照してください。
ノード
mapoi_server
File truncated at 100 lines see the full file
Changelog for package mapoi_server
This per-package file lists only the changes affecting mapoi_server
(including its mapoi_nav2_bridge / mapoi_amcl_localization_bridge /
mapoi_rviz2_publisher / mapoi_gazebo_bridge / mapoi_gz_bridge
nodes), in the flat format expected by bloom / buildfarm. Full
project-level narrative: root CHANGELOG.rst / the GitHub Releases
page.
Forthcoming
0.6.0 (2026-07-15)
-
mapoi_rviz2_publisher: rebuild the marker arrays only when the underlying data changed (POIs, routes, highlights, display parameters), republishing the cached arrays with a refreshed stamp on unchanged ticks — the 1 Hz republish itself is kept so late-joiningvolatilesubscribers still receive markers — and skip the tick entirely while both marker topics have zero subscribers (#402).
0.5.0 (2026-07-10)
- Add the
request_initial_poseservice onmapoi_serveras the sole writer ofmapoi/initialpose_poi; other nodes request a publish instead of publishing directly, unifying the latched cache (#211). - Reject
request_initial_posewhen a non-emptymap_namedoes not match the server's current map, closing the stale-initial-pose map-switch race (#299). - Optionally persist and restore the last-selected map across a
restart via the new
state_pathparameter (default empty = disabled), avoiding a teleport to the launch-parameter map's POI (#297). - Validate the
select_mapservicemap_nameas a single path segment, rejecting path-traversal config loads (#328). - Namespace all eight
mapoi_serverservices undermapoi/(e.g.get_pois_info->mapoi/get_pois_info); no compatibility alias (#341). - Return
success=falsefromget_route_pois(GetRoutePois) for an unknown route instead of silently returning empty lists;mapoi_nav2_bridge/mapoi_rviz2_publishercheckresponse.success(#342). - Add
waypoint_arrival_modeparameter ("nav2"default /"mapoi") onmapoi_nav2_bridge;"mapoi"sends per-waypointNavigateToPosegoals and advances on tolerance match (#243, #259, #260, #261, #263, #264, #265, #266). - Add topic
mapoi/nav/command_rejected(std_msgs/String) onmapoi_nav2_bridgeas an unconditional rejected-command event, independent of the latchedmapoi/nav/status(#354). - Add
auto_resume_timeout_secparameter (default0.0= disabled) onmapoi_nav2_bridgeto auto-resume a paused route after a timeout (#231, #232). - Publish
rejected:<target>onmapoi/nav/statusfor commands rejected while idle (unknown goal/route, landmark-as-goal, service not ready) so operators can see they were ignored (#339, #355, #352, #356). - Fix Jazzy
EVENT_PAUSEDno longer firing by adding acmd_vel_msg_typeparameter (default"auto") that selectsTwistvsTwistStampedfromROS_DISTRO(#249). - Narrow
PoiEventpublishing toROUTEnavigation only (waypoints/landmarks on the active route), removeEVENT_STOPPED/EVENT_RESUMED, addEVENT_PAUSEDfiring on a realcmd_veldwell (#220, #227). - Render a yaw-agnostic POI tolerance (
tolerance.yaw >= pi) as a filled disc inmapoi_rviz2_publisherinstead of omitting the sector (#267, #268, #271). - Split
mapoi_nav2_bridge.cpp(1,712 lines) into five translation units (route / goal / map-switch / backend-status / core) compiling into one executable; internal refactor, no behavior change (#345).
0.4.0 (2026-05-08)
- Rename the Nav2 bridge node from
mapoi_nav_servertomapoi_nav2_bridge(executable, node, C++ class, header, and thewith_nav_server->with_nav2_bridgelaunch arg); no compatibility alias (#204). - Split the AMCL adapter out of the bridge into a new
mapoi_amcl_localization_bridgeexecutable; theinitialpose_*parameters and/initialposepublishing move to it, and it publishesLocalizationBackendStatus(#209). - Hardcode the system tag definitions in
system_tags.hpp(mapoi::kSystemTags) and remove themaps/tag_definitions.yamlfile /maps/directory;get_tag_definitionscontract unchanged (#191). - Publish
NavigationBackendStatusat 1 Hz onmapoi/nav/backend_status(transient_localQoS) as the navigation readiness contract (#198). - Use
MANUAL_BY_TOPICliveliness (5 s lease) on bothbackend_statustopics so consumers detect bridge death; reject infinite-lease publishers via QoS incompatibility (#208). - Keep the 1 Hz
backend_statuspublish running during blockingLoadMapcalls by moving the timer to a separate callback group under aMultiThreadedExecutor(#213). -
mapoi_gazebo_bridge: fix AMCL drift on operator map switch by teleporting via Gazebo Classicdelete_entity+spawn_entityto the first non-landmark POI (#91, #200). - Add CLI launch examples and
maps_path/map_nameargument semantics tomapoi_server/README.md(#172).
0.3.0 (2026-05-02)
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| mapoi | |
| mapoi_turtlebot3_example | |
| mapoi_webui |
Launch files
Messages
Services
Plugins
Recent questions tagged mapoi_server at Robotics Stack Exchange
|
mapoi_server package from mapoi repomapoi mapoi_interfaces mapoi_rviz_plugins mapoi_server mapoi_turtlebot3_example mapoi_webui |
ROS Distro
|
Package Summary
| Version | 0.6.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/shimz-robotics/mapoi.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-07-15 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Shunsuke Kimura
Authors
- Shunsuke Kimura
mapoi_server
English version (primary): README.md 本ファイルは日本語スナップショットです。最新の内容は英語版を参照してください。
mapoi のメインパッケージです。 地図と POI の情報を管理し、他のパッケージにサービスとして提供します。また、POI 名を指定した自律走行やPOI半径イベントの検知を行います。
自分のロボットへの組み込み方
4 つの core node (mapoi_server / mapoi_nav2_bridge / mapoi_amcl_localization_bridge / mapoi_rviz2_publisher) と、必要に応じてシミュレータ連動 bridge をまとめて起動する bringup launch を提供しています。自前の launch から以下のように include してください:
- include:
file: "$(find-pkg-share mapoi_server)/launch/mapoi_bringup.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"} # REQUIRED
- {name: map_name, value: "initial_map_name"} # REQUIRED
- {name: config_file, value: "mapoi_config.yaml"} # optional
- {name: state_path, value: "/var/lib/mapoi"} # optional (実機運用では推奨、#297)
- {name: simulator, value: "none"} # gazebo|gz|none (default: none)
- {name: robot_entity_name, value: "burger"} # simulator=gazebo|gz のとき必要
- {name: robot_sdf_path, value: "/path/.../model.sdf"} # simulator=gazebo のとき必要
- {name: init_world_name, value: "default"} # simulator=gz のとき必要 (gz_sim 起動時の world 名)
maps_path と map_name は 必須 です。maps_path 未指定 / 存在しないパス / ディレクトリでない場合は RCLCPP_FATAL ログ + 終了コード 1 で起動失敗します (#163)。mapoi_turtlebot3_example の sample を流用するなら $(find-pkg-share mapoi_turtlebot3_example)/maps を指定してください。
CLI から直接起動する例
include せず ros2 launch を直接叩く場合の最小例:
# mapoi_turtlebot3_example の sample maps を流用 (apt / 配布 install 後にも動く)
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(ros2 pkg prefix --share mapoi_turtlebot3_example)/maps \
map_name:=turtlebot3_world
# ソースツリーから直接 (ros2_ws 内で source 後)
# 注: 本 repo を `<ws>/src/mapoi/` に clone している前提 (ws 直下で `git clone .../mapoi.git src/mapoi`)。
# パッケージを `<ws>/src/mapoi_turtlebot3_example/` のようにフラット展開している場合は
# パスを調整するか、上の `pkg prefix --share` 形式を使う方が確実。
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(pwd)/src/mapoi/mapoi_turtlebot3_example/maps \
map_name:=turtlebot3_dqn_stage1
引数の取り違え注意
各 launch arg のセマンティクスは以下のとおり ({maps_path}/{map_name}/{config_file} でアクセスする 3 レベルの分割):
| arg | 渡すもの | 例 |
|---|---|---|
maps_path |
地図群を束ねる親ディレクトリ (各地図は配下のサブディレクトリ) | /path/to/maps |
map_name |
maps_path 直下の地図サブディレクトリ名 |
turtlebot3_world |
config_file |
地図サブディレクトリ内の設定ファイル名 (default: mapoi_config.yaml) |
mapoi_config.yaml |
実際にロードされるパスは {maps_path}/{map_name}/{config_file} で、上記例なら /path/to/maps/turtlebot3_world/mapoi_config.yaml となります。
maps_path / map_name 必須 (上節参照) の検証は 2 段階: map_name 自体未指定なら ros2 launch が Required launch argument 'map_name' was not provided で fail (node 起動前 / launch system 側)、maps_path がディレクトリでない等のセマンティクス違反は mapoi_server ノード起動時に RCLCPP_FATAL で fail します。
❌ よくある間違い: maps_path に config.yaml ファイルパスを直接指定 してしまう:
# WRONG: maps_path はファイルではなくディレクトリ
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=./maps/turtlebot3_dqn_stage1/mapoi_config.yaml \
map_name:=turtlebot3_dqn_stage1
→ 起動時に mapoi_server ノードが以下を 1 行で出力して FATAL 終了します (mapoi_server.cpp 内の RCLCPP_FATAL の実ログ文字列そのまま・英日混在):
[FATAL] maps_path '...mapoi_config.yaml' does not exist or is not a directory. 正しい maps ディレクトリ path を指定してください (例: $(find-pkg-share mapoi_turtlebot3_example)/maps)。
maps_path は 地図群を束ねる親ディレクトリ で、特定の地図ディレクトリやファイルではありません。ディレクトリ構成は本 README 末尾の ディレクトリ構成 節を参照してください。
simulator arg はシミュレータ連動 bridge の起動を制御します:
-
gazebo(Gazebo Classic / Humble):mapoi_gazebo_bridgeを起動。operator map switch 時に Gazebo 内のworld_modelentity を入れ替え + ロボットを delete + spawn で POI list 先頭 の座標に再生成 (#144 で旧initial_posesystem tag を廃止し、yaml 順序で表現する semantics に変更) -
gz(gz-sim / Jazzy):mapoi_gz_bridge+parameter_bridge(ros_gz_bridge) を起動。operator map switch 時に gz-sim 内のworld_modelentity を入れ替え + ロボットをSetEntityPoseで POI list 先頭 の座標に teleport (gz-sim では Classic と異なり set_pose service が使えるため delete + spawn は不要) -
none(default): bridge 起動なし (実機運用)
Web UI も使う場合は mapoi_webui.launch.yaml も併せて include:
- include:
file: "$(find-pkg-share mapoi_webui)/launch/mapoi_webui.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"}
- {name: map_name, value: "initial_map_name"}
NOTE:
mapoi_webuiはシステムタグをmapoi_serverのmapoi/get_tag_definitionsservice 経由で取得します。mapoi_webui単体を起動しても system tags の表示は service 通信になるため、mapoi_serverの package install 自体は不要 (ただし service responder としてmapoi_serverノードが起動している必要あり)。
TurtleBot3 を使った動作例は mapoi_turtlebot3_example パッケージを参照してください。
ノード
mapoi_server
File truncated at 100 lines see the full file
Changelog for package mapoi_server
This per-package file lists only the changes affecting mapoi_server
(including its mapoi_nav2_bridge / mapoi_amcl_localization_bridge /
mapoi_rviz2_publisher / mapoi_gazebo_bridge / mapoi_gz_bridge
nodes), in the flat format expected by bloom / buildfarm. Full
project-level narrative: root CHANGELOG.rst / the GitHub Releases
page.
Forthcoming
0.6.0 (2026-07-15)
-
mapoi_rviz2_publisher: rebuild the marker arrays only when the underlying data changed (POIs, routes, highlights, display parameters), republishing the cached arrays with a refreshed stamp on unchanged ticks — the 1 Hz republish itself is kept so late-joiningvolatilesubscribers still receive markers — and skip the tick entirely while both marker topics have zero subscribers (#402).
0.5.0 (2026-07-10)
- Add the
request_initial_poseservice onmapoi_serveras the sole writer ofmapoi/initialpose_poi; other nodes request a publish instead of publishing directly, unifying the latched cache (#211). - Reject
request_initial_posewhen a non-emptymap_namedoes not match the server's current map, closing the stale-initial-pose map-switch race (#299). - Optionally persist and restore the last-selected map across a
restart via the new
state_pathparameter (default empty = disabled), avoiding a teleport to the launch-parameter map's POI (#297). - Validate the
select_mapservicemap_nameas a single path segment, rejecting path-traversal config loads (#328). - Namespace all eight
mapoi_serverservices undermapoi/(e.g.get_pois_info->mapoi/get_pois_info); no compatibility alias (#341). - Return
success=falsefromget_route_pois(GetRoutePois) for an unknown route instead of silently returning empty lists;mapoi_nav2_bridge/mapoi_rviz2_publishercheckresponse.success(#342). - Add
waypoint_arrival_modeparameter ("nav2"default /"mapoi") onmapoi_nav2_bridge;"mapoi"sends per-waypointNavigateToPosegoals and advances on tolerance match (#243, #259, #260, #261, #263, #264, #265, #266). - Add topic
mapoi/nav/command_rejected(std_msgs/String) onmapoi_nav2_bridgeas an unconditional rejected-command event, independent of the latchedmapoi/nav/status(#354). - Add
auto_resume_timeout_secparameter (default0.0= disabled) onmapoi_nav2_bridgeto auto-resume a paused route after a timeout (#231, #232). - Publish
rejected:<target>onmapoi/nav/statusfor commands rejected while idle (unknown goal/route, landmark-as-goal, service not ready) so operators can see they were ignored (#339, #355, #352, #356). - Fix Jazzy
EVENT_PAUSEDno longer firing by adding acmd_vel_msg_typeparameter (default"auto") that selectsTwistvsTwistStampedfromROS_DISTRO(#249). - Narrow
PoiEventpublishing toROUTEnavigation only (waypoints/landmarks on the active route), removeEVENT_STOPPED/EVENT_RESUMED, addEVENT_PAUSEDfiring on a realcmd_veldwell (#220, #227). - Render a yaw-agnostic POI tolerance (
tolerance.yaw >= pi) as a filled disc inmapoi_rviz2_publisherinstead of omitting the sector (#267, #268, #271). - Split
mapoi_nav2_bridge.cpp(1,712 lines) into five translation units (route / goal / map-switch / backend-status / core) compiling into one executable; internal refactor, no behavior change (#345).
0.4.0 (2026-05-08)
- Rename the Nav2 bridge node from
mapoi_nav_servertomapoi_nav2_bridge(executable, node, C++ class, header, and thewith_nav_server->with_nav2_bridgelaunch arg); no compatibility alias (#204). - Split the AMCL adapter out of the bridge into a new
mapoi_amcl_localization_bridgeexecutable; theinitialpose_*parameters and/initialposepublishing move to it, and it publishesLocalizationBackendStatus(#209). - Hardcode the system tag definitions in
system_tags.hpp(mapoi::kSystemTags) and remove themaps/tag_definitions.yamlfile /maps/directory;get_tag_definitionscontract unchanged (#191). - Publish
NavigationBackendStatusat 1 Hz onmapoi/nav/backend_status(transient_localQoS) as the navigation readiness contract (#198). - Use
MANUAL_BY_TOPICliveliness (5 s lease) on bothbackend_statustopics so consumers detect bridge death; reject infinite-lease publishers via QoS incompatibility (#208). - Keep the 1 Hz
backend_statuspublish running during blockingLoadMapcalls by moving the timer to a separate callback group under aMultiThreadedExecutor(#213). -
mapoi_gazebo_bridge: fix AMCL drift on operator map switch by teleporting via Gazebo Classicdelete_entity+spawn_entityto the first non-landmark POI (#91, #200). - Add CLI launch examples and
maps_path/map_nameargument semantics tomapoi_server/README.md(#172).
0.3.0 (2026-05-02)
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| mapoi | |
| mapoi_turtlebot3_example | |
| mapoi_webui |
Launch files
Messages
Services
Plugins
Recent questions tagged mapoi_server at Robotics Stack Exchange
|
mapoi_server package from mapoi repomapoi mapoi_interfaces mapoi_rviz_plugins mapoi_server mapoi_turtlebot3_example mapoi_webui |
ROS Distro
|
Package Summary
| Version | 0.6.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/shimz-robotics/mapoi.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-07-15 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Shunsuke Kimura
Authors
- Shunsuke Kimura
mapoi_server
English version (primary): README.md 本ファイルは日本語スナップショットです。最新の内容は英語版を参照してください。
mapoi のメインパッケージです。 地図と POI の情報を管理し、他のパッケージにサービスとして提供します。また、POI 名を指定した自律走行やPOI半径イベントの検知を行います。
自分のロボットへの組み込み方
4 つの core node (mapoi_server / mapoi_nav2_bridge / mapoi_amcl_localization_bridge / mapoi_rviz2_publisher) と、必要に応じてシミュレータ連動 bridge をまとめて起動する bringup launch を提供しています。自前の launch から以下のように include してください:
- include:
file: "$(find-pkg-share mapoi_server)/launch/mapoi_bringup.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"} # REQUIRED
- {name: map_name, value: "initial_map_name"} # REQUIRED
- {name: config_file, value: "mapoi_config.yaml"} # optional
- {name: state_path, value: "/var/lib/mapoi"} # optional (実機運用では推奨、#297)
- {name: simulator, value: "none"} # gazebo|gz|none (default: none)
- {name: robot_entity_name, value: "burger"} # simulator=gazebo|gz のとき必要
- {name: robot_sdf_path, value: "/path/.../model.sdf"} # simulator=gazebo のとき必要
- {name: init_world_name, value: "default"} # simulator=gz のとき必要 (gz_sim 起動時の world 名)
maps_path と map_name は 必須 です。maps_path 未指定 / 存在しないパス / ディレクトリでない場合は RCLCPP_FATAL ログ + 終了コード 1 で起動失敗します (#163)。mapoi_turtlebot3_example の sample を流用するなら $(find-pkg-share mapoi_turtlebot3_example)/maps を指定してください。
CLI から直接起動する例
include せず ros2 launch を直接叩く場合の最小例:
# mapoi_turtlebot3_example の sample maps を流用 (apt / 配布 install 後にも動く)
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(ros2 pkg prefix --share mapoi_turtlebot3_example)/maps \
map_name:=turtlebot3_world
# ソースツリーから直接 (ros2_ws 内で source 後)
# 注: 本 repo を `<ws>/src/mapoi/` に clone している前提 (ws 直下で `git clone .../mapoi.git src/mapoi`)。
# パッケージを `<ws>/src/mapoi_turtlebot3_example/` のようにフラット展開している場合は
# パスを調整するか、上の `pkg prefix --share` 形式を使う方が確実。
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(pwd)/src/mapoi/mapoi_turtlebot3_example/maps \
map_name:=turtlebot3_dqn_stage1
引数の取り違え注意
各 launch arg のセマンティクスは以下のとおり ({maps_path}/{map_name}/{config_file} でアクセスする 3 レベルの分割):
| arg | 渡すもの | 例 |
|---|---|---|
maps_path |
地図群を束ねる親ディレクトリ (各地図は配下のサブディレクトリ) | /path/to/maps |
map_name |
maps_path 直下の地図サブディレクトリ名 |
turtlebot3_world |
config_file |
地図サブディレクトリ内の設定ファイル名 (default: mapoi_config.yaml) |
mapoi_config.yaml |
実際にロードされるパスは {maps_path}/{map_name}/{config_file} で、上記例なら /path/to/maps/turtlebot3_world/mapoi_config.yaml となります。
maps_path / map_name 必須 (上節参照) の検証は 2 段階: map_name 自体未指定なら ros2 launch が Required launch argument 'map_name' was not provided で fail (node 起動前 / launch system 側)、maps_path がディレクトリでない等のセマンティクス違反は mapoi_server ノード起動時に RCLCPP_FATAL で fail します。
❌ よくある間違い: maps_path に config.yaml ファイルパスを直接指定 してしまう:
# WRONG: maps_path はファイルではなくディレクトリ
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=./maps/turtlebot3_dqn_stage1/mapoi_config.yaml \
map_name:=turtlebot3_dqn_stage1
→ 起動時に mapoi_server ノードが以下を 1 行で出力して FATAL 終了します (mapoi_server.cpp 内の RCLCPP_FATAL の実ログ文字列そのまま・英日混在):
[FATAL] maps_path '...mapoi_config.yaml' does not exist or is not a directory. 正しい maps ディレクトリ path を指定してください (例: $(find-pkg-share mapoi_turtlebot3_example)/maps)。
maps_path は 地図群を束ねる親ディレクトリ で、特定の地図ディレクトリやファイルではありません。ディレクトリ構成は本 README 末尾の ディレクトリ構成 節を参照してください。
simulator arg はシミュレータ連動 bridge の起動を制御します:
-
gazebo(Gazebo Classic / Humble):mapoi_gazebo_bridgeを起動。operator map switch 時に Gazebo 内のworld_modelentity を入れ替え + ロボットを delete + spawn で POI list 先頭 の座標に再生成 (#144 で旧initial_posesystem tag を廃止し、yaml 順序で表現する semantics に変更) -
gz(gz-sim / Jazzy):mapoi_gz_bridge+parameter_bridge(ros_gz_bridge) を起動。operator map switch 時に gz-sim 内のworld_modelentity を入れ替え + ロボットをSetEntityPoseで POI list 先頭 の座標に teleport (gz-sim では Classic と異なり set_pose service が使えるため delete + spawn は不要) -
none(default): bridge 起動なし (実機運用)
Web UI も使う場合は mapoi_webui.launch.yaml も併せて include:
- include:
file: "$(find-pkg-share mapoi_webui)/launch/mapoi_webui.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"}
- {name: map_name, value: "initial_map_name"}
NOTE:
mapoi_webuiはシステムタグをmapoi_serverのmapoi/get_tag_definitionsservice 経由で取得します。mapoi_webui単体を起動しても system tags の表示は service 通信になるため、mapoi_serverの package install 自体は不要 (ただし service responder としてmapoi_serverノードが起動している必要あり)。
TurtleBot3 を使った動作例は mapoi_turtlebot3_example パッケージを参照してください。
ノード
mapoi_server
File truncated at 100 lines see the full file
Changelog for package mapoi_server
This per-package file lists only the changes affecting mapoi_server
(including its mapoi_nav2_bridge / mapoi_amcl_localization_bridge /
mapoi_rviz2_publisher / mapoi_gazebo_bridge / mapoi_gz_bridge
nodes), in the flat format expected by bloom / buildfarm. Full
project-level narrative: root CHANGELOG.rst / the GitHub Releases
page.
Forthcoming
0.6.0 (2026-07-15)
-
mapoi_rviz2_publisher: rebuild the marker arrays only when the underlying data changed (POIs, routes, highlights, display parameters), republishing the cached arrays with a refreshed stamp on unchanged ticks — the 1 Hz republish itself is kept so late-joiningvolatilesubscribers still receive markers — and skip the tick entirely while both marker topics have zero subscribers (#402).
0.5.0 (2026-07-10)
- Add the
request_initial_poseservice onmapoi_serveras the sole writer ofmapoi/initialpose_poi; other nodes request a publish instead of publishing directly, unifying the latched cache (#211). - Reject
request_initial_posewhen a non-emptymap_namedoes not match the server's current map, closing the stale-initial-pose map-switch race (#299). - Optionally persist and restore the last-selected map across a
restart via the new
state_pathparameter (default empty = disabled), avoiding a teleport to the launch-parameter map's POI (#297). - Validate the
select_mapservicemap_nameas a single path segment, rejecting path-traversal config loads (#328). - Namespace all eight
mapoi_serverservices undermapoi/(e.g.get_pois_info->mapoi/get_pois_info); no compatibility alias (#341). - Return
success=falsefromget_route_pois(GetRoutePois) for an unknown route instead of silently returning empty lists;mapoi_nav2_bridge/mapoi_rviz2_publishercheckresponse.success(#342). - Add
waypoint_arrival_modeparameter ("nav2"default /"mapoi") onmapoi_nav2_bridge;"mapoi"sends per-waypointNavigateToPosegoals and advances on tolerance match (#243, #259, #260, #261, #263, #264, #265, #266). - Add topic
mapoi/nav/command_rejected(std_msgs/String) onmapoi_nav2_bridgeas an unconditional rejected-command event, independent of the latchedmapoi/nav/status(#354). - Add
auto_resume_timeout_secparameter (default0.0= disabled) onmapoi_nav2_bridgeto auto-resume a paused route after a timeout (#231, #232). - Publish
rejected:<target>onmapoi/nav/statusfor commands rejected while idle (unknown goal/route, landmark-as-goal, service not ready) so operators can see they were ignored (#339, #355, #352, #356). - Fix Jazzy
EVENT_PAUSEDno longer firing by adding acmd_vel_msg_typeparameter (default"auto") that selectsTwistvsTwistStampedfromROS_DISTRO(#249). - Narrow
PoiEventpublishing toROUTEnavigation only (waypoints/landmarks on the active route), removeEVENT_STOPPED/EVENT_RESUMED, addEVENT_PAUSEDfiring on a realcmd_veldwell (#220, #227). - Render a yaw-agnostic POI tolerance (
tolerance.yaw >= pi) as a filled disc inmapoi_rviz2_publisherinstead of omitting the sector (#267, #268, #271). - Split
mapoi_nav2_bridge.cpp(1,712 lines) into five translation units (route / goal / map-switch / backend-status / core) compiling into one executable; internal refactor, no behavior change (#345).
0.4.0 (2026-05-08)
- Rename the Nav2 bridge node from
mapoi_nav_servertomapoi_nav2_bridge(executable, node, C++ class, header, and thewith_nav_server->with_nav2_bridgelaunch arg); no compatibility alias (#204). - Split the AMCL adapter out of the bridge into a new
mapoi_amcl_localization_bridgeexecutable; theinitialpose_*parameters and/initialposepublishing move to it, and it publishesLocalizationBackendStatus(#209). - Hardcode the system tag definitions in
system_tags.hpp(mapoi::kSystemTags) and remove themaps/tag_definitions.yamlfile /maps/directory;get_tag_definitionscontract unchanged (#191). - Publish
NavigationBackendStatusat 1 Hz onmapoi/nav/backend_status(transient_localQoS) as the navigation readiness contract (#198). - Use
MANUAL_BY_TOPICliveliness (5 s lease) on bothbackend_statustopics so consumers detect bridge death; reject infinite-lease publishers via QoS incompatibility (#208). - Keep the 1 Hz
backend_statuspublish running during blockingLoadMapcalls by moving the timer to a separate callback group under aMultiThreadedExecutor(#213). -
mapoi_gazebo_bridge: fix AMCL drift on operator map switch by teleporting via Gazebo Classicdelete_entity+spawn_entityto the first non-landmark POI (#91, #200). - Add CLI launch examples and
maps_path/map_nameargument semantics tomapoi_server/README.md(#172).
0.3.0 (2026-05-02)
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| mapoi | |
| mapoi_turtlebot3_example | |
| mapoi_webui |
Launch files
Messages
Services
Plugins
Recent questions tagged mapoi_server at Robotics Stack Exchange
|
mapoi_server package from mapoi repomapoi mapoi_interfaces mapoi_rviz_plugins mapoi_server mapoi_turtlebot3_example mapoi_webui |
ROS Distro
|
Package Summary
| Version | 0.6.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/shimz-robotics/mapoi.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-07-15 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Shunsuke Kimura
Authors
- Shunsuke Kimura
mapoi_server
English version (primary): README.md 本ファイルは日本語スナップショットです。最新の内容は英語版を参照してください。
mapoi のメインパッケージです。 地図と POI の情報を管理し、他のパッケージにサービスとして提供します。また、POI 名を指定した自律走行やPOI半径イベントの検知を行います。
自分のロボットへの組み込み方
4 つの core node (mapoi_server / mapoi_nav2_bridge / mapoi_amcl_localization_bridge / mapoi_rviz2_publisher) と、必要に応じてシミュレータ連動 bridge をまとめて起動する bringup launch を提供しています。自前の launch から以下のように include してください:
- include:
file: "$(find-pkg-share mapoi_server)/launch/mapoi_bringup.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"} # REQUIRED
- {name: map_name, value: "initial_map_name"} # REQUIRED
- {name: config_file, value: "mapoi_config.yaml"} # optional
- {name: state_path, value: "/var/lib/mapoi"} # optional (実機運用では推奨、#297)
- {name: simulator, value: "none"} # gazebo|gz|none (default: none)
- {name: robot_entity_name, value: "burger"} # simulator=gazebo|gz のとき必要
- {name: robot_sdf_path, value: "/path/.../model.sdf"} # simulator=gazebo のとき必要
- {name: init_world_name, value: "default"} # simulator=gz のとき必要 (gz_sim 起動時の world 名)
maps_path と map_name は 必須 です。maps_path 未指定 / 存在しないパス / ディレクトリでない場合は RCLCPP_FATAL ログ + 終了コード 1 で起動失敗します (#163)。mapoi_turtlebot3_example の sample を流用するなら $(find-pkg-share mapoi_turtlebot3_example)/maps を指定してください。
CLI から直接起動する例
include せず ros2 launch を直接叩く場合の最小例:
# mapoi_turtlebot3_example の sample maps を流用 (apt / 配布 install 後にも動く)
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(ros2 pkg prefix --share mapoi_turtlebot3_example)/maps \
map_name:=turtlebot3_world
# ソースツリーから直接 (ros2_ws 内で source 後)
# 注: 本 repo を `<ws>/src/mapoi/` に clone している前提 (ws 直下で `git clone .../mapoi.git src/mapoi`)。
# パッケージを `<ws>/src/mapoi_turtlebot3_example/` のようにフラット展開している場合は
# パスを調整するか、上の `pkg prefix --share` 形式を使う方が確実。
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(pwd)/src/mapoi/mapoi_turtlebot3_example/maps \
map_name:=turtlebot3_dqn_stage1
引数の取り違え注意
各 launch arg のセマンティクスは以下のとおり ({maps_path}/{map_name}/{config_file} でアクセスする 3 レベルの分割):
| arg | 渡すもの | 例 |
|---|---|---|
maps_path |
地図群を束ねる親ディレクトリ (各地図は配下のサブディレクトリ) | /path/to/maps |
map_name |
maps_path 直下の地図サブディレクトリ名 |
turtlebot3_world |
config_file |
地図サブディレクトリ内の設定ファイル名 (default: mapoi_config.yaml) |
mapoi_config.yaml |
実際にロードされるパスは {maps_path}/{map_name}/{config_file} で、上記例なら /path/to/maps/turtlebot3_world/mapoi_config.yaml となります。
maps_path / map_name 必須 (上節参照) の検証は 2 段階: map_name 自体未指定なら ros2 launch が Required launch argument 'map_name' was not provided で fail (node 起動前 / launch system 側)、maps_path がディレクトリでない等のセマンティクス違反は mapoi_server ノード起動時に RCLCPP_FATAL で fail します。
❌ よくある間違い: maps_path に config.yaml ファイルパスを直接指定 してしまう:
# WRONG: maps_path はファイルではなくディレクトリ
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=./maps/turtlebot3_dqn_stage1/mapoi_config.yaml \
map_name:=turtlebot3_dqn_stage1
→ 起動時に mapoi_server ノードが以下を 1 行で出力して FATAL 終了します (mapoi_server.cpp 内の RCLCPP_FATAL の実ログ文字列そのまま・英日混在):
[FATAL] maps_path '...mapoi_config.yaml' does not exist or is not a directory. 正しい maps ディレクトリ path を指定してください (例: $(find-pkg-share mapoi_turtlebot3_example)/maps)。
maps_path は 地図群を束ねる親ディレクトリ で、特定の地図ディレクトリやファイルではありません。ディレクトリ構成は本 README 末尾の ディレクトリ構成 節を参照してください。
simulator arg はシミュレータ連動 bridge の起動を制御します:
-
gazebo(Gazebo Classic / Humble):mapoi_gazebo_bridgeを起動。operator map switch 時に Gazebo 内のworld_modelentity を入れ替え + ロボットを delete + spawn で POI list 先頭 の座標に再生成 (#144 で旧initial_posesystem tag を廃止し、yaml 順序で表現する semantics に変更) -
gz(gz-sim / Jazzy):mapoi_gz_bridge+parameter_bridge(ros_gz_bridge) を起動。operator map switch 時に gz-sim 内のworld_modelentity を入れ替え + ロボットをSetEntityPoseで POI list 先頭 の座標に teleport (gz-sim では Classic と異なり set_pose service が使えるため delete + spawn は不要) -
none(default): bridge 起動なし (実機運用)
Web UI も使う場合は mapoi_webui.launch.yaml も併せて include:
- include:
file: "$(find-pkg-share mapoi_webui)/launch/mapoi_webui.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"}
- {name: map_name, value: "initial_map_name"}
NOTE:
mapoi_webuiはシステムタグをmapoi_serverのmapoi/get_tag_definitionsservice 経由で取得します。mapoi_webui単体を起動しても system tags の表示は service 通信になるため、mapoi_serverの package install 自体は不要 (ただし service responder としてmapoi_serverノードが起動している必要あり)。
TurtleBot3 を使った動作例は mapoi_turtlebot3_example パッケージを参照してください。
ノード
mapoi_server
File truncated at 100 lines see the full file
Changelog for package mapoi_server
This per-package file lists only the changes affecting mapoi_server
(including its mapoi_nav2_bridge / mapoi_amcl_localization_bridge /
mapoi_rviz2_publisher / mapoi_gazebo_bridge / mapoi_gz_bridge
nodes), in the flat format expected by bloom / buildfarm. Full
project-level narrative: root CHANGELOG.rst / the GitHub Releases
page.
Forthcoming
0.6.0 (2026-07-15)
-
mapoi_rviz2_publisher: rebuild the marker arrays only when the underlying data changed (POIs, routes, highlights, display parameters), republishing the cached arrays with a refreshed stamp on unchanged ticks — the 1 Hz republish itself is kept so late-joiningvolatilesubscribers still receive markers — and skip the tick entirely while both marker topics have zero subscribers (#402).
0.5.0 (2026-07-10)
- Add the
request_initial_poseservice onmapoi_serveras the sole writer ofmapoi/initialpose_poi; other nodes request a publish instead of publishing directly, unifying the latched cache (#211). - Reject
request_initial_posewhen a non-emptymap_namedoes not match the server's current map, closing the stale-initial-pose map-switch race (#299). - Optionally persist and restore the last-selected map across a
restart via the new
state_pathparameter (default empty = disabled), avoiding a teleport to the launch-parameter map's POI (#297). - Validate the
select_mapservicemap_nameas a single path segment, rejecting path-traversal config loads (#328). - Namespace all eight
mapoi_serverservices undermapoi/(e.g.get_pois_info->mapoi/get_pois_info); no compatibility alias (#341). - Return
success=falsefromget_route_pois(GetRoutePois) for an unknown route instead of silently returning empty lists;mapoi_nav2_bridge/mapoi_rviz2_publishercheckresponse.success(#342). - Add
waypoint_arrival_modeparameter ("nav2"default /"mapoi") onmapoi_nav2_bridge;"mapoi"sends per-waypointNavigateToPosegoals and advances on tolerance match (#243, #259, #260, #261, #263, #264, #265, #266). - Add topic
mapoi/nav/command_rejected(std_msgs/String) onmapoi_nav2_bridgeas an unconditional rejected-command event, independent of the latchedmapoi/nav/status(#354). - Add
auto_resume_timeout_secparameter (default0.0= disabled) onmapoi_nav2_bridgeto auto-resume a paused route after a timeout (#231, #232). - Publish
rejected:<target>onmapoi/nav/statusfor commands rejected while idle (unknown goal/route, landmark-as-goal, service not ready) so operators can see they were ignored (#339, #355, #352, #356). - Fix Jazzy
EVENT_PAUSEDno longer firing by adding acmd_vel_msg_typeparameter (default"auto") that selectsTwistvsTwistStampedfromROS_DISTRO(#249). - Narrow
PoiEventpublishing toROUTEnavigation only (waypoints/landmarks on the active route), removeEVENT_STOPPED/EVENT_RESUMED, addEVENT_PAUSEDfiring on a realcmd_veldwell (#220, #227). - Render a yaw-agnostic POI tolerance (
tolerance.yaw >= pi) as a filled disc inmapoi_rviz2_publisherinstead of omitting the sector (#267, #268, #271). - Split
mapoi_nav2_bridge.cpp(1,712 lines) into five translation units (route / goal / map-switch / backend-status / core) compiling into one executable; internal refactor, no behavior change (#345).
0.4.0 (2026-05-08)
- Rename the Nav2 bridge node from
mapoi_nav_servertomapoi_nav2_bridge(executable, node, C++ class, header, and thewith_nav_server->with_nav2_bridgelaunch arg); no compatibility alias (#204). - Split the AMCL adapter out of the bridge into a new
mapoi_amcl_localization_bridgeexecutable; theinitialpose_*parameters and/initialposepublishing move to it, and it publishesLocalizationBackendStatus(#209). - Hardcode the system tag definitions in
system_tags.hpp(mapoi::kSystemTags) and remove themaps/tag_definitions.yamlfile /maps/directory;get_tag_definitionscontract unchanged (#191). - Publish
NavigationBackendStatusat 1 Hz onmapoi/nav/backend_status(transient_localQoS) as the navigation readiness contract (#198). - Use
MANUAL_BY_TOPICliveliness (5 s lease) on bothbackend_statustopics so consumers detect bridge death; reject infinite-lease publishers via QoS incompatibility (#208). - Keep the 1 Hz
backend_statuspublish running during blockingLoadMapcalls by moving the timer to a separate callback group under aMultiThreadedExecutor(#213). -
mapoi_gazebo_bridge: fix AMCL drift on operator map switch by teleporting via Gazebo Classicdelete_entity+spawn_entityto the first non-landmark POI (#91, #200). - Add CLI launch examples and
maps_path/map_nameargument semantics tomapoi_server/README.md(#172).
0.3.0 (2026-05-02)
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| mapoi | |
| mapoi_turtlebot3_example | |
| mapoi_webui |
Launch files
Messages
Services
Plugins
Recent questions tagged mapoi_server at Robotics Stack Exchange
|
mapoi_server package from mapoi repomapoi mapoi_interfaces mapoi_rviz_plugins mapoi_server mapoi_turtlebot3_example mapoi_webui |
ROS Distro
|
Package Summary
| Version | 0.6.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/shimz-robotics/mapoi.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-07-15 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Shunsuke Kimura
Authors
- Shunsuke Kimura
mapoi_server
English version (primary): README.md 本ファイルは日本語スナップショットです。最新の内容は英語版を参照してください。
mapoi のメインパッケージです。 地図と POI の情報を管理し、他のパッケージにサービスとして提供します。また、POI 名を指定した自律走行やPOI半径イベントの検知を行います。
自分のロボットへの組み込み方
4 つの core node (mapoi_server / mapoi_nav2_bridge / mapoi_amcl_localization_bridge / mapoi_rviz2_publisher) と、必要に応じてシミュレータ連動 bridge をまとめて起動する bringup launch を提供しています。自前の launch から以下のように include してください:
- include:
file: "$(find-pkg-share mapoi_server)/launch/mapoi_bringup.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"} # REQUIRED
- {name: map_name, value: "initial_map_name"} # REQUIRED
- {name: config_file, value: "mapoi_config.yaml"} # optional
- {name: state_path, value: "/var/lib/mapoi"} # optional (実機運用では推奨、#297)
- {name: simulator, value: "none"} # gazebo|gz|none (default: none)
- {name: robot_entity_name, value: "burger"} # simulator=gazebo|gz のとき必要
- {name: robot_sdf_path, value: "/path/.../model.sdf"} # simulator=gazebo のとき必要
- {name: init_world_name, value: "default"} # simulator=gz のとき必要 (gz_sim 起動時の world 名)
maps_path と map_name は 必須 です。maps_path 未指定 / 存在しないパス / ディレクトリでない場合は RCLCPP_FATAL ログ + 終了コード 1 で起動失敗します (#163)。mapoi_turtlebot3_example の sample を流用するなら $(find-pkg-share mapoi_turtlebot3_example)/maps を指定してください。
CLI から直接起動する例
include せず ros2 launch を直接叩く場合の最小例:
# mapoi_turtlebot3_example の sample maps を流用 (apt / 配布 install 後にも動く)
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(ros2 pkg prefix --share mapoi_turtlebot3_example)/maps \
map_name:=turtlebot3_world
# ソースツリーから直接 (ros2_ws 内で source 後)
# 注: 本 repo を `<ws>/src/mapoi/` に clone している前提 (ws 直下で `git clone .../mapoi.git src/mapoi`)。
# パッケージを `<ws>/src/mapoi_turtlebot3_example/` のようにフラット展開している場合は
# パスを調整するか、上の `pkg prefix --share` 形式を使う方が確実。
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(pwd)/src/mapoi/mapoi_turtlebot3_example/maps \
map_name:=turtlebot3_dqn_stage1
引数の取り違え注意
各 launch arg のセマンティクスは以下のとおり ({maps_path}/{map_name}/{config_file} でアクセスする 3 レベルの分割):
| arg | 渡すもの | 例 |
|---|---|---|
maps_path |
地図群を束ねる親ディレクトリ (各地図は配下のサブディレクトリ) | /path/to/maps |
map_name |
maps_path 直下の地図サブディレクトリ名 |
turtlebot3_world |
config_file |
地図サブディレクトリ内の設定ファイル名 (default: mapoi_config.yaml) |
mapoi_config.yaml |
実際にロードされるパスは {maps_path}/{map_name}/{config_file} で、上記例なら /path/to/maps/turtlebot3_world/mapoi_config.yaml となります。
maps_path / map_name 必須 (上節参照) の検証は 2 段階: map_name 自体未指定なら ros2 launch が Required launch argument 'map_name' was not provided で fail (node 起動前 / launch system 側)、maps_path がディレクトリでない等のセマンティクス違反は mapoi_server ノード起動時に RCLCPP_FATAL で fail します。
❌ よくある間違い: maps_path に config.yaml ファイルパスを直接指定 してしまう:
# WRONG: maps_path はファイルではなくディレクトリ
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=./maps/turtlebot3_dqn_stage1/mapoi_config.yaml \
map_name:=turtlebot3_dqn_stage1
→ 起動時に mapoi_server ノードが以下を 1 行で出力して FATAL 終了します (mapoi_server.cpp 内の RCLCPP_FATAL の実ログ文字列そのまま・英日混在):
[FATAL] maps_path '...mapoi_config.yaml' does not exist or is not a directory. 正しい maps ディレクトリ path を指定してください (例: $(find-pkg-share mapoi_turtlebot3_example)/maps)。
maps_path は 地図群を束ねる親ディレクトリ で、特定の地図ディレクトリやファイルではありません。ディレクトリ構成は本 README 末尾の ディレクトリ構成 節を参照してください。
simulator arg はシミュレータ連動 bridge の起動を制御します:
-
gazebo(Gazebo Classic / Humble):mapoi_gazebo_bridgeを起動。operator map switch 時に Gazebo 内のworld_modelentity を入れ替え + ロボットを delete + spawn で POI list 先頭 の座標に再生成 (#144 で旧initial_posesystem tag を廃止し、yaml 順序で表現する semantics に変更) -
gz(gz-sim / Jazzy):mapoi_gz_bridge+parameter_bridge(ros_gz_bridge) を起動。operator map switch 時に gz-sim 内のworld_modelentity を入れ替え + ロボットをSetEntityPoseで POI list 先頭 の座標に teleport (gz-sim では Classic と異なり set_pose service が使えるため delete + spawn は不要) -
none(default): bridge 起動なし (実機運用)
Web UI も使う場合は mapoi_webui.launch.yaml も併せて include:
- include:
file: "$(find-pkg-share mapoi_webui)/launch/mapoi_webui.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"}
- {name: map_name, value: "initial_map_name"}
NOTE:
mapoi_webuiはシステムタグをmapoi_serverのmapoi/get_tag_definitionsservice 経由で取得します。mapoi_webui単体を起動しても system tags の表示は service 通信になるため、mapoi_serverの package install 自体は不要 (ただし service responder としてmapoi_serverノードが起動している必要あり)。
TurtleBot3 を使った動作例は mapoi_turtlebot3_example パッケージを参照してください。
ノード
mapoi_server
File truncated at 100 lines see the full file
Changelog for package mapoi_server
This per-package file lists only the changes affecting mapoi_server
(including its mapoi_nav2_bridge / mapoi_amcl_localization_bridge /
mapoi_rviz2_publisher / mapoi_gazebo_bridge / mapoi_gz_bridge
nodes), in the flat format expected by bloom / buildfarm. Full
project-level narrative: root CHANGELOG.rst / the GitHub Releases
page.
Forthcoming
0.6.0 (2026-07-15)
-
mapoi_rviz2_publisher: rebuild the marker arrays only when the underlying data changed (POIs, routes, highlights, display parameters), republishing the cached arrays with a refreshed stamp on unchanged ticks — the 1 Hz republish itself is kept so late-joiningvolatilesubscribers still receive markers — and skip the tick entirely while both marker topics have zero subscribers (#402).
0.5.0 (2026-07-10)
- Add the
request_initial_poseservice onmapoi_serveras the sole writer ofmapoi/initialpose_poi; other nodes request a publish instead of publishing directly, unifying the latched cache (#211). - Reject
request_initial_posewhen a non-emptymap_namedoes not match the server's current map, closing the stale-initial-pose map-switch race (#299). - Optionally persist and restore the last-selected map across a
restart via the new
state_pathparameter (default empty = disabled), avoiding a teleport to the launch-parameter map's POI (#297). - Validate the
select_mapservicemap_nameas a single path segment, rejecting path-traversal config loads (#328). - Namespace all eight
mapoi_serverservices undermapoi/(e.g.get_pois_info->mapoi/get_pois_info); no compatibility alias (#341). - Return
success=falsefromget_route_pois(GetRoutePois) for an unknown route instead of silently returning empty lists;mapoi_nav2_bridge/mapoi_rviz2_publishercheckresponse.success(#342). - Add
waypoint_arrival_modeparameter ("nav2"default /"mapoi") onmapoi_nav2_bridge;"mapoi"sends per-waypointNavigateToPosegoals and advances on tolerance match (#243, #259, #260, #261, #263, #264, #265, #266). - Add topic
mapoi/nav/command_rejected(std_msgs/String) onmapoi_nav2_bridgeas an unconditional rejected-command event, independent of the latchedmapoi/nav/status(#354). - Add
auto_resume_timeout_secparameter (default0.0= disabled) onmapoi_nav2_bridgeto auto-resume a paused route after a timeout (#231, #232). - Publish
rejected:<target>onmapoi/nav/statusfor commands rejected while idle (unknown goal/route, landmark-as-goal, service not ready) so operators can see they were ignored (#339, #355, #352, #356). - Fix Jazzy
EVENT_PAUSEDno longer firing by adding acmd_vel_msg_typeparameter (default"auto") that selectsTwistvsTwistStampedfromROS_DISTRO(#249). - Narrow
PoiEventpublishing toROUTEnavigation only (waypoints/landmarks on the active route), removeEVENT_STOPPED/EVENT_RESUMED, addEVENT_PAUSEDfiring on a realcmd_veldwell (#220, #227). - Render a yaw-agnostic POI tolerance (
tolerance.yaw >= pi) as a filled disc inmapoi_rviz2_publisherinstead of omitting the sector (#267, #268, #271). - Split
mapoi_nav2_bridge.cpp(1,712 lines) into five translation units (route / goal / map-switch / backend-status / core) compiling into one executable; internal refactor, no behavior change (#345).
0.4.0 (2026-05-08)
- Rename the Nav2 bridge node from
mapoi_nav_servertomapoi_nav2_bridge(executable, node, C++ class, header, and thewith_nav_server->with_nav2_bridgelaunch arg); no compatibility alias (#204). - Split the AMCL adapter out of the bridge into a new
mapoi_amcl_localization_bridgeexecutable; theinitialpose_*parameters and/initialposepublishing move to it, and it publishesLocalizationBackendStatus(#209). - Hardcode the system tag definitions in
system_tags.hpp(mapoi::kSystemTags) and remove themaps/tag_definitions.yamlfile /maps/directory;get_tag_definitionscontract unchanged (#191). - Publish
NavigationBackendStatusat 1 Hz onmapoi/nav/backend_status(transient_localQoS) as the navigation readiness contract (#198). - Use
MANUAL_BY_TOPICliveliness (5 s lease) on bothbackend_statustopics so consumers detect bridge death; reject infinite-lease publishers via QoS incompatibility (#208). - Keep the 1 Hz
backend_statuspublish running during blockingLoadMapcalls by moving the timer to a separate callback group under aMultiThreadedExecutor(#213). -
mapoi_gazebo_bridge: fix AMCL drift on operator map switch by teleporting via Gazebo Classicdelete_entity+spawn_entityto the first non-landmark POI (#91, #200). - Add CLI launch examples and
maps_path/map_nameargument semantics tomapoi_server/README.md(#172).
0.3.0 (2026-05-02)
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| mapoi | |
| mapoi_turtlebot3_example | |
| mapoi_webui |
Launch files
Messages
Services
Plugins
Recent questions tagged mapoi_server at Robotics Stack Exchange
|
mapoi_server package from mapoi repomapoi mapoi_interfaces mapoi_rviz_plugins mapoi_server mapoi_turtlebot3_example mapoi_webui |
ROS Distro
|
Package Summary
| Version | 0.6.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/shimz-robotics/mapoi.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-07-15 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Shunsuke Kimura
Authors
- Shunsuke Kimura
mapoi_server
English version (primary): README.md 本ファイルは日本語スナップショットです。最新の内容は英語版を参照してください。
mapoi のメインパッケージです。 地図と POI の情報を管理し、他のパッケージにサービスとして提供します。また、POI 名を指定した自律走行やPOI半径イベントの検知を行います。
自分のロボットへの組み込み方
4 つの core node (mapoi_server / mapoi_nav2_bridge / mapoi_amcl_localization_bridge / mapoi_rviz2_publisher) と、必要に応じてシミュレータ連動 bridge をまとめて起動する bringup launch を提供しています。自前の launch から以下のように include してください:
- include:
file: "$(find-pkg-share mapoi_server)/launch/mapoi_bringup.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"} # REQUIRED
- {name: map_name, value: "initial_map_name"} # REQUIRED
- {name: config_file, value: "mapoi_config.yaml"} # optional
- {name: state_path, value: "/var/lib/mapoi"} # optional (実機運用では推奨、#297)
- {name: simulator, value: "none"} # gazebo|gz|none (default: none)
- {name: robot_entity_name, value: "burger"} # simulator=gazebo|gz のとき必要
- {name: robot_sdf_path, value: "/path/.../model.sdf"} # simulator=gazebo のとき必要
- {name: init_world_name, value: "default"} # simulator=gz のとき必要 (gz_sim 起動時の world 名)
maps_path と map_name は 必須 です。maps_path 未指定 / 存在しないパス / ディレクトリでない場合は RCLCPP_FATAL ログ + 終了コード 1 で起動失敗します (#163)。mapoi_turtlebot3_example の sample を流用するなら $(find-pkg-share mapoi_turtlebot3_example)/maps を指定してください。
CLI から直接起動する例
include せず ros2 launch を直接叩く場合の最小例:
# mapoi_turtlebot3_example の sample maps を流用 (apt / 配布 install 後にも動く)
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(ros2 pkg prefix --share mapoi_turtlebot3_example)/maps \
map_name:=turtlebot3_world
# ソースツリーから直接 (ros2_ws 内で source 後)
# 注: 本 repo を `<ws>/src/mapoi/` に clone している前提 (ws 直下で `git clone .../mapoi.git src/mapoi`)。
# パッケージを `<ws>/src/mapoi_turtlebot3_example/` のようにフラット展開している場合は
# パスを調整するか、上の `pkg prefix --share` 形式を使う方が確実。
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(pwd)/src/mapoi/mapoi_turtlebot3_example/maps \
map_name:=turtlebot3_dqn_stage1
引数の取り違え注意
各 launch arg のセマンティクスは以下のとおり ({maps_path}/{map_name}/{config_file} でアクセスする 3 レベルの分割):
| arg | 渡すもの | 例 |
|---|---|---|
maps_path |
地図群を束ねる親ディレクトリ (各地図は配下のサブディレクトリ) | /path/to/maps |
map_name |
maps_path 直下の地図サブディレクトリ名 |
turtlebot3_world |
config_file |
地図サブディレクトリ内の設定ファイル名 (default: mapoi_config.yaml) |
mapoi_config.yaml |
実際にロードされるパスは {maps_path}/{map_name}/{config_file} で、上記例なら /path/to/maps/turtlebot3_world/mapoi_config.yaml となります。
maps_path / map_name 必須 (上節参照) の検証は 2 段階: map_name 自体未指定なら ros2 launch が Required launch argument 'map_name' was not provided で fail (node 起動前 / launch system 側)、maps_path がディレクトリでない等のセマンティクス違反は mapoi_server ノード起動時に RCLCPP_FATAL で fail します。
❌ よくある間違い: maps_path に config.yaml ファイルパスを直接指定 してしまう:
# WRONG: maps_path はファイルではなくディレクトリ
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=./maps/turtlebot3_dqn_stage1/mapoi_config.yaml \
map_name:=turtlebot3_dqn_stage1
→ 起動時に mapoi_server ノードが以下を 1 行で出力して FATAL 終了します (mapoi_server.cpp 内の RCLCPP_FATAL の実ログ文字列そのまま・英日混在):
[FATAL] maps_path '...mapoi_config.yaml' does not exist or is not a directory. 正しい maps ディレクトリ path を指定してください (例: $(find-pkg-share mapoi_turtlebot3_example)/maps)。
maps_path は 地図群を束ねる親ディレクトリ で、特定の地図ディレクトリやファイルではありません。ディレクトリ構成は本 README 末尾の ディレクトリ構成 節を参照してください。
simulator arg はシミュレータ連動 bridge の起動を制御します:
-
gazebo(Gazebo Classic / Humble):mapoi_gazebo_bridgeを起動。operator map switch 時に Gazebo 内のworld_modelentity を入れ替え + ロボットを delete + spawn で POI list 先頭 の座標に再生成 (#144 で旧initial_posesystem tag を廃止し、yaml 順序で表現する semantics に変更) -
gz(gz-sim / Jazzy):mapoi_gz_bridge+parameter_bridge(ros_gz_bridge) を起動。operator map switch 時に gz-sim 内のworld_modelentity を入れ替え + ロボットをSetEntityPoseで POI list 先頭 の座標に teleport (gz-sim では Classic と異なり set_pose service が使えるため delete + spawn は不要) -
none(default): bridge 起動なし (実機運用)
Web UI も使う場合は mapoi_webui.launch.yaml も併せて include:
- include:
file: "$(find-pkg-share mapoi_webui)/launch/mapoi_webui.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"}
- {name: map_name, value: "initial_map_name"}
NOTE:
mapoi_webuiはシステムタグをmapoi_serverのmapoi/get_tag_definitionsservice 経由で取得します。mapoi_webui単体を起動しても system tags の表示は service 通信になるため、mapoi_serverの package install 自体は不要 (ただし service responder としてmapoi_serverノードが起動している必要あり)。
TurtleBot3 を使った動作例は mapoi_turtlebot3_example パッケージを参照してください。
ノード
mapoi_server
File truncated at 100 lines see the full file
Changelog for package mapoi_server
This per-package file lists only the changes affecting mapoi_server
(including its mapoi_nav2_bridge / mapoi_amcl_localization_bridge /
mapoi_rviz2_publisher / mapoi_gazebo_bridge / mapoi_gz_bridge
nodes), in the flat format expected by bloom / buildfarm. Full
project-level narrative: root CHANGELOG.rst / the GitHub Releases
page.
Forthcoming
0.6.0 (2026-07-15)
-
mapoi_rviz2_publisher: rebuild the marker arrays only when the underlying data changed (POIs, routes, highlights, display parameters), republishing the cached arrays with a refreshed stamp on unchanged ticks — the 1 Hz republish itself is kept so late-joiningvolatilesubscribers still receive markers — and skip the tick entirely while both marker topics have zero subscribers (#402).
0.5.0 (2026-07-10)
- Add the
request_initial_poseservice onmapoi_serveras the sole writer ofmapoi/initialpose_poi; other nodes request a publish instead of publishing directly, unifying the latched cache (#211). - Reject
request_initial_posewhen a non-emptymap_namedoes not match the server's current map, closing the stale-initial-pose map-switch race (#299). - Optionally persist and restore the last-selected map across a
restart via the new
state_pathparameter (default empty = disabled), avoiding a teleport to the launch-parameter map's POI (#297). - Validate the
select_mapservicemap_nameas a single path segment, rejecting path-traversal config loads (#328). - Namespace all eight
mapoi_serverservices undermapoi/(e.g.get_pois_info->mapoi/get_pois_info); no compatibility alias (#341). - Return
success=falsefromget_route_pois(GetRoutePois) for an unknown route instead of silently returning empty lists;mapoi_nav2_bridge/mapoi_rviz2_publishercheckresponse.success(#342). - Add
waypoint_arrival_modeparameter ("nav2"default /"mapoi") onmapoi_nav2_bridge;"mapoi"sends per-waypointNavigateToPosegoals and advances on tolerance match (#243, #259, #260, #261, #263, #264, #265, #266). - Add topic
mapoi/nav/command_rejected(std_msgs/String) onmapoi_nav2_bridgeas an unconditional rejected-command event, independent of the latchedmapoi/nav/status(#354). - Add
auto_resume_timeout_secparameter (default0.0= disabled) onmapoi_nav2_bridgeto auto-resume a paused route after a timeout (#231, #232). - Publish
rejected:<target>onmapoi/nav/statusfor commands rejected while idle (unknown goal/route, landmark-as-goal, service not ready) so operators can see they were ignored (#339, #355, #352, #356). - Fix Jazzy
EVENT_PAUSEDno longer firing by adding acmd_vel_msg_typeparameter (default"auto") that selectsTwistvsTwistStampedfromROS_DISTRO(#249). - Narrow
PoiEventpublishing toROUTEnavigation only (waypoints/landmarks on the active route), removeEVENT_STOPPED/EVENT_RESUMED, addEVENT_PAUSEDfiring on a realcmd_veldwell (#220, #227). - Render a yaw-agnostic POI tolerance (
tolerance.yaw >= pi) as a filled disc inmapoi_rviz2_publisherinstead of omitting the sector (#267, #268, #271). - Split
mapoi_nav2_bridge.cpp(1,712 lines) into five translation units (route / goal / map-switch / backend-status / core) compiling into one executable; internal refactor, no behavior change (#345).
0.4.0 (2026-05-08)
- Rename the Nav2 bridge node from
mapoi_nav_servertomapoi_nav2_bridge(executable, node, C++ class, header, and thewith_nav_server->with_nav2_bridgelaunch arg); no compatibility alias (#204). - Split the AMCL adapter out of the bridge into a new
mapoi_amcl_localization_bridgeexecutable; theinitialpose_*parameters and/initialposepublishing move to it, and it publishesLocalizationBackendStatus(#209). - Hardcode the system tag definitions in
system_tags.hpp(mapoi::kSystemTags) and remove themaps/tag_definitions.yamlfile /maps/directory;get_tag_definitionscontract unchanged (#191). - Publish
NavigationBackendStatusat 1 Hz onmapoi/nav/backend_status(transient_localQoS) as the navigation readiness contract (#198). - Use
MANUAL_BY_TOPICliveliness (5 s lease) on bothbackend_statustopics so consumers detect bridge death; reject infinite-lease publishers via QoS incompatibility (#208). - Keep the 1 Hz
backend_statuspublish running during blockingLoadMapcalls by moving the timer to a separate callback group under aMultiThreadedExecutor(#213). -
mapoi_gazebo_bridge: fix AMCL drift on operator map switch by teleporting via Gazebo Classicdelete_entity+spawn_entityto the first non-landmark POI (#91, #200). - Add CLI launch examples and
maps_path/map_nameargument semantics tomapoi_server/README.md(#172).
0.3.0 (2026-05-02)
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| mapoi | |
| mapoi_turtlebot3_example | |
| mapoi_webui |
Launch files
Messages
Services
Plugins
Recent questions tagged mapoi_server at Robotics Stack Exchange
|
mapoi_server package from mapoi repomapoi mapoi_interfaces mapoi_rviz_plugins mapoi_server mapoi_turtlebot3_example mapoi_webui |
ROS Distro
|
Package Summary
| Version | 0.6.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/shimz-robotics/mapoi.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-07-15 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Shunsuke Kimura
Authors
- Shunsuke Kimura
mapoi_server
English version (primary): README.md 本ファイルは日本語スナップショットです。最新の内容は英語版を参照してください。
mapoi のメインパッケージです。 地図と POI の情報を管理し、他のパッケージにサービスとして提供します。また、POI 名を指定した自律走行やPOI半径イベントの検知を行います。
自分のロボットへの組み込み方
4 つの core node (mapoi_server / mapoi_nav2_bridge / mapoi_amcl_localization_bridge / mapoi_rviz2_publisher) と、必要に応じてシミュレータ連動 bridge をまとめて起動する bringup launch を提供しています。自前の launch から以下のように include してください:
- include:
file: "$(find-pkg-share mapoi_server)/launch/mapoi_bringup.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"} # REQUIRED
- {name: map_name, value: "initial_map_name"} # REQUIRED
- {name: config_file, value: "mapoi_config.yaml"} # optional
- {name: state_path, value: "/var/lib/mapoi"} # optional (実機運用では推奨、#297)
- {name: simulator, value: "none"} # gazebo|gz|none (default: none)
- {name: robot_entity_name, value: "burger"} # simulator=gazebo|gz のとき必要
- {name: robot_sdf_path, value: "/path/.../model.sdf"} # simulator=gazebo のとき必要
- {name: init_world_name, value: "default"} # simulator=gz のとき必要 (gz_sim 起動時の world 名)
maps_path と map_name は 必須 です。maps_path 未指定 / 存在しないパス / ディレクトリでない場合は RCLCPP_FATAL ログ + 終了コード 1 で起動失敗します (#163)。mapoi_turtlebot3_example の sample を流用するなら $(find-pkg-share mapoi_turtlebot3_example)/maps を指定してください。
CLI から直接起動する例
include せず ros2 launch を直接叩く場合の最小例:
# mapoi_turtlebot3_example の sample maps を流用 (apt / 配布 install 後にも動く)
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(ros2 pkg prefix --share mapoi_turtlebot3_example)/maps \
map_name:=turtlebot3_world
# ソースツリーから直接 (ros2_ws 内で source 後)
# 注: 本 repo を `<ws>/src/mapoi/` に clone している前提 (ws 直下で `git clone .../mapoi.git src/mapoi`)。
# パッケージを `<ws>/src/mapoi_turtlebot3_example/` のようにフラット展開している場合は
# パスを調整するか、上の `pkg prefix --share` 形式を使う方が確実。
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(pwd)/src/mapoi/mapoi_turtlebot3_example/maps \
map_name:=turtlebot3_dqn_stage1
引数の取り違え注意
各 launch arg のセマンティクスは以下のとおり ({maps_path}/{map_name}/{config_file} でアクセスする 3 レベルの分割):
| arg | 渡すもの | 例 |
|---|---|---|
maps_path |
地図群を束ねる親ディレクトリ (各地図は配下のサブディレクトリ) | /path/to/maps |
map_name |
maps_path 直下の地図サブディレクトリ名 |
turtlebot3_world |
config_file |
地図サブディレクトリ内の設定ファイル名 (default: mapoi_config.yaml) |
mapoi_config.yaml |
実際にロードされるパスは {maps_path}/{map_name}/{config_file} で、上記例なら /path/to/maps/turtlebot3_world/mapoi_config.yaml となります。
maps_path / map_name 必須 (上節参照) の検証は 2 段階: map_name 自体未指定なら ros2 launch が Required launch argument 'map_name' was not provided で fail (node 起動前 / launch system 側)、maps_path がディレクトリでない等のセマンティクス違反は mapoi_server ノード起動時に RCLCPP_FATAL で fail します。
❌ よくある間違い: maps_path に config.yaml ファイルパスを直接指定 してしまう:
# WRONG: maps_path はファイルではなくディレクトリ
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=./maps/turtlebot3_dqn_stage1/mapoi_config.yaml \
map_name:=turtlebot3_dqn_stage1
→ 起動時に mapoi_server ノードが以下を 1 行で出力して FATAL 終了します (mapoi_server.cpp 内の RCLCPP_FATAL の実ログ文字列そのまま・英日混在):
[FATAL] maps_path '...mapoi_config.yaml' does not exist or is not a directory. 正しい maps ディレクトリ path を指定してください (例: $(find-pkg-share mapoi_turtlebot3_example)/maps)。
maps_path は 地図群を束ねる親ディレクトリ で、特定の地図ディレクトリやファイルではありません。ディレクトリ構成は本 README 末尾の ディレクトリ構成 節を参照してください。
simulator arg はシミュレータ連動 bridge の起動を制御します:
-
gazebo(Gazebo Classic / Humble):mapoi_gazebo_bridgeを起動。operator map switch 時に Gazebo 内のworld_modelentity を入れ替え + ロボットを delete + spawn で POI list 先頭 の座標に再生成 (#144 で旧initial_posesystem tag を廃止し、yaml 順序で表現する semantics に変更) -
gz(gz-sim / Jazzy):mapoi_gz_bridge+parameter_bridge(ros_gz_bridge) を起動。operator map switch 時に gz-sim 内のworld_modelentity を入れ替え + ロボットをSetEntityPoseで POI list 先頭 の座標に teleport (gz-sim では Classic と異なり set_pose service が使えるため delete + spawn は不要) -
none(default): bridge 起動なし (実機運用)
Web UI も使う場合は mapoi_webui.launch.yaml も併せて include:
- include:
file: "$(find-pkg-share mapoi_webui)/launch/mapoi_webui.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"}
- {name: map_name, value: "initial_map_name"}
NOTE:
mapoi_webuiはシステムタグをmapoi_serverのmapoi/get_tag_definitionsservice 経由で取得します。mapoi_webui単体を起動しても system tags の表示は service 通信になるため、mapoi_serverの package install 自体は不要 (ただし service responder としてmapoi_serverノードが起動している必要あり)。
TurtleBot3 を使った動作例は mapoi_turtlebot3_example パッケージを参照してください。
ノード
mapoi_server
File truncated at 100 lines see the full file
Changelog for package mapoi_server
This per-package file lists only the changes affecting mapoi_server
(including its mapoi_nav2_bridge / mapoi_amcl_localization_bridge /
mapoi_rviz2_publisher / mapoi_gazebo_bridge / mapoi_gz_bridge
nodes), in the flat format expected by bloom / buildfarm. Full
project-level narrative: root CHANGELOG.rst / the GitHub Releases
page.
Forthcoming
0.6.0 (2026-07-15)
-
mapoi_rviz2_publisher: rebuild the marker arrays only when the underlying data changed (POIs, routes, highlights, display parameters), republishing the cached arrays with a refreshed stamp on unchanged ticks — the 1 Hz republish itself is kept so late-joiningvolatilesubscribers still receive markers — and skip the tick entirely while both marker topics have zero subscribers (#402).
0.5.0 (2026-07-10)
- Add the
request_initial_poseservice onmapoi_serveras the sole writer ofmapoi/initialpose_poi; other nodes request a publish instead of publishing directly, unifying the latched cache (#211). - Reject
request_initial_posewhen a non-emptymap_namedoes not match the server's current map, closing the stale-initial-pose map-switch race (#299). - Optionally persist and restore the last-selected map across a
restart via the new
state_pathparameter (default empty = disabled), avoiding a teleport to the launch-parameter map's POI (#297). - Validate the
select_mapservicemap_nameas a single path segment, rejecting path-traversal config loads (#328). - Namespace all eight
mapoi_serverservices undermapoi/(e.g.get_pois_info->mapoi/get_pois_info); no compatibility alias (#341). - Return
success=falsefromget_route_pois(GetRoutePois) for an unknown route instead of silently returning empty lists;mapoi_nav2_bridge/mapoi_rviz2_publishercheckresponse.success(#342). - Add
waypoint_arrival_modeparameter ("nav2"default /"mapoi") onmapoi_nav2_bridge;"mapoi"sends per-waypointNavigateToPosegoals and advances on tolerance match (#243, #259, #260, #261, #263, #264, #265, #266). - Add topic
mapoi/nav/command_rejected(std_msgs/String) onmapoi_nav2_bridgeas an unconditional rejected-command event, independent of the latchedmapoi/nav/status(#354). - Add
auto_resume_timeout_secparameter (default0.0= disabled) onmapoi_nav2_bridgeto auto-resume a paused route after a timeout (#231, #232). - Publish
rejected:<target>onmapoi/nav/statusfor commands rejected while idle (unknown goal/route, landmark-as-goal, service not ready) so operators can see they were ignored (#339, #355, #352, #356). - Fix Jazzy
EVENT_PAUSEDno longer firing by adding acmd_vel_msg_typeparameter (default"auto") that selectsTwistvsTwistStampedfromROS_DISTRO(#249). - Narrow
PoiEventpublishing toROUTEnavigation only (waypoints/landmarks on the active route), removeEVENT_STOPPED/EVENT_RESUMED, addEVENT_PAUSEDfiring on a realcmd_veldwell (#220, #227). - Render a yaw-agnostic POI tolerance (
tolerance.yaw >= pi) as a filled disc inmapoi_rviz2_publisherinstead of omitting the sector (#267, #268, #271). - Split
mapoi_nav2_bridge.cpp(1,712 lines) into five translation units (route / goal / map-switch / backend-status / core) compiling into one executable; internal refactor, no behavior change (#345).
0.4.0 (2026-05-08)
- Rename the Nav2 bridge node from
mapoi_nav_servertomapoi_nav2_bridge(executable, node, C++ class, header, and thewith_nav_server->with_nav2_bridgelaunch arg); no compatibility alias (#204). - Split the AMCL adapter out of the bridge into a new
mapoi_amcl_localization_bridgeexecutable; theinitialpose_*parameters and/initialposepublishing move to it, and it publishesLocalizationBackendStatus(#209). - Hardcode the system tag definitions in
system_tags.hpp(mapoi::kSystemTags) and remove themaps/tag_definitions.yamlfile /maps/directory;get_tag_definitionscontract unchanged (#191). - Publish
NavigationBackendStatusat 1 Hz onmapoi/nav/backend_status(transient_localQoS) as the navigation readiness contract (#198). - Use
MANUAL_BY_TOPICliveliness (5 s lease) on bothbackend_statustopics so consumers detect bridge death; reject infinite-lease publishers via QoS incompatibility (#208). - Keep the 1 Hz
backend_statuspublish running during blockingLoadMapcalls by moving the timer to a separate callback group under aMultiThreadedExecutor(#213). -
mapoi_gazebo_bridge: fix AMCL drift on operator map switch by teleporting via Gazebo Classicdelete_entity+spawn_entityto the first non-landmark POI (#91, #200). - Add CLI launch examples and
maps_path/map_nameargument semantics tomapoi_server/README.md(#172).
0.3.0 (2026-05-02)
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| mapoi | |
| mapoi_turtlebot3_example | |
| mapoi_webui |
Launch files
Messages
Services
Plugins
Recent questions tagged mapoi_server at Robotics Stack Exchange
|
mapoi_server package from mapoi repomapoi mapoi_interfaces mapoi_rviz_plugins mapoi_server mapoi_turtlebot3_example mapoi_webui |
ROS Distro
|
Package Summary
| Version | 0.6.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/shimz-robotics/mapoi.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-07-15 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Shunsuke Kimura
Authors
- Shunsuke Kimura
mapoi_server
English version (primary): README.md 本ファイルは日本語スナップショットです。最新の内容は英語版を参照してください。
mapoi のメインパッケージです。 地図と POI の情報を管理し、他のパッケージにサービスとして提供します。また、POI 名を指定した自律走行やPOI半径イベントの検知を行います。
自分のロボットへの組み込み方
4 つの core node (mapoi_server / mapoi_nav2_bridge / mapoi_amcl_localization_bridge / mapoi_rviz2_publisher) と、必要に応じてシミュレータ連動 bridge をまとめて起動する bringup launch を提供しています。自前の launch から以下のように include してください:
- include:
file: "$(find-pkg-share mapoi_server)/launch/mapoi_bringup.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"} # REQUIRED
- {name: map_name, value: "initial_map_name"} # REQUIRED
- {name: config_file, value: "mapoi_config.yaml"} # optional
- {name: state_path, value: "/var/lib/mapoi"} # optional (実機運用では推奨、#297)
- {name: simulator, value: "none"} # gazebo|gz|none (default: none)
- {name: robot_entity_name, value: "burger"} # simulator=gazebo|gz のとき必要
- {name: robot_sdf_path, value: "/path/.../model.sdf"} # simulator=gazebo のとき必要
- {name: init_world_name, value: "default"} # simulator=gz のとき必要 (gz_sim 起動時の world 名)
maps_path と map_name は 必須 です。maps_path 未指定 / 存在しないパス / ディレクトリでない場合は RCLCPP_FATAL ログ + 終了コード 1 で起動失敗します (#163)。mapoi_turtlebot3_example の sample を流用するなら $(find-pkg-share mapoi_turtlebot3_example)/maps を指定してください。
CLI から直接起動する例
include せず ros2 launch を直接叩く場合の最小例:
# mapoi_turtlebot3_example の sample maps を流用 (apt / 配布 install 後にも動く)
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(ros2 pkg prefix --share mapoi_turtlebot3_example)/maps \
map_name:=turtlebot3_world
# ソースツリーから直接 (ros2_ws 内で source 後)
# 注: 本 repo を `<ws>/src/mapoi/` に clone している前提 (ws 直下で `git clone .../mapoi.git src/mapoi`)。
# パッケージを `<ws>/src/mapoi_turtlebot3_example/` のようにフラット展開している場合は
# パスを調整するか、上の `pkg prefix --share` 形式を使う方が確実。
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(pwd)/src/mapoi/mapoi_turtlebot3_example/maps \
map_name:=turtlebot3_dqn_stage1
引数の取り違え注意
各 launch arg のセマンティクスは以下のとおり ({maps_path}/{map_name}/{config_file} でアクセスする 3 レベルの分割):
| arg | 渡すもの | 例 |
|---|---|---|
maps_path |
地図群を束ねる親ディレクトリ (各地図は配下のサブディレクトリ) | /path/to/maps |
map_name |
maps_path 直下の地図サブディレクトリ名 |
turtlebot3_world |
config_file |
地図サブディレクトリ内の設定ファイル名 (default: mapoi_config.yaml) |
mapoi_config.yaml |
実際にロードされるパスは {maps_path}/{map_name}/{config_file} で、上記例なら /path/to/maps/turtlebot3_world/mapoi_config.yaml となります。
maps_path / map_name 必須 (上節参照) の検証は 2 段階: map_name 自体未指定なら ros2 launch が Required launch argument 'map_name' was not provided で fail (node 起動前 / launch system 側)、maps_path がディレクトリでない等のセマンティクス違反は mapoi_server ノード起動時に RCLCPP_FATAL で fail します。
❌ よくある間違い: maps_path に config.yaml ファイルパスを直接指定 してしまう:
# WRONG: maps_path はファイルではなくディレクトリ
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=./maps/turtlebot3_dqn_stage1/mapoi_config.yaml \
map_name:=turtlebot3_dqn_stage1
→ 起動時に mapoi_server ノードが以下を 1 行で出力して FATAL 終了します (mapoi_server.cpp 内の RCLCPP_FATAL の実ログ文字列そのまま・英日混在):
[FATAL] maps_path '...mapoi_config.yaml' does not exist or is not a directory. 正しい maps ディレクトリ path を指定してください (例: $(find-pkg-share mapoi_turtlebot3_example)/maps)。
maps_path は 地図群を束ねる親ディレクトリ で、特定の地図ディレクトリやファイルではありません。ディレクトリ構成は本 README 末尾の ディレクトリ構成 節を参照してください。
simulator arg はシミュレータ連動 bridge の起動を制御します:
-
gazebo(Gazebo Classic / Humble):mapoi_gazebo_bridgeを起動。operator map switch 時に Gazebo 内のworld_modelentity を入れ替え + ロボットを delete + spawn で POI list 先頭 の座標に再生成 (#144 で旧initial_posesystem tag を廃止し、yaml 順序で表現する semantics に変更) -
gz(gz-sim / Jazzy):mapoi_gz_bridge+parameter_bridge(ros_gz_bridge) を起動。operator map switch 時に gz-sim 内のworld_modelentity を入れ替え + ロボットをSetEntityPoseで POI list 先頭 の座標に teleport (gz-sim では Classic と異なり set_pose service が使えるため delete + spawn は不要) -
none(default): bridge 起動なし (実機運用)
Web UI も使う場合は mapoi_webui.launch.yaml も併せて include:
- include:
file: "$(find-pkg-share mapoi_webui)/launch/mapoi_webui.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"}
- {name: map_name, value: "initial_map_name"}
NOTE:
mapoi_webuiはシステムタグをmapoi_serverのmapoi/get_tag_definitionsservice 経由で取得します。mapoi_webui単体を起動しても system tags の表示は service 通信になるため、mapoi_serverの package install 自体は不要 (ただし service responder としてmapoi_serverノードが起動している必要あり)。
TurtleBot3 を使った動作例は mapoi_turtlebot3_example パッケージを参照してください。
ノード
mapoi_server
File truncated at 100 lines see the full file
Changelog for package mapoi_server
This per-package file lists only the changes affecting mapoi_server
(including its mapoi_nav2_bridge / mapoi_amcl_localization_bridge /
mapoi_rviz2_publisher / mapoi_gazebo_bridge / mapoi_gz_bridge
nodes), in the flat format expected by bloom / buildfarm. Full
project-level narrative: root CHANGELOG.rst / the GitHub Releases
page.
Forthcoming
0.6.0 (2026-07-15)
-
mapoi_rviz2_publisher: rebuild the marker arrays only when the underlying data changed (POIs, routes, highlights, display parameters), republishing the cached arrays with a refreshed stamp on unchanged ticks — the 1 Hz republish itself is kept so late-joiningvolatilesubscribers still receive markers — and skip the tick entirely while both marker topics have zero subscribers (#402).
0.5.0 (2026-07-10)
- Add the
request_initial_poseservice onmapoi_serveras the sole writer ofmapoi/initialpose_poi; other nodes request a publish instead of publishing directly, unifying the latched cache (#211). - Reject
request_initial_posewhen a non-emptymap_namedoes not match the server's current map, closing the stale-initial-pose map-switch race (#299). - Optionally persist and restore the last-selected map across a
restart via the new
state_pathparameter (default empty = disabled), avoiding a teleport to the launch-parameter map's POI (#297). - Validate the
select_mapservicemap_nameas a single path segment, rejecting path-traversal config loads (#328). - Namespace all eight
mapoi_serverservices undermapoi/(e.g.get_pois_info->mapoi/get_pois_info); no compatibility alias (#341). - Return
success=falsefromget_route_pois(GetRoutePois) for an unknown route instead of silently returning empty lists;mapoi_nav2_bridge/mapoi_rviz2_publishercheckresponse.success(#342). - Add
waypoint_arrival_modeparameter ("nav2"default /"mapoi") onmapoi_nav2_bridge;"mapoi"sends per-waypointNavigateToPosegoals and advances on tolerance match (#243, #259, #260, #261, #263, #264, #265, #266). - Add topic
mapoi/nav/command_rejected(std_msgs/String) onmapoi_nav2_bridgeas an unconditional rejected-command event, independent of the latchedmapoi/nav/status(#354). - Add
auto_resume_timeout_secparameter (default0.0= disabled) onmapoi_nav2_bridgeto auto-resume a paused route after a timeout (#231, #232). - Publish
rejected:<target>onmapoi/nav/statusfor commands rejected while idle (unknown goal/route, landmark-as-goal, service not ready) so operators can see they were ignored (#339, #355, #352, #356). - Fix Jazzy
EVENT_PAUSEDno longer firing by adding acmd_vel_msg_typeparameter (default"auto") that selectsTwistvsTwistStampedfromROS_DISTRO(#249). - Narrow
PoiEventpublishing toROUTEnavigation only (waypoints/landmarks on the active route), removeEVENT_STOPPED/EVENT_RESUMED, addEVENT_PAUSEDfiring on a realcmd_veldwell (#220, #227). - Render a yaw-agnostic POI tolerance (
tolerance.yaw >= pi) as a filled disc inmapoi_rviz2_publisherinstead of omitting the sector (#267, #268, #271). - Split
mapoi_nav2_bridge.cpp(1,712 lines) into five translation units (route / goal / map-switch / backend-status / core) compiling into one executable; internal refactor, no behavior change (#345).
0.4.0 (2026-05-08)
- Rename the Nav2 bridge node from
mapoi_nav_servertomapoi_nav2_bridge(executable, node, C++ class, header, and thewith_nav_server->with_nav2_bridgelaunch arg); no compatibility alias (#204). - Split the AMCL adapter out of the bridge into a new
mapoi_amcl_localization_bridgeexecutable; theinitialpose_*parameters and/initialposepublishing move to it, and it publishesLocalizationBackendStatus(#209). - Hardcode the system tag definitions in
system_tags.hpp(mapoi::kSystemTags) and remove themaps/tag_definitions.yamlfile /maps/directory;get_tag_definitionscontract unchanged (#191). - Publish
NavigationBackendStatusat 1 Hz onmapoi/nav/backend_status(transient_localQoS) as the navigation readiness contract (#198). - Use
MANUAL_BY_TOPICliveliness (5 s lease) on bothbackend_statustopics so consumers detect bridge death; reject infinite-lease publishers via QoS incompatibility (#208). - Keep the 1 Hz
backend_statuspublish running during blockingLoadMapcalls by moving the timer to a separate callback group under aMultiThreadedExecutor(#213). -
mapoi_gazebo_bridge: fix AMCL drift on operator map switch by teleporting via Gazebo Classicdelete_entity+spawn_entityto the first non-landmark POI (#91, #200). - Add CLI launch examples and
maps_path/map_nameargument semantics tomapoi_server/README.md(#172).
0.3.0 (2026-05-02)
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| mapoi | |
| mapoi_turtlebot3_example | |
| mapoi_webui |
Launch files
Messages
Services
Plugins
Recent questions tagged mapoi_server at Robotics Stack Exchange
|
mapoi_server package from mapoi repomapoi mapoi_interfaces mapoi_rviz_plugins mapoi_server mapoi_turtlebot3_example mapoi_webui |
ROS Distro
|
Package Summary
| Version | 0.6.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/shimz-robotics/mapoi.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-07-15 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Shunsuke Kimura
Authors
- Shunsuke Kimura
mapoi_server
English version (primary): README.md 本ファイルは日本語スナップショットです。最新の内容は英語版を参照してください。
mapoi のメインパッケージです。 地図と POI の情報を管理し、他のパッケージにサービスとして提供します。また、POI 名を指定した自律走行やPOI半径イベントの検知を行います。
自分のロボットへの組み込み方
4 つの core node (mapoi_server / mapoi_nav2_bridge / mapoi_amcl_localization_bridge / mapoi_rviz2_publisher) と、必要に応じてシミュレータ連動 bridge をまとめて起動する bringup launch を提供しています。自前の launch から以下のように include してください:
- include:
file: "$(find-pkg-share mapoi_server)/launch/mapoi_bringup.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"} # REQUIRED
- {name: map_name, value: "initial_map_name"} # REQUIRED
- {name: config_file, value: "mapoi_config.yaml"} # optional
- {name: state_path, value: "/var/lib/mapoi"} # optional (実機運用では推奨、#297)
- {name: simulator, value: "none"} # gazebo|gz|none (default: none)
- {name: robot_entity_name, value: "burger"} # simulator=gazebo|gz のとき必要
- {name: robot_sdf_path, value: "/path/.../model.sdf"} # simulator=gazebo のとき必要
- {name: init_world_name, value: "default"} # simulator=gz のとき必要 (gz_sim 起動時の world 名)
maps_path と map_name は 必須 です。maps_path 未指定 / 存在しないパス / ディレクトリでない場合は RCLCPP_FATAL ログ + 終了コード 1 で起動失敗します (#163)。mapoi_turtlebot3_example の sample を流用するなら $(find-pkg-share mapoi_turtlebot3_example)/maps を指定してください。
CLI から直接起動する例
include せず ros2 launch を直接叩く場合の最小例:
# mapoi_turtlebot3_example の sample maps を流用 (apt / 配布 install 後にも動く)
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(ros2 pkg prefix --share mapoi_turtlebot3_example)/maps \
map_name:=turtlebot3_world
# ソースツリーから直接 (ros2_ws 内で source 後)
# 注: 本 repo を `<ws>/src/mapoi/` に clone している前提 (ws 直下で `git clone .../mapoi.git src/mapoi`)。
# パッケージを `<ws>/src/mapoi_turtlebot3_example/` のようにフラット展開している場合は
# パスを調整するか、上の `pkg prefix --share` 形式を使う方が確実。
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=$(pwd)/src/mapoi/mapoi_turtlebot3_example/maps \
map_name:=turtlebot3_dqn_stage1
引数の取り違え注意
各 launch arg のセマンティクスは以下のとおり ({maps_path}/{map_name}/{config_file} でアクセスする 3 レベルの分割):
| arg | 渡すもの | 例 |
|---|---|---|
maps_path |
地図群を束ねる親ディレクトリ (各地図は配下のサブディレクトリ) | /path/to/maps |
map_name |
maps_path 直下の地図サブディレクトリ名 |
turtlebot3_world |
config_file |
地図サブディレクトリ内の設定ファイル名 (default: mapoi_config.yaml) |
mapoi_config.yaml |
実際にロードされるパスは {maps_path}/{map_name}/{config_file} で、上記例なら /path/to/maps/turtlebot3_world/mapoi_config.yaml となります。
maps_path / map_name 必須 (上節参照) の検証は 2 段階: map_name 自体未指定なら ros2 launch が Required launch argument 'map_name' was not provided で fail (node 起動前 / launch system 側)、maps_path がディレクトリでない等のセマンティクス違反は mapoi_server ノード起動時に RCLCPP_FATAL で fail します。
❌ よくある間違い: maps_path に config.yaml ファイルパスを直接指定 してしまう:
# WRONG: maps_path はファイルではなくディレクトリ
ros2 launch mapoi_server mapoi_bringup.launch.yaml \
maps_path:=./maps/turtlebot3_dqn_stage1/mapoi_config.yaml \
map_name:=turtlebot3_dqn_stage1
→ 起動時に mapoi_server ノードが以下を 1 行で出力して FATAL 終了します (mapoi_server.cpp 内の RCLCPP_FATAL の実ログ文字列そのまま・英日混在):
[FATAL] maps_path '...mapoi_config.yaml' does not exist or is not a directory. 正しい maps ディレクトリ path を指定してください (例: $(find-pkg-share mapoi_turtlebot3_example)/maps)。
maps_path は 地図群を束ねる親ディレクトリ で、特定の地図ディレクトリやファイルではありません。ディレクトリ構成は本 README 末尾の ディレクトリ構成 節を参照してください。
simulator arg はシミュレータ連動 bridge の起動を制御します:
-
gazebo(Gazebo Classic / Humble):mapoi_gazebo_bridgeを起動。operator map switch 時に Gazebo 内のworld_modelentity を入れ替え + ロボットを delete + spawn で POI list 先頭 の座標に再生成 (#144 で旧initial_posesystem tag を廃止し、yaml 順序で表現する semantics に変更) -
gz(gz-sim / Jazzy):mapoi_gz_bridge+parameter_bridge(ros_gz_bridge) を起動。operator map switch 時に gz-sim 内のworld_modelentity を入れ替え + ロボットをSetEntityPoseで POI list 先頭 の座標に teleport (gz-sim では Classic と異なり set_pose service が使えるため delete + spawn は不要) -
none(default): bridge 起動なし (実機運用)
Web UI も使う場合は mapoi_webui.launch.yaml も併せて include:
- include:
file: "$(find-pkg-share mapoi_webui)/launch/mapoi_webui.launch.yaml"
arg:
- {name: maps_path, value: "/path/to/your/maps"}
- {name: map_name, value: "initial_map_name"}
NOTE:
mapoi_webuiはシステムタグをmapoi_serverのmapoi/get_tag_definitionsservice 経由で取得します。mapoi_webui単体を起動しても system tags の表示は service 通信になるため、mapoi_serverの package install 自体は不要 (ただし service responder としてmapoi_serverノードが起動している必要あり)。
TurtleBot3 を使った動作例は mapoi_turtlebot3_example パッケージを参照してください。
ノード
mapoi_server
File truncated at 100 lines see the full file
Changelog for package mapoi_server
This per-package file lists only the changes affecting mapoi_server
(including its mapoi_nav2_bridge / mapoi_amcl_localization_bridge /
mapoi_rviz2_publisher / mapoi_gazebo_bridge / mapoi_gz_bridge
nodes), in the flat format expected by bloom / buildfarm. Full
project-level narrative: root CHANGELOG.rst / the GitHub Releases
page.
Forthcoming
0.6.0 (2026-07-15)
-
mapoi_rviz2_publisher: rebuild the marker arrays only when the underlying data changed (POIs, routes, highlights, display parameters), republishing the cached arrays with a refreshed stamp on unchanged ticks — the 1 Hz republish itself is kept so late-joiningvolatilesubscribers still receive markers — and skip the tick entirely while both marker topics have zero subscribers (#402).
0.5.0 (2026-07-10)
- Add the
request_initial_poseservice onmapoi_serveras the sole writer ofmapoi/initialpose_poi; other nodes request a publish instead of publishing directly, unifying the latched cache (#211). - Reject
request_initial_posewhen a non-emptymap_namedoes not match the server's current map, closing the stale-initial-pose map-switch race (#299). - Optionally persist and restore the last-selected map across a
restart via the new
state_pathparameter (default empty = disabled), avoiding a teleport to the launch-parameter map's POI (#297). - Validate the
select_mapservicemap_nameas a single path segment, rejecting path-traversal config loads (#328). - Namespace all eight
mapoi_serverservices undermapoi/(e.g.get_pois_info->mapoi/get_pois_info); no compatibility alias (#341). - Return
success=falsefromget_route_pois(GetRoutePois) for an unknown route instead of silently returning empty lists;mapoi_nav2_bridge/mapoi_rviz2_publishercheckresponse.success(#342). - Add
waypoint_arrival_modeparameter ("nav2"default /"mapoi") onmapoi_nav2_bridge;"mapoi"sends per-waypointNavigateToPosegoals and advances on tolerance match (#243, #259, #260, #261, #263, #264, #265, #266). - Add topic
mapoi/nav/command_rejected(std_msgs/String) onmapoi_nav2_bridgeas an unconditional rejected-command event, independent of the latchedmapoi/nav/status(#354). - Add
auto_resume_timeout_secparameter (default0.0= disabled) onmapoi_nav2_bridgeto auto-resume a paused route after a timeout (#231, #232). - Publish
rejected:<target>onmapoi/nav/statusfor commands rejected while idle (unknown goal/route, landmark-as-goal, service not ready) so operators can see they were ignored (#339, #355, #352, #356). - Fix Jazzy
EVENT_PAUSEDno longer firing by adding acmd_vel_msg_typeparameter (default"auto") that selectsTwistvsTwistStampedfromROS_DISTRO(#249). - Narrow
PoiEventpublishing toROUTEnavigation only (waypoints/landmarks on the active route), removeEVENT_STOPPED/EVENT_RESUMED, addEVENT_PAUSEDfiring on a realcmd_veldwell (#220, #227). - Render a yaw-agnostic POI tolerance (
tolerance.yaw >= pi) as a filled disc inmapoi_rviz2_publisherinstead of omitting the sector (#267, #268, #271). - Split
mapoi_nav2_bridge.cpp(1,712 lines) into five translation units (route / goal / map-switch / backend-status / core) compiling into one executable; internal refactor, no behavior change (#345).
0.4.0 (2026-05-08)
- Rename the Nav2 bridge node from
mapoi_nav_servertomapoi_nav2_bridge(executable, node, C++ class, header, and thewith_nav_server->with_nav2_bridgelaunch arg); no compatibility alias (#204). - Split the AMCL adapter out of the bridge into a new
mapoi_amcl_localization_bridgeexecutable; theinitialpose_*parameters and/initialposepublishing move to it, and it publishesLocalizationBackendStatus(#209). - Hardcode the system tag definitions in
system_tags.hpp(mapoi::kSystemTags) and remove themaps/tag_definitions.yamlfile /maps/directory;get_tag_definitionscontract unchanged (#191). - Publish
NavigationBackendStatusat 1 Hz onmapoi/nav/backend_status(transient_localQoS) as the navigation readiness contract (#198). - Use
MANUAL_BY_TOPICliveliness (5 s lease) on bothbackend_statustopics so consumers detect bridge death; reject infinite-lease publishers via QoS incompatibility (#208). - Keep the 1 Hz
backend_statuspublish running during blockingLoadMapcalls by moving the timer to a separate callback group under aMultiThreadedExecutor(#213). -
mapoi_gazebo_bridge: fix AMCL drift on operator map switch by teleporting via Gazebo Classicdelete_entity+spawn_entityto the first non-landmark POI (#91, #200). - Add CLI launch examples and
maps_path/map_nameargument semantics tomapoi_server/README.md(#172).
0.3.0 (2026-05-02)
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| mapoi | |
| mapoi_turtlebot3_example | |
| mapoi_webui |