==================================================================== 720 分終わらなかった回の調べ 20261027_night_cs21_fam_p1_r2_s0_passon(③2台・すれ違い入・種0) 2026-10-27 07:43 調べただけ。Assets は直していません ==================================================================== 結論(ひとことで) **ロボット1 が、料理2皿を持ったまま 600 秒ごとのやり直しを 56 回くり返し、 その2皿を待っていた2組が永久に帰れなくなりました。** ・持っていた料理 dish 157(卓15・**割れやすい**)と dish 153(卓16) ・待っていた客 組62(卓15・4人)と 組63(卓16・2人) ・スタッフ 4人とも手空き。仕事板は空。**一度も頼まれていない** ・場所 待機場所 standby1(x=16.9, z=6.05)から出て、 卓15 の停止点(x=5.613, z=8.662)に着けないまま時間切れ ・始まり 132.0 分(**最後のすれ違いが起きた分と同じ**) ・終わり 708.2 分まで同じことをくり返し、720 分の上限で打ち切り ★ **なぜロボットが着けないのか**は、出力だけでは特定できませんでした。 記録の上ではロボットは「止まってもいない・立ち往生もしていない・ 道も引けている」と言っているのに、600 秒かけて着きません(4 章)。 ==================================================================== 1. 店が固まった様子(timeline.csv) ==================================================================== 171 分から **549 分間、1ミリも変わりません**。 分 待ち組 着席 空卓 汚卓 板(案内/配膳/呼出/会計/片付) 手空 ロボ稼働 ──────────────────────────────────────────────────────────────────── 171 0 2 40 0 0 / 0 / 0 / 0 / 0 4 1 …(720 分まで同じ) ・着席している組が **2組**。待っている組は 0 ・空いている卓 40(店はほぼ空) ・**仕事板は空っぽ**(案内も配膳も呼出も会計も片付けも 0 件) ・**スタッフ4人は全員手空き** ・**ロボットは1台だけ、ずっと稼働中** 店は 118 分の 24 組から順調に減り、168 分で 2組になって、そこで止まりました。 混んで詰まったのではありません(入店待ちは 1.46 分と低い)。 ==================================================================== 2. 帰れなかった2組(groups.csv) ==================================================================== 組 62 卓15・4人 来店 113.4 分 → 着席 114.6 分 → 食べ始め 128.0 分 → **食べ終わり 153.8 分** 会計の開始 なし(-1)/帰った なし(-1)/state = Eating 料理 2皿(dish 145・148)は届いている。**3皿めの dish 157 が来ない** → 食べ終わってはいるが、注文した料理が揃っていないので会計に進まない 組 63 卓16・2人 来店 114.0 分 → 着席 115.9 分 → **食べ始め なし(-1)** state = Seated 料理 1皿(dish 147)は 126.2 分に届いている。**2皿めの dish 153 が来ない** → 料理が揃わないので、食べ始められない ★ 組63 は全64組の中で **料理が1皿しか記録されていない唯一の組**です (ほかの2人組は 2〜3皿)。足りない1皿が dish 153 で、 それがロボット1 に握られたままでした。 ==================================================================== 3. ロボット1 の無限やり直し(trips.csv・requeues.csv) ==================================================================== 往復の記録(ロボット1。132 分以降) 往復 開始 所要 時間切れ 未配膳 卓 料理 戻り先 ────────────────────────────────────────────────────────────── 118 132.0分 600.0秒 1 1 16 153 standby1 119 141.9分 600.0秒 1 2 15;16 157;153 pass 121 151.9分 600.0秒 1 2 15;16 157;153 standby1 122 161.8分 600.0秒 1 2 15;16 157;153 standby1 …(**まったく同じ行が 176 まで続く**)… 176 708.2分 600.0秒 1 2 15;16 157;153 standby1 ・**56 回**(往復121〜176)、10 分ごとに、1秒も違わず同じ ・毎回 total_s = 600.027 秒で **時間切れ**(timeout = 1) ・毎回 未配膳 2 皿 ・毎回 standby1 に戻ってやり直し 料理の積み直し(requeues.csv) t=9710.8 秒 dish 157(卓15・割れやすい)waited 1228.9 秒 積み直し 2 回め why=打ち切り t=9710.8 秒 dish 153(卓16) waited 1793.3 秒 積み直し 3 回め why=打ち切り t=10308.5 秒 dish 157 waited 1826.7 秒 積み直し 3 回め why=打ち切り t=10308.5 秒 dish 153 waited 2391.0 秒 積み直し 4 回め why=打ち切り …(158 分以降で **112 件**。dish 157 が 56 回・dish 153 が 56 回)… ・**料理はちゃんと board に戻されています**(why = 打ち切り) ・けれど戻した **同じ瞬間に同じロボットが取り直します** ・積み直しの回数(requeued_so_far)は 57 回まで増え続ける ・待ち時間(waited_s)は 2988 秒 … と増え続け、上限がない ★ ここが本当の詰まりです。 「board に戻す」までは動いているのに、**何回失敗しても ロボットから取り上げてスタッフに渡す道がありません**。 だから仕事板は(私たちが見る瞬間には)いつも空で、 スタッフ4人は「頼まれていないから手空き」のままでした。 ★ スタッフに渡す道は **ある**のに使われていません。 同じ回の dish 93 は robot_wait_expired=1 で、 staff_dishes=7(7皿はスタッフが運んだ)と記録されています。 つまり「ロボットを待ちきれない→スタッフが運ぶ」仕組みは動くのに、 **往復が時間切れになった後の皿には効いていません**。 ==================================================================== 4. なぜロボットが着けないのか(ここは特定できていません) ==================================================================== 記録の上では、ロボットは自分を「正常」と言っています。 立ち往生(stuck) 0 止まった回数(n_stops) 1(0.95 秒だけ) 通路待ち(wait_aisle_s) 0 他のロボットと会った 0 回 道の引き直し(replans) 0 よけた(robot_yields) 0 道は引けたか **引けた**(standby1 → 卓15 の停止点・角 10 個) 最小の余裕 1.97 m(狭い通路に入っていない) 動いた記録(往復121 のみ) x=16.9, z=6.05(standby1・左の余裕 29.9 cm) → x=15.3, z=5.95(左の余裕 42.1 cm) → x=12.298, z=3.857(左の余裕 90.0 cm・**スタッフとすれ違った**) 行き先は毎回 x=5.613, z=8.662(卓15 の停止点)。標準の経路長 14.31 m。 往復122 以降は、standby1 での 0.95 秒の止まりが1件だけで、 **ほかには何も記録されていません**。9.3 時間で止まりの記録は合計 57 件。 経路 14.3 m を普通に走れば 30 秒ほどで着く距離を、600 秒かけて着きません。 ・NavMesh の警告・例外はログに1件もありません(Unity のログを確認) ・NavMesh からの外れ(off_mesh 1.77 cm)は standby1 では **8.2 分の往復1 でも同じ値**で、そのときは普通に動けています。原因ではありません いちばん疑っているもの(**証拠はまだありません**) cs:10 で入れた「すれ違いの後ずさり」の分かれ道です。 ServingRobotController.FaceAndMove の頭に if (_passByBackingOff) { BackOffStep(dt); return; } を置きました。ここに入ると、**目的地へ進む処理も、 止まりを記録する処理も通りません**。 これなら「止まりも立ち往生も記録されないのに着かない」と合います。 合わない点もあります:132 分以降 すれ違いは1件も起きておらず (met_robot=0)、_passByOther は居ないはずです。 「旗が立ったまま戻らない」場合に限って説明がつきます。 はっきりさせる方法(どれも Assets を直さずにできます) (ア) この回を **SimHud の1倍**で見る(依頼 v13 の 依頼2)。 種0・③2台・すれ違い入 を Site Run で回し、132 分あたりを見る。 1倍だと 132 分まで 2 時間以上かかるので、 倍率表示だけ入れて速く回し、止まったところで見るのが現実的です (バ) det_frames(1コマごとの位置の指紋)を入れて回し、 132 分以降のロボット1 の座標を追う。 ExperimentPlan の detCheckFrameFingerprint を入れるだけで、 Assets のコードは直しません (ウ) 後ずさりの旗が立った回数を数える欄を足す(コードを直すので、 今日はやりません) 私は **(バ)** を勧めます。座標が出れば「その場で揺れている」のか 「どこかを往復している」のかが分かり、疑いを白黒つけられます。 ==================================================================== 5. 「切」と比べる(これは「入」特有です) ==================================================================== 70回ぜんぶの分布 積み直し(requeued_dishes) 切 60回 中央 0.0 幅 0〜4 入 10回 中央 0.5 幅 **0〜117** 時間切れ(trips.timeouts) 切 60回 中央 0.0 幅 0〜7 入 10回 中央 2.0 幅 **1〜59** ・**「入」の10回は、すべて1回以上 時間切れ**になっています(幅 1〜59)。 「切」の60回は中央値 0 です。 ・この回(種0・入)は 時間切れ 59 回・積み直し 117 回で、 2番目(切の ⑦2台・種2 の 時間切れ 7 回)から大きく離れた外れ値です。 ・全員が帰らなかった回は、70回のうち **この1回だけ**です。 → すれ違いの走り方(cs:10 の①②③)は、 **店を悪くするだけでなく、まれに回を壊します**。 「標準は切のまま」というエイイチの判断は、この件でさらに裏づけられました。 ==================================================================== 6. まとめ(誰が・どこで・何を待っていたか) ==================================================================== 客 組62(卓15・4人)… dish 157(割れやすい)を待っていた。 食べ終わっているのに会計に進めない 組63(卓16・2人)… dish 153 を待っていた。食べ始められない ロボット ロボット1 … 上の2皿を持って、standby1(x=16.9, z=6.05)から 卓15 の停止点(x=5.613, z=8.662)へ向かうが着けない。 600 秒で時間切れ → 皿を board に戻す → 同じ瞬間に取り直す、を **56 回** スタッフ 4人とも手空き。仕事板は空。 **皿はいつもロボットが握っていたので、一度も頼まれなかった** ロボット2 往復120(152 分ごろ)で仕事を終えて、あとは待機。 この件には関わっていません ==================================================================== 7. 直すとしたらの案(まだ直していません) ==================================================================== A. 積み直しに上限をつける(いちばん効く・いちばん小さい) 同じ皿が N 回(例 2回)打ち切りで戻されたら、 **ロボットには渡さずスタッフの仕事にする**。 仕組みは既にあります(robot_wait_expired → staff_dishes)。 「往復の時間切れ」をその引き金に足すだけです。 → これなら、原因が分からなくても回が壊れなくなります B. 同じ皿を同じロボットが続けて取らないようにする 打ち切った皿は、そのロボットだけ一定時間取れないようにする C. 往復の時間切れを「立ち往生」として数える いまは stuck=0・n_stops=1 なので、判定にも台帳にも 「おかしい」が出ません。時間切れ59回が summary の trips.timeouts にしか出ないのは見つけにくいです D. 4 章の原因そのものを直す(まず (バ) で特定してから) ★ A だけでも「720 分終わらない回」は無くなります。 原因(D)が分かっていなくても先に入れられるので、 次の夜の前に A を入れるのを勧めます。やりますか。 ==================================================================== 8. 使った記録 ==================================================================== 20261027_night_cs21_fam_p1_r2_s0_passon/ timeline.csv 60 秒ごとの店の様子(722 行)… 1 章 groups.csv 64 組の流れ … 2 章 dishes.csv 届いた 158 皿 … 2 章(153・157 は入っていない=届いていない) trips.csv 176 往復 … 3 章 requeues.csv 117 件の積み直し … 3 章 stops.csv 1051 件の止まり … 4 章 passes.csv 84 件のすれ違い(最後は 132.4 分)… 4 章 summary.json face_stop・requeued_dishes など … 3・5 章 night/20261027/logs/…_s0_passon.log Unity のログ(警告・例外なし)