サービスロボット導入シミュレーション Log#33 | 配膳ロボットに下げ膳も任せると、細い通路で詰まる

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

Unity で再現したファミレス6店・各120回のシミュレーションで、配膳ロボットを下げ膳(食べ終えた皿を洗い場へ運ぶ仕事)にも使うと、スタッフ1人が歩く距離は12条件すべてで減った。ただし通路の細い店でロボット2台のときは、下げ膳のロボットが卓でスタッフを待つあいだに通路をふさぎ、お客さんが帰ってから卓が使えるまでの時間が、③の店で4.1分から6.1分、⑦の店で4.5分から8.1分に延びた。

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

  • 配膳だけの店と、下げ膳にも使う店を、同じお客さんの来かたで並べて見比べられるようになった。サイトの試算のページ(/series8)で③の店を選ぶと、2本を左右に並べた動画と4つの数字が出ます
  • ロボットが同じ所で細かく揺れ続ける動きがなくなった。180回で0回です。ロボットは自分で進めていないことに気づいて、ぴたりと止まり、助けを呼びます
  • サイトに出している6店の動画を、録画の横にスタッフとロボットが何をしているかのパネルを付けた形にそろえた。寄りの場面の字幕も、左端まで読めます
  • Unity の作りを cs:76 で固め、そこに下げ膳を足した cs:78 で区切った。6店180回が約1時間で回り、同じ種なら毎回同じ結果が出るので、これから直すときは前と後を同じ条件で比べられます

困っていたのは、直しを続けても終わりが見えなかったことです。止まったまま解けない詰まりを1つ直すと、別の形の詰まりが出てきました。最初に出てきたのは、ロボットが1.4cmの幅を行ったり来たりし続け、少しずつ動いているので止まったと数えられず、助けも呼ばない形でした。数え方で拾おうとしたら、今度は列に並んでいるだけのロボットまで拾ってしまいました。そこで考え方を変えて、実物の自律移動ロボットと同じように、ロボット自身に「進めているか」を見張らせることにしました。下げ膳を入れたら、今度は卓でスタッフを待つロボットが通路をふさぎました。どこかで区切らないと、サイトに出す動画もそろいません。

やったことなぜ結果
行ったり来たりを止まりに数えた(依頼85)
1.4cm の揺れで、助けを呼ばないロボットがいたため
全員が帰らない回は0回。ただし並んでいるだけの台まで拾い、助けが増えた
ロボット自身に進めているかの見張りを入れ、cs:76 で固めた(依頼86・86b)
実物のロボットは揺れ続けず、自分で止まるため
揺れ続け0回。解けない詰まり1件。180回で瞬間移動0
サイトの6店の動画をパネル付きにそろえた(依頼87〜89)
初めて見る人に、ロボットとスタッフが何をしているかが分からないため
6店54本。寄りの字幕が切れない形・時刻は「開店から 2時間14分」
Unity に下げ膳を入れた(依頼90・91)
配膳だけと下げ膳も使う店を比べるため
歩く距離は12条件すべてで減った。細い通路の店では卓が空くのが遅れた
配膳だけと配膳+下げ膳の比較動画を作った
数字だけでは、何が起きているか伝わらないため
③の店で2本を左右に並べ、4つの数字を添えた

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

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

作業ログ ― 依頼85:行ったり来たりを止まりに数えたら、並んでいるだけのロボットまで拾った

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

ファイルの一覧(11本)

01_v2_SimpleProgressChecker.txt ― Nav2 の進み具合の見張り(SimpleProgressChecker) / 依頼85 の Claude Code の報告(20261103_base72.txt・全文)・11,430字

02_sec02.txt ― 依頼86 の Claude Code の報告(20261103_base73.txt・全文)・12,843字

03_sec02.txt ― 依頼86b の Claude Code の報告(20261103_base73b.txt・全文)・10,415字

04_sec03.txt ― 依頼87 の Claude Code の報告(20261104_rec87.txt・全文)・10,015字

05_sec03.txt ― 依頼88 の Claude Code の報告(20261104_panel88.txt・全文)・6,396字

06_sec03.txt ― 依頼89 の Claude Code の報告(20261104_focus89.txt・全文)・8,389字

07_make_panel_video.py.txt ― make_panel_video.py(--fit と時刻の書き方を足した版の全文)・6,837字

08_focus_clips.py.txt ― focus_clips.py(寄りの字幕の時刻を直した版の全文)・8,891字

09_sec04.txt ― 依頼90 の Claude Code の報告(20261104_bus90.txt・全文)・11,689字

10_sec04.txt ― 依頼91 の Claude Code の報告(20261104_bus91.txt・全文)・12,465字

11_sec05.txt ― serving-robot.html の差分(③の動画の下に比較動画を足した所)・3,542字

前の回(LOG435)の最後、依頼84 で残ったのは、⑦の店のロボット2台・種9 の1回でした。種は乱数の出発点で、同じなら同じお客さんの来かたになります。1号機が卓へ向かう途中で、1.4cm の幅を約50秒ごとに行ったり来たりし続け、少しずつ動いているので「止まった」と数えられず、30秒で助けを呼ぶ決まりが一度も働きませんでした。

最初の直し方は、数え方を変えることでした。30秒のあいだに0.3m進めていなければ止まりと同じに扱う、という測り方です。180回を回すと、全員が帰らない回は0回になりました。ところが、Claude Code の報告と数字を並べると、合わない所が出てきました。

4はこれでいいの?

4つ目の決めてほしいことは、立ち往生の数が903回から1,076回に増えたけれど、この数え方で試算と比べてよいか、でした。Claude は最初これでよいと答えましたが、見直すと、新しく数えた822回に対して合計は173回しか増えていません。受け渡し口の前で少しずつ詰めて並んでいる台まで拾っている疑いがあり、助けが増えた分だけスタッフの手が取られ、④の料理の待ちの向きが試算と逆になった可能性もありました。

同じ所で1.5cmずつ揺れ続ける これは傍目には動いてないと思うけど?

5cmもほぼわからないね。

人の目で見て止まっているなら、それは止まりです。ただ、見た目に合わせて「何cm以内なら止まり」と線を引く前に、もう1つ確かめることがありました。

細かくその場で行ったり来たりはロボットの仕様としてあり得るの?

自律移動ロボットを動かす代表的なソフトの1つに、ROS 2 の Nav2 があります。ROS 2 はロボットのソフトを部品の組み合わせで作るための土台で、Nav2 はその上で地図を持ち、ゴールまでの道を引き、障害物をよけて走らせる部品の集まりです。

Nav2 には、ロボットがゴールに向かって進めているかを見張る部品が標準で入っています。SimpleProgressChecker という名前で、既定では10秒のあいだに0.5m動けなければ「進めていない」と判断します。

言葉この記事での意味
required_movement_radius
進めていると見なすのに要る距離。既定 0.5m
movement_time_allowance
その距離を動くのに許す時間。既定 10秒
進めていない
上の時間で上の距離を動けなかった状態。ロボットは揺れ続けずに、立ち直りの動きに切り替える

前がふさがると、ロボットは少し進んではよけ、またよけ直すという迷いを起こします。これはロボットの移動では昔から知られた現象で、実物でも詰まったときに首を振るような動きは出ます。ただ、実物はこの見張りがあるので、長く揺れ続けることはありません。Unity のロボットには、この見張りがありませんでした。

そこで、傍目の判定(何cm以内なら止まり)を足すのではなく、ロボットの中にこの見張りを入れることにしました。0.3m の測り方はやめて、依頼84 までの数え方に戻します。

依頼85 の依頼文(全文)

---
作業フォルダ: /Users/shimazueiichi/Robotics_UX/ServiceSim
上限時間: 300
---
# 依頼85:同じ所で行ったり来たりし続けるロボットを止まりとして数え、180回で確かめる

エイイチと決めた方針(2026-11-03):ベースの合格の線は (1) 瞬間移動0回 (2) 同じ種で同じ結果 (3) 止まったまま解けない所が残らない (4) 試算と向きが合う(細かい差は記録だけ)(5) サイト用の図面・動画がそろう。現実に瞬間移動はないので Unity でもさせない。
依頼84 の報告:claude_code_reports/20261103_base71.txt(判定:失敗。(1)(2) は合格、(4) は12本中10本、(3) は ⑦2台 種9 の1回が残った)。今の作り cs:73・実行ファイル cs73_20261103_1601。

依頼84 の「決めてほしいこと」への答え(エイイチ了承):
- 1 は直す。30 秒の線(30 秒たったら助けを呼ぶ)はそのままにして、「止まっている」の測り方だけ変える:30 秒のあいだに 0.3 m 以上進めていなければ(その間の位置の移動の差し引きで見る。行ったり来たりは進んでいないと数える)、止まりと同じに扱って助けを呼ぶ。立ち往生の数え方(試算の stuck と比べる数)も同じ測り方にそろえる
- 2 の全員が帰ったあとに残るロボットどうしの助け(⑤2台 種0・6・7)は、解けずに残った詰まりに数えず、記録だけにする(別の列・別の行として残し、待機場所の 1台分 0.8 m が狭い件との関わりを報告に一言書く)
- 3 の向きが逆の2本は記録だけ
- 4 の助けが1時間を超える形(④2台 種4)は今はこのまま。人の部品(依頼78)で直す

## 始める前に確かめること(違えば手を止めて報告)
Unity エディタ・night_runner/rec_runner が動いていない、KIOXIA がマウント済み、unity_ledger_v1.lock がない、保留 0、作業場所が cs:73。台帳は退避してから回す。台帳は追記だけ。

## やること
1. 測り方を直す(上の 1)。行ったり来たりは、ロボットだけでなく人(スタッフ・客)にも同じ形があれば同じ測り方にそろえる。直す前に、⑦2台 種9 の 11798 秒からの動きが新しい測り方で何秒目に止まりになるかを確かめて報告に書く
2. 2 の扱いを集計に入れる(全員が帰ったあとに始まった・残った助けを、解けずに残った詰まりから分けて数える)
3. check-in し、画面なしの実行ファイルを作り直す(保留 0)
4. 確かめ(画面なし)
   - ⑦ fam_p5・種9・2台を2回:記録が1行も違わないこと、全員が帰ること
   - 依頼84 と同じ 6店 × 0・1・2台 × 種0〜9 = 180回(同時4本・label base72)
   - 依頼84 と並べる:瞬間移動・1コマの跳び、解けずに残った詰まりの件数と回数(全員が帰ったあとの分は別に)、全員が帰らなかった回、助けの回数(1往復あたり)、立ち往生の回数、詰まりの場所の上位、店・台数ごとの入店待ち・料理の待ちの中央値と試算との向き(12本)

## 変えないもの
ロボットの速さ・物理の設定・譲る順番・人とロボットの数字・rescue_s 15 秒・30 秒という時間・センサーの 0.6 m・同じ種で同じ結果にする作り・止まっている台を動かす先の決め方・瞬間移動をなくした作り・依頼84 で入れた直し・店の形・台帳の列と今までの行。

## 止める線
直したあと、瞬間移動が1回でも出たら、または入店待ち・料理の待ちの中央値が依頼84 の2倍を超える店・台数があったら、180回の途中でも止めて報告する。比べるときは同じ種どうしで比べる(依頼84 で見張りが種の範囲違いで誤って止めたため)。

## 報告
claude_code_reports/20261103_base72.txt に:変えたファイルと cs・build_id、⑦種9 が新しい測り方で何秒目に止まりになったか、2回の一致、依頼84 と並べた表、向きの12本の表、残った詰まりがあればその中身と場所。
**報告の最後の1行は必ず次のどれか**:「判定:合格」/「判定:止めた(決めてほしいことあり)」/「判定:失敗」

依頼85 の Claude Code の報告(20261103_base72.txt・全文)

01_v2_SimpleProgressChecker.txt11,430字・176行・text
====================================================================
依頼85:同じ所で行ったり来たりし続けるロボットを止まりとして数え、180回で確かめる
2026-11-03 18:00〜20:30 作業場所 cs:73 → cs:75 build_id cs75_20261103_1913(画面なし・保留 0)
====================================================================

--------------------------------------------------------------------
0. 始める前の確かめ(どれも依頼どおり)
--------------------------------------------------------------------
別のタブで開く保存

作業ログ ― 依頼86・86b:ロボット自身に進めているかの見張りを入れ、cs:76 で固めた

依頼86 では、卓・受け渡し口・待機場所へ走ろうとしている間だけ、10秒で0.5m動けなければ、その場でぴたりと止まる見張りを入れました。受け渡し口で料理を待つ間や列に並ぶ間のように、わざと待っている間は見張りません。止まったあとは今までの決まりどおり、前が空けば進み、3秒空かなければ回り込む道を探し、30秒で助けを呼びます。

助けで動かす先が3回続けて見つからないときは、助けのスタッフがロボットに付き添い、来た道を歩く速さで連れて戻す決まりも足しました。瞬間移動はさせません。

180回の途中、44回目で止める線に当たりました。⑦2台の入店待ちの中央値が依頼84 の2.6倍になったためです。ただしこれは種3つだけの中央値で、延びたのは種1だけでした。延々と直し続けないために、ここで区切りを決めています。

どこかで区切って進めてください。

区切りは依頼86 の版にしました。固める条件は、瞬間移動が0回であることと、同じ種なら同じ結果が出ることの2つだけです。詰まりが少し残っても、記録して、サイトの動画を出したあとで直します。残りの136回は作りを変えずに回し(依頼86b)、cs:76 で固めました。

  • ねらい:揺れ続けを数え方で拾うのをやめ、ロボットの動きそのものを実物に近づける
  • 変わったこと:揺れ続け(1cm 幅の行ったり来たりが60秒以上)0回。全員が帰らない回は依頼84 の1回から0回。解けない詰まりは依頼84 の2件から1件
  • 見込める効果:測った値では、立ち往生が1回でもあった往復の割合が0.050から0.062に増えた(試算は0.01)。ぴたりと止まる分、狭い通路では人の道をふさぎやすい。この差は記録して、あとで直す

依頼86 の依頼文(全文)

---
作業フォルダ: /Users/shimazueiichi/Robotics_UX/ServiceSim
上限時間: 300
---
# 依頼86:ロボット自身に「進めているか」の見張りを入れ、揺れ続けをなくして180回で確かめる

エイイチと決めた方針(2026-11-03):ベースの合格の線は (1) 瞬間移動0回 (2) 同じ種で同じ結果 (3) 止まったまま解けない所が残らない (4) 試算と向きが合う(細かい差は記録だけ)(5) サイト用の図面・動画がそろう。現実に瞬間移動はないので Unity でもさせない。
依頼85 の報告:claude_code_reports/20261103_base72.txt(判定:止めた)。今の作り cs:75。

依頼85 の「決めてほしいこと」への答えと、考え直したこと(エイイチ了承):
- 1.5 cm の幅で揺れ続けるロボットは、傍目には止まっている。実物の配膳ロボットはその場で揺れ続けない。自律移動の仕組み(ROS 2 Nav2 の SimpleProgressChecker:既定で 10 秒のあいだに 0.5 m 動けなければ「進めていない」)のように、ロボット自身が進めていないことに気づいて立ち直りの動きに切り替える
- そこで、依頼85 で入れた「30 秒で 0.3 m の測り方」(止まりの数え方・立ち往生の数え方・助けの取り消しの3つとも)はやめて、依頼84(cs:73)までの数え方に戻す。代わりにロボットの中に見張りを入れる(下の 1)
- 2 の ④2台 種6 のように、客がいるあいだに始まった詰まりは、回の終わりまで残れば「解けずに残った詰まり」に数える。記録だけにするのは、最後の組が帰ったあとに始まったものだけ(分け目は始まった時刻)
- 3 の ④料理の待ちの逆向き・4 の立ち往生の増え方は、0.3 m の測り方で助けが増えたためとみられるので、戻したうえで見直す

## 始める前に確かめること(違えば手を止めて報告)
Unity エディタ・night_runner/rec_runner が動いていない、KIOXIA がマウント済み、unity_ledger_v1.lock がない、保留 0、作業場所が cs:75。台帳は退避してから回す。台帳は追記だけ。

## やること
1. ロボットに進めているかの見張りを入れる
   - 卓へ/受け渡し口へ/待機場所へ走ろうとしている間だけ見張る。10 秒のあいだに、見張りを始めた所から 0.5 m 動けなければ「進めていない」とする(Nav2 の既定値。Unity だけの値として設定に名前を付けて置く)
   - 「進めていない」になったら、ロボットはその場でぴたりと止まる(速さ 0。揺れない)。そのあとは今までの決まりどおり:前が空けば進む・3 秒空かなければ回り込む道を探す・30 秒で助けを呼ぶ
   - わざと待っている間(受け渡し口で料理を待つ・受け渡し口の列・卓で客が取るのを待つ・入口や1本道の順番待ち・待機場所)は見張らない
   - 揺れの原因(道の引き直しとよける動きのぶつかり合いなど)を調べ、報告に短く書く
   - 止まりの数え方・立ち往生の数え方・助けの取り消しは依頼84(cs:73)の形に戻す。ぴたりと止まるので、今までの数え方で止まりとして拾える
2. 助けで動かす先が見つからないとき(④2台 種6:「その場で引き直した」が 61 回):動かす先が3回続けて見つからなければ、助けのスタッフがロボットに付き添い、来た道を受け渡し口か待機場所(近い方)まで歩く速さで連れて戻す。瞬間移動はしない。連れて戻したロボットはそこから次の仕事を受けてよい
3. 詰まりの分け方を上の答えのとおりにする(始まった時刻が最後の組が帰ったあとかどうか)
4. check-in し、画面なしの実行ファイルを作り直す(保留 0)
5. 確かめ(画面なし)
   - ⑦ fam_p5・種9・2台を2回、④ fam_p2・種6・2台を2回:どちらも記録が1行も違わないこと、全員が帰ること、揺れ続けがないこと(1 cm 単位で行ったり来たりを 60 秒以上続けた所が 0)
   - 依頼84 と同じ 6店 × 0・1・2台 × 種0〜9 = 180回(同時4本・label base73)
   - 依頼84・85 と並べる:瞬間移動・1コマの跳び、揺れ続け、見張りで止まった回数(場所の上位)、解けずに残った詰まりの件数と回数、全員が帰ったあとに始まった詰まり(別に)、全員が帰らなかった回、助けの回数(1往復あたり)、連れて戻した回数、立ち往生の回数と「立ち往生が1回でもあった往復の割合」(試算の stuck_rate 0.01 と同じ単位で比べるため)、店・台数ごとの入店待ち・料理の待ちの中央値と試算との向き(12本)

## 変えないもの
ロボットの速さ・物理の設定・譲る順番・人とロボットの数字・rescue_s 15 秒・30 秒・60 秒という時間・センサーの 0.6 m・同じ種で同じ結果にする作り・止まっている台を動かす先の決め方(動かす先が見つかるとき)・瞬間移動をなくした作り・依頼84 で入れた直し・依頼85 の ② の直しのうち測り方に関わらない所・店の形・台帳の列と今までの行・試算の値。

## 止める線
直したあと、瞬間移動が1回でも出たら、または入店待ち・料理の待ちの中央値が依頼84 の2倍を超える店・台数があったら、180回の途中でも止めて報告する。比べるときは同じ種どうしで比べる。

## 報告
claude_code_reports/20261103_base73.txt に:揺れの原因、変えたファイルと cs・build_id、2組の2回の一致、依頼84・85 と並べた表、向きの12本の表、残った詰まりがあればその中身と場所。
**報告の最後の1行は必ず次のどれか**:「判定:合格」/「判定:止めた(決めてほしいことあり)」/「判定:失敗」

依頼86 の Claude Code の報告(20261103_base73.txt・全文)

02_sec02.txt12,843字・206行・text
====================================================================
依頼86:ロボットに「進めているか」の見張りを入れ、揺れ続けをなくして180回で確かめる
2026-11-03 20:50〜21:50 作業場所 cs:75 → cs:76 build_id cs76_20261103_2122(画面なし・保留 0)
====================================================================

--------------------------------------------------------------------
0. 始める前の確かめ(どれも依頼どおり)
--------------------------------------------------------------------
別のタブで開く保存

依頼86b の依頼文(全文)

---
作業フォルダ: /Users/shimazueiichi/Robotics_UX/ServiceSim
上限時間: 240
---
# 依頼86b:見張り入りの版(cs:76)で180回の残り136回を回し、この版で固める

エイイチと決めた区切り(2026-11-03 20:55「どこかで区切って進めて」):依頼86 の版で Unity の作りを固める。固める条件は (1) 瞬間移動0 (2) 同じ種で同じ結果 の2つだけ。残った詰まりや試算とのずれは記録して、サイトの動画を出したあとで直す。
依頼86 の報告:claude_code_reports/20261103_base73.txt(44回で止める線に当たって止めた。44回とも瞬間移動0・揺れ続け0・解けずに残った詰まり0、同じ種の2組は一致)。

依頼86 の「決めてほしいこと」への答え(区切りに従って決めた):
- 1:作りは直さず、残りの136回を回して種10個で見る(3つの種の中央値で止めたので。種1 だけが延びている)
- 2:数え方はこのまま。試算の stuck_rate(0.01)との差は記録だけ
- 3・4・5:このままでよい(あなたが決めた形で固める)

## 始める前に確かめること(違えば手を止めて報告)
Unity エディタ・night_runner/rec_runner が動いていない、KIOXIA がマウント済み、unity_ledger_v1.lock がない、保留 0、作業場所が cs:76、Builds/headless が cs:76。台帳は退避してから回す。台帳は追記だけ。

## やること
1. コードは変えない(cs:76 のまま。実行ファイルも作り直さない)
2. night/20261103_base73_cs76 の並び(/tmp/req86/base73.json。無ければ依頼84 と同じ 6店 × 0・1・2台 × 種0〜9 で作り直す)のうち、completed になっていない136回を、同じ label の続きとして回す(同時4本)
3. 180回そろったら、依頼84・85 と並べる表(依頼86 の報告と同じ項目)と、向きの12本の表を作る。⑦2台 種1 の入店待ちが延びた理由を短く調べる(直さない)
4. cs:76 をサイトの動画の撮り直しに使う版として固めたことを、作業場所の README(無ければ報告)に一行残す

## 止める線
瞬間移動が1回でも出たときだけ止める。入店待ち・料理の待ちの中央値の線では止めない(記録だけ)。

## 報告
claude_code_reports/20261103_base73b.txt に:回した回数、180回の表、向きの12本、⑦2台 種1 の理由、残った詰まりがあればその中身と場所、台帳の行数と md5。
**報告の最後の1行は必ず次のどれか**:「判定:合格」/「判定:止めた(決めてほしいことあり)」/「判定:失敗」

依頼86b の Claude Code の報告(20261103_base73b.txt・全文)

03_sec02.txt10,415字・160行・text
====================================================================
依頼86b:見張り入りの版(cs:76)で180回の残り136回を回し、この版で固める
2026-11-03 22:20〜23:30 作業場所 cs:76 build_id cs76_20261103_2122(作り直していない)
====================================================================

--------------------------------------------------------------------
0. 始める前の確かめ(どれも依頼どおり)
--------------------------------------------------------------------
別のタブで開く保存

作業ログ ― 依頼87〜89:サイトの6店の動画を、パネル付きの形にそろえた

そういえば動画のフォーマットに合わせてサイトの動画をつくってますか?

パネル付きの形と、それを作るスクリプトは前の回で決めていました。録画の横に、スタッフが何をしているか(案内・料理・会計・片付け・ロボットの助け・手すき)、ロボットが運んでいるか待機か、入口で待つ組の数を並べる形です。止めていたのは録画の方で、固めた版で撮り直してから差し替える順番にしていました。

依頼87 で、cs:76 で6店(②〜⑦)を撮り直しました。カメラは60°見下ろし・左右30°の2台、4K で、開店から全員が帰るまでです。店ごとに、通しの動画(約75秒)と、ロボットが長く止まった場所に寄る動画を作っています。

③の店の通しの動画の1コマ。左が Unity の録画、右がスタッフ4人がしていることとロボット2台の様子のパネル

撮ってみると、寄りの動画で字幕が切れていました。寄りの部品は1280×720 で、それを高さ1080に広げてから真ん中の1360px を切り出していたので、左上の字幕の左がおよそ280px 切れ、その上に色の説明が重なっていました。パネルの時刻も「開店から 1:39」と書いていて、決めた形(1時間39分)と違っていました。

直す前の寄りの部品。左上の字幕の左が切れて、色の説明と重なっている。時刻も 0:44 の書き方

依頼88 で、寄りの部品は切らずに横幅に合わせて縮め、上下に Unity の背景に近い色の余白を足す形(—fit)にしました。依頼89 で、寄りの字幕の中の時刻も「134:14〜140:10」から「開店から 2時間14分〜2時間20分」に直しました。

スマホはそのままで。

スマホの幅ではパネルの字が小さすぎて読めませんが、縦長の別の形は作らないことにしました。

直した後の寄りの部品。録画は縮めて上下に余白を入れ、字幕は左端まで読める。時刻は開店から 2時間15分 の書き方
  • ねらい:初めて /series8 の動画を見る人が、ロボットとスタッフがいま何をしているかを読めるようにする
  • 変わったこと:6店の動画を v1(パネルなし)から v3(パネル付き・字幕が切れない・時刻の書き方をそろえた)に差し替えた。動画は1本1〜2MB
  • 見込める効果(見込み):動画を最後まで見る人が増える。見られ方はサイトの計測で確かめる

サイト側の差し替えは、試算のページ(public/sim/serving-robot.html)の店ごとの行(const UNITY)の動画と表紙を v3 に替えただけです。

依頼87 の依頼文(全文)

---
作業フォルダ: /Users/shimazueiichi/Robotics_UX/ServiceSim
上限時間: 600
---
# 依頼87:固めた版(cs:76)で、サイトに載せる動画をパネル付きの形で撮り直す

エイイチと決めたこと(2026-11-03):依頼86b の版 cs:76 で Unity を固めた(瞬間移動0・同じ種で同じ結果。報告 claude_code_reports/20261103_base73b.txt・判定 合格)。残った詰まりや試算とのずれは記録だけにし、サイトの動画を出したあとで直す。
サイトに出す Unity の動画は、録画の横にスタッフ・ロボットが何をしているかのパネルを付けた同じ形にそろえる(初見の人に分からないため)。形の決まりは status_videos/tools/PANEL_VIDEO_FORMAT.md、作り方は make_panel_video.py(形は変えない)。
**エイイチは寝ている。人に聞かないと進めない所に当たったら、その店は止めて報告に書き、ほかの店は続ける。時刻で止めず、並べた店が全部終わるまで続ける。**

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

## 撮る回(普通・真ん中の人数・ロボット2台・上げ膳・1往復3卓・レジ1つ・今の標準・道の線なし)
依頼75 と同じ並び。③を最初に撮る。
| 順 | 店 | 種 |
|---|---|---|
| 1 | ③ fam_p1 | 7 |
| 2 | ⑦ fam_p5 | 7 |
| 3 | ④ fam_p2 | 1 |
| 4 | ⑤ fam_p3 | 1 |
| 5 | ⑥ fam_p4 | 1 |
| 6 | ② fam_p0 | 8 |
⑧⑨(大型店)は cs:76 で 180回を回していないので今回は撮らない。

- カメラ・置き方は依頼71 と同じ(wide_l30・wide_r30・3840×2160・0.5秒ごと・30コマ/秒・回の最初から全員が帰るまで・カメラの行列も書き出す・距離は依頼71 と同じ決め方)
- パネルの数字は、録画と同じ回の timeline.csv(60秒ごとの店の様子)と、録画のコマと店の時刻を結ぶ frames.csv を使う。録画の回がこの2つを出していなければ、出力だけを足す(動き・決まりには触れない。足したら cs を上げ、同じ種の2回で記録が1行も違わないことを確かめてから撮る)
- 1回の実時間の上限:80 分。同時に2本。止まっても回し直さない
- 置き場所:`/Volumes/KIOXIA/r2r2r-data/service_sim/unity/rec_focus_20261104/{店}/`(前の分は消さない・上書きしない)
- 台帳は追記だけ

## 動画にする(撮れた店ごと)
1. 問題に寄る動画:focus_clips.py(iCloud の unity/focus_clips/。中身は変えない。iCloud の外へ写して使う)で `{店}/focus_v1/` に作る(依頼71・75 と同じ)
2. パネル付きにする:make_panel_video.py で、次の2本を `{店}/panel_v1/` に作る。題は「③ 標準ファミレス・ロボット2台」のように店の名前と台数
   - 通しの動画:wide_l30 の録画を、開店から全員が帰るまで、60〜90秒に収まる速さで(--speed)
   - 問題に寄る動画:focus_v1 の動画それぞれに、同じ時刻の範囲(--from/--to)のパネルを付ける
   - make_panel_video.py の字は Noto Sans CJK JP。Mac に無ければ Homebrew の font-noto-sans-cjk-jp を入れ、字の場所だけを Mac に合わせる(形・色・大きさは変えない。直したら差分を報告に)
   - 出来た動画は 1920x1080・30fps であること(スクリプトが確かめる)
3. 店ごとに1枚、通しの動画の真ん中あたりの1コマを png で `{店}/panel_v1/` に置く(サイトの差し替え前の確認用)

## 報告
claude_code_reports/20261104_rec87.txt に:
- 店ごと:最後まで回ったか・全員帰ったか・実時間・瞬間移動の回数・上位3つの問題(場所・時刻・止まった合計秒・理由)・できた動画の名前と長さ
- 出力を足したなら、その中身と cs・同じ種の2回の一致
- 台帳の行数の変化と md5
**報告の最後の1行は必ず次のどれか**:「判定:合格」/「判定:止めた(決めてほしいことあり)」/「判定:失敗」

依頼87 の Claude Code の報告(20261104_rec87.txt・全文)

04_sec03.txt10,015字・180行・text
====================================================================
依頼87:固めた版(cs:76)で、サイトに載せる動画をパネル付きの形で撮り直す
2026-11-04 00:20〜03:15 作業場所 cs:76(保留 0) build_id cs76_20261103_2122(作り直していない)
====================================================================

結論
  ・6 店(③⑦④⑤⑥②)とも最後まで回り、全員帰った。瞬間移動 0・1コマの跳び 0・上限で止まった回 0。実時間 42.8〜55.2 分
  ・6 店とも focus_v1(問題に寄る動画)と panel_v1(パネル付きの通し 1 本・寄り 7 部品+つないだもの 1 本・真ん中のコマの png)ができた
別のタブで開く保存

依頼88 の依頼文(全文)

---
作業フォルダ: /Users/shimazueiichi/Robotics_UX/ServiceSim
上限時間: 120
---
# 依頼88:依頼87 のパネル付き動画を、字幕が切れない形・時刻の書き方を直した形で作り直す

依頼87 の報告(claude_code_reports/20261104_rec87.txt)の「決めてほしいこと」への答え(エイイチ了承 2026-11-04):
- 1:問題に寄る動画(focus_v1 の部品)は切らずに横幅に合わせて縮め、上下に余白を足す。make_panel_video.py に --fit を足した(Claude が直した。形の決まりは PANEL_VIDEO_FORMAT.md に追記済み)
- 2:時刻は決まりどおり「1時間39分」(1時間未満は「35分」)。make_panel_video.py の hm() を直した
- 3:録画した回と録画しない回の数字の違いはそのまま(動画の中の映像と数字は同じ回で合っている)。記録だけ
Unity は触らない。録画も撮り直さない(rec_focus_20261104 の録画・frames.csv・focus_v1 をそのまま使う)。

## やること
1. night/20261104_rec87/panel87.py を写して panel88.py にする。変えるのは次の3つだけ
   - 出力先を {店}/panel_v2/ にする(panel_v1 は消さない・上書きしない)
   - focus_v1 の部品(p00_open・pNNa_wide・pNNb_focus)を make_panel_video.py に渡すときに --fit を付ける。通しの動画(4K の録画)は付けない
   - make_panel_video.py は status_videos/tools/ の今のもの(--fit と hm() の直しが入ったもの)を使う
2. 6店(rec_focus_20261104/fam_p0〜fam_p5)を、依頼87 と同じ題で作る(題は各店の panel_v1/panel_log.txt の1行目)
3. 確かめ:どれも 1920x1080・30fps、部品のコマ数が依頼87 と同じ、通しの真ん中の png と、focus_trial_panel.mp4 の寄りの部品の1コマ(p01b_focus の真ん中)を png で panel_v2/ に置く。字幕の左端が切れていないこと(字幕の文字が録画の枠の中にあること)を目で見られる形で

## 報告
claude_code_reports/20261104_panel88.txt に:店ごとにできた動画の名前と長さ、確かめの結果、panel88.py と panel87.py の差分。
**報告の最後の1行は必ず次のどれか**:「判定:合格」/「判定:止めた(決めてほしいことあり)」/「判定:失敗」

依頼88 の Claude Code の報告(20261104_panel88.txt・全文)

05_sec03.txt6,396字・130行・text
====================================================================
依頼88:依頼87 のパネル付き動画を、字幕が切れない形・時刻の書き方を直した形で作り直す
2026-11-04 06:05〜06:25
====================================================================

結論
  ・6 店(② fam_p0・③ fam_p1・④ fam_p2・⑤ fam_p3・⑥ fam_p4・⑦ fam_p5)とも panel_v2/ ができた(1 店 9 本の mp4・計 54 本)
  ・54 本すべて 1920x1080・30fps。コマ数は 54 本とも依頼87(panel_v1)と同じ。focus_trial_panel.mp4 のコマ数は部品の和と同じ
別のタブで開く保存

依頼89 の依頼文(全文)

---
作業フォルダ: /Users/shimazueiichi/Robotics_UX/ServiceSim
上限時間: 120
---
# 依頼89:寄りの字幕の時刻を「開店から 2時間14分」の形に直し、問題に寄る動画とパネル付き動画を作り直す

エイイチの指示(2026-11-04):寄りの字幕の店の時刻「134:14〜140:10」を、パネルと同じ「開店から 2時間14分〜2時間20分」の形に直す。スマホ用の別の形は作らない。
focus_clips.py(iCloud の unity/focus_clips/)は Claude が直した:caption() の時刻を hm() で書くようにしただけ(直す前の写しは focus_clips_pre20261104.py)。ほかは変えていない。
Unity は触らない。録画は撮り直さない(rec_focus_20261104 の録画・frames.csv をそのまま使う)。

## やること
1. 直した focus_clips.py(中身は変えない。iCloud の外へ写して使う)で、6店(rec_focus_20261104/fam_p0〜fam_p5)の問題に寄る動画を {店}/focus_v2/ に作る。字幕の倍率などの引数は依頼87 の focus_v1 と同じにする(focus_v1 は消さない・上書きしない)
2. night/20261104_panel88/panel88.py を写して panel89.py にし、読む部品を focus_v2、出力を {店}/panel_v3/ にする(変えるのはこの2つだけ。--fit はそのまま)。make_panel_video.py は status_videos/tools/ の今のもの
3. 確かめ:どれも 1920x1080・30fps、部品のコマ数が focus_v1・panel_v2 と同じ、各店の focus_trial_panel.mp4 の p01b_focus の真ん中の1コマを png で panel_v3/ に置く(字幕が「開店から …時間…分〜…」になっていることを目で見られる形で)
4. サイト用に書き出す:各店の panel_v3/focus_trial_panel.mp4 を、KIOXIA の service_sim/unity/series8_web_20261104/upload_v3/ に series8_unity_{店}_v3.mp4 として(ffmpeg -c:v libx264 -preset veryfast -crf 26 -movflags +faststart -an)、表紙は同じ動画の 1 秒目のコマを series8_unity_{店}_v3.jpg(-q:v 4)。R2 への入れ込みとサイトの差し替えは Claude がする

## 報告
claude_code_reports/20261104_focus89.txt に:店ごとにできた動画の名前と長さ、確かめの結果、panel89.py と panel88.py の差分、upload_v3 の中身。
**報告の最後の1行は必ず次のどれか**:「判定:合格」/「判定:止めた(決めてほしいことあり)」/「判定:失敗」

依頼89 の Claude Code の報告(20261104_focus89.txt・全文)

06_sec03.txt8,389字・147行・text
====================================================================
依頼89:寄りの字幕の時刻を「開店から 2時間14分」の形に直し、問題に寄る動画とパネル付き動画を作り直す
2026-11-04 06:35〜06:50
====================================================================

結論
  ・6 店(② fam_p0・③ fam_p1・④ fam_p2・⑤ fam_p3・⑥ fam_p4・⑦ fam_p5)とも focus_v2/ と panel_v3/ ができた
  ・寄りの字幕の時刻は「開店から 2時間14分〜2時間20分」の形になった(1時間未満は「42分〜45分」の形)。6 店の png を目で見て確かめた
別のタブで開く保存

PANEL_VIDEO_FORMAT.md(パネル付き動画の決まり・2026-11-04 の追記を含む全文)

# ServiceSim パネル付き動画の形(決まり)

サイトに出す ServiceSim の動画(通し・問題に寄る・比較)は、すべてこの形にそろえる。2026-11-03 エイイチ了承。変えるときはエイイチに確かめてから。
作り方:`tools/make_panel_video.py rec.mp4 frames.csv timeline.csv out.mp4 --title "③ 標準ファミレス・ロボット2台"`(形はこのスクリプトに固定してある。手で別の形を作らない)

- 画面:1920x1080・30fps。左 1360px が録画、右 560px がパネル
- 色:立体と同じ。お客さん=黄・スタッフ=青・ロボット=白。録画の左上に色の説明「お客さん/スタッフ/ロボット」
- パネル(上から):題(店・台数)→「開店から 1時間54分」→ スタッフ N人がしていること(案内・料理・呼び出し・会計・片付け・ロボットの助け・手すき。1人=青い四角1つ)→ ロボット N台(運んでいる=白・黒縁/待機=薄い)→ 入口で待つ組・席にいる組・片付けを待つ卓 → 入口で待つ組の一日の線
- 寄りの部品など、録画に字幕が入っているもの(focus_clips.py の部品)は --fit で入れる:切らずに横幅 1360px に縮め、上下の余白は Unity の背景に近い色(2026-11-04 エイイチ了承。依頼87 で字幕の左が切れたため)
- 言葉:「客」ではなく「お客さん」。時間は「1時間54分」と書き、「1:54」とは書かない(1時間未満は「35分」。スクリプトは 2026-11-04 にこの決まりに合わせた)
- 数字:録画と同じ回の timeline.csv を使う。別の回を重ねるのは試しのときだけ(--trial、題に(試作)が付く)
- 崩れ防止:長い題・人数や台数が多いときは字や四角を小さくして収める。パネルがはみ出す・列が足りない・出来た動画が 1920x1080 でないときは止まる

make_panel_video.py(—fit と時刻の書き方を足した版の全文)

07_make_panel_video.py.txt6,837字・122行・python
"""ServiceSim の録画に、店の様子のパネル(timeline.csv)を横に付ける。
使い方: python3 make_panel_video.py rec.mp4 frames.csv timeline.csv out.mp4 [--from 秒] [--to 秒] [--speed 倍] [--title 文字]
録画は 1コマ = frames.csv の t_s(店の時刻・秒)。パネルは timeline.csv の t_s ごと(60秒おき)に描き直す。
"""
import csv, sys, argparse, subprocess, tempfile, pathlib, bisect
from PIL import Image, ImageDraw, ImageFont

W, H, PW = 1920, 1080, 560          # 全体・パネルの幅
別のタブで開く保存

focus_clips.py(寄りの字幕の時刻を直した版の全文)

08_focus_clips.py.txt8,891字・208行・python
"""問題に寄る動画を作る(サービスロボット導入シミュレーション・2026-11-02)

カメラの目的を分ける(エイイチと決めた)
- 引き:全体の流れを見る(60°見下ろし・左30°/右30°の店全体)
- 寄り:問題が起きている所を見る(ロボットが動けなくなった・長く止まった所と時刻)

問題がどこでいつ起きるかは回してみないと分からないので、1回の回で引きを高解像度(3840×2160)で撮り、
その回の stops.csv から問題を拾って、引きの映像から切り出して寄りを作る(寄りのカメラを別に置かない)。
別のタブで開く保存

作業ログ ― 依頼90・91:Unity の配膳ロボットに下げ膳を入れた

比較動画下げ膳いれる進めて

サイトの試算が正なので、先にサイトの側を整えました。試算にはもともと「下げ膳にも使う」という回し方があります。スタッフが片付けに向かうとき、空いているロボットがいれば一緒に卓へ行き、スタッフが皿を載せ終えるまで卓で待ち、洗い場へ運ぶ形です。空いているロボットがいなければ、人だけで下げます。

Unity が読む条件の表(public/sim/serving-robot-params.json)に、この下げ膳の条件を12個(6店 × ロボット1・2台、120〜131番)足し、決まりを meta.bus に書きました。今までの120条件は変えていません。試算の結果は v2.9 の results.json の同じ条件のものです。

export_params.py の差分(下げ膳の条件を足した所)

commit 41e9364cbddfdb8e9ea6748cb1da3e50852765e9
Author: Claude <noreply@anthropic.com>
Date:   Wed Nov 4 06:36:35 2026 +0900

    Unity の条件に下げ膳にも使う(mode bus)を12条件足す(120〜131番)
    
    配膳だけと配膳+下げ膳の比較動画のため。6店 × 普通・真ん中の人数 × ロボット1・2台。
    試算の結果は v2.9 の results.json の同じ条件。前の120条件は変えていない。
    
    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01LevEXRqrYPEjm1w9jgQTcD

diff --git a/tools/serving_sim/export_params.py b/tools/serving_sim/export_params.py
index 724548c..832b453 100644
--- a/tools/serving_sim/export_params.py
+++ b/tools/serving_sim/export_params.py
@@ -6,7 +6,7 @@ Unity はこの JSON を読み、値を手で写さない(LOG359 のずれ9「
 使い方: python3 export_params.py results.json <出力先>   (出力先は p2m-site の public/sim/serving-robot-params.json。unity_rules は出力先の今の値を引き継ぐ)
 - common:店に共通の値。role が "unity_measures" の値は Unity で測ってサイトに戻すための仮の値なので、Unity は読まない
 - stores:Unity で回す店(fam_p1・fam_p5・fam_p2・fam_p3・fam_p4・fam_p0、2026-11-02 から大型店の large_p6・large_p7)の値。registers はレジの数(v2.8)
-- unity_conditions:Unity で回す条件(0〜17番は店ごとに混み具合が普通の3つ。18〜53番は2026-10-29に足した空いている・混んでいるの各3つ。54〜89番は2026-10-30に足したスタッフが少ない・多いの各3つ(混み具合は普通)。計90条件)と、同じ条件の試算の結果(40回の平均)。Unity の店はレジの内側に店員が1人だけなので、レジは1つ
+- unity_conditions:Unity で回す条件(0〜17番は店ごとに混み具合が普通の3つ。18〜53番は2026-10-29に足した空いている・混んでいるの各3つ。54〜89番は2026-10-30に足したスタッフが少ない・多いの各3つ(混み具合は普通)。計90条件。90〜119番は2026-11-02に足した大型店⑧⑨。120〜131番は2026-11-04に足した下げ膳にも使う条件)と、同じ条件の試算の結果(40回の平均)。Unity の店はレジの内側に店員が1人だけなので、レジは1つ
 """
 import json
 import sys
@@ -91,6 +91,17 @@ for k in UNITY_STORES_LARGE:
             r = rows[h.key(c)]
             conds.append({"condition": c, "site_result": {m: r[m] for m in r if m not in c}})
 
+# 2026-11-04 エイイチと決めた:配膳だけと配膳+下げ膳の比較動画のため、下げ膳にも使う(mode "bus")を Unity で回す。
+# 前の120条件(0〜119番)は並びも中身も変えず、後ろに足す。店ごとに 普通・真ん中の人数で ロボット1・2台(12条件・120〜131番)。
+# 下げ膳の回し方はサイトの試算と同じ(スタッフが片付けに向かうとき、空いているロボットがいれば一緒に卓へ。皿を載せ終えたら洗い場へ)
+for k in UNITY_STORES:
+    s = h.STORES[k]
+    for robots in (1, 2):
+        c = {"store": k, "staff": s["staff"][1], "robots": robots, "arrivals_per_h": s["arrivals"][1], "mode": "bus",
+             "trays": 3, "fragile_by": "any", "registers": UNITY_REGISTERS}
+        r = rows[h.key(c)]
+        conds.append({"condition": c, "site_result": {m: r[m] for m in r if m not in c}})
+
 D = {
     "meta": {
         "schema_version": "serving-robot-params/0.4",

依頼90 で Unity に下げ膳を入れると、120回のうち4回で店が止まりました。下げ膳のロボットは先に卓へ着き、スタッフが来るのを待ちます。この待ちに上限がなく、しかも助けの決まりが「卓で受け渡し中の台は動かさない」だったので、待っている台がほかのロボットやスタッフの道をふさぐと、だれも動かせませんでした。解けずに残った詰まりは53件で、配膳だけの同じ120回では1件です。

どこで区切るつもり?

依頼91 を区切りにしました。待つのは2分まで(過ぎたら皿を載せずに待機場所へ戻り、その卓は人だけで下げる)、待っている台も助けで動かしてよい、の2つを入れ、120回を回して、結果がどうでも比較動画の素材を撮る。止めるのは瞬間移動が出たときと、同じ種で同じ結果にならなかったときだけです。2分は、料理を2分待ってもロボットが来なければスタッフが運ぶ、という前からの決まりにそろえました。

細い通路の卓には下げ膳のロボットを出さない、という案も Claude Code から出ましたが、入れていません。サイトの試算にない出し方を Unity だけで決めることになるためです。

  • ねらい:下げ膳のロボットが卓で待ち続けて、店が止まるのをなくす
  • 変わったこと:全員が帰らない回は120回中4回から1回。解けずに残った詰まりは53件から4件。上限で戻った回は14回、卓で待つ下げ膳の台を助けで動かしたのは166回。残った1回(④2台 種4)は料理の往復どうしの向かい合いで、下げ膳の台ではない
  • 見込める効果:測った値では、下の表のとおり、歩く距離は12条件すべてで減った

配膳だけ(cs:76・base73)と下げ膳にも使う(cs:78・bus75)の、店・台数ごとの中央値です(種10個)。歩いた距離はスタッフ1人の km、卓が使えるまではお客さんが帰ってからの分、入店待ちは来てから席に着くまでの分です。

店・台数歩いた距離 配膳だけ → 下げ膳も
卓が使えるまで 配膳だけ → 下げ膳も
入店待ち 配膳だけ → 下げ膳も
③1台2.72 → 2.624.97 → 5.103.47 → 3.47
③2台2.54 → 2.354.05 → 6.052.72 → 3.95
⑦1台2.74 → 2.626.47 → 6.593.87 → 3.87
⑦2台2.55 → 2.364.49 → 8.063.87 → 4.65
④1台2.37 → 2.1719.72 → 19.6611.02 → 11.39
④2台2.66 → 2.2528.61 → 30.6218.66 → 16.70
⑤1台3.22 → 3.1010.21 → 10.306.99 → 6.98
⑤2台2.87 → 2.6610.45 → 9.846.12 → 5.83
⑥1台2.58 → 2.4711.73 → 11.405.19 → 4.92
⑥2台2.37 → 2.1412.05 → 11.874.54 → 4.54
②1台1.53 → 1.333.49 → 3.011.60 → 1.62
②2台1.55 → 1.194.03 → 3.901.65 → 1.66

同じ条件の試算(v2.9)では、卓が使えるまでの時間は下げ膳にも使うとわずかに縮みます(③2台で 2.14 → 2.00分)。Unity では、③⑦のロボット2台で大きく延びました。③⑦は席を詰めた店で、細い通路が多い店です。下げ膳のロボットが卓に着いてスタッフを待つあいだ、通路が1本ふさがり、ほかのロボットとスタッフが回り道をするか待つことになります。試算はこの通路の取り合いを数えていないので、ここが Unity と試算の差です。

依頼90 の依頼文(全文)

---
作業フォルダ: /Users/shimazueiichi/Robotics_UX/ServiceSim
上限時間: 480
---
# 依頼90:下げ膳にも使う(mode bus)を Unity に入れ、120回で確かめ、比較動画の素材を撮る

エイイチの指示(2026-11-04):配膳だけと配膳+下げ膳の比較動画を作る。そのために Unity に下げ膳を入れる。
固めた版は cs:76(瞬間移動0・同じ種で同じ結果)。この版の配膳だけ(mode serve)の動きは変えない。
サイトが正:下げ膳の回し方はサイトの試算と同じにする。サイトの public/sim/serving-robot-params.json に、下げ膳の条件 120〜131番(6店 × 普通・真ん中の人数 × ロボット1・2台・mode "bus")と、meta.bus に決まりを足した(Claude・2026-11-04)。Unity はこの JSON を読み、値を手で写さない。

## 下げ膳の決まり(サイトの試算 v2.4 から。meta.bus と同じ)
- スタッフが片付けに向かうとき、空いているロボットがいれば一緒に卓へ向かう
- スタッフは卓で皿をまとめ(clear_s)、ロボットが着いたら皿を載せ(load_s)、卓を拭いて(wipe_s)戻る
- ロボットはスタッフが皿を載せ終えるまで卓で待ち、載せ終えたら洗い場へ行って皿を下ろし、待機場所へ戻る
- 空いているロボットがいなければ、人だけで下げる(今までと同じ)
- 仕事の優先順はロボットの救出 → 配膳・案内・会計・呼び出し → 下げ膳。料理はロボット最優先(2分でスタッフ)は今までどおり
- 値(clear_s・load_s・wipe_s など)は params の common から読む。洗い場の位置は店の形(public/sim/layouts/)から。洗い場でロボットが止まる点が店の形に無ければ、受け渡し口の近くの洗い場側に、店の形から決まる規則で置き、報告に書く(店の形の JSON は変えない)

## 始める前に確かめること(違えば手を止めて報告)
Unity エディタ・night_runner/rec_runner が動いていない、KIOXIA がマウント済み、unity_ledger_v1.lock がない、保留 0、作業場所が cs:76。サイトの params を git pull して 132 条件あること。台帳は退避してから回す。台帳は追記だけ。

## やること
1. 下げ膳を入れる(条件の mode が bus のときだけ働く。serve のときの動きは1行も変わらないこと)
   - 見張り(10秒で0.5m)・助け・瞬間移動なしの作りは、下げ膳の往復にも同じように効かせる。卓でスタッフを待っている間・洗い場で皿を下ろしている間は「わざと待っている間」として見張らない
   - パネルの数字のため timeline.csv に robots_bussing(下げ膳を運んでいる台数)を足す。staff_clear は今のまま
2. check-in し、画面なしの実行ファイルを作り直す(保留 0)
3. 確かめ(画面なし)
   - serve が変わっていないこと:⑦ fam_p5・2台・種7 を新しい版で回し、base73(cs:76)の同じ回と記録が1行も違わないこと
   - bus の同じ種で同じ結果:③ fam_p1・2台・bus・種7 を2回、記録が1行も違わないこと
   - 120回:条件 120〜131 × 種0〜9(同時4本・label bus74)。base73 の同じ店・台数の serve と並べる:瞬間移動、解けずに残った詰まり、全員が帰らなかった回、入店待ち・料理の待ち・客が帰ってから卓が使えるまで(turn)・スタッフ1人の歩いた距離・ロボットが下げ膳を運んだ割合の中央値、試算(serve→bus)との向き
4. 比較動画の素材を撮る(3 が合格のときだけ)
   - ③ fam_p1・2台・種7 を serve と bus で1回ずつ。カメラ・置き方・字幕などは依頼87 と同じ(wide_l30・wide_r30・4K・回の最初から終わりまで・frames.csv・timeline.csv)。置き場所 rec_compare_20261104/{serve|bus}/
   - それぞれ make_panel_video.py で通しのパネル付き動画を作る(依頼87 の whole と同じ作り方、出力は rec_compare_20261104/{serve|bus}/panel/)。2本を並べた比較動画は Claude が作る

## 変えないもの
serve のときの動き・決まり・数字。ロボットの速さ・物理の設定・譲る順番・見張りの 10秒・0.5m・30秒・60秒の線・センサー 0.6m・瞬間移動をなくした作り・店の形・台帳の列と今までの行。

## 止める線
瞬間移動が1回でも出たら、または serve の同じ回の記録が base73 と違ったら止めて報告する。

## 報告
claude_code_reports/20261104_bus90.txt に:変えたファイルと cs・build_id、洗い場の止まる点の決め方、2つの一致の確かめ、120回の表(serve と並べる)と向き、残った詰まりの中身と場所、撮った素材の場所と長さ。
**報告の最後の1行は必ず次のどれか**:「判定:合格」/「判定:止めた(決めてほしいことあり)」/「判定:失敗」

依頼90 の Claude Code の報告(20261104_bus90.txt・全文)

09_sec04.txt11,689字・222行・text
====================================================================
依頼90:下げ膳にも使う(mode bus)を Unity に入れ、120回で確かめ、比較動画の素材を撮る
2026-11-04 07:00〜08:45 作業場所 cs:76 → cs:77 build_id cs77_20261104_0746(画面なし・保留 0)
====================================================================

結論
  ・下げ膳を入れた(cs:77)。serve の回は base73 と記録が一致、bus の同じ種の2回も一致、120回で瞬間移動 0・1コマの跳び 0
  ・しかし 120 回のうち 4 回(③2台 種2・④2台 種4・④2台 種9・⑥2台 種4)で店が止まり、全員が帰らなかった
別のタブで開く保存

依頼91 の依頼文(全文)

---
作業フォルダ: /Users/shimazueiichi/Robotics_UX/ServiceSim
上限時間: 480
---
# 依頼91:下げ膳で卓に着いた台のふさぎを直し、120回を回し、比較動画の素材を撮る(ここで区切る)

エイイチと決めた区切り(2026-11-04):依頼91 が配膳ロボットのベースの最後の直し。結果がどうでも素材を撮って終える。残った詰まりや試算とのずれは記録だけにし、あとで直す。
依頼90 の報告:claude_code_reports/20261104_bus90.txt(判定:止めた)。今の作り cs:77。

依頼90 の「決めてほしいこと」への答え(エイイチ了承):
- 1:(イ) と (ウ) を入れる。(ア)(細い通路の卓には下げ膳のロボットを出さない)は入れない(サイトの試算にない出し方なので)
  (イ) 卓でスタッフを待っている下げ膳の台は、助けで動かしてよい(料理の受け渡し中の台は今までどおり動かさない)
  (ウ) 下げ膳の台が卓でスタッフを待つ時間の上限を 120 秒にする(料理の「2分でスタッフ」と同じ考え方)。過ぎたら皿を載せずに待機場所へ戻り、その卓は人だけで下げる。上限で戻った回数を数える
- 2:試しで足した a〜c はこのままでよい
- 3:素材は 1 を直してから撮る。ただし区切りに従い、120 回で全員が帰らない回が残っても止めずに撮る
- 4:題は2本を分ける:「③ 標準ファミレス・ロボット2台・配膳だけ」「③ 標準ファミレス・ロボット2台・配膳+下げ膳」

## 始める前に確かめること(違えば手を止めて報告)
Unity エディタ・night_runner/rec_runner が動いていない、KIOXIA がマウント済み、unity_ledger_v1.lock がない、保留 0、作業場所が cs:77。台帳は退避してから回す。台帳は追記だけ。

## やること
1. (イ)(ウ) を入れる(bus の回だけ働く。serve の動きは1行も変えない)。check-in し、画面なしの実行ファイルを作り直す(保留 0)
2. 確かめ(画面なし)
   - serve:⑦ fam_p5・2台・種7 が base73(cs:76)の同じ回と記録が1行も違わないこと
   - bus:③ fam_p1・2台・bus・種7 を2回、記録が1行も違わないこと
   - 120 回:条件 120〜131 × 種0〜9(同時4本・label bus75)。依頼90(bus74)・base73(serve)と並べる:瞬間移動、解けずに残った詰まり、全員が帰らなかった回、上限で戻った回数、助けの回数、入店待ち・料理の待ち・卓が使えるまで(turn)・スタッフ1人の歩いた距離・ロボットが下げ膳を運んだ割合の中央値、試算(serve→bus)との向き
3. 比較動画の素材を撮る(止める線に当たらなければ、120 回の結果に関わらず撮る)
   - ③ fam_p1・2台・種7 を serve と bus で1回ずつ。依頼90 で用意した録画の手順(6 章)で。カメラ・置き方は依頼87 と同じ。置き場所 rec_compare_20261104/{serve|bus}/。録画した回が全員帰ったかを報告に書く
   - それぞれ make_panel_video.py で通しのパネル付き動画を作る(依頼87 の whole と同じ作り方。出力 rec_compare_20261104/{serve|bus}/panel/。題は上の 4)。パネルのロボットの欄に「下げ膳」の状態が出るなら、それも確かめる(make_panel_video.py の形を変えたら差分を報告に)
   - 2本を並べた比較動画は Claude が作る

## 止める線
瞬間移動が1回でも出たとき、serve の記録が base73 と違ったとき、bus の同じ種の2回が違ったときだけ止めて報告する。

## 報告
claude_code_reports/20261104_bus91.txt に:変えたファイルと cs・build_id、確かめ、120 回の表(bus74・serve と並べる)と向き、残った詰まりの中身と場所、撮った素材の場所と長さ・全員帰ったか。
**報告の最後の1行は必ず次のどれか**:「判定:合格」/「判定:止めた(決めてほしいことあり)」/「判定:失敗」

依頼91 の Claude Code の報告(20261104_bus91.txt・全文)

10_sec04.txt12,465字・226行・text
====================================================================
依頼91:下げ膳で卓に着いた台のふさぎを直し、120回を回し、比較動画の素材を撮る(ここで区切る)
2026-11-04 09:39〜12:20 作業場所 cs:77 → cs:78 build_id cs78_20261104_1011(画面なし・保留 0)
====================================================================

結論
  ・(イ) と (ウ) を入れた(cs:78。bus の回だけ働く)。serve の回は base73 と記録が一致、bus の同じ種の2回も一致
  ・120 回(bus75):瞬間移動 0・1コマの跳び 0。全員が帰らなかった回は 4 回 → 1 回(④2台 種4)。
別のタブで開く保存

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

依頼91 で、③の店・ロボット2台・種7 を、配膳だけと下げ膳にも使うの2通りで撮りました。どちらも全員が帰っています。それぞれのパネル付きの通しの動画を、左右に並べて同じ速さ(10.5倍)で同時に流し、下にその回の4つの数字を置きました。2本は同じ開店からの時刻で進むので、同じ瞬間の店の様子を見比べられます。

③の店のロボット2台で、左が配膳だけ、右が配膳+下げ膳。同じ開店から1時間44分の様子と、その回の4つの数字

この1回の数字は、スタッフ1人が歩いた距離が 2.65km → 2.38km、卓が使えるまでが 3.4分 → 4.7分、入店待ちが 3.1分 → 3.4分、ロボットを助けた回数が 20回 → 41回です。歩く距離は減ったけれど、ほかは悪くなりました。良い面だけを切り取らず、そのまま並べています。

サイトでは、試算のページで③の店を選び「Unity で動かすと」を押すと、いつもの動画の下にこの比較動画が出ます。

make_compare.py(比較動画を作るコードの全文)

"""配膳だけと配膳+下げ膳のパネル付き通し動画を左右に並べ、下に数字の帯を付ける(2026-11-04・Claude)
使い方: python3 make_compare.py  (rec_compare_20261104/ の中で)"""
import json, subprocess
from PIL import Image, ImageDraw, ImageFont
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(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),"③ 標準ファミレス・ロボット2台 配膳だけ と 配膳+下げ膳",font=F(40,True),fill=INK)
d.text((W-40,34),"同じお客さんの来かた(種7)・同じ速さ",font=F(24),fill=Q,anchor="ra")
VW,VH,Y0=936,527,150
for i,(m,lab) in enumerate((("serve","配膳だけ"),("bus","配膳+下げ膳"))):
    x=16+i*(VW+16); d.text((x,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]; good=(b<a)==low
    d.text((40,y+6),name,font=F(30),fill=INK)
    fa=("%%.%df"%dp)%a; fb=("%%.%df"%dp)%b
    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=GOOD if good else BAD,anchor="ra")
    d.text((1460,y+8),"減った" if b<a else "増えた",font=F(28,True),fill=GOOD if good else BAD)
    y+=78
d.text((40,H-44),"Unity の中で1回動かした結果です。実際のロボットや人が同じ動きをするとは限りません。",font=F(22),fill=Q)
im.save("compare/bg.png")
dur=max(76.2,75.1)
vf=("[1:v]scale=%d:%d[a];[2:v]scale=%d:%d,tpad=stop_mode=clone:stop_duration=2[b];"
    "[0:v][a]overlay=16:%d[t];[t][b]overlay=%d:%d,format=yuv420p"%(VW,VH,VW,VH,Y0,16+VW+16,Y0))
subprocess.run(["ffmpeg","-y","-v","error","-loop","1","-i","compare/bg.png","-i","serve/panel/whole_wide_l30_panel.mp4","-i","bus/panel/whole_wide_l30_panel.mp4",
  "-filter_complex",vf,"-t","%.2f"%dur,"-r","30","-c:v","libx264","-preset","veryfast","-crf","22","-movflags","+faststart","compare/compare_serve_bus_p1_s7.mp4"],check=True)
subprocess.run(["ffmpeg","-y","-v","error","-ss","40","-i","compare/compare_serve_bus_p1_s7.mp4","-frames:v","1","compare/compare_mid.png"],check=True)
print("ok")

serving-robot.html の差分(③の動画の下に比較動画を足した所)

11_sec05.txt3,542字・35行・diff
diff --git a/public/sim/serving-robot.html b/public/sim/serving-robot.html
index dc846e6..eeb72a1 100644
--- a/public/sim/serving-robot.html
+++ b/public/sim/serving-robot.html
@@ -172,6 +172,8 @@ footer { color: var(--ink-3); font-size: 11px; }
 .pv-sw button:focus-visible { outline: 2px solid #111; outline-offset: 2px; }
 .pv-unity video { display: block; width: 100%; aspect-ratio: 16 / 9; background: #3a3a3a; border-radius: 4px; }
 .pv-plan[hidden], .pv-unity[hidden] { display: none; }
別のタブで開く保存

作業ログ ― 区切りで残したこと

決めた区切りに従って、次のことは直さずに記録だけにしています。

残したこと中身いまの扱い
④2台 種4 の向かい合い
料理を運ぶ2台が向かい合って止まり、全員が帰らない
記録だけ。下げ膳とは関係ない
立ち往生の多さ
立ち往生が1回でもあった往復の割合 0.062(試算 0.01)
記録だけ。試算の値は変えない
⑦の細い通路
見張りで止まった台が入口側の通路をふさぎ、入店待ちが延びる回がある
記録だけ
下げ膳で試算と逆になった向き
卓が使えるまでと入店待ちの向きが試算と逆の10本
記録だけ
下げ膳の待ちの上限2分
いまは Unity のコードの定数。サイトの試算には上限がない
サイトの試算の決まりに足すかは、これから決める
録画した回と録画しない回の違い
同じ種でも、録画すると860秒ごろから記録が分かれる
記録だけ。動画の映像とパネルの数字は同じ回なので合っている

これで、配膳ロボットのベースは一区切りです。次は、配膳ロボットでまだできていない大型店⑧⑨を足し、そのあとほかの種類のロボットへ進みます。