サービスロボット導入シミュレーション Log#14 | 動画は2回目へ、次は3Dの店で止まる所を見る
配膳ロボットを入れたら、ホールのスタッフを1人減らせるのか。ファミレスの混む2時間をパソコンの中で再現して確かめると、減らせる条件は見つかりました。ロボットが食事中に席を回って、お客さんに空いた皿を載せてもらう使い方で、ロボットが3台のときです。ところが、1人減って浮く人件費は月約14.1万円、ロボット3台を借りる費用は月約21.6万円で、1人減らせても、差し引きは月約7.5万円の持ち出しでした。
この記事は、その結果を伝える YouTube の解説動画(13分35秒)を作った記録です。動画は、配膳ロボットの導入を試算するシリーズの2回目にあたります。1回目では、スタッフ3人のままロボットを0台から6台まで増やし、料理を運ぶだけなら、どの台数でも3人を2人にすると店が回らない、という結果を伝えました。その最後で「まず、人は減らせるのか、月いくら浮くのか」と次の回を予告しています。
じつはこの2回目の動画は、一度できあがっていました。3日前に作った「配膳ロボットで1人減らせるか」という単発の動画で、まだ公開していませんでした。その後、試算の作りを直して数字が変わったため(料理はまずロボットを待つ、という決まりを入れた版。v2.7)、シリーズの2回目として作り直すことにしました。数字を差し替えるだけのつもりが、前の版の冒頭の「料理は早く届くのに、席に着くまでが延びる」は、新しい数字では成り立ちませんでした(料理の届く速さは58秒から54秒で、ほとんど変わらない)。話の芯を組み直し、お金の章を新しく足しています。
台本は、別の AI(codex)に「台本を論破するつもりで」検証してもらい、2回直しました。指摘の中心は数字の写し間違いではなく、パソコンの中で「必要な人数が1人減る」ことを、実際の店で「1人分の給料が減る」ことまで広げて話していた点でした。
| やったこと | なぜ | 結果 |
|---|---|---|
未公開の動画を、シリーズ2回目として台本から作り直した | 試算の数字が変わり、1回目の予告(減らせるか・月いくら浮くか)に合わせるため | 「料理を運ぶだけでは減らせない → 皿を集めて回ると3台で減る → お金は残らない」の3章にした |
台本の数字を、別の AI に全部計算し直してもらった | 数字の取り違えを、書いた本人とは別の目で見つけるため | 数字の食い違いは0。言い方を4か所直した |
codex に2回検証してもらった | 言い過ぎや抜けている前提を見つけるため | 1回目22件・2回目13件の指摘。どちらも「直してから・条件つきで成立」 |
声を作ったあと、13文を抜いた | 16分29秒あり、目安(13〜14分)を超えたため | 13分35秒になった |
背景に流す試算ページの録画を6本録り直した | 1回目の録画では、この回の条件が映っていないため | 画面のほぼ全部で、この回の条件の試算が後ろに流れる |

ところが、記事にまとめる前に、もう一度サイトの試算を開くと、試算が次の版(v2.8)に変わっていました。会計をレジで1組ずつさばく作りを入れた版です。初めに表示されるレジ1つの条件では、2人+ロボット1台でも、料理を運ぶだけで「店が回る」になります。動画の結論とは逆です。レジを2つにすると、動画とほぼ同じ結果になります。動画をこのまま出すか、v2.8 の数字で直すかは、まだ決めていません。 その比べは、記事の後半に全部載せています。動画の最後では、次の回の予告として、店の図面から3Dの店を建ててロボットを走らせ、この試算に入っていない「通路で止まる所」を見る、と伝えています。
作業ログ ― 第2回にする前の動画と、試算の版
この記事の作業は、1つの会話の中で、台本の書き直しから YouTube に上げるものをそろえるまで進めました。効果の欄(ねらい・変わったこと・見込める効果)のうち、数字があるものは測った値、ないものは見込みです。
- 作り直す前の動画:「配膳ロボットで1人減らせるか」(2026-10-22 に作った8版・試算 v2.4・13分39秒・未公開)
- 1回目の動画:「配膳ロボット何台で店は変わる? 2台まで変わり、人は減らせなかった【導入シミュレーション 第1回】」(試算 v2.7・2026-11-09 19:30 に公開予約)
- この回の数字:サイトの試算 v2.7(p2m-site の public/sim/serving-robot.html に埋め込みの結果・16,425条件・各40回の平均・md5 88adf2b2)
- 作業フォルダ:iCloud
PixelstoMotors/デジタルツイン学習R2R2R/動画/配膳ロボットで1人減らせるか/。前の版のファイルは動画/_旧版/置き換え前_20261025_配膳ロボットで1人減らせるか_第2回化/に移した - 重いファイル:KIOXIA
r2r2r-data/videos/配膳ロボットで1人減らせるか/
始まりは、次の問いでした。
何台入れたら店は変わるの動画の台本って続き分あるんでしたっけ?
作業フォルダを見ると、続きにあたる台本は前の版の1本だけで、前日に決めた「第2回にして、最新の試算の数字に直す」には、まだ手が付いていませんでした。そこから作り直しを始めています。
台本を v2.7 の数字で書き直し、お金の章を足した
数字は、試算ページに埋め込まれた結果から読んだ
試算のページ(serving-robot.html)には、全部の条件の結果が JSON で埋め込まれています。ページと同じ決め方(ロボット0台は「料理を運ぶだけ・1卓ずつ」の行、ほかは「1往復で最大3つ・壊れやすい皿は誰が運んでもよい」の行。「店が回らない」は ng=1)で読み、費用はページの費用の欄の既定値で計算しました。
numbers_v27_for_script.py
# 第2回の台本に使った数字を、試算 v2.7(サイトの試算ページに埋め込みの結果)から読み、費用の式で計算する
# 使い方: python3 numbers_v27_for_script.py <v2.7 の serving-robot.html>
# 決め方は試算ページと同じ(find: ロボット0台は「料理を運ぶだけ・1卓ずつ・誰でも」の行、ほかは「最大3つ・誰でも」。店が回らない=ng=1)
import json, sys
s = open(sys.argv[1], encoding='utf-8').read()
i = s.find('const D = ') + len('const D = ')
D, _ = json.JSONDecoder().raw_decode(s[i:])
k = D['k']; rows = [dict(zip(k, x)) for x in D['r']]
IDX = {(r['store'], r['staff'], r['robots'], r['arrivals_per_h'], r['mode'], r['trays'], r['fragile_by']): r for r in rows}
def find(st, rb, arr, mode):
key = ('family', st, 0, arr, 'serve', 1, 'any') if rb == 0 else ('family', st, rb, arr, mode, 3, 'any')
return IDX[key]
def fm(r):
return (f"入店 {r['entry_wait_mean']:.2f}分・席はあるのに {r['staff_wait_mean']:.2f}分・満席 {r['full_wait_mean']:.2f}分・"
f"料理 {r['dish_wait_mean']*60:.1f}秒・歩く {r['walk_km_per_staff']:.2f}km・回らない {r['ng']}")
def min_staff(rb, arr, mode):
for st in D['stores']['family']['staff_all']:
if find(st, rb, arr, mode)['ng'] == 0:
return st
print('model', D['common']['model'], '条件の数', len(rows))
print('3人・0台 ', fm(find(3, 0, 35, 'serve')))
print('2人・2台・運ぶだけ ', fm(find(2, 2, 35, 'serve')))
print('2人・2台・まとめた皿 ', fm(find(2, 2, 35, 'bus')))
print('2人・6台・運ぶだけ ', fm(find(2, 6, 35, 'serve')))
for n in range(1, 7):
print(f'2人・{n}台・集めて回る ', fm(find(2, n, 35, 'patrol')))
print('3人・2台・運ぶだけ ', fm(find(3, 2, 35, 'serve')))
for arr in (35, 45):
for mode in ('serve', 'bus', 'patrol'):
print(f'店が回る最少のスタッフ {arr}組/時・{mode}: ' + ','.join(str(min_staff(n, arr, mode)) for n in range(7)))
# 費用(試算ページの COST の既定)
WAGE, PEAKS, DAYS = 1177, 2, 30
RENT, MAINT, CHARGE = 60000, 10000, 2000
BUY, SUB_RATE, SUB_CAP, YEARS = 2500000, 0.5, 7500000, 5
labor = lambda h: h * PEAKS * DAYS * WAGE
rent = lambda n, p=RENT: n * (p + MAINT + CHARGE)
print()
print('浮く人件費(2時間)', labor(2), '(4時間)', labor(4))
print('3台を月6万円で借りる', rent(3), '差し引き', labor(2) - rent(3))
print('3台を月3万円で借りる', rent(3, 30000), '差し引き', labor(2) - rent(3, 30000))
print('4時間ずつ・月6万円', labor(4) - rent(3))
print('2台を月6万円で借りる', rent(2), '差し引き', labor(2) - rent(2))
print('3人+2台(人は減らさない)の追加', rent(2))
total = 3 * BUY; sub = min(total * SUB_RATE, SUB_CAP); first = total - sub; run = 3 * (MAINT + CHARGE)
print('買う:本体', total, '補助金', sub, '自己負担', first, '保守と充電', run,
'取り戻す月数', round(first / (labor(2) - run), 1), '補助金なし', round(total / (labor(2) - run), 1),
'5年で割った月の差し引き', round(labor(2) - (first / (YEARS * 12) + run)))
numbers_v27_for_script_output.txt
model v2.7 条件の数 16425
3人・0台 入店 8.58分・席はあるのに 7.41分・満席 0.93分・料理 57.9秒・歩く 3.88km・回らない 0
2人・2台・運ぶだけ 入店 14.26分・席はあるのに 13.24分・満席 0.79分・料理 53.5秒・歩く 3.48km・回らない 1
2人・2台・まとめた皿 入店 14.30分・席はあるのに 13.26分・満席 0.82分・料理 59.9秒・歩く 2.90km・回らない 1
2人・6台・運ぶだけ 入店 15.37分・席はあるのに 14.16分・満席 0.97分・料理 31.0秒・歩く 3.59km・回らない 1
2人・1台・集めて回る 入店 17.02分・席はあるのに 15.45分・満席 1.33分・料理 132.6秒・歩く 3.50km・回らない 1
2人・2台・集めて回る 入店 11.68分・席はあるのに 10.47分・満席 0.97分・料理 74.2秒・歩く 2.62km・回らない 1
2人・3台・集めて回る 入店 7.54分・席はあるのに 6.85分・満席 0.46分・料理 51.7秒・歩く 2.46km・回らない 0
2人・4台・集めて回る 入店 7.21分・席はあるのに 6.35分・満席 0.62分・料理 39.5秒・歩く 2.52km・回らない 0
2人・5台・集めて回る 入店 9.78分・席はあるのに 8.71分・満席 0.84分・料理 33.6秒・歩く 2.60km・回らない 0
2人・6台・集めて回る 入店 8.77分・席はあるのに 7.56分・満席 0.98分・料理 31.7秒・歩く 2.58km・回らない 0
3人・2台・運ぶだけ 入店 3.16分・席はあるのに 2.35分・満席 0.58分・料理 61.5秒・歩く 2.35km・回らない 0
店が回る最少のスタッフ 35組/時・serve: 3,3,3,3,3,3,3
店が回る最少のスタッフ 35組/時・bus: 3,3,3,3,3,3,3
店が回る最少のスタッフ 35組/時・patrol: 3,3,3,2,2,2,2
店が回る最少のスタッフ 45組/時・serve: 4,3,3,3,3,3,3
店が回る最少のスタッフ 45組/時・bus: 4,3,3,3,3,3,3
店が回る最少のスタッフ 45組/時・patrol: 4,3,3,3,3,3,3
浮く人件費(2時間) 141240 (4時間) 282480
3台を月6万円で借りる 216000 差し引き -74760
3台を月3万円で借りる 126000 差し引き 15240
4時間ずつ・月6万円 66480
2台を月6万円で借りる 144000 差し引き -2760
3人+2台(人は減らさない)の追加 144000
買う:本体 7500000 補助金 3750000.0 自己負担 3750000.0 保守と充電 36000 取り戻す月数 35.6 補助金なし 71.3 5年で割った月の差し引き 42740
前の版(v2.4)から変わった数字
| 見るもの | 前の版(v2.4) | この回(v2.7) |
|---|---|---|
3人・ロボットなし:席に着くまで | 8.6分 | 8.6分 |
2人+2台・料理を運ぶだけ:料理が卓に届くまで | 40秒(58秒から縮む) | 54秒(ほとんど変わらない) |
2人+2台・料理を運ぶだけ:席に着くまで | 15.0分 | 14.3分 |
2人・皿を集めて回る3台:席に着くまで | 8.4分 | 7.5分 |
2人・皿を集めて回る2台:席は空いているのに待った時間 | 10.8分 | 10.5分 |
v2.7 では、料理ができたら、まずロボットを待ちます。2分たってもロボットが空かなければ、人も運べるようになります。前の版の「料理は早く届くのに」という冒頭は、この決まりで成り立たなくなりました。冒頭は、配膳ロボットを入れた宮崎県の飲食店の人がテレビの取材で話した言葉(「1人にはならないですけれども、0.5だとか、0.25にはなるので」)から入る形に替えています。
1回目と重なる話を外し、3つの章にした
1回目と重なる、試算の道具(SimPy)の説明、ロボットを6台にしたら回るかのクイズ、焼肉の食べ放題と洗い場が遠い店の話は外しました。本編は次の3章です。
- 料理を運ぶだけだと、なぜ1人減らせないのか(片付けと案内が人に残る)
- 皿を集めて回ると、何が変わるのか(食べ終わったあとの片付けが軽くなり、3台で2人でも回る)
- 1人減ったら、月いくら浮くのか(浮く人件費より、ロボットの費用が高い)
- ねらい:1回目の最後の予告(減らせるか・月いくら浮くか)に、2回目で答える
- 変わったこと:前の版になかった費用の章を足し、「人は減らせても、お金は残らない」という結論にした
- 見込める効果:導入を考える飲食店や、ロボットを提案する会社が気にする「結局いくらか」まで話が届く。見てもらえたかは、公開後の視聴の続き具合で確かめる
台本を書いた本人とは別の AI に、数字を全部計算し直してもらった
台本を書いたあと、別のエージェントに、埋め込みの結果と費用の式から台本の数字を1つずつ計算し直してもらいました。依頼したのは、数字の照合と、言い過ぎ・定義とのずれ・皿を集めて回る使い方が設定によって変わるか・元を取るまでの期間の4点です。返ってきた報告の全文です。
agent_check_report.md(別のエージェントの照合の報告・全文)
台本の数字はすべて D.json と費用の式から計算し直しました。数字の食い違いは一つもありません。ただ、言い方の問題が4つあり、そのうち2つは直した方がいい所です。(ng = 席はあるのに待った時間 staff_wait_mean が10分以上、という決まりは、16,425行すべてで成り立っていました。)
| 文番号 | 台本の数字 | データの値 | 判定 | メモ |
|---|---|---|---|---|
| S004 | 混む2時間 | peak_min 120 | 一致 | |
| S012 | 2人・料理を運ぶだけ、どの台数でも回らない | 1〜6台すべて ng(0台も ng) | 一致 | |
| S018 | 10分以上で「回らない」 | ng の決まりと同じ | 一致 | |
| S020 | 35卓・35組・40回 | 35卓・35組/時・ページに「40回の平均」 | 一致 | |
| S022/S083 | 皿を集めて回る、3台以上で2人 | 既定の設定では 3〜6台が ng=0 | 一致(条件つき) | 下の3を参照 |
| S023/S061/S062 | 月約14.1万円 | 2×2×30×1,177=141,240円 | 一致 | |
| S023/S064 | 3台で月21.6万円 | 3×72,000=216,000円 | 一致 | |
| S024/S065/S084 | 月約7.5万円の持ち出し | −74,760円 | 一致 | |
| S035 | 料理 58秒→54秒 | 0.965分→0.892分 | 一致 | |
| S036 | 8.6分→14.3分 | 8.58→14.26 | 一致 | |
| S037 | そのうち13.2分 | 13.24 | 一致 | |
| S042 | 下げ膳にも、2台で14.3分「線を超えました」 | 入店 14.30/席はあるのに 13.26・ng | 言い方 | 線は「席はあるのに待った時間」で引くので、14.3分(入店までの時間)を線と比べるのはずれる。13.3分と言うべき所。3〜6台も ng |
| S044/S077/S083 | 料理を運ぶだけ、6台でも回らない | 2人6台 ng(14.16) | 一致 | |
| S049 | 2台で10.5分、少しだけ超えた | 10.47・ng | 一致 | |
| S050 | 3台で7.5分、3人0台の8.6分より短い | 7.54 対 8.58 | 一致 | |
| S051 | 料理 52秒、4〜6台も線の内側 | 0.862分。席はあるのに 6.35/8.71/7.56 | 一致 | 5台は入店 9.78分で 8.6分より長い。台本は「短い」とは言っていないので問題なし |
| S053 | 3.9km→2.5km | 3.88→2.46 | 一致 | |
| S056 | 45組なら、どの台数でも2人では回らない。4人→3人 | 2人の席はあるのに 14.7〜24.6分・すべて ng。最少人数 4/3/3/3/3/3/3 | 一致 | 料理を運ぶだけ・下げ膳にもでも同じ 4→3 |
| S067 | 月約1.5万円のプラス | 141,240−126,000=+15,240円 | 一致 | |
| S068 | 月約28.2万円、月約6.6万円のプラス | 282,480円/+66,480円 | 一致 | 試算は2時間だけ。4時間2人で回るかは試算の外まで伸ばした話 |
| S069 | 375万円、月約4.3万円のプラス、約3年 | 375万円、月98,500円 → +42,740円、375万÷(141,240−36,000)=35.6か月 | 一致(言い方) | 下の4を参照 |
| S070 | 混雑の日は2人では回らない | 上と同じ | 一致 | |
| S073 | 3人2台で 8.6→3.2分 | 3.16 | 一致 | 前回の 3.2分とも合う |
| S006/S060 | 人件費よりロボットの費用が高い | 借りる場合は −7.5万円。買う場合は +4.3万円 | おおむね一致 | すぐ後に「借りる値段しだい」と断っているので許容 |
**お願いされた4点**
1. **言い過ぎ**:大きな言い過ぎはありません。S046「2人でも回るようになります」は、3台以上・既定の設定のときだけです。直前と直後の文が補っています。
2. **決まりとのずれ**:S042 だけです。入店までの時間(14.3分)を10分の線と比べています。線の対象は席はあるのに待った時間(13.3分)です。結論(超えた)は変わりません。
3. **皿を集めて回る使い方の「3台で2人」**:成り立つのは、壊れやすい皿を誰が運んでもよいときだけです。既定の「1往復で最大3つ」でも、「1往復で1つ」でも同じです。
| 設定 | 2人で回る台数 | 席はあるのに待った時間(1〜6台) |
|---|---|---|
| 最大3つ・誰でも(既定) | 3〜6台 | 15.45/10.47/6.85/6.35/8.71/7.56 |
| 最大1つ・誰でも | 3〜6台 | 7.69 などで、3台以上はすべて10分未満 |
| 最大3つ・壊れやすい皿は人 | 3台だけ | 4〜6台は 10.43/10.28/10.57 で ng |
| 最大1つ・壊れやすい皿は人 | 5台だけ(9.81) | 3台 10.16、4台 10.19、6台 10.7 で ng |
4. **元を取るまでの期間**:375万円 ÷(141,240 − 36,000)= 35.6か月です。「約3年」は妥当です。
**直すべき所**
- **S042**:「席に着くまで14.3分。こちらも線を超えました」を、「席はあるのに待った時間が13.3分。こちらも線を超えました」に直す。
- **S022/S083 の「3台以上」**:前提の一言を足す。例えば「デザートやドリンクもロボットが運んでよい、という前提で」です。壊れやすい皿を人が運ぶ設定だと、4〜6台では回りません。
- **S069(直した方がよい)**:言い方の問題です。「月約4.3万円のプラス」は、5年で割った買う額を引いた後の数字です。「約3年」は、保守と充電だけを引いた月約10.5万円で割った数字です。並べると、聞く人が 375万÷4.3万=約7年と取り違えます。例えば「保守と充電を引いて月約10.5万円浮くので、約3年で取り戻せる」と、割る数を示すとよいです。
- **S068(任意)**:「試算は混む2時間だけで、4時間まで2人で回るかは確かめていない」と一言足すと正確です。
報告のとおり、まとめた皿も運ぶ使い方は「席は空いているのに待った時間が13.3分」と言い直し、皿を集めて回る使い方の結果はデザートやドリンクもロボットが運んでよい前提だと足し、買う場合の約3年は割る数(月約10.5万円)を言う形に直しました。
codex に2回検証してもらった
この記事のコード・ログ・データは、1ファイルずつ下に置いています。全文はリンク先にあります。
ファイルの一覧(8本)
01_sec03.py.txt ― 1回目の指摘は、試算のコードを開いて確かめた / haizen_sim.py v2.7 の 300〜546 行目(料理を運ぶ・食事中の回収・下げ膳・1組の流れ)・10,538字
02_1_codex___1_.md ― 1回目の指摘は、試算のコードを開いて確かめた / codex_検証結果_1回目.md・8,935字
03_2_codex___2_.md ― 2回目は「別の条件の費用を結びつけていた」を見つけた / codex_検証結果_2回目.md・6,275字
04_6_src_rec__.py.txt ― 背景に流す試算ページを、この回のために6本録った / src/rec_背景の録画.py・5,808字
05_1_narration.py.txt ― 動画/配膳ロボットで1人減らせるか/narration.py(台本・12版)・15,338字
06_1_scenes.py.txt ― 動画/配膳ロボットで1人減らせるか/scenes.py・21,782字
07_1_make_docs.py.txt ― 動画/配膳ロボットで1人減らせるか/make_docs.py(codex の依頼文と読み物の台本を作る)・8,666字
08_sec11.md ― 動画/配膳ロボットで1人減らせるか/台本_配膳ロボットで1人減らせるか.md(読み物の台本)・6,569字
Mac の「codex 係」(5分ごとに作業フォルダの印を探し、検証の依頼文を codex に渡すスクリプト)に、2回かけました。依頼文は make_docs.py が台本から作ります(全文は記事の最後)。
| 回 | かかった時間 | 検索の回数 | 指摘の数 | 判定 |
|---|---|---|---|---|
| 1回目 | 33分32秒 | 34 | 22 | 直してから・条件つきで成立 |
| 2回目 | 6分37秒 | 16 | 13 | 直してから(作り直しは不要)・条件つきで成立 |
1回目の指摘は、試算のコードを開いて確かめた
1回目の中心の指摘は、「お客さんが一定の量の皿を載せてくれる」という言い方では、結論を支える前提の強さが伝わらない、というものでした。試算のコード(haizen_sim.py v2.7)を開くと、そのとおりでした。食事中の回収(collect_visit)は、空いた皿があるか・お客さんが断るかを見ずに、回収を1回数えます。食べ終わったあとの下げ膳(bus)は、人の往復の回数を「2 − 回収の回数」に減らし、0回なら皿をまとめる40秒も省きます。つまり、2回回収できれば、食べ終わったあとに下げる皿は残らない設定です。
もう1つ、料理をロボットに載せる人の時間と、集めた皿を洗い場で降ろす人の時間が、コードのどこにもないことも確かめました(人が料理を置く staff_place_s は、人が運ぶときだけ)。
haizen_sim.py v2.7 の 300〜546 行目(料理を運ぶ・食事中の回収・下げ膳・1組の流れ)
# v2.6 までは、はじめから「先に空いた方」だったため、受け渡し口の横で待つスタッフが多く運んでいた。
# ロボットが出るときは、受け渡し口で待っている料理を段の数までまとめて載せ、近い卓から回る。
def deliver(self, d, fragile=False, counted=True):
env, p = self.env, self.p
rec = {"d": d, "ready": env.now, "fragile": fragile, "counted": counted,
"taken": env.event(), "arrived": env.event()}
robot_ok = self.robots is not None and not (fragile and p["fragile_by"] == "staff")
if not robot_ok:この2点を台本に入れたほか、1回目の指摘で直したことは次のとおりです。
- お金は「料理を載せる人や皿を降ろす人の勤務を増やさずに、実際のシフトで1人分の給料を減らせた場合の仮の計算」と言う。2時間だけ人を減らすシフトは試していない
- 混雑の日(1時間に45組)も、要る人数はロボットなしの4人が3人になり、1人減る。前の版の「毎日1人減らせるとは限らない」の言い方を直した
- 買う場合は本体3台で750万円、補助金を受け取れれば自己負担375万円。代金は先に払う。補助金なしでは約6年で、5年使う前提に収まらない
- 借りる値段の「相場の真ん中が6万円台」は出典で確かめられないので外し、仮に置いた値と言う
- 「ロボットが1人分を丸ごと受け持てる」は外し、冒頭の「0.5人分」という実感と試算はそのまま比べられない、と言う
- 3台という答えは10分の線に左右される(2台は10.5分で、線のすぐ上)。調べたのは6台まで。40回の平均で、日ごとのばらつきは示していない
採らなかったのは、見立ての1文目の言い換えです。「人を減らせるかは、ロボットに何を受け持たせるかで決まる」は本人の言葉なのでそのまま残し、次の文で「何を受け持たせ、人の仕事をどう組み直すか」を足しました。
codex_検証結果_1回目.md
# codex 敵対的検証 結果 1回目(配膳ロボットで1人減らせるか)
- 日時: 2026-10-25 09:08(JST)
- 依頼文: codex_敵対的検証依頼_配膳ロボットで1人減らせるか.md(md5 c94c3d8bf6741b6e5afc39fbc7adc34c・27,552 バイト)
- 題(依頼文の1行目): # 敵対的検証依頼:YouTube台本「配膳ロボットは「0.5人分」? ― 1人減らせる条件と、月いくら浮くかを試算した(配膳ロボット導入シミュレーション 第2回)」
- codex: codex-cli 0.163.0-alpha.11
- モデル: gpt-6.1-sol
- 考える深さ: high2回目は「別の条件の費用を結びつけていた」を見つけた
2回目で必ず直すように言われたのは4か所でした。料理の時間は「料理ができてから卓に届くまで」と言う(注文から届くまでと取り違えないように・2か所)、補助金は条件を満たして受け取れた場合で、導入をきっかけに解雇すると対象外や返還になる条件があると言う、そして、人を減らさずに3人+2台にする話のすぐあとに「月7.5万円」を置いていた所です。3人のまま2台足すなら、費用は月14.4万円の追加で、月7.5万円は「1人減らして3台」の差し引きでした。
そのほか、線を11分にすると2台で足り、持ち出しは月約3,000円になること、導入時の設定や研修の費用は入れていないこと、借りる契約でも支援の対象になるものがあること、人が食事中に皿を下げる方法とは比べていないことを足しました。
codex_検証結果_2回目.md
# codex 敵対的検証 結果 2回目(配膳ロボットで1人減らせるか)
- 日時: 2026-10-25 09:31(JST)
- 依頼文: codex_敵対的検証依頼_配膳ロボットで1人減らせるか.md(md5 219f39a23913e9d1be3c64d291ee0e87・30,692 バイト)
- 題(依頼文の1行目): # 敵対的検証依頼:YouTube台本「配膳ロボットは「0.5人分」? ― 1人減らせる条件と、月いくら浮くかを試算した(配膳ロボット導入シミュレーション 第2回)」
- codex: codex-cli 0.163.0-alpha.11
- モデル: gpt-6.1-sol
- 考える深さ: high声は16分29秒あり、13文を抜いて13分35秒にした
台本を確かめてもらったあと、Mac で ElevenLabs のハコブくんの声を93文ぶん作りました。長さを測ると16分29秒で、目安の上限(13〜14分)を2分半ほど超えていました。声を作り直さずに、次の13文を抜く案を出し、そのまま決まりました。
| 抜いた文 | 中身 | 秒 |
|---|---|---|
| S013 | 1回目からの続きを言う文 | 9 |
| S025・S026 | 「割に合わないと言いたいわけじゃない…」 | 18 |
| S038 | 「空いた卓には皿が残ったまま…」 | 11 |
| S047 | 食べ放題の店の事例 | 14 |
| S051 | 「2台の10.5分は線のすぐ上…」(お金の章に同じ話がある) | 12 |
| S052 | 「食事中に皿が減っていくので…」 | 10 |
| S053 | 歩く距離 3.9→2.5キロ | 12 |
| S056 | 「これは40回の平均です」 | 8 |
| S061 | 3つ目の章の「一言で言うと」 | 7 |
| S073 | 設定・研修の費用は入れていない/2時間だけのシフトは試していない | 17 |
| S079 | 見立ての中の、結果の繰り返し | 18 |
| S084 | 観察シート | 24 |
codex に必ず直すように言われた文と、本人の言葉の文は、どれも残しています。抜いた設定・研修の費用と観察シートは、概要欄に書きました。声は、番号を付け直した別のフォルダ(voice_eleven/ハコブ_抜き後/)に写し、元の voice_eleven/ハコブ/ は残しています。
抜いたあと、見立ての所で「ただ、」で始まる文が2つ続きました(「ただ、人が食事中に皿を下げたり…」「ただ、導入したばかりなら…」)。2つ目の頭を「それに、」に直し、その1文だけ声を作り直しています。
- ねらい:動画を冗長にしない(細かい説明が続くと視聴者が飽きる)
- 変わったこと:93文・16分29秒 → 80文・13分35秒(書き出した動画の長さ。声の長さと間の合計では13分51秒)
- 見込める効果:最後まで見てもらえる割合が上がる見込み。公開後に YouTube の視聴の続き具合で確かめる
voice_lengths_抜き後.txt(抜いたあとの80文の声の長さと、後ろの間・積み上げた時間)
000 S001 hook 6.11 0.35 6.5
001 S002 hook_voice 5.41 1.2 13.1
002 S003 hook_q 5.88 1.2 20.1
003 S004 hook_try 9.40 0.35 29.9
004 S005 hook_found 7.55 1.2 38.7
005 S006 hook_cost 12.59 1.8 53.0
006 S007 title 3.87 0.35 57.3
007 S008 title 6.27 1.2 64.7
008 S009 title_eiichi 10.76 1.8 77.3
009 S010 question 8.12 1.2 86.6
010 S011 series 2.59 0.35 89.6
011 S012 series 11.73 1.2 102.5
012 S013 define 7.55 0.35 110.4
013 S014 define2 5.64 0.35 116.4
014 S015 define2 5.88 0.35 122.6
015 S016 define2 5.88 1.2 129.7
016 S017 define3 20.35 1.2 151.2
017 S018 scope 12.28 0.35 163.9
018 S019 scope 15.65 0.35 179.9
019 S020 scope 12.51 1.2 193.6
020 S021 answer 13.48 0.35 207.4
021 S022 answer_cost 12.75 0.35 220.5
022 S023 answer_cost 4.13 1.2 225.8
023 S024 toc 1.72 0.35 227.9
024 S025 toc 3.55 0.35 231.8
025 S026 toc 3.00 0.35 235.1
026 S027 toc 2.77 0.35 238.3
027 S028 toc 8.52 1.8 248.6
028 S029 c1 5.07 1.2 254.9
029 S030 c1 6.53 1.2 262.6
030 S031 entry 14.52 0.35 277.5
031 S032 entry 6.19 1.2 284.8
032 S033 why 6.61 0.35 291.8
033 S034 why2 11.31 1.2 304.3
034 S035 honne1 9.48 0.35 314.1
035 S036 honne1 7.89 1.2 323.2
036 S037 bus 13.32 0.35 336.9
037 S038 bus 10.61 1.2 348.7
038 S039 c1_end 3.24 1.8 353.8
039 S040 c2 4.68 1.2 359.6
040 S041 c2 5.72 1.2 366.6
041 S042 patrol 8.28 0.35 375.2
042 S043 patrol2 8.28 0.35 383.8
043 S044 patrol3 8.91 1.2 393.9
044 S045 patrol3 9.64 0.35 403.9
045 S046 patrol_note 22.99 0.35 427.2
046 S047 honne2 6.11 1.2 434.6
047 S048 crowd 16.12 0.35 451.0
048 S049 crowd 7.47 1.2 459.7
049 S050 robot_note 14.29 1.8 475.8
050 S051 c3 4.36 1.2 481.4
051 S052 labor 17.48 0.35 499.2
052 S053 labor 13.32 0.35 512.8
053 S054 robotcost 10.19 0.35 523.4
054 S055 robotcost 8.36 0.35 532.1
055 S056 net 7.71 1.2 541.0
056 S057 sens 3.08 0.35 544.4
057 S058 sens 10.76 0.35 555.5
058 S059 sens 16.77 0.35 572.7
059 S060 sens 11.31 0.35 584.3
060 S061 sens_buy 22.13 0.35 606.8
061 S062 sens_buy 19.88 1.2 627.9
062 S063 merit 3.00 0.35 631.2
063 S064 merit 25.08 1.2 657.5
064 S065 shop_back 19.23 1.8 678.5
065 S066 mitate 2.43 1.2 682.2
066 S067 mitate1 6.43 0.35 688.9
067 S068 mitate1 10.19 1.2 700.3
068 S069 honne3 10.27 0.35 711.0
069 S070 honne3 10.68 1.2 722.8
070 S071 mitate_cost 14.29 1.8 738.9
071 S072 answer2 6.53 0.35 745.8
072 S073 answer2 14.11 0.35 760.3
073 S074 answer2 20.04 1.2 781.5
074 S075 question_next 11.23 1.2 793.9
075 S076 next 9.33 1.2 804.5
076 S077 try 9.09 1.8 815.3
077 S078 outro 4.28 0.35 820.0
078 S079 outro 5.80 0.35 826.1
079 S080 outro 4.13 1.2 831.5
合計 831.5秒 = 13分51秒
画面は1回目と同じ「流れ続ける映像+黒いカード」
画面の形は、パターン(大文字型と説明型)と動き(ありなし)を選んでもらい、1回目と同じ形に決まりました。背景に試算ページの録画か Unity の店の映像を流し続け、文字は黒い角丸のカードに載せる形です(1回目の作り方は LOG378)。
背景に流す試算ページを、この回のために6本録った
1回目の録画は、スタッフ3人のまま台数を増やす操作が中心で、この回の条件(2人・皿を集めて回る・混雑・費用)が映っていません。試算のページをクラウドの作業環境で開き、画面ありのブラウザを仮想の画面(Xvfb)に出して ffmpeg で録る形で、6本を録りました。
| 録画 | 操作 | 使った場面 |
|---|---|---|
| sim_entry2 | 3人・0台 → 2人・2台(料理を運ぶだけ) | 料理を運ぶだけの2人+2台 |
| sim_bus | 2人・2台:まとめた皿も運ぶ | まとめた皿も運ぶ使い方 |
| sim_patrol6 | 2人・皿を集めて回る:1台 → 6台 | 台数ごとの棒・結論の前の場面 |
| sim_crowdp | 混雑・皿を集めて回る3台:2人 → 3人 | 混雑の日 |
| sim_cut | 「スタッフを1人減らして」の比べ | 冒頭近く |
| sim_cost | 費用の欄:3台 → 月3万円 → 4時間 → 買う・補助金 | 費用の章 |

費用の欄の録画は、1本目では見出しの文字を探す処理がページの上の別の文字に当たり、最初の数秒がページの頭のままでした。費用の欄の要素(#cost)の位置で移るように直して録り直しています。録画は場面より短いと頭に戻ってしまうので、どれも最後のコマを60秒延ばしました。費用の表が出ている所だけを切り出して延ばしたもの(costhold)と、月3万円・4時間に切り替える所を切り出したもの(costsens)も作っています。
src/rec_背景の録画.py
# 第2回「配膳ロボットで1人減らせるか」の背景の録画(試算 v2.7 のページをローカルで開いて録る)
# 使い方: p2m-site/public/sim で python3 -m http.server 8765 を動かし、xvfb-run -s '-screen 0 1920x1400x24' python3 rec2.py [名前 ...]
# 第1回の src/rec_背景の録画.py を写して書き換えた(2026-10-25)。ページは p2m-site public/sim/serving-robot.html(md5 88adf2b2・v2.7)
import asyncio, sys, os, subprocess
from playwright.async_api import async_playwright
URL = 'http://localhost:8765/serving-robot.html'
CUR = """(() => { if (document.getElementById('fakecur')) return;
const c=document.createElement('div'); c.id='fakecur';背景の録画に、台本と違う条件の数字が映っていた
書き出した確認用の動画から場面ごとに1コマずつ取り出して見ると、結論の場面と答えの場面の後ろに、試算ページの「ロボット2台・差し引き −14.4万円」が映っていました。台本は「3台・−7.5万円」です。録画の下のほうに、別の条件の費用の欄が写り込んでいました。この2場面の背景は、皿を集めて回る1〜6台の録画と、費用の表の録画に替えています。背景の録画も、映っている数字を台本と照らす必要がありました。
場面ごとの静止画の一覧で、カードの収まりを確かめた
46の場面のカードを、背景の映像の真ん中のコマに重ねて一覧にしました。各場面に、強い動き(大きい文字を叩きつける)か、中くらいか、動きなしかの札を付けています。強い動きは10場面で、続けて置いた所はありません。カードの下の端がハコブくんの区画にかからないかも、書き出す前に確かめています(はみ出したのは「来るたびに必ず載せる」の場面の1つで、補足の行を短くして収めた)。

46の場面を2つに分けて並べて書き出した
動きのある場面(46)は、書き出すコマ数がほぼ同じになるよう2組に分け、クラウドの作業環境で並べて動かしました。圧縮の設定を速いもの(veryfast)にした写しを使い、約15分で書き出せています。続けて、背景の断片と字幕・ハコブくんを重ねる書き出し(assemble.py)で、確認用まで作りました。
書き出しの途中で、確認用を作る段(30MB 以下になるまで圧縮の強さを変えて何度も作り直す)に時間がかかったため、途中で止めました。すると、止めた時点の書きかけの断片が壊れたまま残り、次の書き出しでつなぐと、映像が壊れていました。
$ ffmpeg -v error -i out.mp4 -f null - 2>&1 | head -3
[h264 @ 0x558e4c426f80] Invalid NAL unit size (0 > 35916).
[h264 @ 0x558e4c426f80] missing picture in access unit with size 35920
[h264 @ 0x558e4c426f80] Invalid NAL unit size (0 > 35916).
背景を差し替えた場面の断片(020・071〜073)を消し、確認用を作る段を外した写しで書き出し直したところ、同じ確かめでエラーは0件でした。確認用は、できあがった本編から1回だけ圧縮して作っています(26.2MB)。

概要欄・タイトル・サムネイル・X の投稿をそろえた
確認用はそのまま合格になりました。タイトルは3案から「配膳ロボットは「0.5人分」? 1人減らせる条件と、月いくら浮くか【導入シミュレーション 第2回】」に、サムネイルは前の版の案(スタッフを1人減らせる?)に決まりました。お金の問いを前に出した案(1人減らせたら 月いくら浮く?)も並べましたが、選ばれていません。
アップロード用の本編(crf 20・75MB)は、gzip にしてから18MB ずつに分けて Mac に送り、つないだあとの指紋(md5 ef41cb2d)が送る前と同じことを確かめてから、KIOXIA のアップロード用のフォルダに置きました。前の版のショート3本は v2.4 の数字のままだったので、ショート/ から _取り込み/ショート_8版/ に移しています(2回目のショートは作っていない)。
概要欄.txt
目次の時間は、書き出した動画の時刻から自動で入れています。1回目の URL は公開予約中のものです。
配膳ロボットを入れたら、ホールのスタッフを1人減らせるのか。減らせたら、月いくら浮くのか。シリーズ「配膳ロボット導入シミュレーション」の2回目です。
ファミレスの混む2時間をパソコンの中で再現すると、スタッフを3人から2人にしても店が回ったのは、ロボットが食事中に席を回って、お客さんに空いた皿を載せてもらう使い方で、3台から6台のときでした。料理を運ぶだけなら、6台でも2人では回りませんでした。
ところが、1人減って浮く人件費(月約14.1万円)より、ロボット3台を借りる費用(月約21.6万円)の方が高く、差し引きは月約7.5万円の持ち出し。借りる値段や、人を減らせる時間しだいで、答えは逆になります。
試算はサイトで、店・人数・台数・使い方・費用の前提を変えて試せます。
https://pixelstomotors.com/series8
▼目次
0:00 「0.5だとか、0.25にはなる」
0:51 この番組について
1:15 今日の問い:1人減らせるのか、月いくら浮くのか
3:09 先に結論
4:02 1. 料理を運ぶだけだと、なぜ1人減らせないのか
5:45 2. 皿を集めて回ると、何が変わるのか
7:04 混雑の日は
7:45 3. 1人減ったら、月いくら浮くのか
8:49 前提を変えると
10:15 お金にしていない変化
11:05 エイイチの見立て
12:04 冒頭の問いへの答え
13:19 エンディング
▼この動画で扱う範囲
・パソコンの中の試算です(Python の SimPy で、お客さんが来てから帰るまでの出来事を時間の順に再現)。数字の多くは、公開されている導入事例やメーカーの仕様をもとにした仮の値で、実際の店で測ったものではありません
・店は35卓のファミレスで、お客さんが1人もいない状態から始め、1時間に35組のペースで2時間だけ受け入れ、片付けが終わるまでを、同じ人数で計算しています。どの条件も40回回した平均で、日ごとのばらつきは示していません
・「店が回らない」は、席は空いているのに片付けや案内を待たせた時間が平均10分以上の条件です。この10分は、比べるためにエイイチが決めた線で、実際の店の営業を決める基準ではありません。満席で待つ時間や料理の遅れは入れていません
・比べているのは、試算に入れたホールの仕事を何人でこなせるかです。料理をロボットに載せる手間、集めた皿を洗い場で降ろす手間、厨房との兼務、休憩は入れていません
・食事中に皿を集めて回る使い方は、ロボットが席に来るたびにお客さんが皿を載せてくれる、と置いています(2回集めると、食べ終わったあとに下げる皿は残らない設定)。デザートやドリンクもロボットが運んでよい前提です
・お金は、料理を載せる人や皿を降ろす人の勤務を増やさずに、実際のシフトで1人分の給料を減らせた場合の仮の計算です。2時間だけ人を減らすシフトが組めるかは試していません。時給は2026年度の最低賃金の全国加重平均(1,177円)で、社会保険料や交通費は入れていません
・ロボットの費用(1台月6万円で借りる・保守月1万円・充電月2,000円・買う場合は1台250万円)は仮に置いた値で、見積もりではありません。導入時の設定や研修の費用は入れていません
・補助金(中小企業省力化投資補助金 カタログ注文型)は、条件を満たして半分を受け取れた場合です。代金は先に払い、補助金はあとから受け取ります。導入をきっかけに従業員を解雇すると、対象外や返還になる条件があります。借りる契約でも支援の対象になるものがあります
・ロボットどうしが細い通路で道を譲り合う時間や、故障・充電で1台が長く使えない場合は入っていません。台数の多い条件は、効果を楽観的に見積もっている可能性があります
・人が食事中に皿を下げる方法や、お客さんに皿を返してもらう方法とは比べていません
▼出典
・宮崎県の飲食店の人の言葉:MRT宮崎放送「人手不足の救世主?「配膳ロボット」宮崎県内でも活躍広がる 2022.4.27(水)」 https://www.youtube.com/watch?v=ZB66Qqu7Twg (映像は使っていません)
・最低賃金(2026年度・全国加重平均 1,177円):労働政策研究・研修機構 https://www.jil.go.jp/kokunai/blt/backnumber/2026/10/special_03.html
・中小企業省力化投資補助金(カタログ注文型)公募要領 https://shoryokuka.smrj.go.jp/assets/pdf/application_guidelines_catalog.pdf ・申請の流れ https://shoryokuka.smrj.go.jp/catalog/flow/
▼関連する記事(作業ログ)
・試算を作った回:https://pixelstomotors.com/record/serving-robot-simulation-simpy
・店で数える観察シート:https://pixelstomotors.com/record/serving-robot-observation-sheet
・試算を点検した回:https://pixelstomotors.com/record/audit-simulator-before-unity
▼シリーズ「配膳ロボット導入シミュレーション」
・第1回 配膳ロボット何台で店は変わる?(2026年11月9日 公開予定):https://www.youtube.com/watch?v=Ayq0zDZcaWo
▼この番組について
「フィジカルAI解説|Pixels to Motors」は、フィジカルAIのニュースや実機の記録から、現場で使える形を考える番組です。
エイイチは、本業のデザイナーをしながら、ロボティクスの研究と開発をしています。その中で分かったことと、そこから考えた見立てを、案内役のハコブくんがお伝えします。
・ナレーションは AI 音声(ElevenLabs)です。話しているのは Pixels to Motors のキャラクター、ハコブくんです
・BGM は ElevenLabs Music で作った曲、効果音はコードで作った音です
・画面の映像は、サイトの試算ページを操作した録画と、Unity で作った仮のファミレスの映像です
▼ロボットの開発・導入のご相談
メール:pixelstomotors@adaptdesign.jp
▼リンク
Webサイト:https://pixelstomotors.com
GitHub:https://github.com/PixelstoMotors
X:https://x.com/adaptdesignjp
LinkedIn:https://www.linkedin.com/in/eiichi-shimazu
チャンネル登録・高評価もよろしくお願いします。コメントは、エイイチが全部読んでいます。
#フィジカルAI #配膳ロボット #サービスロボット
X は、YouTube の公開予約に合わせて自動で出る
X の文は、r2r2r-content の sns/VIDEO_serving-robots-one-less_sns_posts.json に置きました。YouTube で公開予約すると、予定のタスクが公開の時刻で予定表に入れ、URL も入れて出します。最初の文は X の数え方(全角2・URL 23)で296になり、上限の280を超えたので縮めました(251)。push は、手元の写しが古く1回はねられ、取り込み直してから通しています(commit d1c2680)。
sns/VIDEO_serving-robots-one-less_sns_posts.json
{
"meta": {
"kind": "youtube_video",
"title": "配膳ロボットで1人減らせるか(配膳ロボット導入シミュレーション 第2回)",
"youtube_title": "配膳ロボットは「0.5人分」? 1人減らせる条件と、月いくら浮くか【導入シミュレーション 第2回】",
"title_match": [
"配膳ロボット",
"0.5人分"
],
"seconds": 815,
"url": "",
"youtube_id": ""
},
"posts": {
"x_template": "配膳ロボットで、ホールを1人減らせる?\n\nファミレスの混む2時間を試算したら、減らせたのは食事中に皿を集めて回る使い方で3台から。でも借りると、浮く人件費より月7.5万円高い…\n浮かない結果も、ちゃんと見せたいね。\n#配膳ロボット #飲食店\n{url}"
},
"note": "YouTube の本編の X 投稿。url と posts.x は tools/sync_youtube_shorts.py が YouTube の公開予約を見て入れる。LinkedIn は動画を直接アップロードする決まりなので入れない(文は iCloud の 動画/配膳ロボットで1人減らせるか/投稿文_X_LinkedIn.txt)"
}
投稿文_X_LinkedIn.txt(動画の投稿文。LinkedIn は動画を直接上げ、手で出す)
# 「配膳ロボットは「0.5人分」? 1人減らせる条件と、月いくら浮くか【導入シミュレーション 第2回】」の投稿文(2026-10-25)
# X は自動で出る(GitHub r2r2r-content の sns/VIDEO_serving-robots-one-less_sns_posts.json。YouTube で公開予約すると、公開の時刻に URL 入りで出る)。手で貼らない。
# LinkedIn のコメント欄の【URL】だけは、公開後に手で入れる。X は140字以内(URL は23字で数える)。
# 動画の投稿文は日本語だけ。LinkedIn は動画を直接アップロードする。本文に動画の URL は入れず、最後はチャンネルへのリンク。YouTube 版の URL はコメント欄の補足にだけ書く。
────────────────────────
■ X
────────────────────────
配膳ロボットで1人減らせるか試算。
減らせたのは、食事中に皿を集めて回る使い方で3台から。
でも3台借りると、浮く人件費より月7.5万円高い。
答えは借りる値段と減らせる時間しだい。
【URL】
#R2R2R #PixelsToMotors
────────────────────────
■ LinkedIn
────────────────────────
配膳ロボットで、ホールのスタッフを1人減らせるのか。試算では、減らせる条件は見つかりました。ただ、お金は残りませんでした。
35卓のファミレスの混む2時間を、Python(SimPy)で再現しました。1つの条件を40回計算した平均です。前回は、スタッフ3人のままロボットを0台から6台まで増やし、料理を運ぶだけなら、どの台数でも3人を2人にすると店は回らない、という結果でした。
料理を運ぶだけのロボットで2人+2台にすると、料理ができてから卓に届くまでは58秒から54秒でほとんど変わらず、お客さんが席に着くまでは8.6分から14.3分に延びました。そのうち13.2分は、席は空いているのに、片付けや案内の手が空かずに待った時間です。
使い方を変えて、ロボットが食事中に席を回り、お客さんに空いた皿を載せてもらうと、3台で席に着くまで7.5分。3人・ロボットなしの8.6分より短くなりました。ただしこれは、ロボットが来るたびにお客さんが皿を載せてくれる、と置いた試算です。混雑の日は、この使い方でも2人では回りません(ロボットなしの4人が3人になる、という意味では1人減ります)。
では、1人減ったら月いくら浮くのか。時給1,177円(2026年度の最低賃金の全国加重平均)で、混む2時間を1日2回、30日分減らせたとすると、月約14.1万円。ロボット3台を1台月6万円で借りると、保守と充電を入れて月約21.6万円。差し引きは月約7.5万円の持ち出しです。
前提を変えると答えは逆になります。月3万円で借りられれば月約1.5万円のプラス、昼と夜に4時間ずつ減らせれば月約6.6万円のプラス。買って補助金で半分を受け取れれば、約3年で取り戻す計算です。どれも、実際のシフトで給料を減らせた場合の仮の計算で、導入時の設定や研修の費用は入れていません。
人を減らせるかは、ロボットに何を受け持たせるかで決まる、と私は見ています。そしてお金については、人件費が浮かない結果もそのまま見せるべきだと考えています。店がロボットを入れる理由は、人件費だけでなく、人手不足やスタッフの負担、サービスにもあるからです。
これはパソコンの中の試算で、実際の店で測ったものではありません。数字の多くは公開されている事例や仕様をもとにした仮の値で、「店が回らない」の線(席は空いているのに待たせた時間が平均10分以上)は私が決めたものです。次の回は、店の図面から Unity で3Dの店を建てて、通路で止まる所を見ていきます。
YouTube のほかの動画: https://www.youtube.com/@PixelstoMotors
────────────────────────
■ LinkedIn コメント欄の補足
────────────────────────
冒頭の言葉:MRT宮崎放送「人手不足の救世主?「配膳ロボット」宮崎県内でも活躍広がる 2022.4.27(水)」。最低賃金:労働政策研究・研修機構。補助金:中小企業省力化投資補助金(カタログ注文型)公募要領。試算はサイトで、使い方・台数・費用の前提を変えて試せます:https://pixelstomotors.com/series8 全部の前提と目次は YouTube 版の概要欄に:【URL】
公開の前に、サイトの試算が v2.8 に変わっていた
記事にまとめる前にサイトの試算を開き直すと、同じ日の 15:20 に、別の作業(LOG379)で試算が v2.8 に変わっていました。会計をレジで1組ずつさばく作りが入り、レジの数(1つか2つ)を選べるようになっています。標準ファミレスの初めの表示はレジ1つです。動画の数字(v2.7)と、v2.8 のレジ1つ・レジ2つを、同じ条件で並べました。
compare_v27_v28_video.py
# 第2回の動画(試算 v2.7)の数字が、サイトの試算 v2.8(2026-10-25 15:20 公開・LOG379)でどうなるかを並べる
# 使い方: python3 compare_v27_v28_video.py <v2.7 の serving-robot.html> <v2.8 の serving-robot.html>
# v2.7: p2m-site 2bc3cd4 の public/sim/serving-robot.html(md5 88adf2b2)/v2.8: p2m-site add3fe3(md5 e4e4f5b1)
# 標準ファミレス(35卓)・1往復で最大3つ・壊れやすい皿は誰が運んでもよい(試算ページの初めの表示と同じ)
import json, sys
def load(path):
s = open(path, encoding='utf-8').read()
i = s.find('const D = ') + len('const D = ')
D, _ = json.JSONDecoder().raw_decode(s[i:])
k = D['k']
rows = [dict(zip(k, x)) for x in D['r']]
has_reg = 'registers' in k
idx = {}
for r in rows:
key = (r['store'], r['staff'], r['robots'], r['arrivals_per_h'], r['mode'], r['trays'], r['fragile_by'], r.get('registers'))
idx[key] = r
return D, idx, has_reg
def find(idx, st, rb, arr, mode, reg):
key = ('family', st, 0, arr, 'serve', 1, 'any', reg) if rb == 0 else ('family', st, rb, arr, mode, 3, 'any', reg)
return idx.get(key)
def min_staff(D, idx, rb, arr, mode, reg):
for st in D['stores']['family']['staff_all']:
r = find(idx, st, rb, arr, mode, reg)
if r and r['ng'] == 0:
return st
return None
D7, I7, _ = load(sys.argv[1])
D8, I8, _ = load(sys.argv[2])
print('v2.7 model', D7['common'].get('model'), '/ v2.8 model', D8['common'].get('model'),
'/ v2.8 標準ファミレスのレジの初めの数', D8['stores']['family'].get('registers'), '選べる数', D8['stores']['family'].get('registers_all'))
views = [('v2.7', D7, I7, None), ('v2.8 レジ1', D8, I8, 1), ('v2.8 レジ2', D8, I8, 2)]
conds = [('3人・0台', 3, 0, 35, 'serve'), ('2人・0台', 2, 0, 35, 'serve'),
('2人・2台・料理を運ぶだけ', 2, 2, 35, 'serve'), ('2人・2台・まとめた皿も運ぶ', 2, 2, 35, 'bus'),
('2人・6台・料理を運ぶだけ', 2, 6, 35, 'serve')] + \
[(f'2人・{n}台・皿を集めて回る', 2, n, 35, 'patrol') for n in range(1, 7)] + [('3人・2台・料理を運ぶだけ', 3, 2, 35, 'serve')]
print()
print('入店待ち(分)/席は空いているのに待った(分)/店が回らない(1)。v2.8 は後ろに会計の待ち(分)')
print(f"{'条件':<22}" + ''.join(f'{v[0]:>24}' for v in views))
for name, st, rb, arr, mode in conds:
cells = []
for _, D, I, reg in views:
r = find(I, st, rb, arr, mode, reg)
c = f"{r['entry_wait_mean']:6.2f} / {r['staff_wait_mean']:6.2f} / {r['ng']}" if r else '—'
if r and 'pay_wait_mean' in r:
c += f" / 会計 {r['pay_wait_mean']:5.2f}"
cells.append(c)
print(f'{name:<22}' + ''.join(f'{c:>34}' for c in cells))
print()
print('店が回る最少のスタッフ(ロボット 0〜6台)')
for arr, crowd in ((35, '普通'), (45, '混雑')):
for mode, mname in (('serve', '料理を運ぶだけ'), ('bus', 'まとめた皿も運ぶ'), ('patrol', '皿を集めて回る')):
line = f'{crowd}・{mname:<10}'
for vname, D, I, reg in views:
line += f' {vname}: ' + ','.join(str(min_staff(D, I, n, arr, mode, reg)) for n in range(7))
print(line)
compare_v27_v28_video_output.txt
v2.7 model v2.7 / v2.8 model v2.8 / v2.8 標準ファミレスのレジの初めの数 1 選べる数 [1, 2]
入店待ち(分)/席は空いているのに待った(分)/店が回らない(1)。v2.8 は後ろに会計の待ち(分)
条件 v2.7 v2.8 レジ1 v2.8 レジ2
3人・0台 8.58 / 7.41 / 0 7.86 / 4.93 / 0 / 会計 10.18 8.83 / 7.97 / 0 / 会計 1.25
2人・0台 28.25 / 25.82 / 1 25.54 / 19.54 / 1 / 会計 10.81 25.76 / 23.83 / 1 / 会計 2.65
2人・2台・料理を運ぶだけ 14.26 / 13.24 / 1 12.70 / 7.75 / 0 / 会計 15.83 14.45 / 13.40 / 1 / 会計 1.77
2人・2台・まとめた皿も運ぶ 14.30 / 13.26 / 1 11.62 / 7.02 / 0 / 会計 14.04 14.61 / 13.38 / 1 / 会計 1.72
2人・6台・料理を運ぶだけ 15.37 / 14.16 / 1 12.57 / 7.78 / 0 / 会計 15.48 14.41 / 13.47 / 1 / 会計 1.70
2人・1台・皿を集めて回る 17.02 / 15.45 / 1 12.68 / 8.39 / 0 / 会計 13.50 16.39 / 14.44 / 1 / 会計 1.56
2人・2台・皿を集めて回る 11.68 / 10.47 / 1 10.29 / 5.80 / 0 / 会計 12.89 11.99 / 11.09 / 1 / 会計 1.40
2人・3台・皿を集めて回る 7.54 / 6.85 / 0 6.57 / 3.23 / 0 / 会計 11.18 7.59 / 6.93 / 0 / 会計 1.26
2人・4台・皿を集めて回る 7.21 / 6.35 / 0 5.19 / 3.03 / 0 / 会計 9.90 7.31 / 6.62 / 0 / 会計 1.26
2人・5台・皿を集めて回る 9.78 / 8.71 / 0 5.50 / 3.02 / 0 / 会計 10.95 8.69 / 7.92 / 0 / 会計 1.23
2人・6台・皿を集めて回る 8.77 / 7.56 / 0 6.23 / 3.06 / 0 / 会計 10.50 9.59 / 8.07 / 0 / 会計 1.37
3人・2台・料理を運ぶだけ 3.16 / 2.35 / 0 2.56 / 0.89 / 0 / 会計 6.74 2.98 / 2.41 / 0 / 会計 0.89
店が回る最少のスタッフ(ロボット 0〜6台)
普通・料理を運ぶだけ v2.7: 3,3,3,3,3,3,3 v2.8 レジ1: 3,2,2,2,2,2,2 v2.8 レジ2: 3,3,3,3,3,3,3
普通・まとめた皿も運ぶ v2.7: 3,3,3,3,3,3,3 v2.8 レジ1: 3,2,2,2,2,2,2 v2.8 レジ2: 3,3,3,3,3,3,3
普通・皿を集めて回る v2.7: 3,3,3,2,2,2,2 v2.8 レジ1: 3,2,2,2,2,2,2 v2.8 レジ2: 3,3,3,2,2,2,2
混雑・料理を運ぶだけ v2.7: 4,3,3,3,3,3,3 v2.8 レジ1: 3,3,3,3,3,3,3 v2.8 レジ2: 4,3,3,3,3,3,3
混雑・まとめた皿も運ぶ v2.7: 4,3,3,3,3,3,3 v2.8 レジ1: 3,3,3,3,3,3,3 v2.8 レジ2: 4,3,3,3,3,3,3
混雑・皿を集めて回る v2.7: 4,3,3,3,3,3,3 v2.8 レジ1: 3,3,2,2,2,2,2 v2.8 レジ2: 4,3,3,3,3,3,3
レジ1つでは、2人+ロボット1台でも、どの使い方でも「店が回る」になります。席は空いているのに待った時間は、料理を運ぶだけの2人+2台で 13.24分(v2.7)から 7.75分(v2.8 レジ1つ)に縮み、そのかわり会計の待ちが約16分あります。会計の列にお客さんがたまる分、片付けと案内を待つ時間が10分の線より短くなる形です(LOG379 でも「レジ1つにすると『店が回らない』がかえって減った」と書いている)。レジ2つでは、動画の結論(料理を運ぶだけでは減らせない・皿を集めて回ると3台から・混雑の日は4人が3人)がそのまま成り立ち、数字も近いです(皿を集めて回る3台で席に着くまで 7.54分 → 7.59分)。
動画は「試算はサイトのシリーズのページで試せます」と案内しています。いまのページを初めの表示のまま開くと、動画と逆の結果が出ます。1回目の動画(11月9日に公開予約)も、同じ v2.7 の数字です。動画を v2.8 のレジ2つの数字に直すか、レジ1つで作り直すか、概要欄で断ってこのまま出すかを選んでもらい、まずは記事を書くことになりました。
次の回(第3回)は、図面から建てた3Dの店で通路で止まる所を見る
この回の試算には、ロボットどうしが細い通路で道を譲り合う時間が入っていません(概要欄の「この動画で扱う範囲」にも書いた)。台数の多い条件ほど、効果を楽観的に見ている可能性があります。動画の最後のハコブくんの予告は次の1文です(narration.py の next)。
次の回では、店の図面から3Dの店を建てて、ロボットを走らせます。今日の試算に入っていない、通路で止まる所を見ていきます。
3Dの店は、試算と同じ店の形のデータ(p2m-site の public/sim/layouts/)を Unity が読んで建てます。止まる所が分かれば、「3台から2人で回る」という答えが、通路の広さでどこまで動くかを見られます。
video_rules.md に足したこと(90回目)
動画の制作ルール(video_rules.md)の更新履歴に、この回の1行を足しました。iCloud の 動画/_制作ベース/video_rules.md とプロジェクトの claude/video_rules.md の両方に保存しています。
- 2026-10-25(90回目): 未公開だった「配膳ロボットで1人減らせるか」を、シリーズ「配膳ロボット導入シミュレーション」第2回として作り直した(13分35秒・パターン2+動きあり・4-4e の背景映像+カード)。数字は試算 v2.7。第1回の予告(減らせるか・月いくら浮くか)に合わせ、本編を「料理を運ぶだけでは減らせない → 皿を集めて回ると3台で減る → 浮く人件費より費用が高い(月約7.5万円の持ち出し)」にし、費用の節を足した。台本は別のエージェントに試算のデータで全部の数字を計算し直してもらい(食い違いなし)、codex に2回かけた(1回目22件・2回目13件。どちらも「直してから・条件つきで成立」。指摘は試算のコード haizen_sim.py で確かめた。客が皿を載せる置き方・載せる手間は入っていない・お金はシフトで給料を減らせた場合の仮の計算・補助金の条件と解雇・別条件の費用を結びつけない)。声は16分29秒あり、13文を抜いて13分35秒(voice_eleven/ハコブ_抜き後)。背景の試算ページは、この回のために6本録り直した(src/rec_背景の録画.py・KIOXIA の _取り込み/背景_第2回/)。費用の欄の録画は、表が出ている所を切り出して最後のコマを延ばした物(costhold・costsens)を作って使った。背景の録画に台本と違う条件の数字(2台の −14.4万円)が映っていた場面は、別の録画に替えた(背景の録画も、映っている数字を台本と照らす)。書き出しはクラウドの作業環境で、動きの場面46を2つに分けて並べて書き出した(約15分)。assemble.py を途中で止めると、確認用を作り直す段の書きかけの mp4 が壊れたまま残る(Invalid NAL unit)。止めたときは、壊れた断片(chunks/)を消して書き出し直す。前の版のショート3本は v2.4 の数字なので、KIOXIA の _取り込み/ショート_8版/ に移した(第2回のショートは作っていない・9-0)。タイトルは案A、サムネイルは前の版の案A(エイイチの決定)。X は sns/VIDEO_serving-robots-one-less_sns_posts.json
まだ決めていないこと・確かめていないこと
- 動画(2回目・1回目)を、サイトの試算 v2.8 に合わせるかどうか。レジ2つなら結論は変わらず数字だけ少し動く。レジ1つなら結論が逆になる
- お客さんが食事中に、ほんとうにロボットへ皿を載せてくれるか。試算は「来るたびに載せる」と置いている。事例は食べ放題の店(ロボットは下げる専用)で、料理も運ぶファミレスでの例は見つかっていない
- 料理をロボットに載せる人・集めた皿を降ろす人の手間と、導入時の設定・研修の費用。どれも試算とお金の計算に入っていない
- 宮崎県の飲食店の人の言葉は、YouTube の文字起こしのまま使っている。codex は元の音声を確かめられなかった(公式記事で趣旨は一致)
- 動画の効果(最後まで見てもらえたか・相談につながったか)は、公開後の数字で確かめる
この記事で作った・直したファイルの全文
動画/配膳ロボットで1人減らせるか/narration.py(台本・12版)
# -*- coding: utf-8 -*-
# 台本「配膳ロボットは「0.5人分」? ― 1人減らせる条件と、月いくら浮くか」— シリーズ「配膳ロボット導入シミュレーション」第2回(/series8 の試算が元の解説回)
# 2026-10-25 12版。全文の声(93文)が16分29秒だったので、声を作り直さずに13文を抜いた(エイイチが決めた。約13分50秒の見込み):
# 抜いた文(11版の番号・0から): 12 今日はその先・24〜25 立場(割に合わないとは言わない)・37 空いた卓には皿が残ったまま・46 食べ放題の事例・50 2台の10.5分は線のすぐ上・
# 51 片付けが軽くなる理由・52 歩く距離・55 40回の平均・60 節3の一言・72 設定や研修の費用/2時間だけのシフト・78 見立ての中の結果の繰り返し・83 観察シート
# 声は voice_eleven/ハコブ_抜き後/ に番号を付け直して写した(元の voice_eleven/ハコブ/ は残す)。間: 11(前回の振り返り)・36(2人で追いつかない)を 1.2秒、82(見立ての終わり)を 1.8秒に
# 設定や研修の費用・観察シートは概要欄で触れる
# 「ただ、」が2文続いたので、68(honne3)の頭を「それに、」にした(エイイチが決めた。--name ハコブ_抜き後 --lines 68 で作り直す)動画/配膳ロボットで1人減らせるか/scenes.py
# -*- coding: utf-8 -*-
# 動画「配膳ロボットは「0.5人分」?」(シリーズ「配膳ロボット導入シミュレーション」第2回・作業フォルダ名「配膳ロボットで1人減らせるか」)の場面
PATTERN = 2 # 画面パターン2(大文字型・video_rules.md 4-4c)
MOVE = True # 画面型の動き(4-4d)を強弱を付けて使う(2026-10-25 エイイチが選んだ)
# 2026-10-25: 第1回「何台入れたら店は変わる」の scenes.py(4-4e:背景に映像を長く流し、文字はカード)を写して書いた(エイイチが「第1回と同じ形」を選んだ)
# 背景の映像:
# src/sim_*.mp4 試算 v2.7 のページを、この回のために録画(src/rec_背景の録画.py。p2m-site public/sim/serving-robot.html・md5 88adf2b2)
# entry2: 3人0台→2人2台(料理を運ぶだけ)/bus: 2人2台・まとめた皿も運ぶ/patrol6: 2人・皿を集めて回る 1→6台/動画/配膳ロボットで1人減らせるか/make_docs.py(codex の依頼文と読み物の台本を作る)
"""台本の読み物(台本_*.md)と codex 敵対的検証の依頼(codex_*.md)を、narration.py から作り直す。
台本を直したら、動画の作業フォルダで python3 make_docs.py
2026-10-21: 「AIに昨日の続きをさせる」の make_docs.py を写して書き換えた
2026-10-25: シリーズ第2回として台本を作り直した(9版b・試算 v2.7)。依頼は第2回としての1回目(前の版の1回目・2回目の結果は _旧版/ に置いた)
2026-10-25: codex 1回目を受けて台本を10版にし、2回目の依頼にした
"""
import sys, json, os, datetime
sys.path.insert(0, '.')動画/配膳ロボットで1人減らせるか/台本_配膳ロボットで1人減らせるか.md(読み物の台本)
# 台本:配膳ロボットは「0.5人分」? ― 1人減らせる条件と、月いくら浮くかを試算した(配膳ロボット導入シミュレーション 第2回)
話し手はハコブくん(エイイチは三人称)。各行は「文番号|表情|場面|字幕の文」。字幕の「|」は、読み上げは1文のまま字幕だけ次の枚に替える位置。
## 0 フック(0:00〜)
- S001|基本|hook|配膳ロボットを入れた、宮崎県の飲食店の人は、テレビの取材で、こう話していました。