コンテンツにスキップ

章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のパッケージ構成図にある。

確認課題

  1. ros2 node info /toio1/bt_navigator などで、Nav2側が navigate_to_pose アクションサーバを提供していることを確認する。これがフリートアダプタの「委譲先」。
  2. /fleet_states をechoしたまま、章0のpatrolをもう一度投げてみる。ロボットの mode や位置がタスク中にどう変わるか眺める(詳しい読み方は次章)。

← 前章: Open-RMFとは | 目次 | 次章: 1台を動かす →