サービスロボット導入シミュレーション Log#18 | 小さい店では、2台目のロボットが待ちを延ばした
この記事の素材(コード・ログ・データ 10ファイル・まとめてダウンロードあり)arrow_downward3Dのファミレスのシミュレーションで、28卓の小さな店に配膳ロボットを2台入れると、お客さんが席に着くまでの待ち時間は、ロボットがいないときの倍になりました。パソコンの中の計算では、2台入れれば待ちは3分ほどに縮むはずでした。ところが、通路や人の動きまで作り込んだ3Dの店で回すと、待ちは25分近くまで延びました。
配膳ロボットを入れると店がどう変わるかを、2つのやり方で調べています。1つはサイトに公開している試算で、卓までの距離・料理の数・スタッフの人数から、待ち時間を計算します。もう1つは Unity(ゲームを作る道具)で作った3Dのファミレスで、お客さん・スタッフ・ロボットを1人ずつ動かすシミュレーションです。試算を正とし、3Dの店は「通路で実際に何が起きるか」を測る役です。これまでは42卓の店(③と⑦)で回してきました。今回は、それより小さい28卓の店(④)に広げました。
④は、試算の上ではロボットがよく効く店です。スタッフ2人の店で、ロボットがいないと入店待ちは約10分ですが、1台入れると約3分に縮みます。それが3Dの店では、1台でも縮まず、2台ではかえって延びました。
原因を1つずつ外していきました。
| やったこと | なぜ | 結果 |
|---|---|---|
④を3Dの店に建て、ロボット0・1・2台で1回ずつ回した | 小さい店に広げる最初の確かめ | 2台で入店待ち29.5分(試算3.2分)。30秒以上止まったのが143回 |
壁ぎわの2人席を上へ1mずらし、角にロボットがよける隙間を作った | 左の壁ぞいの一本道で、2台が向かい合って動けなくなっていた | 止まりは1往復あたり1.86回→1.04回。入店待ちは16.3分 |
④を種(来客の並びの乱数)を変えて10回ずつ回した | 1回ずつでは偶然と見分けられない | 2台で入店待ち26.9分。止まりの一番多い所は受け渡し口の前 |
ドリンクバーを壁ぎわへ動かした | 並ぶお客さんがロボットの出発点まで来ていた | 受け渡し口の前の止まりは減らなかった(見立て違い) |
受け渡し口に入れるロボットを1台ずつにした | 受け渡し口の前で2台がぶつかっていた | 調べる途中で、ロボットが待機場所へ戻っていなかったと分かった |
往復を終えたロボットが待機場所へ戻るように直した | 3Dの店の作りの誤り。店の形では待機場所を決めてあった | 受け渡し口の前のロボットどうしの止まりは278回→110回 |
42卓の店(③⑦)も、待機場所へ戻る作りで回し直した | 同じ誤りで回っていたため | 2台の止まりが減り、ロボットを足したときの向きが試算とそろった |
④の入店待ちが延びる理由のいくつかは、店の形と3Dの店の作りの誤りでした。それを直しても、小さい店では2台目のロボットが待ちを延ばす形は残りました。 待機場所へ戻るように直したあとも、④の入店待ちは、ロボット0台で12.7分・1台で14.4分・2台で24.8分です。2台のときの待ちのほとんどは「席は空いているのに、片付けと案内が追いつかずに待った時間」で、スタッフ2人の手が回らなくなっています。ここは直し続けず、調べる対象として記録に残し、次の店(⑤⑥)へ進むことにしました。
途中で、同じ条件・同じ乱数の種で回しても、3Dの店の数字が毎回少しずつずれることも分かりました。2台の入店待ちは、同じ回し方を3回くり返して18.4〜19.9分でした。そのため、比べるときは1回どうしではなく、種10個の真ん中の値(中央値)で比べています。
ここから下は作業ログです。「見込める効果」と書いた所は見込みで、測った値は「変わったこと」に書いています。3Dの店の回はすべて Claude Code が依頼箱(依頼を置くと Mac で自動で実行される仕組み)で回し、報告を書き戻しました。依頼文と報告は全量を載せています。
配膳ロボットを自分の店に入れたらどうなるかは、このシリーズの試算をもとにした別のページで試せます。
作業ログ ― ④の条件をサイトの試算から書き出した
この記事のコード・ログ・データは、1ファイルずつ下に置いています。全文はリンク先にあります。
ファイルの一覧(10本)
01_export_params.py.txt ― 書き出しのスクリプト export_params.py(このあと3回直した最後の版)・4,717字
02_sec02.txt ― 報告:20261027_1228_p2_build_check.txt・8,841字
03_sec03.txt ― 報告:20261027_2009_p2_rebuild_check.txt・10,058字
04_sec04.txt ― 報告:20261030_night_p2.txt・5,991字
05_sec05.txt ― 報告:20261027_2155_p2_drinkbar_check.txt・12,144字
06_sec06.md ― 依頼文:受け渡し口は1台ずつ・同じ卓は1台(20261027_12)・3,079字
07_sec06.txt ― 報告:20261027_2228_p2_ruleB_check.txt・14,456字
08_sec07.txt ― 報告:20261031_night_p2_standby.txt・17,122字
09_sec07.txt ― 報告:20261101_night_37_standby_ruleB.txt・9,114字
10_sec08.txt ― 報告:20261102_night_37_v5candidate.txt・12,957字
④(28卓・88席)の3条件は、③⑦と同じ決め方にした
3Dの店は、サイトの試算から書き出した serving-robot-params.json を読んで動きます。これまでは③⑦の6条件だけが入っていました。④を足すにあたって、条件の決め方は③⑦と同じにしました。スタッフは店の選択肢の真ん中の人数、混み具合は普通、上げ膳(料理を運ぶ仕事)だけ、1往復で3卓、レジ1つです。④では、スタッフ2人・1時間に28組・ロボット0・1・2台になります。
スタッフ2人だと、会計(1組90秒×28組=1時間に約42分)のあいだ、1人がほぼレジにかかりきりになります。2人で始め、問題が多ければ考え直すことにしました。最終的には、0人から4人まで、どの人数でも回せるようにする必要があります。
試算(v2.8)の④の値(入店待ちの平均・分。かっこ内は、そのうち席は空いているのに片付けと案内が追いつかずに待った時間):
| ロボット | 入店待ち | 料理の待ち | 会計待ち |
|---|---|---|---|
| 0台 | 9.72(7.93) | 0.90 | 4.24 |
| 1台 | 3.37(2.19) | 1.30 | 4.97 |
| 2台 | 3.17(1.93) | 0.47 | 4.86 |
試算は計算し直していません。書き出しのスクリプト export_params.py の「3Dの店で回す店」に④を足しただけで、③⑦の6条件と共通の値は前と同じであることを、書き出したファイルどうしで比べて確かめました(p2m-site commit bd71298)。
書き出しのスクリプト export_params.py(このあと3回直した最後の版)
このあと、店の形の版の番号が2回変わり、3Dの店の回し方の決まり(unity_rules)を2回足し直しています。ここに載せるのは最後の版(schema 0.4)です。
"""試算(haizen_sim.py)の条件と店の回し方の値を、Unity が読む JSON に書き出す(2026-10-22。v2.8 で2026-10-25 にレジの数を足した)。
「何について正か」(unity_design_v0.md の 0 章)で、条件と店の回し方の決まり・時間・数字の定義はサイトが正。
Unity はこの JSON を読み、値を手で写さない(LOG359 のずれ9「値の手写し」をなくすため)。
使い方: python3 export_params.py results.json <出力先> (出力先は p2m-site の public/sim/serving-robot-params.json)
- common:店に共通の値。role が "unity_measures" の値は Unity で測ってサイトに戻すための仮の値なので、Unity は読まない
- stores:Unity で回す店(fam_p1・fam_p5・fam_p2)の値。registers はレジの数(v2.8)作業ログ ― ④を3Dの店に建て、1回ずつ回した
依頼文:④を建てて確かめる(20261027_06)
---
作業フォルダ: /Users/shimazueiichi/Robotics_UX/ServiceSim
上限時間: 180
---
# 依頼:④ 効率重視・小さめの店(fam_p2)を Unity に建て、1回ずつ回して確かめる(2026-10-27)
エイイチの決定(2026-10-27):Unity を別の店へ広げる。順番は ④ → ⑤⑥ → ②。今回は④だけ。
サイト(正)はもう直して公開した(p2m-site commit bd71298)。
- `public/sim/serving-robot-params.json`:Unity で回す店に fam_p2 を足した。unity_conditions は6件 → 9件。③⑦の6件と common は前と同じ。試算は v2.8 のまま計算し直していない
- ④の3条件:スタッフ2人・28組/時・ロボット0・1・2台・上げ膳・1往復3卓(0台は trays 1)・レジ1つ
- 店の形:`public/sim/layouts/unity/p2_efficient_narrow.json` と `p2_efficient_narrow_map.json`(generation 8a5b2f6a016a。③⑦と同じ版。前から公開済み)
- 台帳の退避は Claude が済ませた:`/Volumes/KIOXIA/r2r2r-data/service_sim/unity/archive/unity_ledger_v1_pre_p2check_20261027/unity_ledger_v1.csv`(325行・md5 f6c7e71ce48dba4a620850b48535c411)
## 始める前に確かめること(違えば手を止めて報告)
1. Unity エディタが起動していない(起動していたら閉じずに報告して終わる)
2. /Volumes/KIOXIA がマウントされている。鍵ファイル unity_ledger_v1.lock がない
3. 台帳の md5 が上の退避と同じ
4. ServiceSim の保留が 0
## やること
1. サイトの params と④の店の形2つを、③⑦と同じやり方でプロジェクトに写す(写し元は https://pixelstomotors.com/sim/ か p2m-site の main。手で値を写さない)。generation が 8a5b2f6a016a でそろっているか確かめる
2. ④を③⑦と同じコード・同じ規則で建てる(地図の上で自分で道を引く動き方・すれ違い入・店員優先のよけ方・逃がし弁・モニター、すべて今の標準のまま)。④のためだけの手直しはしない
- ④の店の形のせいで建てられない・回らないところ(届かない卓、待機場所・レジ・スタッフが待つ点・並ぶ点が置けない、NavMesh の切れ目など)があっても、Unity 側で形を直さない。場所と理由を「決めてほしいこと」に書く(直すならサイトが先)
3. tools/make_queue.py に、店を選んで並べる指定(例 `--stores fam_p2`)を足す。**指定しないときは今までどおり ③ fam_p1・⑦ fam_p5 の60回**(params の条件が9件に増えても60回のまま)。judge_night.py は変えない(④は基準データがないので「基準なし」に振り分けられてよい)
4. check-in して、画面なしの実行ファイルを作り直す(保留 0)
5. 確かめの3回を回す:④ × ロボット0・1・2台 × 種0、すれ違い入。夜の回と混ざらないラベル(例 `p2check`)で。同時に回す本数は今の4のまま(3回なので3本になってよい)。ラベルを変えられない作りなら、その小さな変更は入れてよい
- 台帳には3行が足される(追記だけ)。終わったら行数と、先頭325行の md5 が退避と同じかを確かめる
6. `make_queue.py --dry-run` 相当で、何も指定しないとき③⑦の60回のままであることを確かめる(台帳に書かない)
## 変えないもの
- 店の回し方・人とロボットの動き・速さ・Stiffness などの物理の設定・同時に回す本数(N=4)
- 台帳の列(59列)と今までの行。③⑦の基準データ v4 の記録(night/ と 20261029_night_* の出力)
- 本番の夜は回さない(④の夜は、確かめの結果をエイイチが画面で見てから決める)
## 報告
依頼箱の結果に加えて、claude_code_reports に 20261027_HHMM_p2_build_check.txt として書く(場所:~/Library/Mobile Documents/com~apple~CloudDocs/デスクトップ/ADAPT DESIGN/じぶんの/PixelstoMotors/デジタルツイン学習R2R2R/サービスロボット導入シミュレーション/unity/claude_code_reports/)。
- 始める前の確かめ4つの結果
- 入れた cs 番号・build_id と保留の有無・変えたファイル
- ④を建てて分かったこと(卓の数28・止まる位置・待機場所・レジ・スタッフが待つ点が置けたか、置けなかった所)
- 3回それぞれ:最後まで回ったか・全員帰ったか・入れた組の数・入店待ち・そのうち席は空いているのに待った時間・料理の待ち・会計待ち・ロボットが運んだ皿の割合・30秒以上の止まり(1往復あたり)・動けなくなった(60秒)・卓を空けた・瞬間移動・打ち切り。試算の同じ条件の値(params の site_result)と並べる。差の理由の調べはしなくてよい
- 台帳の行数(325 → 328 のはず)と先頭325行の md5
- dry-run で③⑦が60回のままか
- **エイイチが画面で④を見る手順**(Unity を開いてから、どのシーン・メニューで④の、どの条件を流せるか。短く)
- 決めてほしいこと(なければ「なし」)
報告:20261027_1228_p2_build_check.txt
====================================================================
④ 効率重視・小さめの店(fam_p2)を建てて、1回ずつ回して確かめた
2026-10-27 12:28 check-in:cs:28(保留 0)
====================================================================
結論
・④は③⑦と同じコード・同じ決まりで建ちました。卓 28・席 88。止まる位置 28 か所はロボット2台で、30秒以上の止まりが143回出た
④は③⑦と同じ作り・同じ決まりで建ち、28卓すべてにロボットの道が引けました。ところが、2台の回では30秒以上止まったのが143回(1往復あたり1.86回)、60秒以上動けなくなったのが116回でした。入店待ちは29.5分で、試算の3.2分を大きく上回りました。③の基準データ(v4)では、2台の止まりは1往復あたり0.26回です。
3Dの店をエディタで流して画面で見ると、立ち往生がたしかに多く出ていました。
途中報告立ち往生多いね。
画面録画を8秒ごとのコマで見ると、48秒あたりで、1号機が卓04の前で止まり、2号機がそれをよけるために相手を待って、2台が向かい合ったまま動けなくなっていました。止まりの記録(stops.csv)を場所ごとに分けると、30秒以上の止まりの合計時間のうち、左の壁ぞいの列の卓へ行った往復が約2.6時間(56%)でした。左の列は、7卓分の止まる位置が1本の通路に縦に並んでいます。
もう1つ、2台が同じ卓へ同時に向かっていることも分かりました。2台の往復が時間的に重なった70組のうち14組(20%)が同じ卓を含んでいました。③では118組中5組(4%)です。
同じ種でも、エディタで流すと数字が変わった
画面で見るためにエディタで流した回(種1)も、2台で入店待ち38.9分、30秒以上の止まり123回のうち62回が「もう1台のロボット」でした。種を変えても同じ形が出たので、偶然ではなく、④の店の形と2台の組み合わせで起きていると見ました。
作業ログ ― 壁ぎわの2人席を上へ1mずらし、ロボットがよける隙間を作った
角に逃げ場を空ける案は、画面を見て決めた
エディタで流した画面のコマでは、左下の角で、配膳中のロボットの横をもう1台が抜けられずに止まっていました。
ここにロボットを逃す隙間を空けた方がいいね。 壁際の2名席をもう少し上にずらす感じで
左の壁ぞいの2人席は、1.1m間隔で5卓あります。一番下の卓と下の6人ボックスのあいだは0.4mで、ロボットが入れる隙間はありませんでした。一番上の卓の上には、トイレの入口の前の空け場所まで1.4mの余りがありました。
上へ1.0mずらす案と、余りいっぱいの1.4mずらす案を、店の形の決まりの確かめにかけました。どちらも決まりを満たし、28卓すべてにふだんの1.0mの道で届きます。ただ1.4mでは、一番下の卓のロボットが止まる位置が、空けた角そのものに移ってしまいます。配膳中のロボットが逃げ場をふさぐので、1.0mにしました。
途中で一度、言い間違えています。「上へ1.0mずらしても、一番上の2人席とトイレの入口の前の空け場所のあいだは1.4m残る」と伝えましたが、正しくは0.4mに縮みます。トイレの入口の前1.2mには何も置かない決まりは守れていて、店の形の確かめも通っています。
- ねらい:左の列の一本道で、配膳中のロボットの横をもう1台が抜けられるようにする
- 変わったこと:下の6人ボックスとのあいだが0.4m→1.4m。2台の回(種0)の30秒以上の止まりは143回→87回(1往復あたり1.86→1.04)、左の列の止まりは32回→15回、入店待ちは29.5分→16.3分
- 見込める効果:左の列の詰まりが減る分、1台目の配膳中も2台目が奥の卓へ行ける。卓までの距離は平均8.4m→8.5mでほぼ変わらない
試しにずらした形を描いたスクリプト try_p2.py
import sys, json, re
import matplotlib.pyplot as plt
import famires_gen2 as gen, famires_v3 as v3
src=open('famires_gen2.py',encoding='utf-8').read()
shift=float(sys.argv[1])
orig=gen.two_seat_row
def p2():
def tsr(x,y,side,n,pitch=1.1):
if side=="left" and x==0.0 and y==2.2: y=round(2.2+shift,2)
return orig(x,y,side,n,pitch)
gen.two_seat_row=tsr
try: return gen.p2_efficient_narrow()
finally: gen.two_seat_row=orig
L=v3.prepare(p2())
v=v3.check_rules(L)
if v: print('NG',v); sys.exit()
res,err=v3.analyze(L,v3.SETTINGS['res'],{})
resb,errb=v3.analyze(L,v3.SETTINGS['check_res'])
print('err',err,errb)
summ=v3.summarize(L,res)
print({k:summ[k] for k in ('tables','robot_tables','narrow_tables','human_tables','robot_dist_mean','robot_dist_max')})
d={r['id']:r.get('dist') for r in res}
print({k:d[k] for k in list(d)[:5]}, [r['category'] for r in res][:5])
fig,ax=plt.subplots(figsize=(14,11),dpi=90); v3.draw(ax,L,res,summ,[]); fig.savefig(f'p2_shift_{shift}.png',bbox_inches='tight',facecolor='white')
店の形の作り方 famires_gen2.py の④の部分(最後の版)
このあとドリンクバーも動かしたので、最後の版を載せます。左の2人席は two_seat_row(0.0, 3.2, "left", 5)(前は 2.2)です。
def p2_efficient_narrow():
W, D = 17.0, 12.0
rooms, walls, dish, sb, start = boh_right(W, D, 10.0, 5.0, 10.0, pw=1.5, sw=1.8, wash_gap=0.8)
toilet, twalls, tdoor = toilet_block([0.0, 10.0, 2.4, 12.0], "bottom", W, D) # 左上の角。入口は下向き
rooms += [toilet]
walls += twalls
sb["rect"] = [12.0, 4.15, 13.6, 4.95]
sb["slots"] = 2
rooms += [dict(label="待合", rect=[16.5, 3.2, 17.0, 4.8], kind="guest"),
*register([13.6, 0.3, 14.3, 3.0], [12.9, 0.3, 13.6, 3.0]), # 入口に向いた縦のカウンター
# ドリンクバーは下の壁ぎわ(2026-10-27 エイイチと決めた。前は y=1.6〜2.2 で、並ぶ点が受け渡し口の前(出発点)まで
# 届き、Unity でロボット2台が受け渡し口の前で詰まったため。並ぶ点の先から受け渡し口の前まで約1.5m空く)
dict(label="ドリンクバー", rect=[10.4, 0.0, 12.4, 0.6], kind="drink")]
# 左の壁ぞいの2人席(トイレの入口の手前で止める)。下の6人ボックスとの間に1.4m空け、ロボットがよける隙間にする
# (2026-10-27 エイイチと決めた。Unity で2台が左の列で向かい合って動けなくなったため。前は y=2.2 で隙間0.4m)
t = two_seat_row(0.0, 3.2, "left", 5)
t += two_seat_row(3.5, 10.6, "top", 6, pitch=1.05) # 上の壁ぞいの2人席(トイレから1m以上離す)
t += island(2.6, 2.9, "v", 3)
t += island(6.3, 2.9, "v", 3)
t += strip(1.6, 0.0, "h", 2, seats=6) # 家族用の6人ボックス
t += two_seat_row(5.6, 0.0, "bottom", 3)
return dict(name="④ 効率重視型・狭い店・入口が右の壁", style="効率重視", outer=dict(w=W, d=D),
entrance=dict(side="right", a0=0.6, a1=3.0), rooms=rooms, walls=walls, toilet_doors=[tdoor],
dish_up=dish, robot_standby=sb, start=start, tables=t)
卓までの距離が変わったので、④だけ試算を計算し直した
店の形を直して卓までの距離が変わったら、その店だけ試算を計算し直し、店の形と一緒に公開すると前に決めています。6店を作り直したところ、④以外の5店は版の番号が変わっただけで、中身は同じでした(ロボットの地図は、ほどいた中身が同じで、圧縮のバイトだけが違った)。
試算(haizen_sim.py v2.8)は、前提が変わった店の条件だけを回し直す作りになっていたので、そのまま回しました。全32,850条件のうち30,222条件は使い回し、④の2,628条件だけを回し直しました(クラウドの作業環境・2コアで約10分)。公開中の試算のページは、④の結果と平面図だけを差し替えるスクリプトで作り直し、全37,800画面を描いて、欠け・undefined・NaN がないことを確かめました(p2m-site commit e7bbe7d)。
32850 conditions, 30222 reused, 2628 to run
結果が変わった行: {'fam_p2': 2628}
④の距離: [1.5, 13.9] 8.5
平面図で動かした卓: 5
書いた: serving-robot.v28b.html 版 25e420d53394
rendered 37800 / レジが詰まるが出た画面 6968 / 回らないが出た画面 5941 / 5台以上の注意 10800
| ロボット | 入店待ち(前) | 入店待ち(直したあと) |
|---|---|---|
| 0台 | 9.7分 | 10.4分 |
| 1台 | 3.4分 | 2.9分 |
| 2台 | 3.2分 | 3.5分 |
試算でも、1台と2台の差は小さいままです(40回の平均なので、0.5分ほどは揺れの範囲です)。
ページの④だけを差し替えるスクリプト update_page_p2.py
"""④の店の形を直したとき(2026-10-27)、公開中の試算のページの④だけを差し替える。
使い方: python3 update_page_p2.py <公開中のページ> <新しい results.json> <前の p2 の店の形> <新しい p2 の店の形> <新しい summary.json> <出力するページ>
- const D の r(結果):④(fam_p2)の行だけが変わっていることを確かめてから、全部を新しい結果に入れ替える
- const D の stores.fam_p2:卓までの距離(dist_m・dist_mean)を新しい値に
- const D の plans.fam_p2:位置が変わった卓だけ、新しい位置に
- const D の layout_generation:新しい版の番号に
ほかの店・費用の欄・画面の文は変えない"""
import json, sys
import haizen_sim as h
live, res, old_lay, new_lay, summ, out = sys.argv[1:7]
s = open(live, encoding="utf-8").read()
N = json.load(open(res, encoding="utf-8"))
assert N["common"] == json.loads(json.dumps(h.COMMON))
lines = [l for l in s.split("\n") if l.startswith("const D = ")]
assert len(lines) == 1
D = json.loads(lines[0][len("const D = "):].rstrip(";"))
cond = D["k"][:8]
mets = D["k"][8:-1]
conds = list(h.conditions())
assert len(N["rows"]) == len(conds) == len(D["r"])
rows = []
changed = {}
for c, r, o in zip(conds, N["rows"], D["r"]):
assert all(r[k] == c[k] for k in cond)
row = [r[k] for k in cond] + [round(r[k], 3) for k in mets] + [1 if r["staff_wait_mean"] >= h.NG_MIN else 0]
assert o[:8] == row[:8]
if o != row:
changed[c["store"]] = changed.get(c["store"], 0) + 1
rows.append(row)
print("結果が変わった行:", changed)
assert set(changed) <= {"fam_p2"}, changed
D["r"] = rows
st = h.STORES["fam_p2"]
D["stores"]["fam_p2"]["dist_m"] = list(st["dist_m"])
D["stores"]["fam_p2"]["dist_mean"] = round(sum(st["dist_list"]) / len(st["dist_list"]), 1)
print("④の距離:", D["stores"]["fam_p2"]["dist_m"], D["stores"]["fam_p2"]["dist_mean"])
to = json.load(open(old_lay, encoding="utf-8"))["layout"]["tables"]
tn = json.load(open(new_lay, encoding="utf-8"))["layout"]["tables"]
rect = lambda t: [round(t["x"], 2), round(t["y"], 2), round(t["x"] + t["w"], 2), round(t["y"] + t["h"], 2)]
moves = {tuple(rect(a)): rect(b) for a, b in zip(to, tn) if a != b}
n = 0
for t in D["plans"]["fam_p2"]["tables"]:
k = tuple(round(v, 2) for v in t[:4])
if k in moves:
t[:4] = moves[k]
n += 1
assert n == len(moves), (n, len(moves))
print("平面図で動かした卓:", n)
gens = {g["generation"] for g in json.load(open(summ, encoding="utf-8"))}
assert len(gens) == 1
D["layout_generation"] = gens.pop()
s = s.replace(lines[0], "const D = " + json.dumps(D, ensure_ascii=False, separators=(",", ":")) + ";")
open(out, "w", encoding="utf-8").write(s)
print("書いた:", out, "版", D["layout_generation"])
依頼文:④を建て直す(20261027_07。Unity が開いていたので08で置き直した)
1回目(07)は、始める前の確かめで Unity のエディタが開いていたので、何も変えずに止まりました。エディタを閉じて、同じ中身を08として置き直しました。
---
作業フォルダ: /Users/shimazueiichi/Robotics_UX/ServiceSim
上限時間: 120
---
# 依頼:④の店の形を直したので、Unity の④を建て直して3回回し直す(2026-10-27)
エイイチの決定(2026-10-27):④の左の壁ぞいの2人席(T01〜T05)を上へ1.0mずらし、下の6人ボックスとの間に1.4mの隙間を作る。前回(cs:28)の2台の回で、2台が左の列で向かい合って動けなくなったため、ロボットがよけられる所を作る。
サイト(正)はもう直して公開した(p2m-site commit e7bbe7d)。
- 店の形の版:8a5b2f6a016a → **25e420d53394**(6店とも版の番号が変わる。中身が変わったのは④だけ。ほかの5店は、地図の圧縮のバイトが変わっただけで、ほどいた中身は同じ)
- ④:T01〜T05 の y が +1.0m。卓までの距離は平均 8.4 → 8.5m
- 試算:④の条件だけ計算し直した(v2.8 のまま)。params の④の3条件の site_result が変わった。③⑦の6条件は同じ
- 台帳の退避は Claude が済ませた:`/Volumes/KIOXIA/r2r2r-data/service_sim/unity/archive/unity_ledger_v1_pre_p2check2_20261027/unity_ledger_v1.csv`(328行・md5 ce05588198bca70278a439aa092acf04)
## 始める前に確かめること(違えば手を止めて報告)
1. Unity エディタが起動していない(起動していたら閉じずに報告して終わる)
2. /Volumes/KIOXIA がマウントされている。鍵ファイル unity_ledger_v1.lock がない
3. 台帳の md5 が上の退避と同じ
4. ServiceSim の保留が 0
5. https://pixelstomotors.com/sim/serving-robot-params.json の meta.layout_generation が 25e420d53394(まだ前の版なら、サイトへの反映待ちなので数分待って取り直す。30分たっても前の版なら報告して終わる)
## やること
1. 前回と同じやり方で、params と6店の店の形(unity/ の JSON と地図)をプロジェクトに写す。版がそろっているか確かめる
2. ④を前回と同じコード・同じ規則で建て直す(④のためだけの手直しはしない)。前回と同じ確かめ(止まる位置・道順・場所の点・NavMesh・確かめ A)を回し、前回と比べる。特に、左下の隙間がロボットの地図で通れる所(マスの種類)になっているか、ロボット用の NavMesh に乗っているかを書く
3. ③⑦は建て直さなくてよい。ただし版の番号の確かめで止まるなら、③⑦の .asset の版の番号だけを新しくする(形は変えない)。③⑦の確かめ A を1回回し、前と同じ結果か書く
4. check-in して、画面なしの実行ファイルを作り直す(保留 0)
5. 確かめの3回を回す:④ × ロボット0・1・2台 × 種0、すれ違い入。ラベルは `p2check2`。記録の置き場所は前回と同じく分ける(`--record-name 20261027_p2check2` など)
- 台帳には3行が足される(追記だけ)。終わったら行数と、先頭の行の md5 が退避と同じかを確かめる
6. 何も指定しないとき、make_queue が③⑦の60回のままか確かめる(台帳に書かない)
## 変えないもの
- 店の回し方・人とロボットの動き・速さ・物理の設定・同時に回す本数(N=4)
- 台帳の列(59列)と今までの行。③⑦の基準データ v4 の記録
- 本番の夜は回さない
## 報告
依頼箱の結果に加えて、claude_code_reports に 20261027_HHMM_p2_rebuild_check.txt として書く(場所:~/Library/Mobile Documents/com~apple~CloudDocs/デスクトップ/ADAPT DESIGN/じぶんの/PixelstoMotors/デジタルツイン学習R2R2R/サービスロボット導入シミュレーション/unity/claude_code_reports/)。
- 始める前の確かめ5つの結果
- 入れた cs 番号・build_id と保留の有無・変えたファイル
- ④を建て直して分かったこと(前回との違い。左下の隙間)
- 3回それぞれ、前回(cs:28 の p2check)と同じ表:最後まで回ったか・全員帰ったか・入れた組の数・入店待ち・そのうち席は空いているのに待った時間・料理の待ち・会計待ち・ロボットが運んだ皿の割合・30秒以上の止まり(1往復あたり)・動けなくなった(60秒)・卓を空けた・瞬間移動・打ち切り。試算の値(新しい site_result)と、前回の Unity の値を並べる
- 2台の回の30秒以上の止まりを、理由(もう1台のロボット・人など)ごとと、場所(左の列・上の列・下の列・受け渡し口の前)ごとに数えたもの。前回と並べる。差の理由の調べはしなくてよい
- 台帳の行数と先頭の行の md5
- 決めてほしいこと(なければ「なし」)
報告:20261027_2009_p2_rebuild_check.txt
====================================================================
④の店の形を直した版(25e420d53394)で、Unity の④を建て直して3回回し直した
依頼:20261027_08_店4を建て直す_やり直し.md
2026-10-27 20:09 check-in:cs:29(保留 0)/build_id cs29_20261027_2004
====================================================================
結論
作業ログ ― ④を種10個ずつ回すと、2台で入店待ちが26.9分だった
依頼文:④の夜を回す(20261027_09)
---
作業フォルダ: /Users/shimazueiichi/Robotics_UX/ServiceSim
上限時間: 120
---
# 依頼:④の夜(30回)を回す(2026-10-27)
エイイチが「④の夜を回す」と決めた。④(fam_p2・店の形 25e420d53394)× ロボット0・1・2台 × 種0〜9、すれ違い入。
台帳の退避は Claude が済ませた。
- 退避先:/Volumes/KIOXIA/r2r2r-data/service_sim/unity/archive/unity_ledger_v1_prenight_20261030_p2/unity_ledger_v1.csv
- 331 行・md5 1eb3428dc415c0466edb79f53e9eef69
## 始める前に確かめること(1つでも違えば回さずに報告して終わる)
1. Unity エディタが起動していない(起動していたら閉じずに報告して終わる)
2. /Volumes/KIOXIA がマウントされている。鍵ファイル unity_ledger_v1.lock がない
3. 本物の台帳の md5 が上の退避と同じ
4. ServiceSim の保留が 0 で、実行ファイルの build_info が cs29_20261027_2004・保留なし
## 回す
作業フォルダで、次の2つを順に実行する。night_runner.py は終わるまで待つ。
```
python3 tools/make_queue.py --stores fam_p2 --out queue_p2.json
python3 tools/night_runner.py --queue queue_p2.json --parallel 4 --night 20261030 --record-name 20261030_p2
```
- 夜の名前は 20261030。記録は night/20261030_p2/ に分ける(night/20261030/ には前の dry-run の記録があるので混ぜない)。オプションの名前が違えば、同じ意味になるように合わせる
- 並ぶのは 30 回(④ × 0・1・2台 × 種0〜9・すれ違い入)であることを、回す前に queue_p2.json で確かめる。30 回でなければ回さずに報告
- プロジェクトの queue.json(③⑦の60回)は触らない
- 回している間は、ほかの作業をしない。Assets・tools・設定ファイルを開かない・変えない。Unity を開かない
- Ctrl+C で止めない。途中で止まっても、同じ夜を回し直さない(そのまま報告する)
## 報告
依頼箱の結果に加えて、claude_code_reports に 20261030_night_p2.txt として書く(場所:~/Library/Mobile Documents/com~apple~CloudDocs/デスクトップ/ADAPT DESIGN/じぶんの/PixelstoMotors/デジタルツイン学習R2R2R/サービスロボット導入シミュレーション/unity/claude_code_reports/)。
- 始める前の確かめ4つの結果
- runner_log のまとめ(completed の回数・失敗・止まった回・最長の実時間)
- 台帳の行数(331 → 361 になるはず)と、先頭 331 行の md5 が退避と同じか
- 全員が帰らなかった回があれば、その回の名前(原因の調べはしない)
- 台数ごと(0・1・2台)の種10個の中央値と最小・最大:入店待ち・そのうち席は空いているのに待った時間・料理の待ち・会計待ち・入れた組の数・ロボットが運んだ皿の割合・30秒以上の止まり(1往復あたり)・動けなくなった(60秒)・瞬間移動・打ち切り・卓を空けた
- 2台の30秒以上の止まりを、理由ごと・場所ごと(前回 p2_rebuild_check と同じ分け方)に、種10個の合計で
- judge.md ができたか(④は基準がないので「基準なし」でよい。中身の判断はしない)
報告:20261030_night_p2.txt
====================================================================
④の夜(30回)を回した
依頼:20261027_09_店4の夜を回す.md
2026-10-27 20:41〜21:15 build_id cs29_20261027_2004(cs:29・保留なし)
====================================================================
結論
ロボットを入れても、④では入店待ちが縮まなかった
種10個の中央値(分):
| 0台 | 1台 | 2台 | |
|---|---|---|---|
| 入店待ち(3Dの店) | 12.95 | 13.78 | 26.85 |
| 入店待ち(試算) | 10.39 | 2.93 | 3.46 |
30秒以上の止まり(1往復あたり) | 0 | 0.314 | 1.031 |
| 動けなくなった(60秒) | 0 | 13 | 78.5 |
0台は試算とほぼ同じです。試算ではロボット1台で入店待ちが大きく縮みますが、3Dの店の④では1台でも縮まず、2台では倍になりました。2台の30秒以上の止まり(10回の合計1,017回)は、受け渡し口の前が348回で一番多く、そのうち256回が「もう1台のロボット」でした。
この報告は 21:15 に書き終わっていましたが、依頼箱では「実行中」のまま残り、次の依頼が始まりませんでした。Claude Code が、報告のあとも何かを待っていたようです。見張り係を止めずに、自動で呼び出した Claude Code だけを止める手順(pkill -INT -f "claude -p")を出しましたが、その直前に前の依頼は自分で終わっていて、止まったのは始まったばかりの次の依頼(10)でした。台帳には何も書かれていなかったので、同じ依頼を11として置き直しました。
作業ログ ― ドリンクバーを壁ぎわへ動かしたが、受け渡し口の前の詰まりは減らなかった
並ぶ点が、ロボットの出発点まで届いていた
④のドリンクバーは、受け渡し口の下にあり、前に並ぶお客さんの3つ目の点 (11.4, 4.5) が、ロボットの出発点 (11.05, 4.45) とほぼ同じ所にありました。受け渡し口の前の詰まりはこれが原因だと見て、ドリンクバーを下の壁ぎわ(y 0〜0.6)へ動かしました。並ぶ点の先から出発点まで約1.5m空きます。卓までの距離は1つも変わらないので、試算は計算し直していません(p2m-site commit 9eeca01)。
試しに動かした形を確かめたスクリプト try_db.py
import sys, json, tempfile
from pathlib import Path
import matplotlib.pyplot as plt
import famires_gen2 as gen, famires_v3 as v3
rect=json.loads(sys.argv[1]); tag=sys.argv[2]
orig=gen.p2_efficient_narrow
L0=orig()
for r in L0["rooms"]:
if r["label"]=="ドリンクバー": r["rect"]=rect
L=v3.prepare(L0)
v=v3.check_rules(L)
if v: print('NG',v); sys.exit()
ctx={}
res,err=v3.analyze(L,v3.SETTINGS['res'],ctx); resb,errb=v3.analyze(L,v3.SETTINGS['check_res'])
if err or errb: print('ERR',err,errb); sys.exit()
summ=v3.summarize(L,res); tmp=Path(tempfile.mkdtemp())
U=v3.export_unity(L,res,ctx,'p2',tmp,'x'); print('register', v3.check_register_clear(U))
print({k:summ[k] for k in ('robot_tables','narrow_tables','robot_dist_mean','robot_dist_max')})
print('dists',[r['dist'] for r in res])
for p in U['places']:
if p['kind'].startswith('Drink') or p['kind'] in ('FoodPass','RobotStandby'): print(' ',p['kind'],p['point'],p.get('front',''))
fig,ax=plt.subplots(figsize=(14,11),dpi=90); v3.draw(ax,L,res,summ,[]); fig.savefig(f'db_{tag}.png',bbox_inches='tight',facecolor='white')
== now
register []
{'robot_tables': 28, 'narrow_tables': 0, 'robot_dist_mean': 8.5, 'robot_dist_max': 13.92}
FoodPass [11.05, 4.45]
DrinkBar [11.4, 2.6] top
DrinkBarStand [10.9, 2.6]
DrinkBarStand [11.9, 2.6]
DrinkBarQueue [11.4, 3.5]
DrinkBarQueue [11.4, 4.0]
DrinkBarQueue [11.4, 4.5]
RobotStandby [12.4, 4.55]
RobotStandby [13.2, 4.55]
== wall
register []
{'robot_tables': 28, 'narrow_tables': 0, 'robot_dist_mean': 8.5, 'robot_dist_max': 13.92}
FoodPass [11.05, 4.45]
DrinkBar [11.4, 1.0] top
DrinkBarStand [10.9, 1.0]
DrinkBarStand [11.9, 1.0]
DrinkBarQueue [11.4, 1.9]
DrinkBarQueue [11.4, 2.4]
DrinkBarQueue [11.4, 2.9]
RobotStandby [12.4, 4.55]
RobotStandby [13.2, 4.55]
依頼文:ドリンクバーを動かして建て直す(20261027_10。11で置き直した)
---
作業フォルダ: /Users/shimazueiichi/Robotics_UX/ServiceSim
上限時間: 120
---
# 依頼:④のドリンクバーを動かしたので、Unity の④を建て直して3回回し直す(2026-10-27)
エイイチの決定(2026-10-27):④の夜(20261030_p2・30回)で、2台の30秒以上の止まりが一番多かったのは「もう1台のロボット・受け渡し口の前」(256回)。ドリンクバーに並ぶ点が受け渡し口の前(出発点 11.05, 4.45)まで届いていたので、ドリンクバーを下の壁ぎわへ動かす。
サイト(正)はもう直して公開した(p2m-site commit 9eeca01)。
- 店の形の版:25e420d53394 → **39257d16b68a**(中身が変わったのは④だけ。ほかの5店は版の番号と地図の圧縮のバイトだけ)
- ④:ドリンクバー [10.4, 1.6, 12.4, 2.2] → **[10.4, 0.0, 12.4, 0.6]**。並ぶ点は (11.4, 1.9)・(11.4, 2.4)・(11.4, 2.9)。前に立つ点は y=1.0
- 卓までの距離は変わらないので、試算の数字(params の site_result)は前と同じ。params は layout_generation だけが変わった
- 台帳の退避は Claude が済ませた:`/Volumes/KIOXIA/r2r2r-data/service_sim/unity/archive/unity_ledger_v1_pre_p2check3_20261027/unity_ledger_v1.csv`(361行・md5 d019df2c3018fcb99b9e8bd4efde7e89)
## 始める前に確かめること(違えば手を止めて報告)
1. Unity エディタが起動していない(起動していたら閉じずに報告して終わる)
2. /Volumes/KIOXIA がマウントされている。鍵ファイル unity_ledger_v1.lock がない
3. 台帳の md5 が上の退避と同じ
4. ServiceSim の保留が 0(作業フォルダに queue_p2.json が残っていれば、夜の記録 night/20261030_p2/queue.json と中身が同じかを確かめてから消してよい。check-in しない)
5. https://pixelstomotors.com/sim/serving-robot-params.json の meta.layout_generation が 39257d16b68a
## やること
1. 前回(cs:29)と同じやり方で、params と店の形をプロジェクトに写す(p1・p2・p5 と summary.json。版がそろっているか確かめる)
2. ④を前回と同じコード・同じ規則で建て直す(④のためだけの手直しはしない)。前回と同じ確かめ(止まる位置・道順・場所の点・NavMesh・確かめ A)を回し、前回と比べる。ドリンクバーの点(前・立つ点・並ぶ点)が NavMesh に乗っているか、受け渡し口の前のまわり(x 9.8〜13.6・y 2.9〜5.0)のロボットの地図のマスの種類が前とどう変わったかを書く
3. check-in して、画面なしの実行ファイルを作り直す(保留 0)
4. 確かめの3回を回す:④ × ロボット0・1・2台 × 種0、すれ違い入。ラベルは `p2check3`。記録の置き場所は分ける(`--record-name 20261027_p2check3`)
- 台帳には3行が足される(追記だけ)。終わったら行数と、先頭361行の md5 が退避と同じかを確かめる
5. 何も指定しないとき、make_queue が③⑦の60回のままか確かめる(台帳に書かない)
6. 作業フォルダに queue の一時ファイルを残さない(作ったら、同じ中身が night/ の記録にあることを確かめて消す)
## 変えないもの
- 店の回し方・人とロボットの動き・速さ・物理の設定・同時に回す本数(N=4)
- 台帳の列(59列)と今までの行。③⑦の基準データ v4、④の夜 20261030_p2 の記録
- 本番の夜は回さない
## 報告
依頼箱の結果に加えて、claude_code_reports に 20261027_HHMM_p2_drinkbar_check.txt として書く(場所:~/Library/Mobile Documents/com~apple~CloudDocs/デスクトップ/ADAPT DESIGN/じぶんの/PixelstoMotors/デジタルツイン学習R2R2R/サービスロボット導入シミュレーション/unity/claude_code_reports/)。
- 始める前の確かめ5つの結果
- 入れた cs 番号・build_id と保留の有無・変えたファイル
- ④を建て直して分かったこと(前回との違い。ドリンクバーのまわりと受け渡し口の前)
- 3回それぞれ、前回(cs:29 の p2check2)と同じ表で、今回・前回・試算を並べる
- 2台の回の30秒以上の止まりを、理由ごと・場所ごと(前回と同じ分け方)に。前回(p2check2・種0)と、④の夜(20261030_p2)の種0の回と並べる
- 台帳の行数と先頭361行の md5
- 決めてほしいこと(なければ「なし」)
報告:20261027_2155_p2_drinkbar_check.txt
====================================================================
④のドリンクバーを動かした版(39257d16b68a)で、Unity の④を建て直して3回回し直した
依頼:20261027_11_店4のドリンクバーを動かして建て直す_やり直し.md
2026-10-27 21:55 check-in:cs:30(保留 0)/build_id cs30_20261027_2150
====================================================================
結論
見立てが外れた:詰まっていたのはロボットどうしだった
2台の回の「もう1台のロボット・受け渡し口の前」は、今回17回・前回15回・④の夜の種0で17回で、減りませんでした。ドリンクバーのまわりの30秒以上の止まりは、前も今も0回です。並ぶお客さんは原因ではなく、受け渡し口のまわりで2台のロボットどうしがぶつかっていました。
同じ版・同じ種でも回ごとに数字がずれることも、ここで分かりました。前回の確かめと④の夜の種0は同じ作りですが、2台の入店待ちは16.34分と15.30分でした。
作業ログ ― 受け渡し口を1台ずつにしたら、逆に悪くなった
回し方の決まり(案B)は、試算には効かないので、サイトには決まりとして書いた
受け渡し口でのぶつかりを、回し方の決まりで防ぐことにしました。
- 受け渡し口の前に入れるロボットは1台だけ。前の1台が出発点から1.5m離れるまで、次の1台は待機場所で待つ
- その卓へ向かっているロボットがいる間は、その卓の料理を別のロボットに積まない。2分待っても来なければ、今までどおりスタッフが運ぶ
試算の作りを確かめると、試算の料理は卓までの距離だけを持っていて、どの卓の料理かを区別していません。受け渡し口で積む時間も0秒で、順番待ちが起きません。なので2つとも、試算の数字には効きません。受け渡し口でのぶつかりは通路で起きることなので、3Dの店が測る側です。サイトの params には決まりとして書くだけにし、試算の数字は変えませんでした(p2m-site commit 7484322)。
依頼文:受け渡し口は1台ずつ・同じ卓は1台(20261027_12)
---
作業フォルダ: /Users/shimazueiichi/Robotics_UX/ServiceSim
上限時間: 180
---
# 依頼:回し方の決まり(案B)を切り替えで入れ、④で3回確かめる(2026-10-27)
エイイチの決定(2026-10-27):④でロボット2台の30秒以上の止まりが一番多いのは「もう1台のロボット・受け渡し口の前」(④の夜で256回/2台・種10個)。ドリンクバーを動かしても減らなかった(p2_drinkbar_check)。受け渡し口でのロボットどうしのぶつかりを、回し方の決まりで防ぐ。
報告:20261027_2228_p2_ruleB_check.txt
====================================================================
回し方の決まり(案B)を切り替えで入れ、④で確かめた
依頼:20261027_12_受け渡し口は1台ずつ_同じ卓は1台.md
2026-10-27 22:28 check-in:cs:31(決まりを入れた)→ cs:32(受け渡し口の決まりの直し)
build_id cs32_20261027_2227(保留 0)
====================================================================
結論2台が互いを待ち続け、もう1つの誤りが見つかった
「入」の2台の回は、作りの誤りで2台が互いを待ち続け、往復が23回しかありませんでした(ふだんは70〜90回)。Claude Code はこれを直しました(cs:32)。
その調べの途中で、往復を終えたロボットが待機場所まで下がらず、受け渡し口の点で止まったまま次の料理を待っていたことが分かりました。決まりを切った回でも、前の回でも同じでした。店の形では、待機場所を受け渡し口の横に決めてあります。サイトの決まりに3Dの店が合っていない作りの誤りです。③⑦の回も、同じ作りで回っていました。
作業ログ ― 待機場所へ戻るように直し、④を3つの作りで比べた
依頼文:待機場所へ戻る と④の比べ(20261027_13・夜の作業)
進めて、夜の間に作業できるようにしてください。
夜の間に2つの依頼が続けて回るように置きました。人に聞かないと進めない所に当たったら、その作業だけ止めて報告に書き、ほかの作業は続ける形にしています。2つ目は、1つ目がちゃんと終わったときだけ始まり、台帳の退避も Claude Code が自分で行います。
---
作業フォルダ: /Users/shimazueiichi/Robotics_UX/ServiceSim
上限時間: 300
---
# 依頼:往復を終えたロボットが待機場所へ戻るように直し、④で3つの作りを種10個ずつ比べる(夜の作業・2026-10-27)
エイイチの決定(2026-10-27 22:52):前の報告(20261027_2228_p2_ruleB_check.txt)の「決めてほしいこと 2」のとおり、往復を終えたロボットが待機場所まで下がらず、受け渡し口の点(10.8〜10.9, 4.3〜4.5)で止まっている。店の形では待機場所(RobotStandby)が受け渡し口の横に決まっているので、これはサイトの決まりに Unity が合っていない作りの誤りとして直す。そのうえで、案B(受け渡し口は1台ずつ・同じ卓は1台)の効き目を、種10個の中央値で測る。
**エイイチは寝ている。人に聞かないと進めない所に当たったら、その作業は止めて報告に書き、ほかの作業は続ける。**
台帳の退避は Claude が済ませた:`/Volumes/KIOXIA/r2r2r-data/service_sim/unity/archive/unity_ledger_v1_pre_standby_20261027/unity_ledger_v1.csv`(368行・md5 f15eb7e9f26c110388003506683978f0)
## 始める前に確かめること(違えば回さずに報告して終わる)
1. Unity エディタが起動していない(起動していたら閉じずに報告して終わる)
2. /Volumes/KIOXIA がマウントされている。鍵ファイル unity_ledger_v1.lock がない
3. 台帳の md5 が上の退避と同じ
4. ServiceSim の保留が 0(cs:32 head)
## やること
1. **待機場所へ戻る**を切り替えで入れる(`-ssStandbyReturn on|off`・make_queue / night_runner の `--standby-return on|off`。**既定は切**=今までの動き。入の回は出力フォルダ名の末尾に `_sbret`。run_info.json に書く。台帳の列は増やさない)
- 入のとき:往復を終えたロボットは、受け渡し口の点で止まらず、自分の待機場所(params ではなく店の形の RobotStandby。1台に1つ)へ下がって待つ。次の料理を積むときは待機場所から受け渡し口の前へ出る
- 待機場所への道が引けないときは、今までどおり受け渡し口の点で待つ(その回数を数えて summary.json に残す)
- 案Bの「受け渡し口は1台ずつ」は、待機場所で止まっている台を数えない(cs:32 の直しと同じ考え)
- キッチンのモニターに「待機場所へ戻る」が分かる表示を足す
2. 判定(judge_night.py)がラベルの頭が同じ別の回を拾う件(例:p2ruleB の判定に p2ruleB_off が入る)を直す。ラベルまで完全に一致する回だけを拾う。判定の決まりそのものは変えない
3. 切のまま(待機場所へ戻る 切・案B 切)で ④ × 2台 × 種0 を1回回し、cs:31 の p2ruleB_off と同じ動きかを見る(ラベル `sbcheck_off`)。同じでなくても止めずに続け、違いを報告に書く
4. check-in して、画面なしの実行ファイルを作り直す(保留 0)。3 は保留ありの実行ファイルで回さない(台帳の unity_cs と中身をそろえるため、先に check-in してよい)
5. 夜の名前 20261031 で、④(fam_p2)を次の 70 回回す。すれ違い入。同時に回す本数は 4 のまま。記録は night/20261031_p2/ に分ける
- A:待機場所へ戻る 切・案B 切 … ロボット 0・1・2台 × 種0〜9(30回)
- B:待機場所へ戻る 入・案B 切 … ロボット 1・2台 × 種0〜9(20回)
- C:待機場所へ戻る 入・案B 入 … ロボット 1・2台 × 種0〜9(20回)
(0台はロボットがいないので A だけ)
6. 回ごとの揺れの確かめ:④ × 2台 × 種0、A の作りで、同時1本で3回・同時4本で3回(ラベル `repeat1`・`repeat4`、記録は night/20261031_repeat/)。同じ版・同じ種で数字がどれだけずれるか、同時に回す本数で変わるかを見る
7. 回したあと:台帳の行数(368 → 368+1+70+6=445 のはず)と、先頭368行の md5 が退避と同じかを確かめる
8. 作業フォルダに queue の一時ファイルを残さない
## 変えないもの
- 店の形・人の動き・速さ・物理の設定・すれ違いの作り・案Bの決まりの中身(cs:32 のまま)
- 何も指定しないときの make_queue(③⑦の60回・すれ違い入・待機場所へ戻る 切・案B 切)
- 台帳の列(59列)と今までの行。③⑦の基準データ v4、④の夜 20261030_p2 の記録
## 報告
依頼箱の結果に加えて、claude_code_reports に 20261031_night_p2_standby.txt として書く(場所:~/Library/Mobile Documents/com~apple~CloudDocs/デスクトップ/ADAPT DESIGN/じぶんの/PixelstoMotors/デジタルツイン学習R2R2R/サービスロボット導入シミュレーション/unity/claude_code_reports/)。
- 始める前の確かめ4つの結果
- 入れた cs 番号・build_id と保留の有無・変えたファイル・待機場所へ戻る作りで決めたところ
- 3 の切の1回と cs:31 の p2ruleB_off の比べ
- 5 の A・B・C × 台数ごとの種10個の中央値(最小〜最大):入店待ち・そのうち席は空いているのに待った時間・料理の待ち・会計待ち・入れた組の数・ロボットが運んだ皿の割合・往復の数・30秒以上の止まり(1往復あたり)・動けなくなった(60秒)・瞬間移動・打ち切り・卓を空けた・冷めた皿の割合。試算の値(params の site_result)も並べる
- 2台の30秒以上の止まりを、A・B・C ごとに理由ごと・場所ごと(前回と同じ分け方)に種10個の合計で
- 案Bで待った回数と秒数・待機場所へ戻れなかった回数(B・C)
- 6 の揺れ:6回それぞれの往復の数・30秒以上の止まり・入店待ち、同時1本と4本の違い
- 台帳の行数と先頭368行の md5
- 全員が帰らなかった回・失敗した回があればその名前(原因の調べはしない)
- 決めてほしいこと(なければ「なし」)
報告:20261031_night_p2_standby.txt
====================================================================
待機場所へ戻るを切り替えで入れ、④で3つの作り(A・B・C)を種10個ずつ比べた
依頼:20261027_13_待機場所へ戻る_と④の比べ.md
2026-10-27 23:07 check-in:cs:33/build_id cs33_20261027_2307(保留 0)
夜:20261031(2026-10-27 23:11〜10-28 00:30)・揺れの確かめ 00:30〜00:43
====================================================================
待機場所へ戻ると、受け渡し口の前の止まりは半分以下になった
待機場所へ下げる処理はもともとありましたが、止まっている間のロボットは動かさない作りだったので、効いていませんでした。往復を終えたコマのうち、自分の待機場所にいた割合は、直す前1%、直したあと97%です。
④・ロボット2台(種10個の中央値。止まりの数は10回の合計):
| A 今まで | B 待機場所へ戻る | C 戻る+案B | 試算 | |
|---|---|---|---|---|
30秒以上の止まり(1往復あたり) | 1.092 | 0.806 | 1.427 | ― |
受け渡し口の前の「もう1台のロボット」 | 278 | 110 | 444 | ― |
| 往復の数 | 92 | 94 | 62 | ― |
| 入店待ち | 24.74分 | 24.79分 | 21.35分 | 3.46分 |
| ロボットが運んだ皿 | 0.862 | 0.877 | 0.660 | 1.000 |
- ねらい:往復を終えたロボットを、店の形で決めた待機場所へ下げ、受け渡し口の前を空ける
- 変わったこと:④の2台で、受け渡し口の前のロボットどうしの止まりが278回→110回、30秒以上の止まりが1往復あたり1.092→0.806。入店待ちは24.74分→24.79分で変わらない
- 見込める効果:受け渡し口の前で2台がふさぎ合う形がなくなり、ロボットの往復が安定する。入店待ちのずれは、受け渡し口ではない所(スタッフの手)に残っている
案B(C)は、受け渡し口で待った時間が1回あたり約56分になり、往復が減りました。④の1つ目の待機場所は受け渡し口の点から約1.35mで、案Bの「受け渡し口の前(1.5m以内)」の中にあります。待機場所へ出入りするたびに、互いを「受け渡し口の前にいる」と数えて待っていたと見ています。
同じ種・同じ版・1本ずつでも、数字はそろわなかった
④・2台・種0を、同じ実行ファイルで6回回しました。
| 回 | 同時に回した本数 | 往復 | 30秒以上の止まり | 入店待ち |
|---|---|---|---|---|
| repeat1a | 1 | 81 | 96 | 18.51分 |
| repeat1b | 1 | 84 | 88 | 19.85分 |
| repeat1c | 1 | 77 | 95 | 18.41分 |
| repeat4a | 1→3 | 85 | 93 | 19.22分 |
| repeat4b | 2→3 | 75 | 117 | 21.39分 |
| repeat4c | 3 | 81 | 97 | 14.59分 |
ほかに何も走っていない状態で1本ずつ回しても、ずれます。比べるときは種10個の中央値で比べ、ずれの元は別に調べることにしました。他の人が同じ手順で同じ結果に届くかどうかに関わる所です。
依頼文:③⑦を待機場所へ戻る・案B入で回す(20261027_14・夜の作業)
---
作業フォルダ: /Users/shimazueiichi/Robotics_UX/ServiceSim
上限時間: 180
---
# 依頼:③⑦を「待機場所へ戻る 入・案B 入」で60回回す(夜の作業・2026-10-27)
エイイチの決定(2026-10-27 22:52):夜の間に作業を進める。ひとつ前の依頼(20261027_13_待機場所へ戻る_と④の比べ.md)で入れた2つの切り替えを、③⑦でも回しておく。基準データ v4(すれ違い入・両方 切)と比べ、v5 の候補にするかは朝にエイイチと Claude が決める。
**エイイチは寝ている。人に聞かないと進めない所に当たったら、回さずに報告に書いて終わる。**
## 始める前に確かめること(1つでも違えば回さずに報告して終わる)
1. ひとつ前の依頼 20261027_13 が「完了」で終わっている(依頼箱の 記録.log と 結果/)。報告 claude_code_reports/20261031_night_p2_standby.txt がある
2. 画面なしの実行ファイルが `-ssStandbyReturn` と `-ssRuleB` を受け付ける版で、build_info の保留なし。ServiceSim の保留が 0
3. Unity エディタが起動していない。/Volumes/KIOXIA がマウントされている。鍵ファイル unity_ledger_v1.lock がない
4. ひとつ前の依頼の 7(台帳の行数と md5)が合っていた
## 台帳の退避(回す前に自分で行う)
`/Volumes/KIOXIA/r2r2r-data/service_sim/unity/unity_ledger_v1.csv` を
`/Volumes/KIOXIA/r2r2r-data/service_sim/unity/archive/unity_ledger_v1_prenight_20261101/unity_ledger_v1.csv` にコピーする(コピーだけ。移動・上書きしない。フォルダが既にあれば止めて報告)。行数と md5 を控え、元と同じかを確かめる。
## 回す
夜の名前 20261101。③(fam_p1)・⑦(fam_p5)× ロボット 0・1・2台 × 種0〜9 = 60回。すれ違い入・待機場所へ戻る 入・案B 入。同時に回す本数は 4。記録は night/20261101/。
- 0台はロボットがいないが、条件をそろえるため同じ指定で回してよい(出力フォルダ名に付く字は作りのとおりでよい)
- 判定(judge_night.py)は基準データ v4(20261029_night_cs26_*)と比べる今の既定のまま。切り替えの違いで「Unity の作り」「試算を見直す候補」に振り分けられても、そのまま報告する
- 回している間はほかの作業をしない。Ctrl+C で止めない。途中で止まっても回し直さない
- 作業フォルダに queue の一時ファイルを残さない
## 報告
依頼箱の結果に加えて、claude_code_reports に 20261101_night_37_standby_ruleB.txt として書く(場所:~/Library/Mobile Documents/com~apple~CloudDocs/デスクトップ/ADAPT DESIGN/じぶんの/PixelstoMotors/デジタルツイン学習R2R2R/サービスロボット導入シミュレーション/unity/claude_code_reports/)。
- 始める前の確かめ4つと、台帳の退避(行数・md5)
- runner_log のまとめ(completed・失敗・止まった回・最長の実時間)
- 台帳の行数(退避+60 になるはず)と、先頭の行の md5 が退避と同じか
- 店 × 台数ごとの種10個の中央値(最小〜最大)を、基準データ v4(20261029_night_cs26_*)と並べる:入店待ち・料理の待ち・ロボットが運んだ皿の割合・往復の数・30秒以上の止まり(1往復あたり)・動けなくなった(60秒)・瞬間移動・打ち切り・冷めた皿の割合
- 2台の30秒以上の止まりの、受け渡し口の前(③⑦それぞれの受け渡し口の点から 2.5 m 以内)での数を、v4 と並べる
- judge.md の振り分けの数
- 全員が帰らなかった回・失敗した回があればその名前(原因の調べはしない)
- 決めてほしいこと(なければ「なし」)
報告:20261101_night_37_standby_ruleB.txt
====================================================================
③⑦を「すれ違い入・待機場所へ戻る 入・案B 入」で60回回した(夜 20261101)
依頼:20261027_14_③⑦を待機場所へ戻る_案B入で回す.md
実行ファイル:build_id cs33_20261027_2307(ServiceSim/cs:33・保留なし)
回した時刻:2026-10-28 00:48〜01:47
====================================================================
結論③⑦でも、案Bを入れると2台の往復が減り(③は130回→85回)、ロボットが運ぶ皿も減りました(92%→56%)。判定では③⑦の2台の20回が「Unity の作り」に振り分けられました。案Bは切に戻し、作りは残して、待機場所との距離の決め方を考え直すまで使わないことにしました。
作業ログ ― 待機場所へ戻るを標準にし、③⑦を回し直した
サイトの params:待機場所へ戻るを入、案Bを切にした
それでいいですので進めてください。
params の unity_rules に standby_return(入)を足し、案Bの2つを切にしました(schema 0.4、p2m-site commit eb03d73)。試算の数字は変えていません。あわせて、判定のスクリプトが、すれ違い・待機場所へ戻る・案Bの入切を条件の一部として扱い、同じ入切の回とだけ比べるようにしました。今までは入切の違う回を混ぜて比べていました。
依頼文:待機場所へ戻るを標準に、③⑦を v5 候補で回す(20261028_15)
---
作業フォルダ: /Users/shimazueiichi/Robotics_UX/ServiceSim
上限時間: 240
---
# 依頼:待機場所へ戻るを標準にし、判定を切り替えごとに分け、③⑦を60回回す(基準データ v5 の候補・2026-10-28)
エイイチの決定(2026-10-28 06:33):前の2つの報告(20261031_night_p2_standby.txt・20261101_night_37_standby_ruleB.txt)を受けて
1. 待機場所へ戻るを標準(既定 入)にする
2. 案B(受け渡し口は1台ずつ・同じ卓は1台)は切のまま。作りは消さない
3. 判定(judge_night.py)を、切り替え(すれ違い・待機場所へ戻る・案B)の入切ごとに分けて比べる形にする
4. ③⑦を「すれ違い入・待機場所へ戻る 入・案B 切」で60回回し、基準データ v5 の候補にする(v5 にするかはエイイチが決める)
サイト(正)を直した(p2m-site commit eb03d73):params の schema 0.4。`unity_rules` に `standby_return`(true)を足し、`pass_one_robot`・`same_table_one_robot` を false にした。試算の数字・条件・店の形の版(39257d16b68a)は変わっていない。
台帳の退避は Claude が済ませた:`/Volumes/KIOXIA/r2r2r-data/service_sim/unity/archive/unity_ledger_v1_prenight_20261102/unity_ledger_v1.csv`(505行・md5 c7031e3824b9aa6b137668d44e87db64)
## 始める前に確かめること(違えば回さずに報告して終わる)
1. Unity エディタが起動していない
2. /Volumes/KIOXIA がマウントされている。鍵ファイル unity_ledger_v1.lock がない
3. 台帳の md5 が上の退避と同じ
4. ServiceSim の保留が 0(cs:33 head)
5. https://pixelstomotors.com/sim/serving-robot-params.json の meta.schema_version が serving-robot-params/0.4(まだ 0.3 なら数分おきに取り直す。30分たっても 0.3 なら報告して終わる)
## やること
1. 公開版の params をプロジェクトに写す。`unity_rules` 以外が今の写しと同じか確かめる
2. 待機場所へ戻る・案Bの既定を、params の `unity_rules` の値から決める形にする(standby_return 入・案B 切)。`-ssStandbyReturn`・`-ssRuleB`・make_queue / night_runner の `--standby-return`・`--rule-b` で、回ごとに入切を上書きできるのは今のまま。エディタのメニュー(Site Run など)も同じ既定にする
- 出力フォルダ名の字:今は入のとき `_sbret` が付く。既定が入になっても、入のときは今までどおり `_sbret` を付ける(名前から作りが分かるように)
3. judge_night.py:回ごとの run_info.json(または queue)にある切り替え(すれ違い・待機場所へ戻る・案B)の入切を条件の一部として扱い、基準データの中で**同じ条件・同じ入切の回とだけ**比べる。同じ入切の回が基準に無ければ「基準なし」。判定の決まり(何を超えたら何に振り分けるか)は変えない。基準データの既定(v4・20261029_night_cs26_*)も変えない
- 確かめ:夜 20261101(待機場所 入・案B 入)を判定し直すと、v4 と入切が違うので60回とも「基準なし」になること。夜 20261029(v4)を自分自身に当てると今までどおり「正常」60になること(/tmp に出す。night/ の記録は上書きしない)
4. 何も指定しないときの make_queue が、③⑦の60回・すれ違い入・待機場所へ戻る 入・案B 切になることを確かめる
5. check-in して、画面なしの実行ファイルを作り直す(保留 0)
6. 夜の名前 20261102 で、何も指定しない make_queue の60回を回す(同時4本・記録は night/20261102/)。回している間はほかの作業をしない
7. 台帳の行数(505 → 565 のはず)と先頭505行の md5 が退避と同じかを確かめる
8. 作業フォルダに queue の一時ファイルを残さない
## 変えないもの
- 店の形・人の動き・速さ・物理の設定・すれ違いの作り・待機場所へ戻る作りの中身(cs:33)・案Bの作り
- 台帳の列(59列)と今までの行。今までの night/ の記録
## 報告
依頼箱の結果に加えて、claude_code_reports に 20261102_night_37_v5candidate.txt として書く(場所:~/Library/Mobile Documents/com~apple~CloudDocs/デスクトップ/ADAPT DESIGN/じぶんの/PixelstoMotors/デジタルツイン学習R2R2R/サービスロボット導入シミュレーション/unity/claude_code_reports/)。
- 始める前の確かめ5つの結果
- 入れた cs 番号・build_id と保留の有無・変えたファイル
- 判定の直しと、3 の確かめ2つの結果
- runner_log のまとめ・台帳の行数と md5
- 店 × 台数ごとの種10個の中央値(最小〜最大)を、v4(20261029・待機場所 切)と、夜 20261101(待機場所 入・案B 入)と並べる:入店待ち・料理の待ち・ロボットが運んだ皿の割合・往復の数・30秒以上の止まり(1往復あたり)・動けなくなった(60秒)・瞬間移動・打ち切り・冷めた皿の割合。試算の値も並べる
- 2台の30秒以上の止まりの、受け渡し口の点から 2.5 m 以内の数(待機場所での止まりを除いた数も)を、v4・20261101 と並べる
- ロボットを1台増やしたときの向き(入店待ち・料理の待ち)が、種の過半数で試算と同じか逆か
- 全員が帰らなかった回・失敗した回があればその名前
- 決めてほしいこと(なければ「なし」)
報告:20261102_night_37_v5candidate.txt
====================================================================
待機場所へ戻るを標準にし、判定を入切ごとに分け、③⑦を60回回した(夜 20261102・基準データ v5 の候補)
依頼:20261028_15_待機場所へ戻るを標準に_③⑦をv5候補で回す.md
実行ファイル:build_id cs34_20261028_0642(ServiceSim/cs:34・保留なし)
回した時刻:2026-10-28 06:42〜07:43
====================================================================
結論③⑦の2台は、v4 より止まりが減り、向きが試算とそろった
③・2台(種10個の中央値):
| v4(今まで) | 案B入 | 今回(待機場所へ戻る) | 試算 | |
|---|---|---|---|---|
| 入店待ち | 4.17分 | 4.13分 | 3.99分 | 1.18分 |
30秒以上の止まり(1往復あたり) | 0.255 | 0.470 | 0.173 | ― |
受け渡し口のまわりの止まり(10回の合計) | 156 | 431 | 86 | ― |
| ロボットが運んだ皿 | 0.920 | 0.560 | 0.832 | 0.991 |
⑦の2台も同じ傾向で、受け渡し口のまわりの止まりは133回→76回でした。0台と1台は v4 とほぼ同じです。v4 では、③でロボットを1台から2台にしたとき、入店待ちが種10個中6個で試算と逆の向き(延びる)でした。今回は逆が1個だけで、残りは試算と同じ向きか、変わらないでした。
- ねらい:待機場所へ戻る作りを、③⑦にも当てる
- 変わったこと:③の2台で、30秒以上の止まりが1往復あたり0.255→0.173、受け渡し口のまわりの止まりが156回→86回。1台→2台で入店待ちが試算と逆になる種が6個→1個
- 見込める効果:③⑦の基準データを v5 に替えれば、これからの店の回は「待機場所へ戻る」作りどうしで比べられる
作業ログ ― ④はここで区切り、⑤⑥へ進む
④のずれは、直し続けず、調べる対象として残す
まず全体の流れを確認させてください。 今は全体のどのパートをおこなっていますか?
最初に決めた流れは、④の条件をサイトに書き出す → 3Dの店に④を建てて1回ずつ回し、画面で確かめる → ④の夜を回し、問題なければ⑤⑥、そのあと②、でした。今は3つ目の途中で、④の夜で見つかった詰まりを直していました。直しを続けると、⑤⑥②へ進めないまま延々と続くおそれがあります。前に「ずれは直し続けず、調べる対象にする」「ゴールを決めずに作業が続くのは避けたい」と決めていたので、④はここで区切りました。
ここで区切って記事化進めてください。
区切った時点で決まっていること:
| 項目 | 状態 |
|---|---|
| 3Dの店の標準 | すれ違い入・待機場所へ戻る 入・案B 切(ServiceSim cs:34) |
| ③⑦の基準データ | v4(20261029)のまま。今回の夜(20261102)が v5 の候補 |
| ④の店の形 | 左の2人席を上へ1.0m・ドリンクバーは下の壁ぎわ(店の形の版 39257d16b68a) |
| ④の基準 | 20261031 の B(待機場所へ戻る 入・案B 切)の30回にあたる作り |
| 残るずれ | ④でロボットを足すほど入店待ちが延びる(2台で24.8分、試算3.5分)。待ちのほとんどは「席は空いているのに待った」時間 |
| 揺れ | 同じ種・同じ版でも回ごとにずれる。比べるのは種10個の中央値 |
次は、⑤⑥の店を3Dの店に建てて回します。その間に、④の夜の記録を読み、2台のときにスタッフの時間が何に取られているか(ロボットをよけた時間・案内・片付け・下の列での止まり)を分けて数えます。