# ブラウザ版 配膳ロボットシミュレーション — 決まりの一覧（下書き v0）

作成：2026-11-13
読んだもの：サイト p2m-site の tools/serving_sim/haizen_sim.py（試算 v2.9）・assumptions.json・public/sim/serving-robot-params.json／Mac の ServiceSim の Assets/ServiceSim/（Robot・People・Service の Spec と主なコード。読むだけ）

ブラウザ版の位置付け（2026-11-13 決定）：題材は配膳ロボット。ブラウザの中で人とロボットを動かし、数字も出す。
「何について正か」は今までどおり。店の形・条件・回し方の決まり・数字の定義はサイトが正。ブラウザ版は Unity と同じく「通路で起きること」を動かして数える側。

---

## A. サイトが正（ブラウザ版はそのまま読む・まねる）

| 何 | 値・決まり | 出どころ |
|---|---|---|
| 店の形 | 6店（⓪〜⑤）＋大型店⑧⑨。版 9b8dae7ebf8c | public/sim/layouts/*.json |
| 走れるマス目 | 2.5cm刻み 960×640（③）。2＝ふだんの幅（1.0m）が通れる／1＝通れる幅（0.8m）だけ／0＝通れない | layouts/unity/*_map.json |
| パネルで選べる条件 | 店・スタッフ人数・ロボット 0〜6台・来客のペース（混み具合）・使い方（上げ膳だけ／下げ膳にも／回って集める）・1往復の卓数（1／3）・割れ物を誰が運ぶか・レジ 1／2 | assumptions.json の choices |
| 時間の区切り | 空の店から始め、ピーク120分だけ来客、全員帰るまで回す | params の time_window |
| スタッフの仕事の順 | 0＝ロボットの救出 → 1＝案内・配膳・呼び出し・会計 → 2＝片付け | haizen_sim.py staff_job |
| 料理の運び方 | ロボット優先。2分待ってもロボットが空かなければ、先に空いた方が運ぶ | v2.7 |
| 会計 | レジ1つにつき1組ずつ・90秒。頼みはレジに並んだ時刻の古さで並ぶ | v2.8〜v2.9 |
| 下げ膳にも使う | スタッフが片付けに向かうとき空いているロボットが一緒に行き、載せ終えるまで卓で待ち、洗い場へ | v2.4 |
| 作業の時間 | 案内45秒・呼び出し30秒・片付け40秒・卓拭き40秒・載せ下ろし15秒 など | assumptions.json common |
| 数字の定義 | 入店待ち（来てから卓に着くまで）・うち満席待ち・うち人手待ち（10分以上で「店が回らない」）・料理が届くまで・会計待ち（10分以上で「レジが詰まる」）・歩いた距離・手がふさがる割合 ほか | params の metrics |

## B. Unity だけの値・決まり（ブラウザ版も同じ動きをまねる）

| 何 | Unity の値 | メモ |
|---|---|---|
| ロボットの体 | 直径0.5m・最高0.6m/秒・加減速1.0 | 試算は0.5m/秒（決めたとおり、そのまま） |
| 前のセンサー | 0.6m先・幅0.5m。空いて1秒で動き出す | |
| 道の引き方 | 地図（マス目）の上で自分で道を引く。NavMesh は使わない。真ん中寄りを走る・狭いマスは割高 | **人は NavMesh、ロボットはマス目**と分かれている |
| 回り込み | 前がふさがって3秒空かなければ回り込む道を探す（長さ2倍まで） | |
| 進めているかの見張り | 10秒で0.5m離れられなければ止まる（Nav2 の既定） | |
| 立ち往生 | **30秒**動けなければスタッフが来て動かす（救出15秒）。瞬間移動はしない | 2026-11-13 確定。Unity の RobotSpec の既定値は60秒（stuckAfterStoppedSec）なので、Unity 側は別途確かめる |
| 通路をふさぐロボットを人が動かす | **5秒**止まったら**7m以内**の人が動かす。料理・皿を持つ人は置いてから／すり抜けられれば動かさない／客は触らない | 2026-11-06 の決まり。2026-11-13 ブラウザ版に入れると確定（Unity のコードでは未確認） |
| ロボットどうし | 料理を載せた台が先・空の台がよける。すれ違いは 入（2m手前から0.3m/秒で右へ寄る） | 標準 |
| 待機場所へ戻る | 往復が終わったら待機場所へ戻る | 標準 入 |
| 案B（受け渡し口は1台ずつ・同じ卓は1台） | 作りは残し、標準は 切 | |
| 譲る順番 | ロボット ＞ スタッフ ＞ 客 | |
| 人の先よけ | 広い通路で4m手前から端へ寄る。標準は 切・撮るときだけ 入 | |
| 卓での受け渡し | 卓で25秒 | |
| スタッフの待つ場所 | 手が空いたら1人はレジ（入口番）、ほかは持ち場 | 2026-10-31 決定 |
| 人どうしの詰まり | 1秒で体を細め、3秒で片方が下がる（客が下がる） | |
| 人の体 | 半径0.2m・スタッフ1.0m/秒・客0.8m/秒 | |
| 下げ膳で卓で待つ上限 | 2分 | Unity だけの値 |

## C. ブラウザ版で決める・確かめること

1. **一時停止・立ち往生を確率で入れるか、動かして数えるか**：試算は確率（pause_rate・stuck_rate）で入れている。ブラウザ版は Unity と同じく動かして数える側なので、確率は使わず、実際に起きた数を数える案。
2. **道を引く重さ**：Unity のマス目は2.5cm刻みで 61万マス。ブラウザで何台も引き直すと重いので、5cm刻み（15万マス）に粗くしても道が変わらないかを確かめる。
3. **人の動き**：Unity は人に NavMesh を使っている。ブラウザは recast-navigation-js（Unity の NavMesh と同じ Recast 系）で人を動かし、ロボットは自前のマス目で道を引く（Unity と同じ分け方）。
4. **同じ種で同じ結果になるか**：決めてある「合格の線」の1つ。ブラウザ・端末をまたいで同じになるかを小さな試作で確かめる。ならなければ、数を出す計算は固定の刻みで回し、見せる動きとは分ける。
5. **Unity にあって決まりとして確かめが要るもの**：
   - 客が60秒で家へ戻る逃がし弁（guestWarpHomeSec）：**ブラウザ版には入れない**（2026-11-13 確定。瞬間移動はさせない）。
   - 立ち往生の30秒・5秒7mの決まりが今の Unity に入っているかは、Unity 側で別途確かめる（ブラウザ版は決まりのほうで作る）。
6. **答え合わせ**：ブラウザの数字を、試算 v2.9 と Unity の基準データ v5 の両方と並べ、向きが合うかで見る。ブラウザを4つ目の正にしない。

## 次の一手

C-2〜C-4 を、③（効率重視・入口が角）・ロボット2台・スタッフ真ん中・混み具合 普通 の1条件だけの試作で確かめる（見た目は作り込まず、店の床・卓・人とロボットの点だけ）。

## 試作で確かめた結果（2026-11-13・③ 効率重視・入口が角）

試作のコード：gridcheck.mjs（道の長さ）・crowdcheck.mjs（人の動き）。Node 22 で回した（サーバーの CPU。ブラウザではまだ測っていない）。

| 確かめ | 結果 | 決め |
|---|---|---|
| C-2 道を引く重さ（受け渡し口→42卓） | 2.5cm刻み：サイトの道の長さとの差 平均0.01m・最大0.04m・1本30ms／5cm刻み：差 平均0.11m・最大0.17m・1本7ms／10cm刻み：差 平均0.20m・最大0.47m・1本1.4ms。どの刻みでも行けない卓は0 | 2.5cm刻みのままでよい（引き直しは0.5秒に1回までなので重くない）。重いときだけ5cmへ |
| C-3 人の動き（recast-navigation 0.44） | 店の床から NavMesh を作るのに71ms。30人が店の中を動いて、店の時間10分ぶんが2.6秒（約230倍の速さ） | 使える。ピーク2時間ぶんは約30秒かかるので、数字は画面の裏（Web Worker）で回し、画面は見せる速さで動かす |
| C-4 同じ種で同じ結果か | 同じ種で2回回して位置が完全に一致。違う種では違う結果 | 同じ環境ではOK。ブラウザや端末をまたいで同じになるかは、ブラウザで確かめる（NavMesh の計算は WebAssembly なので同じになる見込み。こちらで書く計算は Math.log など端末で値がずれうる関数を避ける） |
