章3: 1台を動かす(go_to_place)
← 前章: RMFの全体像 | 目次 | 次章: 巡回と帰還 →
狙い
- RMFで一番単純なタスクgo_to_place(指定地点へ1回だけ移動)を投げる
- 「タスクを投げてから、フリートアダプタがNav2に走行を委譲するまで」の一連の流れを、実際にログとアクションで追う
- 特定の1台を指名して動かす方法を知る(入札を経ない直接割当)
動かす
端末Aは起動したまま。端末Bから、目的地を1つ指定して移動させる:
ros2 run rmf_demos_tasks dispatch_go_to_place -p patrol_B --use_sim_time
-p patrol_B が目的地(navグラフの頂点名)。どちらか空いている1台が patrol_B へ向かい、着いたらそこで停止する(patrolと違い巡回も帰還もしない)。
特定の1台を指名する
入札(次章以降)を経ず、名指しで動かすこともできる:
ros2 run rmf_demos_tasks dispatch_go_to_place -p patrol_B -F toio -R toio1 --use_sim_time
-F toio… フリート名(このパッケージでは常にtoio)-R toio1… ロボット名。-Fと併用したときだけ有効で、入札を経ずそのロボットへ直接割り当てる(RMF内部ではrobot_task_request)
-F を付けず -R だけ、あるいは両方無しなら、フリート内で入札して勝った方が動く(→章5)。
観察する
指名した(または落札した)1台が、現在地から目的地のwaypointへ向かい、着いたら停止する。緑の帯は rmf_traffic_schedule が予約した走行経路(スケジュール)。
toio1が charger_1 から目的地へ向かう様子を2つのビューで並べたもの。左がRViz2(RMFスケジュール可視化)、右がtoio_gazebo(実際のキューブの動き)。着いたらそこで停止し、patrolのような巡回・周回はしない。
1. タスクの一生をログで追う
端末Aの rmf_task_dispatcher と toio_fleet_adapter のログに、投入から完了までが流れる。おおまかに次の順で読める:
- ディスパッチャがタスク要求を受ける
- フリートへBidNotice(入札依頼)が飛ぶ
- アダプタがBidResponse(到達時刻とバッテリ消費の見積)を返す
- ディスパッチャが落札通知(
task_idを割当) - アダプタがNav2へ
NavigateToPoseを発行し、キューブが動く - 到達後、
TaskStateがcompletedになる
-R で直接指名した場合は2〜4の入札が省かれ、いきなりそのロボットに割り当たる。ここが「入札あり / なし」の見分けどころ。
2. 委譲先のアクションを覗く
フリートアダプタが実際に叩いているNav2のアクションを、別端末で監視してみる:
ros2 topic echo /toio1/navigate_to_pose/_action/status
タスクを投げた瞬間、指名した(または落札した)ロボットのこのトピックにゴールが現れ、STATUS_EXECUTING(=4)になる。RMFの抽象タスクが、ここでNav2の具体的な座標移動に翻訳される瞬間が見える。
3. 位置がどこから来ているか確かめる
RMFはキューブの位置をTFから受け取っている(シミュレーション時)。走行中に:
ros2 run tf2_ros tf2_echo map toio1/base_link
map からの座標が刻々と更新される。この値が /fleet_states(章2)のロボット位置と一致しているはず。「走行指令は下りるが、位置は別経路で上がる」という前章の話が、ここで具体的に確認できる。
理解する
go_to_placeは「移動」だけのタスク。RMFのタスクは「移動」「荷役」「充電」などのフェーズの列でできていて、go_to_placeはその最小構成(移動フェーズ1つ)にあたる。patrol(章4)やdelivery(章8)は、このフェーズを組み合わせたもの、と捉えると見通しが良い。頂点間をどう走るか(経路・速度・障害物回避)はNav2の仕事なので、頂点に着けるかはNav2次第で、Nav2が詰まればタスクも止まる。
確認課題
-R toio1と-R toio2を交互に投げ、指名した方だけが動くことを確認する。-F-Rを両方外してdispatch_go_to_place -p patrol_Bを投げ、今度はどちらが動くか観察する。なぜその1台が選ばれたのかは次章の「入札」で説明できるようになる ── 今は「指名しないと勝手に選ばれる」ことだけ押さえる。navigate_to_pose/_action/statusを/toio1と/toio2の両方でechoし、直接指名したときに指名した側にだけゴールが立つことを見る。
← 前章: RMFの全体像 | 目次 | 次章: 巡回と帰還 →