CubePetit専用のOpen-RMF fleet adapter。
Hardware: CubePetit v2 & v3 Software: Ubuntu 24.04 ROS Version: ROS2 Jazzy
CubePetitの複数個体(cube_petit_orange・cube_petit_pink など)を
Open-RMF のfleet管理に統合するための、
fleet adapterプロセスのみを提供するリポジトリです。
- ロボット側(各CubePetit本体)は、別途
cube_petit_rosリポジトリのfeature/zenoh-fleet-bridgeブランチで実装される「zenoh connector」 ノードが担当します。当リポジトリはそれとは別プロセス・別リポジトリで、 eclipse-zenoh の Python クライアント (eclipse-zenohpip パッケージ)経由でロボットとやり取りします。rmw_zenoh_cpp(ROS2 ミドルウェアとしてのzenoh)は使っていません。 - Open-RMF本体(rmf_fleet_adapter_python等)には、社内の汎用実装
fleet_adapter_zenohが既にありますが、それには依存しません。 参考にした設計パターンは一般的なOpen-RMFのeasy_full_controlfleet adapterのものですが、コードはCubePetit向けに独立して書き直しています (sbgisen内部の私的リポジトリへの依存を避けるため)。
構成:
cube_petit_fleet_adapter/
├── cube_petit_fleet_adapter/
│ ├── robot_client_api.py # RobotAPI: zenohでロボットと通信する薄いクライアント
│ └── fleet_adapter.py # rmf_easy(EasyFullControl)を起動するエントリポイント
├── config/config.yaml # フリート・ロボット定義(CubePetit向けサンプル値)
├── launch/fleet_adapter.launch.py
└── requirements.txt # eclipse-zenoh, nudged (pipのみ、rosdep管理外)
このリポジトリは fleet adapter プロセスのみを提供します。以下は別途必要です:
- Open-RMF本体のインストール。
rmf_fleet_adapter_python(rmf_adapter/rmf_adapter.easy_full_controlを提供するパッケージ) がROS2ワークスペースにビルド済み・ソース読み込み済みであること。 このマシン(オレンジプチ体内PC)には現時点でインストールされていません。 open-rmf/rmf の手順に従ってセットアップしてください。 - nav_graph。CubePetitが動く実環境の地図に対応するOpen-RMFの
nav_graphを別途作成する必要があります(
rmf_building_map_tools等)。 現時点でCubePetit用のnav_graphは存在しません。 - zenoh connector側の実装。
cube_petit_rosのfeature/zenoh-fleet-bridgeブランチが、ロボット側でrobots/<name>/pose等のキーを実際にpublish/subscribeしている必要が あります。
pip install -r requirements.txtrobot_client_api.py の RobotAPI が使う規約(zenoh connector側との合意事項):
| キー | 方向 | ペイロード(JSON) |
|---|---|---|
robots/<name>/pose |
sub | {"x": float, "y": float, "yaw": float} |
robots/<name>/battery |
sub | float (0.0-1.0) |
robots/<name>/map_name |
sub | string |
robots/<name>/command_is_completed |
sub | {"id": str, "is_completed": bool, "success": bool} |
robots/<name>/command |
pub | {"method": str, "args": dict, "id": str} |
robots/<name>/status |
query | フォールバック用。pose/battery/map_nameの購読データが古い(既定5秒)場合に、RobotAPI.get_data() が同期queryで補う |
command の method: move_to_pose / localize / dock / undock /
speak / cancel_command。
# 1. このワークスペースをビルド(Open-RMFが既にセットアップ済みの
# ワークスペースに colcon build 対象として置くこと)
colcon build --packages-select cube_petit_fleet_adapter
source install/setup.bash
# 2. config.yaml / nav_graph を用意した上で起動
ros2 launch cube_petit_fleet_adapter fleet_adapter.launch.py \
config_file:=/path/to/config.yaml \
nav_graph:=/path/to/nav_graph.yaml \
server_uri:=http://localhost:8000/_internal # 任意、RMF APIサーバーを使う場合のみros2 run で直接起動する場合(launchを介さない場合)も、
-c/--config_file と -n/--nav_graph は必須、-s/--server_uri は任意です:
ros2 run cube_petit_fleet_adapter fleet_adapter \
-c config/config.yaml -n /path/to/nav_graph.yamlrmf_fleet.name: "cube_petit"。複数個体(orange/pink)を1つのfleetとして扱う。robots:cube_petit_orange/cube_petit_pinkをサンプルとして記載。robot_coordinates/rmf_coordinatesは3点対応のプレースホルダーで、 実際のnav_graphとロボット側マップができてから実測値に差し替えること (nudged.estimate()で座標変換を推定するために使う)。profile.footprint/profile.vicinity: CubePetitが小型の卓上ロボット であることを踏まえた仮の値(直径25cm程度を想定)。実測して調整すること、 とコメントで明記済み。battery_system/mechanical_system: CubePetitには実バッテリー計装が 無いため、ダミー値。account_for_battery_drain: falseにして、 RMFが未計装のバッテリー値を信用してタスク采配しないようにしている。task_capabilities:loopのみ有効。CubePetitの実情(会話・簡単な 移動デモ)に合わせてdelivery等は無効化。actions: ["speak"]: CubePetit固有のカスタムアクション。TTS発話をrobots/<name>/command経由でトリガーする想定。
rmf_easyAPI の細部は未検証。fleet_adapter.pyは一般的なeasy_full_controlパターン(Open-RMFのrmf_demos等で使われている もの)を踏まえて書いていますが、このマシンにはrmf_fleet_adapter_pythonが入っておらず、実際にimportして動作確認はできていません。特にrmf_easy.FleetConfigHandle.from_config_files()/RobotStateの コンストラクタ引数 /add_robot()の引数名 /navigate・dockコールバックに渡されるdestination・executionオブジェクトの 属性名は、インストールされているOpen-RMFのバージョンに合わせて 要確認・要修正です(該当箇所にコメントで明記済み)。- nav_graphが存在しない。CubePetitが実際に動く環境向けのnav_graphは 別途作成が必要(このリポジトリのスコープ外)。
- バッテリー計装が無い。
robots/<name>/batteryは現状ダミー値である 前提で実装(account_for_battery_drain: false)。実装され次第、 config.yamlのbattery_systemを実測値に差し替え、account_for_battery_drainの有効化を検討する。 - 実機確認未実施。zenoh connector側(
cube_petit_rosfeature/zenoh-fleet-bridge)との結合テスト、Open-RMFコアとの結合テスト はいずれも未実施。 - 座標変換の3点対応が未実測。config.yamlの
robot_coordinates/rmf_coordinatesはプレースホルダー。
初回コミットのみ develop に直接push(空リポジトリだったため例外対応)。
次回以降の変更は feature/* ブランチを切って develop 向けにPRを出す運用とします。
Apache License Version 2.0