サービスロボット導入シミュレーション Log#34 | 配膳ロボットの下げ膳、効くかは店の通路しだい

この記事の素材(コード・ログ・データ 6ファイル・まとめてダウンロードあり)
AIで読む ChatGPT・Claude などで、この記事に質問できます

Unity で再現したファミレス6店で、配膳ロボット2台に下げ膳(食べ終えた皿を洗い場へ運ぶ仕事)も任せると、通路にゆとりのある3店(②⑤⑥)では入店待ちと卓が空くまでの時間が縮み、通路を詰めた効率重視の3店(③④⑦)では延びた。 スタッフ1人が歩く距離は6店とも減っています。どれも同じお客さんの来かたで1回ずつ動かしたシミュレーションの結果で、実物の店で測った数字ではありません。

この回で、次のことができるようになりました。

  • サイトの試算のページ(/series8)で、図面のあるファミレス6店のどれを選んでも、配膳だけの店と下げ膳にも使う店を左右に並べた動画が見られる。前は③の1店だけでした
  • 動画の横のパネルに、スタッフとロボットがいま何をしているかが出るので、どこで手が止まり、どこで皿が溜まるかを、数字の表を読まずに目で追える
  • 配膳ロボットの LP(スタッフを1人減らせるか)の動画も、今のシミュレーションの版で撮り直した。4つの視点で店を見る動画にもパネルが付き、PC では幅いっぱいで字が読める
  • 大型店⑧⑨でも同じ比べ方ができるように、Unity が読む条件の表に⑧⑨の下げ膳を足し、夜の間に回す依頼を出した

困っていたのは、比較動画が③の1本しかなかったことです。前の回(LOG440)で、120回を回した数字では、下げ膳も任せるとスタッフの歩く距離はどの店でも減るのに、細い通路の店では卓が空くのが遅れることが分かっていました。ただ、それがどの店でどう見えるのかは、③の動画1本では確かめられません。店によって向きが逆になるなら、店の人に見せる動画も店ごとに要ります。

やったことなぜ結果
残り5店で、配膳だけと配膳+下げ膳を同じお客さんの来かたで撮った(依頼92・93)
比較動画が③にしかなかったため
10本とも最後まで回った。②は1回目が撮影の時間の上限に当たり、上限を延ばして撮り直した
6店分の比較動画を作り、/series8 に載せた
店ごとに向きが違うかを目で確かめるため
通路にゆとりのある②⑤⑥は良くなり、効率重視の③④⑦は悪くなった
LP の Unity の動画を、今の版で撮り直した(依頼93)
パネルのない古い版の動画が残っていたため
4視点はパネル付き・幅いっぱいに。丸テーブルの直す前と直した後は、今の版では直す前でも止まらなかったので前の録画を残した
大型店⑧⑨の下げ膳の条件を足し、⑧⑨を回す依頼を出した(依頼94)
図面のある8店すべてで比べられるようにするため
夜の間に、配膳だけ60回・下げ膳40回と、比較動画の素材を撮る

配膳ロボットを自分の店に入れたらどうなるかは、このシリーズの試算をもとにした別のページで試せます。

店の立体図(席・キッチン・配膳ロボットの通り道)導入前シミュレーション配膳ロボットを、導入前に自分の店舗でシミュレーション店舗の図面と人数から、何人で回るか・どこで止まるか・月いくらかかるかを出します

作業ログ ― 依頼92:残り5店で、配膳だけと配膳+下げ膳を同じ種で撮った

この記事のコード・ログ・データは、1ファイルずつ下に置いています。全文はリンク先にあります。

ファイルの一覧(6本)

01_sec01.txt ― 依頼92 の報告(claude_code_reports/20261105_rec92.txt)・6,486字

02_sec02.txt ― series8 の差分(④⑤⑥⑦。commit 0db70df)・4,334字

03_sec03.txt ― 依頼93 の依頼文・3,120字

04_sec03.txt ― 依頼93 の報告(claude_code_reports/20261105_rec93.txt)・11,865字

05_sec03.txt ― LP の差分(commit e629556 のうち serving-robot-one-less-staff.astro)・5,428字

06_sec04.txt ― 条件の表と書き出しのコードの差分(commit 34af4fb)・6,161字

この回の作業は、すべて Unity で再現した店の中のシミュレーションです。Unity はゲームや3Dの映像を作る道具で、ここではファミレスの店内を3Dで建て、スタッフ・お客さん・配膳ロボットを動かして、何分待ったか、どこで止まったかを数えています。実際の店の作業はサイトの試算(SimPy という Python の道具で書いた計算)が正で、Unity はその店の形と条件を読んで動きます。

種:同じお客さんの来かたを2回作るための番号

言葉この記事での意味
種
乱数の出発点の番号。同じ種なら、同じ時刻に同じ人数のお客さんが来て、同じ料理を頼む
serve(配膳だけ)
ロボットは料理を卓へ運ぶだけ。食べ終えた皿はスタッフが洗い場へ運ぶ
bus(配膳+下げ膳)
ロボットは料理を運ぶほか、片付けのスタッフと一緒に卓へ行き、皿を載せて洗い場へ運ぶ
パネル
録画の右に付けた表示。スタッフ一人ひとりの今の仕事(案内・料理・会計・片付けなど)、ロボットの状態、入口で待つ組の数が出る

配膳だけと配膳+下げ膳を比べるときは、同じ種で2回動かします。お客さんの来かたがそろうので、違いはロボットの使い方だけになります。種は、サイトの各店の動画に使ったものと同じにしました(⑦は7、④⑤⑥は1、②は8)。

依頼文は、作業を自動で Claude Code に渡す「依頼箱」に入れました。全文です。

依頼92 の依頼文

---
作業フォルダ: /Users/shimazueiichi/Robotics_UX/ServiceSim
上限時間: 600
---
# 依頼92:残り5店(②④⑤⑥⑦)で、配膳だけと配膳+下げ膳を同じ種で撮り、パネル付きの動画にする

エイイチと決めたこと(2026-11-05):サイトの比較動画(配膳だけと配膳+下げ膳を左右に並べたもの)が③の1本しかない。先に残り5店の比較動画をそろえる。そのあと LP の Unity の動画5本をパネル付きに撮り直し(依頼93)、その次に大型店⑧⑨を足す(依頼94)。
Unity の作りは cs:78 のまま。動き・決まりには触れない。今回は撮って動画にするだけ。2本を並べた比較動画は Claude が作る。
**エイイチは見ていないことがある。人に聞かないと進めない所に当たったら、その店は止めて報告に書き、ほかの店は続ける。時刻で止めず、並べた店が全部終わるまで続ける。**

## 始める前に確かめること(違えば回さずに報告して終わる)
1. 作業場所が cs:78、Builds/headless と録画用 Builds/rec20_bus91 が cs:78。保留 0
2. Unity エディタ・night_runner/rec_runner が動いていない。KIOXIA がマウントされ、unity_ledger_v1.lock がない。台帳を archive/unity_ledger_v1_pre_rec92_20261105/ に退避(行数と md5 を報告に)
3. python3・numpy・Pillow・ffmpeg(依頼87 と同じ。miniforge の ros_env の ffmpeg を PATH に足してよい)

## 撮る回
依頼91 で③を撮ったのと同じ撮り方(依頼90 の報告 6 章の録画の手順。カメラ・置き方は依頼87 と同じ:wide_l30・wide_r30・3840×2160・0.5秒ごと・30コマ/秒・回の最初から全員が帰るまで・カメラの行列と frames.csv・timeline.csv も書き出す)。
種は依頼87 でサイトの動画に使ったのと同じ。serve と bus は同じ種で撮る(お客さんの来かたをそろえるため)。

| 順 | 店 | 種 | serve の条件 | bus の条件 |
|---|---|---|---|---|
| 1 | ⑦ fam_p5 | 7 | 5 | 123 |
| 2 | ④ fam_p2 | 1 | 8 | 125 |
| 3 | ⑤ fam_p3 | 1 | 11 | 127 |
| 4 | ⑥ fam_p4 | 1 | 14 | 129 |
| 5 | ② fam_p0 | 8 | 17 | 131 |

- どれもロボット2台・混み具合は普通・真ん中の人数・1往復3卓・レジ1つ・今の標準(すれ違い入・待機場所へ戻る入・案B 切・助け入)・道の線なし
- 1回の実時間の上限:80 分。同時に2本。止まっても回し直さない(止まった回は報告に書き、その店の動画は作らない)
- 置き場所:`/Volumes/KIOXIA/r2r2r-data/service_sim/unity/rec_compare_20261105/{店}/{serve|bus}/`(③の rec_compare_20261104 と同じ形。前の分は消さない・上書きしない)
- 台帳は追記だけ

## 動画にする(撮れた回ごと)
- make_panel_video.py(status_videos/tools。依頼91 で「下げ膳」をロボットの欄に出すようにした版)で、wide_l30 の録画から通しのパネル付き動画を作る。依頼91 の whole と同じ作り方(開店から全員が帰るまで、60〜90秒に収まる速さ)。出力 `{店}/{serve|bus}/panel/whole_wide_l30_panel.mp4`
- 同じ店の serve と bus は同じ速さ(--speed)にそろえる(Claude が左右に並べて同期させるため)。そろえた速さを報告に書く
- 題は「⑦ ロボット2台・配膳だけ」「⑦ ロボット2台・配膳+下げ膳」の形(店の番号・台数・使い方)。依頼91 では題がパネルで切れたので、切れないことを1コマ見て確かめる。それでも切れるなら題の字を小さくせず、題を短くして報告に書く(パネルの形・色・大きさは変えない)
- 出来た動画は 1920x1080・30fps であること(スクリプトが確かめる)
- 動画ごとに、真ん中あたりの1コマを `whole_wide_l30_panel_mid.png` として同じ所に置く

## 止める線
瞬間移動が1回でも出たとき、または serve の回が base73(cs:76)の同じ店・同じ種の回と記録が違ったとき(依頼91 の確かめと同じ比べ方。録画している回は 860 秒ごろから分かれることがあるので、録画しない同じ回を1本回して比べる)。そのときはその店を止めて報告し、ほかの店は続ける。
全員が帰らない回・詰まりが残る回が出ても止めずに動画にし、報告に書く。

## 報告
claude_code_reports/20261105_rec92.txt に:
- 店ごと・serve と bus ごと:最後まで回ったか・全員帰ったか・実時間・瞬間移動の回数・上限で戻った回数(bus)・入店待ち・料理の待ち・卓が使えるまで(turn)・スタッフ1人の歩いた距離・ロボットが下げ膳を運んだ割合・できた動画の名前と長さと速さ
- serve の確かめ(base73 との比べ)の結果
- 題が切れたかどうか、短くしたならその題
- 台帳の行数の変化と md5
**報告の最後の1行は必ず次のどれか**:「判定:合格」/「判定:止めた(決めてほしいことあり)」/「判定:失敗」

依頼92 の報告(claude_code_reports/20261105_rec92.txt)

01_sec01.txt6,486字・100行・text
====================================================================
依頼92:残り5店(⑦④⑤⑥②)の配膳だけ(serve)と配膳+下げ膳(bus)を同じ種で撮り、パネル付きの動画にする
2026-11-05 08:05〜14:40 作業場所 cs:78(Unity の作りは変えていない)
====================================================================

結論
  ・⑦④⑤⑥ の4店は serve・bus とも最後まで回り、全員帰った。瞬間移動 0。パネル付きの動画 8 本を作った(どれも 1920x1080・30fps・題は切れていない)
  ・② は serve・bus とも 1回の実時間の上限 80 分に当たって止まった(店の時刻 serve 8658 秒・bus 9152 秒。瞬間移動 0)。
別のタブで開く保存

②の2本は、撮影1本の上限にした80分に当たって途中で止まりました。前の日には同じ②が43分で撮れています。報告では、この日はマシン全体が1.4倍ほど遅く、②を撮っていた間はほかの処理が CPU を多く使っていた、と見立てています。店や作りの問題ではないので、上限を120分に延ばして撮り直すことにしました。

  • ねらい:撮影の上限を、店の重さではなくマシンの混み具合で止まらない長さにする
  • 変わったこと:1本の上限を80分から120分に延ばした(同時に撮る本数は2本のまま)
  • 見込める効果:依頼93 の②の2本は76分ずつで、上限に当たらずに撮れた。これからの大型店の撮影も同じ上限で回す

作業ログ ― 6店の比較動画:配膳だけと配膳+下げ膳を左右に並べた

撮ったパネル付きの動画2本を、同じ店の時刻で左右に並べ、下に4つの数字を付けました。作り方は、前の回で③の比較動画を作ったスクリプトを、店ごとに回せるようにしたものです。数字の色は、良くなった方を緑、悪くなった方を赤にしています。

make_compare92.py(店ごとに比較動画を作る)

"""配膳だけと配膳+下げ膳のパネル付き通し動画を左右に並べ、下に数字の帯を付ける(依頼92の4店・2026-11-05・Claude。③の make_compare.py を店ごとに回せるようにした版)
使い方: python3 make_compare92.py <rec_compare_20261105 の場所> <出力先> <店> <題> <種>"""
import json, subprocess, sys
from PIL import Image, ImageDraw, ImageFont
R,OUT,ST,LABEL,SEED=sys.argv[1:6]
W,H=1920,1080; BG="#faf9f5"; INK="#1d1d1b"; Q="#6b6a64"; GOOD="#1d9e75"; BAD="#d85a30"; LINE="#d9d6cc"
F=lambda s,b=False: ImageFont.truetype("/usr/share/fonts/opentype/noto/NotoSansCJK-%s.ttc"%("Bold" if b else "Regular"),s,index=0)
S={m:json.load(open(f"{R}/{ST}/{m}/summary.json"))["site_metrics"] for m in ("serve","bus")}
im=Image.new("RGB",(W,H),BG); d=ImageDraw.Draw(im)
d.text((40,22),f"{LABEL}・ロボット2台 配膳だけ と 配膳+下げ膳",font=F(40,True),fill=INK)
d.text((W-40,34),f"同じお客さんの来かた(種{SEED})・同じ速さ",font=F(24),fill=Q,anchor="ra")
VW,VH,Y0=936,527,150
for i,lab in enumerate(("配膳だけ","配膳+下げ膳")):
    d.text((16+i*(VW+16),104),lab,font=F(32,True),fill=INK)
rows=[("スタッフ1人が歩いた距離","walk_km_per_staff","km",2,True),("お客さんが帰ってから卓が使えるまで","turn_mean","分",1,True),
      ("入店待ち(来てから席に着くまで)","entry_wait_mean","分",1,True),("ロボットが止まってスタッフが助けた回数","rescues","回",0,True)]
y=Y0+VH+30; d.line((40,y-12,W-40,y-12),fill=LINE,width=2)
for name,k,u,dp,low in rows:
    a,b=S["serve"][k],S["bus"][k]; fa=("%%.%df"%dp)%a; fb=("%%.%df"%dp)%b
    same=fa==fb; good=(b<a)==low
    col=Q if same else (GOOD if good else BAD)
    d.text((40,y+6),name,font=F(30),fill=INK)
    d.text((1040,y),fa+" "+u,font=F(40,True),fill=Q,anchor="ra")
    d.text((1100,y+4),"→",font=F(34),fill=Q)
    d.text((1420,y),fb+" "+u,font=F(40,True),fill=col,anchor="ra")
    d.text((1460,y+8),"変わらない" if same else ("減った" if b<a else "増えた"),font=F(28,True),fill=col)
    y+=78
d.text((40,H-44),"Unity の中で1回動かした結果です。実際のロボットや人が同じ動きをするとは限りません。",font=F(22),fill=Q)
bg=f"{OUT}/bg_{ST}.png"; im.save(bg)
dur=lambda f: float(subprocess.run(["ffprobe","-v","error","-show_entries","format=duration","-of","csv=p=0",f],capture_output=True,text=True).stdout)
sv,bv=f"{R}/{ST}/serve/panel/whole_wide_l30_panel.mp4",f"{R}/{ST}/bus/panel/whole_wide_l30_panel.mp4"
T=max(dur(sv),dur(bv))+2
vf=("[1:v]scale=%d:%d,tpad=stop_mode=clone:stop_duration=30[a];[2:v]scale=%d:%d,tpad=stop_mode=clone:stop_duration=30[b];"
    "[0:v][a]overlay=16:%d[t];[t][b]overlay=%d:%d,format=yuv420p"%(VW,VH,VW,VH,Y0,16+VW+16,Y0))
mp4=f"{OUT}/series8_compare_serve_bus_{ST.replace('fam_','')}_v1.mp4"
subprocess.run(["ffmpeg","-y","-v","error","-loop","1","-i",bg,"-i",sv,"-i",bv,"-filter_complex",vf,"-t","%.2f"%T,"-r","30",
  "-c:v","libx264","-preset","veryfast","-crf","22","-movflags","+faststart",mp4],check=True)
subprocess.run(["ffmpeg","-y","-v","error","-ss","40","-i",mp4,"-frames:v","1",mp4.replace(".mp4","_mid.png")],check=True)
subprocess.run(["ffmpeg","-y","-v","error","-i",mp4,"-frames:v","1","-q:v","4",mp4.replace(".mp4",".jpg")],check=True)
print(ST,"%.1f"%T,{k:(S['serve'][k],S['bus'][k]) for k in ('walk_km_per_staff','turn_mean','entry_wait_mean','rescues')})

make_compare92.py の出力(④⑤⑥⑦。②は依頼93 のあと)

fam_p2 81.3 {'walk_km_per_staff': (2.3968, 2.1948), 'turn_mean': (27.0317, 33.0558), 'entry_wait_mean': (17.4812, 25.841), 'rescues': (33, 87)}
fam_p4 76.5 {'walk_km_per_staff': (2.2855, 1.9912), 'turn_mean': (11.5906, 10.0405), 'entry_wait_mean': (3.1716, 2.8284), 'rescues': (7, 12)}
fam_p3 77.3 {'walk_km_per_staff': (2.906, 2.6422), 'turn_mean': (9.3662, 8.0019), 'entry_wait_mean': (5.6866, 4.8492), 'rescues': (30, 26)}
fam_p5 79.2 {'walk_km_per_staff': (2.6156, 2.4193), 'turn_mean': (3.7772, 4.97), 'entry_wait_mean': (3.6852, 4.6425), 'rescues': (22, 37)}
fam_p0 78.1 {'walk_km_per_staff': (1.5954, 1.1302), 'turn_mean': (2.5992, 2.4742), 'entry_wait_mean': (1.4566, 1.3974), 'rescues': (16, 20)}
④効率重視・小さめの店の比較動画の1コマ。左が配膳だけ、右が配膳+下げ膳。下の数字は、歩く距離が減り、卓が使えるまでと入店待ちが延び、助けた回数が33回から87回に増えたことを示す

④はスタッフ2人の小さな店です。下げ膳のロボットは卓に着いてから、片付けのスタッフが来るのを待ちます。スタッフが2人しかいないと、その迎えに行く手間が案内と片付けの手を取り、入口で待つ組が増えました。右のパネルでは、入口で待つ組が配膳だけの店より多く、片付けを待つ卓も18卓と多いままです。

⑤ゆったり・入口が正面の店の比較動画の1コマ。4つの数字がすべて減っている

⑤は通路にゆとりのある店で、4つの数字がすべて減りました。下げ膳のロボットが卓で待っていても、ほかの人やロボットは別の通路を回って行けます。

②定番の郊外型の比較動画の1コマ。歩く距離が1.60kmから1.13kmに減り、卓が使えるまでと入店待ちもわずかに減った

②は、昔働いていたファミレスを記憶から起こした店です。19卓と小さく、お客さんも少ないので、もともと待ちは短い店です。下げ膳を任せると、スタッフの歩く距離が3割ほど減りました。

6店を並べると、次のようになります。Unity の数字はどれも1回ずつの録画の値です。右の2列は、サイトの試算(同じ条件で40回の平均)で、配膳だけから配膳+下げ膳にしたときの向きです。

店歩く距離(km)卓が使えるまで(分)入店待ち(分)助けた回数試算の入店待ち試算の卓が使えるまで
② 定番の郊外型1.60 → 1.132.6 → 2.51.46 → 1.4016 → 201.30 → 2.12(延びる)2.80 → 2.66(縮む)
③ 効率重視・入口が角2.65 → 2.383.4 → 4.73.06 → 3.4420 → 411.13 → 2.22(延びる)2.14 → 2.00(縮む)
④ 効率重視・小さめの店2.40 → 2.1927.0 → 33.117.48 → 25.8433 → 875.57 → 3.86(縮む)9.88 → 8.57(縮む)
⑤ ゆったり・入口が正面2.91 → 2.649.4 → 8.05.69 → 4.8530 → 262.37 → 2.78(延びる)2.41 → 2.25(縮む)
⑥ ゆったり・入口が横2.29 → 1.9911.6 → 10.03.17 → 2.837 → 122.11 → 1.77(縮む)5.27 → 4.74(縮む)
⑦ ③の通路を95cmに2.62 → 2.423.8 → 5.03.69 → 4.6422 → 371.60 → 1.70(延びる)2.19 → 2.04(縮む)

歩く距離は、Unity でも試算でも6店すべてで減ります。ここは向きがそろっています。

卓が使えるまでの時間は、試算では6店すべてで縮むのに、Unity では③④⑦で延びました。試算には、下げ膳のロボットが卓でスタッフを待つあいだに通路をふさぐ、という動きが入っていません。前の回(LOG440)の120回でも同じずれが出ていて、この1回ずつの動画でも同じ向きに出ました。

入店待ちは、試算と Unity で向きが合う店と合わない店が入り混じっています。④は試算では縮むのに Unity では大きく延びました。1回ずつの録画なので、ここから店ごとの答えを言い切ることはできません。動画は、何が起きているかを目で見るためのもので、数字の正は試算と、Unity の120回の集計です。

/series8 の店の動画の設定に、比較動画を足しました。差分です。

series8 の差分(④⑤⑥⑦。commit 0db70df)

02_sec02.txt4,334字・39行・diff
commit 0db70dfb140750dde6b40fb4d278f6e4105e12d2
Author: Claude <noreply@anthropic.com>
Date:   Thu Nov 5 14:48:31 2026 +0900

    series8: ④⑤⑥⑦に配膳だけと配膳+下げ膳の比較動画を足す(依頼92)
    
    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01LevEXRjJt67bSDYZYEUWTQ
別のタブで開く保存

series8 の差分(②。commit e629556 のうち serving-robot.html)

commit e629556e8df31d92d112befe7ae746a60b24ba09
Author: Claude <noreply@anthropic.com>
Date:   Thu Nov 5 19:01:41 2026 +0900

    series8 に②の比較動画、LP の4視点をパネル付きに・最初の画面の2枚を今の版に差し替え(依頼93)
    
    丸テーブルの直す前・直した後は10月29日の版の録画のまま残し、その旨を書き添えた
    
    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01LevEXRjJt67bSDYZYEUWTQ

diff --git a/public/sim/serving-robot.html b/public/sim/serving-robot.html
index 18689bf..ca02d96 100644
--- a/public/sim/serving-robot.html
+++ b/public/sim/serving-robot.html
@@ -501,10 +501,11 @@ function bigPlanSvg(p) {
       }).join("")
     + `</svg>`;
 }
-// Unity で動かした様子(2026-11-03、11-04 にパネル付きの v2 へ。固めた版 cs:76 で撮り直し。11-05 に④⑤⑥⑦の配膳だけと配膳+下げ膳の比較動画を足した・依頼92・cs:78)。図面のある店ごとに、引き→問題の場所→寄りの動画を1本。
+// Unity で動かした様子(2026-11-03、11-04 にパネル付きの v2 へ。固めた版 cs:76 で撮り直し。11-05 に②④⑤⑥⑦の配膳だけと配膳+下げ膳の比較動画を足した・依頼92・93・cs:78)。図面のある店ごとに、引き→問題の場所→寄りの動画を1本。
 // 条件は Unity の録画の回のもの(試算で選んでいる人数・台数とは別)。動画と表紙の画像は R2(/media/)
 const UNITY = {
-  fam_p0: { video: "/media/series8_unity_fam_p0_v3.mp4", poster: "/media/series8_unity_fam_p0_v3.jpg", staff: 2, note: "引きで店全体を見たあと、ロボットが長く止まった場所に3か所寄ります。右のパネルに、スタッフとロボットがいま何をしているかが出ます(約55秒)" },
+  fam_p0: { compare: { video: "/media/series8_compare_serve_bus_p0_v1.mp4", poster: "/media/series8_compare_serve_bus_p0_v1.jpg", note: "同じお客さんの来かたで、ロボットを配膳だけに使った店(左)と下げ膳にも使った店(右)を同時に流します(約80秒)。この1回では、スタッフの歩く距離が3割ほど減り、卓が使えるまでの時間と入店待ちもわずかに減りました。ロボットを助けに行く回数は16回から20回に増えています" },
+    video: "/media/series8_unity_fam_p0_v3.mp4", poster: "/media/series8_unity_fam_p0_v3.jpg", staff: 2, note: "引きで店全体を見たあと、ロボットが長く止まった場所に3か所寄ります。右のパネルに、スタッフとロボットがいま何をしているかが出ます(約55秒)" },
   fam_p1: { compare: { video: "/media/series8_compare_serve_bus_p1_v1.mp4", poster: "/media/series8_compare_serve_bus_p1_v1.jpg", note: "同じお客さんの来かたで、ロボットを配膳だけに使った店(左)と下げ膳にも使った店(右)を同時に流します(約75秒)。この1回では、スタッフの歩く距離は減りましたが、卓が使えるまでの時間と入店待ちは延び、ロボットを助けに行く回数は増えました。下げ膳の台が卓でスタッフを待つあいだ、細い通路をふさぐことがあるためです" },
     video: "/media/series8_unity_fam_p1_v3.mp4", poster: "/media/series8_unity_fam_p1_v3.jpg", staff: 4, note: "引きで店全体を見たあと、ロボットが長く止まった場所に3か所寄ります。右のパネルに、スタッフとロボットがいま何をしているかが出ます(約70秒)" },
   fam_p2: { compare: { video: "/media/series8_compare_serve_bus_p2_v1.mp4", poster: "/media/series8_compare_serve_bus_p2_v1.jpg", note: "同じお客さんの来かたで、ロボットを配膳だけに使った店(左)と下げ膳にも使った店(右)を同時に流します(約80秒)。この1回では、スタッフの歩く距離は減りましたが、卓が使えるまでの時間と入店待ちは大きく延び、ロボットを助けに行く回数は33回から87回に増えました。スタッフ2人の小さめの店では、下げ膳の台を卓で迎えに行く手間が、案内や片付けの手を取ってしまうためです" },

作業ログ ― 依頼93:②の撮り直しと、LP の動画の素材を今の版で撮った

LP(配膳ロボットでスタッフを1人減らせるか)には、Unity の動画が5本ありました。最初の画面の4分割のうち2枚(3Dで建てる・走らせる)、4つの視点で店を見る動画、丸テーブルの直す前と直した後の2本です。どれもパネルのない、10月の版の録画でした。サイトに出す Unity の動画はパネル付きにそろえる、と決めていたので、撮り直すことにしました。

ただ、LP の動画はかなり小さく出ています。PC で幅533px、スマホでは177pxの枠もあります。横1920の動画を縮めると、パネルの字は6px前後になって読めません。そこで、出し方を分けました。

LP のどこ前後
最初の画面の2枚(3Dで建てる・走らせる)
10月の版のループ
今の版のループ(パネルなし)。押すと4視点のパネル付き動画へ移る
4つの視点で店を見る動画幅480px・パネルなし
パネル付き・PC では幅いっぱい(1040px)
丸テーブルの直す前・直した後10月29日の版の録画
そのまま残し、10月29日の版の録画だと書き添えた(下の節)

依頼93 の依頼文

03_sec03.txt3,120字・53行・text
---
作業フォルダ: /Users/shimazueiichi/Robotics_UX/ServiceSim
上限時間: 600
---
# 依頼93:② の配膳だけ・配膳+下げ膳を撮り直し、LP(配膳ロボットでスタッフを1人減らせるか)の Unity の動画5本の素材を撮る

エイイチと決めたこと(2026-11-05):
- 依頼92 で 80 分の上限に当たった ② の2本を撮り直す。撮影1本の上限はこれから 120 分(同時2本のまま)
別のタブで開く保存

依頼93 の報告(claude_code_reports/20261105_rec93.txt)

04_sec03.txt11,865字・189行・text
====================================================================
依頼93:② の配膳だけ・配膳+下げ膳を撮り直し、LP の Unity の動画5本の素材を撮る
2026-11-05 15:32〜18:40 作業場所 cs:78(Unity の作りは変えていない。check-in なし)
====================================================================

結論
  ・撮る5回(A 2回・B1 1回・B2 2回)は、どれも最後まで回り、全員帰った。瞬間移動 0・1コマの跳び 0。止める線には当たっていない
  ・A:② の2本は 75.9 分・75.8 分で終わった(上限 120 分)。パネル付きの動画2本(9 倍)を作った
別のタブで開く保存
4視点のパネル付き動画の最初のコマ。左に真上・斜め・正面・横の4つの映像を2×2に並べ、右にスタッフとロボットの状態のパネルを付けた

4つのカメラは、Unity の作りを変えずに、録画の実行ファイルに渡す引数だけで足せました。同じ種で前に2つのカメラで撮った回と、記録は1字も違いませんでした。カメラを増やしても、店の中で起きることは変わらないということです。正面と横は、前の LP の動画では真横からの絵でしたが、今の録画の道具では床の高さから撮ることになるので、45°の見下ろしにしました。

丸テーブルの間で、今の版のロボットは止まらなかった

丸テーブルの直す前と直した後は、②の店で、右の丸テーブルを1.0m右へずらす前と後を比べた動画です。10月29日の版では、直す前の店でロボット2台が丸テーブルの間で60秒以上動けなくなり、直した後は抜けていました(LOG404)。

今の版で同じ回を撮り直すと、直す前の店でも、丸テーブルの間でいちばん長く止まったのは3.6秒でした。30秒以上の止まりは0回です。そのあいだに、ロボットが自分で進めているかを見張る仕組み、すれ違い方、立ち往生のときの助け方などを直してきたので、前の詰まりが解けるようになったとみています。

LP の「直す前は止まる、直した後は抜ける」という見せ方は、今の版では作れません。3つの案を出しました。前の録画を残して版を書き添える、今の版の2本に差し替えて「止まらなくなった」と書き換える、今も止まりが残っている所で新しく作る、の3つです。

(おすすめ)前の録画を残す

前の録画を残し、「10月29日の版の録画で、パネルは付いていない。その後のロボットの動きの直しで、今の版では直す前の店でも長くは止まらなくなった」と書き添えました。撮り直した2本は KIOXIA に残してあります。

  • ねらい:LP の動画を、今のシミュレーションの版で撮ったものにそろえ、パネルの字が読める大きさで出す
  • 変わったこと:4視点はパネル付き・幅480pxから1040pxに。最初の画面の2枚は今の版のループに。丸テーブルの2本は前の版の録画だと明記した
  • 見込める効果:LP を見た人が、スタッフとロボットが何をしているかを動画の中で追える。これは見込み。LP の見られ方の変化は、サイトの計測(/api/ev)で確かめる
LP の最初の画面。右上の「同じ店舗を3Dで建てる」と左下の「スタッフとロボットを走らせる」を、今の版のループに差し替えた
LP の「どこで止まるか」の節。4視点のパネル付き動画を幅いっぱいで出し、右のパネルの字が読める

LP の差分(commit e629556 のうち serving-robot-one-less-staff.astro)

05_sec03.txt5,428字・73行・diff
commit e629556e8df31d92d112befe7ae746a60b24ba09
Author: Claude <noreply@anthropic.com>
Date:   Thu Nov 5 19:01:41 2026 +0900

    series8 に②の比較動画、LP の4視点をパネル付きに・最初の画面の2枚を今の版に差し替え(依頼93)
    
    丸テーブルの直す前・直した後は10月29日の版の録画のまま残し、その旨を書き添えた
    
別のタブで開く保存

作業ログ ― 依頼94:大型店⑧⑨にも下げ膳の条件を足し、夜に回す

図面のある店は、ファミレス6店のほかに大型店が2つ(⑧ 受け渡し口が奥の真ん中、⑨ 厨房が右・入口が角)あります。⑧⑨は11月2日に一度 Unity に建てましたが、そのあと瞬間移動をなくして版を固めた(LOG435・LOG440)ので、今の版ではまだ回していません。サイトにも⑧⑨の Unity の動画はありません。

⑧⑨にも比較動画を作るには、Unity が読む条件の表(p2m-site の public/sim/serving-robot-params.json)に、⑧⑨の下げ膳の条件が要ります。試算の数字やページの表示は変えず、表に4行(⑧⑨ × ロボット1台・2台)を足すだけにする案で了承をもらいました。値は、試算の大型店の結果(iCloud の simulation/v2_9_large/)から写しています。写す前に、同じファイルの配膳だけの値が今の表と同じであることを確かめました(⑧2台の入店待ち 7.2357分・料理の待ち 1.8623分、⑨2台 7.471分・2.1582分)。

大型店の結果から下げ膳の4条件を取り出したコマンド

cd "$HOME/mnt/PixelstoMotors/デジタルツイン学習R2R2R/サービスロボット導入シミュレーション/simulation/v2_9_large"; python3 - <<'E'
import json
src={"large_p6":"results_large_mac.json","large_p7":"results_large_p7_v2.json"}
out=[]
for st,f in src.items():
    rows=json.load(open(f))["rows"]
    def find(**c): 
        m=[r for r in rows if all(r.get(k)==v for k,v in c.items())]; assert len(m)==1,(c,len(m)); return m[0]
    chk=find(store=st,staff=6,robots=2,arrivals_per_h=70,mode="serve",trays=3,fragile_by="any",registers=1)
    print(st,"serve2 check",chk["entry_wait_mean"],chk["dish_wait_mean"])
    for rb in (1,2):
        r=find(store=st,staff=6,robots=rb,arrivals_per_h=70,mode="bus",trays=3,fragile_by="any",registers=1)
        c={k:r[k] for k in ("store","staff","robots","arrivals_per_h","mode","trays","fragile_by","registers")}
        out.append({"condition":c,"site_result":{k:v for k,v in r.items() if k not in c}})
json.dump(out,open("/tmp/large_bus_conds.json","w"),ensure_ascii=False)
print(json.dumps(out,ensure_ascii=False)[:300])
E
large_p6 serve2 check 7.2357 1.8623
large_p7 serve2 check 7.471 2.1582

条件の表と書き出しのコードの差分(commit 34af4fb)

06_sec04.txt6,161字・195行・diff
commit 34af4fb027de440f265e7e58c688f2d9c327afb5
Author: Claude <noreply@anthropic.com>
Date:   Thu Nov 5 19:08:51 2026 +0900

    Unity の条件に大型店⑧⑨の下げ膳(ロボット1・2台)を足す(132〜135番)
    
    試算の数字とページの表示は変えない。値は v2_9_large の結果から写した
    
別のタブで開く保存

依頼94 の依頼文

---
作業フォルダ: /Users/shimazueiichi/Robotics_UX/ServiceSim
上限時間: 720
---
# 依頼94:大型店⑧⑨を今の版(cs:78)で回して合格の線を見て、配膳だけ・配膳+下げ膳の動画の素材を撮る

エイイチと決めたこと(2026-11-05):配膳ロボットのベースで残っている大型店⑧⑨を足す。ほかの6店と同じく、ベースとして合格かを線で見て、サイト用のパネル付き動画と比較動画の素材をそろえる。
サイトの条件の表(p2m-site の public/sim/serving-robot-params.json)に、⑧⑨の下げ膳の条件 132〜135番を足した(2026-11-05。前の 0〜131番は中身も並びも変えていない)。
⑧⑨は 11/2 に cs:62 で建てたきりで、瞬間移動をなくした版(cs:76〜78)ではまだ回していない。
Unity の動き・決まりは変えない(cs:78 のまま)。大型店でだけ起きる問題が出ても、直さずに記録して報告に書く。
**エイイチは寝ている。人に聞かないと進めない所に当たったら、その項目は止めて報告に書き、ほかは続ける。時刻で止めず、全部終わるまで続ける。**

## 始める前に確かめること(違えば回さずに報告して終わる)
1. 作業場所が cs:78、Builds/headless と Builds/rec20_bus91 が cs:78。保留 0
2. Unity エディタ・night_runner/rec_runner が動いていない。KIOXIA がマウント済み、unity_ledger_v1.lock がない。台帳を archive/unity_ledger_v1_pre_large94_20261105/ に退避(行数と md5 を報告に)
3. サイトの params を Unity に写し直す(依頼72 と同じやり方。Assets/ServiceSim/Experiment/serving-robot-params.json)。0〜131番が今までと1字も違わず、132〜135番だけ増えたことを確かめる。⑧⑨の店の形(Assets/ServiceSim/Store/Layouts/large/)がサイトの public/sim/layouts/large/ と同じ版か確かめる。写したら check-in し、cs と実行ファイルを作り直す(保留 0)。作り直した版で ⑦ fam_p5・2台・種7 の serve が base73 と記録が1行も違わないことを確かめる

## A. 回す(画面なし・同時4本)
- serve:条件 90・91・92(⑧ 0/1/2台)と 105・106・107(⑨ 0/1/2台)× 種0〜9 = 60 回(label large94)
- bus:条件 132・133(⑧ 1/2台)と 134・135(⑨ 1/2台)× 種0〜9 = 40 回(label large94bus)
- 確かめ:⑧2台 serve 種0・⑨2台 serve 種0・⑧2台 bus 種0 を、それぞれもう1回回して記録が1行も違わないこと
- 表にすること(ほかの6店の base73・bus75 と同じ列):瞬間移動・1コマの跳び、揺れ続け、解けずに残った詰まり(件・回。全員が帰ったあとの分は別に)、全員が帰らなかった回、助けの回数、上限で戻った回数(bus)、入店待ち・料理の待ち・turn・スタッフ1人の歩いた距離・ロボットが運んだ割合の中央値、試算と向きが合うか(0→1→2台、serve→bus)
- 詰まりの多い場所の上位5つ(店・場所・理由)

## B. 撮る(A の止める線に当たらなければ、A の結果に関わらず撮る)
- 撮る回:⑧・⑨ それぞれロボット2台の serve と bus を同じ種で(計4回)。種は、serve 2台の10回のうち全員が帰った回で、入店待ちが中央値にいちばん近い種(選んだ種と理由を報告に)
- 撮り方は依頼92 と同じ(rec_runner・wide_l30 と wide_r30・3840×2160・0.5 秒ごと・frames.csv・timeline.csv)。1回の上限 120 分・同時2本・止まっても回し直さない
- 大型店で店全体が画面に入らないときは、依頼87 の距離の決め方のまま、入るところまで引く(決め方を変えたら報告に)
- 置き場所:/Volumes/KIOXIA/r2r2r-data/service_sim/unity/rec_large_20261105/{large_p6|large_p7}/{serve|bus}/
- 動画にする
  1. serve の2本:依頼87 と同じに、問題に寄る動画(focus_clips.py → focus_v1/)と、パネル付きの通しの動画・寄りの動画(make_panel_video.py → panel_v1/)を作る。題「⑧ ロボット2台」「⑨ ロボット2台」
  2. serve と bus の通しのパネル付き動画(依頼92 と同じ。同じ店は同じ速さ。題「⑧ ロボット2台・配膳だけ」「⑧ ロボット2台・配膳+下げ膳」)→ {serve|bus}/panel/
  題がパネルで切れないことを1コマ見て確かめる

## 止める線
瞬間移動が1回でも出たとき、または確かめの同じ種の2回が違ったとき、または ⑦ の serve が base73 と違ったとき。止めたら報告に書き、ほかの項目は続ける(ただし確かめが通らなかった店は撮らない)。

## 報告
claude_code_reports/20261105_large94.txt に:始める前の確かめ(params・店の形・cs と build_id)、A の表と上位5つ、ほかの6店と比べて大型店で目立つこと、B で撮った回(種・実時間・全員帰ったか・瞬間移動)と動画の名前・長さ・速さ、台帳の行数の変化と md5。
**報告の最後の1行は必ず次のどれか**:「判定:合格」/「判定:止めた(決めてほしいことあり)」/「判定:失敗」

依頼94 は19:09に始まりました。⑧⑨を配膳だけ60回・配膳+下げ膳40回回し、ベースとして合格かを見てから、⑧⑨それぞれのロボット2台で、配膳だけと配膳+下げ膳を撮ります。大型店は1回が重いので、夜の間かかる見込みです。結果と⑧⑨の動画は、/series8 に載せたあと次の記録で書きます。

作業ログ ― 残したこと

残したこと中身いまの扱い
卓が使えるまでの向き
試算では6店とも縮むが、Unity では③④⑦で延びる
記録だけ。試算に、下げ膳の台が卓で通路をふさぐ動きは入れていない
丸テーブルの撮り直した2本
今の版では直す前でも止まらない
LP には使わず、KIOXIA の rec_lp_20261105/p0_round/ に残した
4視点の正面・横の角度
前の LP は真横からの絵、今は45°の見下ろし
このまま。真横から撮るには録画の道具にカメラを足す必要がある
1年の記録の LP の走らせる動画
前の版のファイルを指したまま今回は変えていない