③ スタッフ4人・ロボット2台(cs:117)が A03 の入口で動けなくなった件。 直さずに原因だけ調べました。読んだのは 20261023_p1_efficient_corner_fam_p1_s4_r2_a42_s0_0655_stopped(trips/stops/dishes/groups/summary) 店の形の JSON(p1_efficient_corner.json) 07:28 の store_report(同じ③の店を、焼きたての NavMesh で調べたもの) ════════════════════════════════════════════════════════ 結論 ════════════════════════════════════════════════════════ **通路の幅は足りています。足りないのは「止まったまま抜け出す道」です。** 1.「通路の幅が足りない」は、**幅の話ではありません**。 「次の点までの道が引けなかった」ときに付く名前です(StopCause.NoPath)。 そのとき記録された左右の空きは 37〜275 cm(中央 118 cm)で、物理的には広く空いています。 2. 道が引けないあいだ、ロボットは **1 mm も動けません**。 走ってよいか= wantMove = 前が空いている かつ **道が引けている** かつ … 道が引けないと wantMove が false になります。 3. 道が引けないときの逃げ道(EscapePartialPath)は「通路の入口まで歩いて出る」ですが、 **歩くには道が引けている必要がある**ので、いちばん必要な場面で働きません。 入口まで 0.48 m しかないのに、そこへ歩き出せません。 → 10 秒ごとに引き直す → 引けない → 入口へ出ようとする → 歩けない → 10 秒ごとに… を 600 秒の打ち切りまで繰り返します。1 往復あたり約 50 回の「止まり」として記録されます。 実際の記録(往復39・robot1)。2 cm のあいだを行き来しながら、10.0 秒ちょうどで同じことを繰り返します。 208.1 分 (9.38,4.52) 通路の幅が足りない 10.0 秒 引き直し replans=2 no_path 10.0 秒 208.3 分 (9.30,4.47) 通路の幅が足りない 10.0 秒 引き直し replans=2 no_path 10.0 秒 208.5 分 (9.30,4.49) 通路の幅が足りない 10.0 秒 引き直し replans=2 no_path 10.0 秒 …(51 回・合計 504 秒)→ 600 秒で打ち切り no_path が 10.0 秒/10.0 秒なので、**その 10 秒のあいだ一度も道が引けていません**。 引き直した先(通路の入口 9.2, 4.0)への道も引けていない、ということです。 ──────────────────────────────────────────────────────── 1. A03 は幅 1.2 m なのに、なぜ「通路の幅が足りない」になるのか ──────────────────────────────────────────────────────── (1) 幅は足りています(07:28 の store_report より。同じ店・焼きたての面) A03: 通路 1.2 m / 焼いた面のいちばん狭いところ **0.62 m**(ロボットの半径はすでに引いた後の幅) ロボットの道順 42 本・点 189 個のうち、ロボット用の面に乗っていない点 **0 個** ふさがないとき、届かない卓 **0 / 42** 通路の入口の点(9.2, 4.0)のまわりのすき間 **1.00 m** (2) 椅子でもありません ③ の椅子は **8 脚だけ**(A01〜A03 ぞいの卓はベンチで椅子を持ちません)。 8 脚すべてを 0.3 m 引いた状態で、42 本の道順すべてと突き合わせました。 **道順をふさぐ組み合わせは 0 件**です。 (3) 残るのは「道の引き方」です 止まっている位置は (9.30, 4.47)。次の点は (9.31, 4.74) で、**27 cm 先**です。 まわりは 0.67 m 空いています。この 27 cm の道が引けていません。 ここから先は、回してみないと決められません。4 節に、何を足せば分かるかを書きます。 (4) ご質問の「1台が中にいるとき、もう1台が入口で待つ決まり」→ **あります** ServingRobotController.MustWaitForAisle ・その通路の中に別の台がいれば入らない ・同じ通路を目指している台が2台あれば、**番号の小さい方が先** 待つ場所は通路の入口の点で、**待ち時間の上限がありません**。 (人がロボットを待つときは 20 秒で打ち切る決まり robotYieldMaxSec があるのに、 ロボットどうしには何もありません) ──────────────────────────────────────────────────────── 2. 中の台が出ようとしたとき、入口の台とふさぎ合っていないか ──────────────────────────────────────────────────────── **ふさぎ合っています。記録に 2 回出ています。** 15.7 分 robot2 往復1 (1.89, 3.81) **576 秒** 入口で待った 先に入っている台:ServingRobot01 37.3 分 robot1 往復5 (1.90, 3.79) **556 秒** 入口で待った 先に入っている台:ServingRobot02 どちらも A01 の入口(1.8, 3.8)で、**600 秒の打ち切りまで待ち続けて**終わっています。 この2往復は、それだけで時間切れになりました(往復1 は届いた皿 0)。 成り立ちは次のとおりです。 ・外の台は「中の台が通路の区画から出る」まで待つ。上限なし ・中の台が戻り(ToPass)のときは譲らない決まりなので、出ようとはする ・しかし外の台は**入口の点そのもの**に立っているので、出口でぶつかる。 ロボットは前のセンサーで相手を見ると止まる ・中の台が出られない → 外の台の待ちが終わらない → 互いに待ち合う なお A03 の入口の 982 回の止まりは、**973 回が robot1**、robot2 は 9 回です。 そのうち 252 回は「道をふさいでいるものとして ServingRobot02 が 2 m 以内に見つかった」 となっています。待ち合いと、道が引けない繰り返しが、同じ場所で重なっています。 ──────────────────────────────────────────────────────── 3. サイトの道順のうち、A03 を通る卓 ──────────────────────────────────────────────────────── 受け渡し口からの道順 42 本の点が、どの通路の区画を通るかで数えました。 A01(幅 1.2 m): **T01 T02 T03 T04 T05 T06 T07 T08**(8 卓) A02(幅 1.2 m): **T09 T10 T11 T12 T13 T14 T15 T16 T17**(9 卓) A03(幅 1.2 m): **T18 T19 T20 T21 T22 T23 T24 T25 T26**(9 卓) どの通路も通らない卓: T27〜T42(16 卓) ③ は狭い道(0.8 m)が無いので、42 卓すべて use=normal・via_narrow=0 です。 T19 の道順(7 点・8.76 m) (15.30,5.95) → (12.51,4.34) → (12.39,4.31) → (9.56,4.31) → (9.34,4.56) → (9.31,4.74) → (9.31,6.81)=止まる位置 止まりが集まっている (9.3, 4.4〜4.5) は、**このうち 4 点目と 5 点目のあいだ**です。 道順に沿った静止物とのすき間(0.05 m 刻み): いちばん狭くて **0.488 m**(相手 卓T27)。 ロボットの半径 0.25 m を引くと余裕 0.238 m。狭いですが、通れないほどではありません。 ──────────────────────────────────────────────────────── 4. 帰らなかった3組(Seated のまま) ──────────────────────────────────────────────────────── 組24(2人・**T16**)着席 34.1 分 / 組27(4人・**T19**)着席 36.9 分 / 組28(4人・**T20**)着席 35.6 分 3組とも 食べ終わり・会計・退店 がすべて -1(一度も起きていない)。 理由は一本道です。 (1) 組は「最初の料理が**全部**届いたら」食事に移ります(AllFirstDishesArrived)。 (2) この3卓の料理は一度も届いていません。 戻した皿 100 枚のうち、**T19 が 24 枚・T20 が 24 枚・T16 が 24 枚**(合計 72 枚)。 戻した理由は 100 枚すべて「打ち切り」(=ロボットの往復が 600 秒で切られた)。 同じ皿が最大 8 回以上も戻されています。 (3) 食事に移れない → 会計にも片付けにも進まない。 (4) 「卓が空かないときに強引に空ける」逃がし弁(tableStuckFreeSec 600 秒)は、 **会計中・片付け中の組にしか効きません**(GState.Paying / Clearing のときだけ)。 Seated のまま止まった組は、いつまでも卓を占め続けます。 (5) 卓が空かない → その3枚の皿が受け渡し口の先頭に残り続ける → 次の往復もまた同じ3卓へ割り当てられる。 実際、**往復11 以降(57.8 分〜)robot1 は 22 回続けて まったく同じ「19;20;16」を走って** います。毎回 600 秒で切られ、毎回 3 枚とも戻る。これが 45/47 の時間切れの正体です。 往復11 (57.8分) 19;20;16 時間切れ 入口の止まり 43 回 往復13 (67.8分) 19;20;16 時間切れ 〃 0 回 往復15 (77.8分) 19;20;16 時間切れ 〃 50 回 … 往復47 (287.9分) 19;20;16 時間切れ 〃 51 回 ──────────────────────────────────────────────────────── 5. 分かっていないこと(次に何を足せば分かるか) ──────────────────────────────────────────────────────── 「(9.30,4.47) から 27 cm 先の点へ、なぜ道が引けないのか」だけが残っています。 店の形・焼いた面・椅子のどれでもないことは、上のとおり確かめました。 いまの記録には、道を引くときに実際に使った点が残っていないので、ここで止まります。 stops.csv に次の3つを足せば、1回回すだけで決まります(計測の決まりは変わりません)。 ・道を引いた出発点(SamplePosition で面に寄せたあとの座標) ・道を引いた行き先(同じく寄せたあとの座標)と、それが道順の何点目か ・CalculatePath の結果(PathComplete / PathPartial / PathInvalid)と、角の数 いまの見立て(確かめていません): ロボットの立っている位置が面からわずかに外れ、面に寄せた出発点が 通路の反対側へ飛んでいる、という形です。寄せる半径が 1.0 m と広いので、 0.62 m 幅の通路では、反対側の島に乗ることがありえます。 上の3つを足せば、これが当たりかどうかがその場で分かります。 ──────────────────────────────────────────────────────── 6. 直すとしたら(まだ何もしていません) ──────────────────────────────────────────────────────── a. 道が引けないときに、その場から動けるようにする いまは「入口へ歩いて出る」逃げ道が、歩けないので働きません。 道が引けないまま一定の秒数が過ぎたら、道順の**手前の点へ戻す** (来た道なので必ず引ける)か、その区間だけ寄せる半径を変えて引き直す。 b. ロボットどうしの入口待ちに上限を付ける(人の robotYieldMaxSec 20 秒と同じ考え方)。 上限を過ぎたら、譲らずに進む。 c. Seated のまま止まった組にも、卓を空ける逃がし弁を効かせる (いまは会計中・片付け中だけ)。 d. 同じ皿が何回も戻ったら、ロボットではなくスタッフに回す。 いまは同じ3枚が 24 回ずつ同じ道へ送り返されています。 どれを入れるかはご指示をください。