章2: RMFの全体像を掴む
← 前章: Open-RMFとは | 目次 | 次章: 1台を動かす →
狙い
- Open-RMFの環境が3つの層でできていることを、実際のノード一覧から掴む
- 「タスクを投げてからキューブが動くまで」に、どのノードが何を担当するかの地図を頭に描く。この地図が以降すべての章の土台になる。
三層モデル
toioフリートの環境は、役割の違う3層が重なってできている。上ほど「何をするか」、下ほど「どう動かすか」を担当する。
flowchart TB
core["① RMFコア ── 仕事を配る・交通を捌く(誰が・いつ・どこへ)<br/>rmf_task_dispatcher / rmf_traffic_schedule<br/>rmf_traffic_blockade / building_map_server"]
fa["② フリートアダプタ ── RMFとロボットの通訳(このロボットで実現する)<br/>toio_fleet_adapter(EasyFullControl)"]
robot["③ ロボット層 ── 実際に走らせる(どう走るか)<br/>Nav2 /toio1・/toio2 + Gazebo(または実機)"]
core -->|"抽象タスク → NavigateToPose"| fa
fa -->|"走行指令 cmd_vel"| robot
robot -.->|"位置・バッテリ"| fa
fa -.->|"FleetState / TaskState"| core
実線が下向きの指令、破線が上向きの報告。位置・バッテリは走行指令とは別経路で上がる。
- ① RMFコアは、ロボットの機種を知らない。「patrol_Aへ行け」「この時刻にこのレーンを予約する」といった抽象的な指示だけを扱う。
- ③ ロボット層は、RMFを知らない。
NavigateToPoseアクションで「この座標へ行け」と言われたら走る、ただのNav2ロボット。 - ② フリートアダプタが両者の通訳。RMFの抽象タスクを受け、Nav2の
NavigateToPoseに翻訳し、逆にロボットの位置・バッテリをRMFへ報告する。toioではtoio_fleet_adapter(RMFのEasyFullControl API実装)がこれ。
この分業のおかげで、下のロボットがシミュレーションでも実機でも、RMFコアの上で学ぶこと(入札・調停・充電)は同じになる。第2部で実機に移っても、差し替わるのは③だけ。
動かす・観察する
端末Aで環境を起動したまま(章0の端末A)、端末Bで中を覗く。
1. ノードを層ごとに見分ける
ros2 node list
出てくるノードを上の3層に振り分けてみる:
| 層 | 主なノード |
|---|---|
| ① RMFコア | rmf_task_dispatcher、rmf_traffic_schedule_primary、rmf_traffic_blockade、building_map_server、可視化ノード群 |
| ② アダプタ | toio_fleet_adapter(フリート名 toio) |
| ③ ロボット | /toio1/*、/toio2/*(Nav2のcontroller / planner / bt_navigatorなど、名前空間付きで各1式) |
名前空間 /toio1 /toio2 が付いているものがロボット1台ぶんのNav2。2台なので2セットある。名前空間の無いRMF・アダプタ系はフリート全体で1つ。
2. タスクの入口を見る
RMFコアへの入口はトピック。タスクCLIはここに投げている:
ros2 topic list | grep -E 'task|dispenser|ingestor'
/task_api_requests などが見える。章3以降で投げる dispatch_* コマンドは、最終的にここへ届く。
3. フリートの自己申告を聞く
アダプタが定期的に流しているフリートの状態を覗く:
ros2 topic echo /fleet_states --once
フリート名 toio、ロボット toio1 / toio2、それぞれの現在位置とバッテリ残量が入っている。これがRMFコアから見た「ロボットの姿」。RMFコアはキューブそのものではなく、この報告を通してロボットを認識している。
理解する
- ③のロボット層は、実はこのパッケージ独自ではない普通のNav2。RMFは
NavigateToPoseアクションを名前空間付きで叩いているだけ。つまりNav2が単体で動くことを前提に、RMFはその上に協調の頭脳を乗せている。 - ①と②の境界が、このチュートリアルの主戦場。入札(章5)・交通調停(章6)・充電計画(章7)は①で決まり、②がそれをロボットの言葉に翻訳する。
- 位置とバッテリの報告経路は覚えておくと第2部(実機編)で効く。走行指令は②→③(
NavigateToPose)へ下るが、位置・バッテリは③→②へ別経路で上がる。シミュレーションではTF(map→ベースフレーム)から、実機ではtoio_ros2の専用トピックから受け取る(→章12)。
より詳しい構成図(どのノードがlaunchされるか)はREADMEのパッケージ構成図にある。
確認課題
ros2 node info /toio1/bt_navigatorなどで、Nav2側がnavigate_to_poseアクションサーバを提供していることを確認する。これがフリートアダプタの「委譲先」。/fleet_statesをechoしたまま、章0のpatrolをもう一度投げてみる。ロボットのmodeや位置がタスク中にどう変わるか眺める(詳しい読み方は次章)。
← 前章: Open-RMFとは | 目次 | 次章: 1台を動かす →