サービスロボット導入シミュレーション Log#44 | 搬送ロボットの問題は、病院の職員の仮の動きだった

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

病院で検体や薬を運ぶ搬送ロボットを Unity で動かすシミュレーションで、ロボットに起きる問題(急に止まった・ひやり・人がよけさせられたなど)の大半は、職員141人を「1人が1時間に1回、くじ引きで選んだ部屋へ行って戻る」という仮の決まりで動かしていたことが作っていた。職員を持ち場ごとの型と用事で動かす形に替えると、ロボットが走っている間の問題は1日68件から19件に減り、そのうち職員141人が相手だったのは2件だけになった。

この回で良くなったこと、できるようになったことです。

  • ロボットの問題の数が、仮の動きではなく、理由のある人の動きから出るようになった。走っている間の問題は68件から19件、台の前で待っている間のひやりは47件から12件。残った相手は、ほかの階から来る職員・病棟の看護師・患者と、ロボットに積みに来る看護師だった
  • 職員の動かし方に台帳ができた。141人を持ち場ごとの21行に分け、動き方を4つの型(持ち場の中だけ・決まった相手先と行き来・患者に付いて動く・フロアを回る)にした。細かく作り込むのは15人で、110人は「持ち場から出ない」と決めるだけで足りた
  • 車いすの患者が救急室のまわりで約11分動けなくなる件が消えた(最長20秒)。化学療法の患者8人も、通り道を0.5m から1.5m に広げたトイレへ歩いて行けるようになった
  • 作業は依頼箱から Claude Code が回した。依頼155 は186分、依頼157 は215分で、Unity を人が開いて手で直した所はない。依頼155 は Anthropic の Claude Fable 5.2 で回し、やり取りは75回・約700円だった(前後の回は Claude Opus 5.5 で122回・約1,200円と137回・約2,400円。作る物が違うので、同じ条件の比べではない)

困っていたのは、問題の数が直すたびに増えたり減ったりして、何が原因なのかが読めなかったことです。前の回(LOG488)では、通れなかった患者と職員を通したら問題が84件から132件に増えました。行き先を絞る直し(依頼155)で68件に下がったものの、新しく車いすの患者が動けなくなり、大廊下の人は目安を下回りました。そこで1日分の記録を役割ごとに数え直すと、医師が外来の時間に診察室を空けて内視鏡室や救急へ行き、臨床検査技師が X線室へ1日73回行っていました。

配膳ロボットの時と違って、人によって動きがかなり違うため。スタッフ、患者(患者も色々)、医師、事務員、付添人など各々の問題点をまずは洗い出してください。

何をなぜどうなったか
Claude Fable 5.2 で何が良くなるかを調べ、依頼155 で1回試した
新しいモデルが Unity の作業に効くかを、公表の数字ではなく自分の依頼で見るため
186分・75回・約700円で合格。1回だけなので、良し悪しは言い切れない
化学療法のトイレの通り道を広げ、職員の行き先を持ち場のある所だけにした(依頼155)
トイレへの通り道が0.35m で通れず、職員が付き添い用の所へふだんも行っていた
8人ともトイレへ行けた。問題は132件から68件
依頼155 の1日分の記録を、役割ごとに数え直した
直しても問題が残り、車いすの患者が救急室で動けなくなった
職員は5つの役割とも同じ決まりで、科をまたいで動いていた
職員を持ち場ごとの21行・4つの型に分け、用事の表を作った
役割で分ける形そのものが合っていなかった
作り込むのは15人。清掃と警備の人も足した
職員の動きを替えて1日を撮り直した(依頼157)
表のとおりに動かすと問題の数がどう変わるかを見るため
68件から19件。受け取る人がロボットに会えないなど4つが残った
動画を見て、呼ぶ場面と積む・受け取るの見せ方を決めた
ロボットがどこから呼ばれて動いているのかが、画面で分からなかった
患者の動きの直しと合わせて、依頼158 として回している

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

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

作業ログ ― Claude Fable 5.2 を、病院の Unity の依頼155 で1回試す

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

ファイルの一覧(19本)

01_0.5m_1.5m_diff_49c3ea4.txt ― 化学療法のトイレの通り道を0.5m から1.5m に広げた(サイト側) / diff_49c3ea4.txt(p2m-site の commit 49c3ea4 の差分。書き出したファイル hospital-unity-params.json は除く)・4,178字

02_sec01.md ― 依頼155:トイレへ8人とも行け、問題は132件から68件になった / result155.md(依頼箱が書き戻した依頼155 の結果)・3,040字

03_sec01.txt ― 依頼155:トイレへ8人とも行け、問題は132件から68件になった / report155.txt(依頼155 の報告の全文)・17,425字

04_sec01.txt ― 依頼155:トイレへ8人とも行け、問題は132件から68件になった / agg155_out.txt(依頼155 の確かめのまとめの出力)・35,344字

05_sec01.py.txt ― 依頼155:トイレへ8人とも行け、問題は132件から68件になった / agg155.py(依頼155 の確かめのまとめを作るスクリプト)・16,830字

06_sec02.txt ― 人の種類・職員の行き来・問題の相手を数えるスクリプトと出力 / count_staff_moves155_out.txt(その出力)・3,256字

07_sec02.txt ― 人の種類・職員の行き来・問題の相手を数えるスクリプトと出力 / count_people155_out.txt(その出力)・3,092字

08_15_110_staff_classification.md ― 細かく作り込むのは15人で、110人は持ち場から出ないと決めるだけで足りた / staff_classification.md(職員の分け方の台帳の全文。依頼157 の結果を書き込んだ後の版)・4,725字

09_sec03.txt ― 用事の頻度は新しく決めず、試算の便と人が運ぶ回につないだ / diff_cf58824.txt(p2m-site の commit cf58824 の差分。職員の動き方の表・ほかの階の職員の3つの分け・清掃と警備の人・人が運ぶ回の記録。書き出したファイルは除く)・11,126字

10_157_request157.md ― 依頼157 の依頼文と、確かめてもらったこと / request157.md(依頼157 の依頼文の全文)・3,640字

11_sec04.md ― 走っている間の問題は68件から19件になり、職員141人が相手だったのは2件だった / result157.md(依頼箱が書き戻した依頼157 の結果)・3,040字

12_sec04.txt ― 走っている間の問題は68件から19件になり、職員141人が相手だったのは2件だった / report157.txt(依頼157 の報告の全文)・22,030字

13_sec04.txt ― 走っている間の問題は68件から19件になり、職員141人が相手だったのは2件だった / agg157_out.txt(依頼157 の確かめのまとめの出力)・50,743字

14_sec04.py.txt ― 走っている間の問題は68件から19件になり、職員141人が相手だったのは2件だった / agg157.py(依頼157 の確かめのまとめを作るスクリプト)・24,293字

15_sec04.py.txt ― 走っている間の問題は68件から19件になり、職員141人が相手だったのは2件だった / paths157.py(1日の早回しの動画のカメラの道を作るスクリプト)・8,828字

16_sec06.txt ― 依頼158 に向けて、サイトの条件に3回に分けて入れたもの / diff_3c7927b.txt(commit 3c7927b の差分。呼ぶ場面と荷物の見せ方・依頼が出た時刻の書き出し)・6,291字

17_sec06.txt ― 依頼158 に向けて、サイトの条件に3回に分けて入れたもの / diff_0463a35.txt(commit 0463a35 の差分。患者の動き)・7,462字

18_sec06.txt ― 依頼158 に向けて、サイトの条件に3回に分けて入れたもの / diff_23f2f65.txt(commit 23f2f65 の差分。正面玄関を職員も通れるように・台の前の決まり・立っている人がよける決まり)・4,294字

19_158_1_request158.md ― 依頼158 は、患者の動き・呼ぶ場面・台の前の決まりを1つにまとめて回している / request158.md(依頼158 の依頼文の全文)・4,885字

この記事の効果の数字は、Unity の記録から数えたものです。見込みで書いた所は、見込みと書いています。費用は1ドル155円で円に直しました。

依頼箱と Claude Code は、Unity の作業を自動で回す仕組み

この回の Unity の作業は、どれも「依頼箱」で回しました。依頼箱は、Claude(チャットの側)が書いた依頼文を Mac のフォルダに置くと、Mac の見張り係が Claude Code(Mac の上でコードを書いて動かす Claude)に1件ずつ渡し、報告をフォルダに書き戻す仕組みです。Unity を人が開いて操作することはありません。作りは LOG390 に書いています。

言葉この記事での意味
依頼箱
Claude が書いた依頼を、Mac の見張り係が Claude Code に渡す仕組み(iCloud の 依頼箱/ フォルダ)
依頼155・依頼157・依頼158
依頼箱に置いた依頼の番号
見た目なしの回
Unity で人やロボットの見た目を作らずに回す回。問題の数はこの回を正とする
廊下だけ/時間で切替
青の道(内科の処置室→検査部)の決め方。1日じゅう外来の大廊下を通るか、外来の混む8〜11時だけ裏口の職員通路を通るか
種
乱数の種。同じ種なら、人の出方も依頼の出方も同じになる
check-in の番号(cs:125 など)
Unity の場面とコードを Unity Version Control に保存したときの番号
サイトの条件
Unity が読む値をまとめたファイル hospital-unity-params.json。試算の前提の表(assumptions.json)から書き出す。Unity は値を自分で決めず、これを読む

Claude Fable 5.2 は、Anthropic が2026年11月9日に出したモデル

Claude Fable 5.2 は、Anthropic が2026年11月9日に出したモデルです。日常の決まった作業は Claude Opus 5.5、複雑で自由度の高い技術の作業は Fable 5.2、というのが Anthropic の示す使い分けです。病院の Unity の作業に効きそうかを、公表されている数字で調べました。数字はどれも Anthropic が自分で出した測定値で、前の版の Fable 5.1 との比較です。

伸びたとされる所
公表の数字(前の版 → Fable 5.2)
病院の Unity の作業で効きそうな所
大きなコードの課題を解く32% → 49%
直しても別の場所で詰まる問題の原因探し
図表を読む45% → 73%
図面からフロアの形を起こす・録画のコマを読む
シミュレーションの中でロボットを動かす
28% → 65%
部屋の中まで入る道・人の持ち場の配置
長い実行の中で、再現しない結果を知らせる
数字なし
同じ種で同じ結果になるかの確かめ
費用
前の版より2割安い(100万語あたり入力8ドル・出力40ドル=約1,200円・約6,000円)
夜に長く回す依頼

調べた元は、Anthropic の Fable のページ、SiliconANGLE の記事、CNBC の記事、Android Authority の記事、Claude の X の発表 です。

公表の数字が自分の作業で同じだけ出るかは分からないので、次に回す予定だった依頼155 を、Fable 5.2 で回すことにしました。依頼箱の見張り係は、設定ファイル config.json の extra_args に書いた引数を Claude Code に渡します。ここに --model claude-fable-5-2 を入れてから依頼を置き、依頼が動き出したあとで元に戻しました(設定は依頼を始めるたびに読み直すので、戻しても動いている依頼には影響しない)。アームの依頼まで Fable 5.2 になるのは望まない、という指示があったためです。

変える前  "extra_args": [],
依頼155 を置く間だけ  "extra_args": ["--model", "claude-fable-5-2"],
依頼155 が動き出したあと  "extra_args": [],

化学療法のトイレの通り道を0.5m から1.5m に広げた(サイト側)

前の回の依頼154 で、化学療法の患者がトイレへ歩いて行けないことが分かっていました。トイレの扉は西の壁にあり、その前は準備室とトイレにはさまれた幅0.5m の細い所で、壁の厚みを引くと0.35m しか残りません。Unity を直す前に、正であるサイト側のフロアの形を直しました。トイレの西の壁と扉を1m 東へ動かし、通り道を1.5m にしています。1.5m は点滴の台を押して通る幅としての仮置きです。ロボットの道と距離は変わりません。

外来化学療法室のトイレの前。左が直す前で、準備室とトイレの間の通り道は0.5m。右が直した後で、トイレの西の壁を動かして1.5m にした

あわせて、職員がふだん持ち場から動くときの行き先を「持ち場の所だけ」と条件に書きました。

diff_49c3ea4.txt(p2m-site の commit 49c3ea4 の差分。書き出したファイル hospital-unity-params.json は除く)

01_0.5m_1.5m_diff_49c3ea4.txt4,178字・103行・diff
commit 49c3ea4 病院 h1:化学療法のトイレの前の通り道を 0.5m → 1.5m に広げた・職員のふだんの行き先を持ち場だけにする決まりを条件に足した(依頼155 の前)

diff --git a/tools/hospital_layouts/README.md b/tools/hospital_layouts/README.md
index 5f37e26..4323003 100644
--- a/tools/hospital_layouts/README.md
+++ b/tools/hospital_layouts/README.md
@@ -25,3 +25,7 @@
 - だれがどこに入るか(`access`):外来の患者・化学療法の患者・救急の患者・看護師・医師・薬剤師・検査技師・事務・ロボット の9つの役割ごとに「座る」「入る」。図は `draw_h1_access.py`
別のタブで開く保存

依頼155:トイレへ8人とも行け、問題は132件から68件になった

依頼155 の依頼文の全文です。

request155.md(依頼155 の依頼文の全文)

---
作業フォルダ: /Users/shimazueiichi/Robotics_UX/ServiceSim
上限時間: 480
---
# 依頼155:病院の化学療法のトイレの通り道を広げ、職員のふだんの行き先を持ち場だけに戻して、1日を撮り直す

依頼154 の報告(claude_code_reports/20261111_hospital_154.txt)の「決めてほしいこと」1〜3 に、エイイチと決めた答え(2026-11-11):
1 化学療法のトイレへ歩いて行けない:**サイトのフロアの形を直した**。トイレの前の通り道を 0.5 m → 1.5 m に広げた(トイレの西の壁と扉を x114.5 → 115.5)。化学療法の患者は化学療法のトイレへ行く(近い方のトイレへ回す形はやめる。行けなかったときだけ今までどおり近い方へ行かせて、その数を数える)
2 職員がふだん持ち場から動く行き先:**持ち場の所だけに戻す**。付き添い・通り抜けのために「入る」にした所(化学療法・生理検査・救急の処置の場所・X線室など)へは、ふだんの行き来では行かない。付き添い(病棟の患者と看護師)・ほかの階の職員の通り抜けは依頼154 のまま
3 Unity で決めた値(看護師が待つ点・同じ速さで歩く・X線室は立って待つ):**このままでよい**

**今回はこの2つを直して、確かめの回を撮って見せるところまで。** 数える問題・ロボットの止まり方・人がロボットをよける決まりは変えない。
**配膳の場面・配膳の実行ファイル・配膳の台帳、配膳と共通の部品には触らない。** 変えるのは Assets/ServiceSim/Hospital/ の中だけ。見た目は依頼153 の色・決めたカメラのまま。
**瞬間移動はさせない**(エレベーターの中で現れ・消えるのはよい)。
**エイイチは見ていない。人に聞かないと進めない所に当たったら、その項目は止めて報告に書き、ほかは続ける。**

## 正(読むもの)
- p2m-site main(49c3ea4)
  - フロアの形:`tools/hospital_layouts/hospital_h1.json`(md5 76084c213ce03712abcdd6fa1d143489)。前の写し(85fa5f06)との違いは4か所だけのはず:
    外来化学療法室のトイレの rect の西の端 114.5 → 115.5/その扉の at の x 114.5 → 115.5/access の化学療法の点滴の場所の細い長方形 (114,53,114.5,60) → (114,53,115.5,60)/access の化学療法のトイレ (114.5,53,120,60) → (115.5,53,120,60)
  - 条件:`tools/hospital_sim/hospital-unity-params.json`(md5 415ee6bc98d2d84e98b69914c4a3da6b)。前の写し(8cb6451a)との違いは layout・layout_back_door の md5 と、people_flow.staff_moves の「ふだんの行き先」の行・what だけのはず

## 始める前に確かめること(違えば回さずに報告して終わる)
作業場所の保留 0(cs:124 のあと)・Unity と回し係が動いていない・KIOXIA がマウント済み・上の md5 と違いの中身

## 1. 作る
- 上の 1・2 を入れる。Data/ に h1 と params の新しい写しを置く(前の写しは残す)
- check-in(保留0)して、Builds/hospital155/ を作る。前の実行ファイルは残す

## 2. 確かめ(違えば 3 は撮らずに止める)
- 依頼154 と同じ確かめ(廊下だけ×2 で1バイト一致、瞬間移動0、便16/16、立ち往生、ロボット・人が入れない所0秒(役割ごと)、時間で切替×1)
- 化学療法の患者がトイレへ行った数を、行き先ごとに(化学療法のトイレ/西/東)。化学療法のトイレへ行けなかった人が 0 人になったこと。トイレの前の通り道(x114〜115.5, y53〜60)で人どうしが詰まって止まった所が無いこと
- 職員のふだんの行き来の行き先を、役割ごと・所ごとの回数で出す。持ち場でない所が 0 回になったこと(付き添い・通り抜けは別に数える)
- 飛ばした行き先・出さなかった人が 0 人のままであること
- 問題の数を依頼143・147・149・154 と並べる(区間:外来の大廊下・職員の廊下・部屋の中・台の前)。依頼154 で増えた大廊下の東の端(化学療法の受付の台と東の縦廊下の口のまわり)の数がどう変わったか。数は見た目なしの回を正とする
- 時刻ごと(30分ごと)の所ごとの人の数(依頼154 の表と同じ形)。外来の大廊下 x0〜70 と x70〜120 を、依頼154 と flow_estimate(山場 2〜8・午後 1〜3)と並べる

## 3. 撮る(依頼154 と同じ)
- 静止画:依頼154 と同じ16枚に、寄り:化学療法のトイレの前(患者がトイレへ向かっている時刻を記録から選ぶ)を足す
- 動画:廊下だけ・0.6m/秒・種0 の1日の早回し(依頼154 と同じ作り)
- 並べた図
- 出力:/Volumes/KIOXIA/r2r2r-data/service_sim/unity/hospital/20261112_flow155/。並べた図・静止画・動画は iCloud の …/サービスロボット導入シミュレーション/hospital/flow155/ にも写し、md5 を確かめる

## 報告
claude_code_reports/20261112_hospital_155.txt に:始める前の確かめ、1 で作ったもの、2 の確かめ(表)、3 のカメラの値と動画の長さ、出力の場所、check-in の番号、決めてほしいこと(直し方の候補は作らない)。
**報告の最後の1行は必ず次のどれか**:「判定:合格」/「判定:止めた(決めてほしいことあり)」/「判定:失敗」

Claude Code が Fable 5.2 で回した結果です。始めて約1時間で作る・確かめの回までが終わり、残りの約2時間は Unity の1日分の録画でした。

  • ねらい:化学療法の患者がトイレへ歩いて行けるようにし、職員が付き添い用の所へふだんは行かないようにする
  • 変わったこと:トイレへ行くと決まった8人が全員、化学療法のトイレへ歩いて行けた(片道9〜23秒。依頼154 は8人とも西のトイレへ回っていた)。職員が持ち場でない所へ行った回数は642回から0回。走っている間の問題は132件から68件、大廊下の東の端は38件から8件
  • 見込める効果:通れない所が原因で人が遠回りする、という作りの都合が1つ減った。ただし下に書くとおり、職員の動きの決まりそのものは仮のままだった

result155.md(依頼箱が書き戻した依頼155 の結果)

02_sec01.md3,040字・64行・markdown
# 結果:20261112_155_病院の化学療法のトイレの通り道を広げ職員の行き先を持ち場だけに戻して1日を撮り直す

- 状態:完了
- 始めた時刻:2026-11-12 08:11
- 終わった時刻:2026-11-12 11:17(186分)
- 作業フォルダ:/Users/shimazueiichi/Robotics_UX/ServiceSim
- この続きを Claude Code で話すとき:作業フォルダで `claude --resume a7bf7c39-f6c4-4c36-a97a-83581c12f31a`
別のタブで開く保存

report155.txt(依頼155 の報告の全文)

03_sec01.txt17,425字・196行・text
依頼155 報告 2026-11-12
病院の化学療法のトイレの通り道を広げ、職員のふだんの行き先を持ち場だけに戻して、1日を撮り直す

■ 0. 始める前の確かめ(進めた)
- 作業場所:cs:124 が頭、保留の変更 0
- 動いている物:Unity のエディタ・画面なしの Unity・回し係はなし(動いていたのは Unity Hub だけ)
- KIOXIA:マウント済み
- p2m-site main:49c3ea4b1dfa…(依頼の 49c3ea4)
別のタブで開く保存

agg155_out.txt(依頼155 の確かめのまとめの出力)

04_sec01.txt35,344字・425行・text
== a vs b
同じ 19:access147.csv・build143.csv・chemo_way155.csv・crowd.csv・elevator149.csv・er_cross154.csv・events.csv・legs.csv・moves.csv・people147.csv・rescues.csv・robot_track.csv・robot_zones.csv・seats147.csv・staff147.csv・staff_moves147.csv・toilet149.csv・trips.csv・zones147.csv
違う 0:
summary.json の違う項目: run, wall_s
== a vs L
同じ 19:access147.csv・build143.csv・chemo_way155.csv・crowd.csv・elevator149.csv・er_cross154.csv・events.csv・legs.csv・moves.csv・people147.csv・rescues.csv・robot_track.csv・robot_zones.csv・seats147.csv・staff147.csv・staff_moves147.csv・toilet149.csv・trips.csv・zones147.csv
違う 0:
summary.json の違う項目: run, wall_s
別のタブで開く保存

agg155.py(依頼155 の確かめのまとめを作るスクリプト)

05_sec01.py.txt16,830字・294行・python
#!/usr/bin/env python3
"""依頼155:確かめの回のまとめ(依頼143・147・149・154 の check と並べる)。
  python3 agg155.py <回のフォルダ> [<回のフォルダ> ...]"""
import csv, json, os, sys, statistics
from collections import Counter, defaultdict

HOSP = "/Volumes/KIOXIA/r2r2r-data/service_sim/unity/hospital"
R143 = {"hall": HOSP + "/20261110_floor143/runs/check143a_v06_hall_s0", "switch": HOSP + "/20261110_floor143/runs/check143c_v06_switch_s0"}
別のタブで開く保存

Fable 5.2 の1回と、前後の Opus 5.5 の回の時間・やり取り・費用

依頼箱の結果の JSON に、使ったモデルと費用が残ります。依頼155 は claude-fable-5-2 だけ、依頼154 と依頼157 は claude-opus-5-5 だけで動いていました。

依頼モデル時間やり取りの回数費用
依頼154(通れなかった41人を通す)
Claude Opus 5.5197分122回
7.72ドル(約1,200円)
依頼155(トイレの通り道・職員の行き先)
Claude Fable 5.2186分75回4.56ドル(約700円)
依頼157(職員の動きを型に替える)
Claude Opus 5.5215分137回
15.57ドル(約2,400円)

どの回も、時間のうち2時間弱は Unity の1日分の録画です。依頼の中身が違い、依頼157 は作る物がいちばん多かったので、この表だけで Fable 5.2 の方が良いとは言えません。依頼155 では、確かめの項目に無かった車いすの患者の止まりも、気づいたこととして報告に書かれていました。Fable 5.2 にするのは依頼155 だけ、という指示だったので、依頼157 と依頼158 は今までのモデルで回しています。

作業ログ ― 依頼155 の1日分の記録を、役割ごとに数え直す

依頼155 で残った3つは、どれも人の動かし方の話だった

依頼155 は合格でしたが、「決めてほしいこと」が3つ残りました。

番号依頼155 で残ったこと
1
「持ち場の所だけ」を、Claude Code は「同じ役割の職員の持ち場がある所」と読んで入れた。医師が化学療法の点滴の場所へ行く動きなどは残る。これでよいか
2
X線室へ行き来する病棟の患者(車いす)が、救急の待合で約11分動けなかった。別の回では、検査の約27分を X線室の外で過ごした
3
外来の大廊下の人数が、混んでいる時間帯で平均1.4人になり、目安の2〜8人を下回った

2 と 3 は直す、1 については、役割で読み方を決める前に、人ごとの問題点を洗い出すように、という指示でした(冒頭の引用)。配膳ロボットの店では、スタッフはみな同じ仕事(配膳・片付け・案内・会計)をしていたので、役割を分けずに済んでいました。病院は、医師・看護師・薬剤師・検査技師・事務で持ち場も動きも違います。

人の種類・職員の行き来・問題の相手を数えるスクリプトと出力

依頼155 の廊下だけの回(check155a)の記録を、3つのスクリプトで数えました。元の記録は KIOXIA の service_sim/unity/hospital/20261112_flow155/runs/check155a_v06_hall_s0/ にあります。

count_staff_moves155.py(職員のふだんの行き来を、役割ごと・持ち場→行き先ごとに数える)

# 依頼155(check155a)の staff147.csv・staff_moves147.csv から、職員のふだんの行き来を役割ごと・持ち場→行き先ごとに数える(LOG491)
# 使い方:python3 count_staff_moves155.py <回のフォルダ>
import csv, collections, statistics as st, sys
C = collections.Counter
B = sys.argv[1]
S = list(csv.DictReader(open(B + '/staff147.csv', encoding='utf-8')))
M = list(csv.DictReader(open(B + '/staff_moves147.csv', encoding='utf-8')))
print('職員', C((s['role'], s['job']) for s in S))
print('座る', C((s['role'], s['sit']) for s in S))
print('動きの種類', C(m['what'] for m in M))
for role in ('医師', '看護師', '薬剤師', '検査技師', '事務'):
    L = [m for m in M if m['role'] == role and m['what'] == '持ち場から動く']
    n = len([s for s in S if s['role'] == role])
    d = [float(m['end_s']) - float(m['start_s']) for m in L if m['end_s']]
    print('\n##', role, '人数', n, '動いた', len(L), '1人1時間', round(len(L) / n / 9, 2), '1回の分 中央', round(st.median(d) / 60, 1), '最大', round(max(d) / 60, 1))
    for (p, dst), c in C((m['post'], m['dest']) for m in L).most_common(40):
        print('   ', p, '→', dst, c)
for w in set(m['what'] for m in M):
    if w == '持ち場から動く':
        continue
    L = [m for m in M if m['what'] == w]
    d = [float(m['end_s']) - float(m['start_s']) for m in L if m['end_s'] and m['start_s']]
    print(w, len(L), C(m['role'] for m in L), '分 中央', round(st.median(d) / 60, 1) if d else None, C((m['post'], m['dest']) for m in L).most_common(4))
mv = C(m['staff_id'] for m in M)
print('1日1回も動かない職員', [(s['role'], s['post']) for s in S if mv[s['id']] == 0][:40])

count_staff_moves155_out.txt(その出力)

06_sec02.txt3,256字・114行・text
職員 Counter({('事務', '事務職員'): 38, ('看護師', '看護師'): 33, ('検査技師', '臨床検査技師'): 27, ('薬剤師', '薬剤師'): 20, ('医師', '医師'): 19, ('看護師', '看護業務補助者'): 2, ('検査技師', '診療放射線技師'): 2})
座る Counter({('看護師', '0'): 35, ('事務', '1'): 32, ('検査技師', '1'): 23, ('薬剤師', '1'): 20, ('医師', '1'): 13, ('医師', '0'): 6, ('検査技師', '0'): 6, ('事務', '0'): 6})
動きの種類 Counter({'持ち場から動く': 1221, '呼びに出る': 386, '付き添う(着いた)': 47})

## 医師 人数 19 動いた 165 1人1時間 0.96 1回の分 中央 3.5 最大 4.8
    ほかの外来の診察室 → 内視鏡室 26
    ほかの外来の診察室 → 救急の処置の場所 21
    ほかの外来の診察室 → 生理検査の検査室 17
別のタブで開く保存

count_partners155.py(ロボットの問題の相手がだれで、何をしていたかを数える)

# 依頼155(check155a)の events.csv から、ロボットの問題の相手がだれで、そのとき何をしていたかを数える(LOG491)
# 相手の番号は職員(staff147.csv)と人(people147.csv)で同じ数字が重なることがあるので、相手の種類「スタッフ」は先に職員の表で引いている(おおよその数)
# 使い方:python3 count_partners155.py <回のフォルダ>
import csv, collections, sys
C = collections.Counter
B = sys.argv[1]
S = {s['id']: s for s in csv.DictReader(open(B + '/staff147.csv', encoding='utf-8'))}
P = {p['id']: p for p in csv.DictReader(open(B + '/people147.csv', encoding='utf-8'))}
E = list(csv.DictReader(open(B + '/events.csv', encoding='utf-8')))
M = list(csv.DictReader(open(B + '/staff_moves147.csv', encoding='utf-8')))


def who(e):
    k, i = e['partner_kind'], e['partner_id']
    t = float(e['t_s'])
    if k == 'スタッフ':
        if i in S:
            s = S[i]
            act = '持ち場'
            for m in M:
                if m['staff_id'] == i and m['start_s'] and float(m['start_s']) - 1 <= t <= (float(m['end_s']) if m['end_s'] else 1e9) + 1:
                    act = m['what'] + '→' + m['dest']
                    break
            return (s['role'], s['post'], act)
        if i in P:
            return (P[i]['what'], '', '')
        return ('スタッフ?', '', '')
    if i in P:
        return (P[i]['what'], P[i]['kind'], '')
    return (k, '', '')


run = [e for e in E if e['dir'] != '待ち']
wait = [e for e in E if e['dir'] == '待ち']
print('走っている間', len(run))
for k, c in C((who(e)[0], e['area']) for e in run).most_common():
    print('  ', k, c)
print('  何をしていた人か')
for k, c in C((who(e)[0], who(e)[2].split('→')[0]) for e in run).most_common():
    print('  ', k, c)
for k, c in C(who(e) for e in run).most_common(12):
    print('    ', k, c)
print('待っている間', len(wait))
for k, c in C((who(e)[0], who(e)[2].split('→')[0], e['area']) for e in wait).most_common():
    print('  ', k, c)

count_partners155_out.txt(その出力)

走っている間 68
   ('看護師', '廊下') 13
   ('事務', '廊下') 13
   ('検査技師', '廊下') 9
   ('外来の患者', '廊下') 5
   ('なし', '廊下') 4
   ('病棟の患者', '部屋の中') 4
   ('病棟の患者', '廊下') 4
   ('付き添い', '廊下') 3
   ('医師', '廊下') 3
   ('検査技師', '部屋の中') 2
   ('病棟の看護師', '廊下') 2
   ('看護師', '部屋の中') 1
   ('救急の患者', '廊下') 1
   ('ほかの階の職員', '廊下') 1
   ('化学療法の患者', '廊下') 1
   ('見舞いの人', '廊下') 1
   ('ストレッチャー', '廊下') 1
  何をしていた人か
   ('看護師', '持ち場から動く') 11
   ('事務', '持ち場') 8
   ('病棟の患者', '') 8
   ('検査技師', '持ち場') 6
   ('検査技師', '持ち場から動く') 5
   ('事務', '持ち場から動く') 5
   ('外来の患者', '') 5
   ('なし', '') 4
   ('付き添い', '') 3
   ('看護師', '持ち場') 3
   ('病棟の看護師', '') 2
   ('医師', '持ち場から動く') 2
   ('医師', '持ち場') 1
   ('救急の患者', '') 1
   ('ほかの階の職員', '') 1
   ('化学療法の患者', '') 1
   ('見舞いの人', '') 1
   ('ストレッチャー', '') 1
     ('事務', '各科の受付', '持ち場') 8
     ('病棟の患者', '', '') 8
     ('外来の患者', '', '') 5
     ('看護師', '内科(中待合・診察室)', '持ち場から動く→化学療法の点滴の場所') 5
     ('なし', '', '') 4
     ('検査技師', '内科の処置室(採血)', '持ち場') 3
     ('付き添い', '', '') 3
     ('検査技師', '中央検査室', '持ち場から動く→X線室') 2
     ('病棟の看護師', '', '') 2
     ('検査技師', '中央検査室', '持ち場') 2
     ('看護師', '外来化学療法室', '持ち場から動く→内科の診察室') 2
     ('事務', '医事・事務', '持ち場から動く→総合受付・会計の内側') 2
待っている間 55
   ('薬剤師', '持ち場', '部屋の中') 12
   ('検査技師', '持ち場から動く', '部屋の中') 10
   ('薬剤師', '持ち場から動く', '部屋の中') 10
   ('検査技師', '持ち場', '部屋の中') 8
   ('看護師', '持ち場から動く', '部屋の中') 5
   ('看護師', '持ち場', '部屋の中') 2
   ('救急の患者', '', '部屋の中') 2
   ('スタッフ?', '', '部屋の中') 2
   ('医師', '持ち場から動く', '部屋の中') 1
   ('医師', '持ち場', '部屋の中') 1
   ('外来の患者', '', '部屋の中') 1
   ('歩く患者・付き添い', '', '部屋の中') 1

count_people155.py(患者・付き添い・見舞いの人・ほかの階の職員の動きを数える)

# 依頼155(check155a)の people147.csv から、人の種類ごとの動きを数える(LOG491)
# 使い方:python3 count_people155.py <回のフォルダ>
import csv, collections, statistics as st, sys
C = collections.Counter
P = list(csv.DictReader(open(sys.argv[1] + '/people147.csv', encoding='utf-8')))
print('人の種類×動き方', C((p['what'], p['kind']) for p in P))


def f(x):
    try:
        return float(x)
    except Exception:
        return None


for w in sorted(set(p['what'] for p in P)):
    L = [p for p in P if p['what'] == w]
    s = [f(p['stay_s']) for p in L if f(p['stay_s'])]
    ex = [f(p['exit_s']) for p in L if f(p['exit_s'])]
    print(w, len(L), '滞在分 中央', round(st.median(s) / 60, 1) if s else None, '最大', round(max(s) / 60) if s else None,
          '出なかった', len(L) - len(ex), 'from/to', C((p['from'], p['to']) for p in L).most_common(3))
step = collections.defaultdict(list)
how = collections.defaultdict(C)
for p in P:
    if p['what'] != '外来の患者':
        continue
    for s in p['steps'].split('|'):
        a = s.split(':')
        if len(a) >= 4 and f(a[1]) is not None:
            step[a[0]].append(f(a[1]) / 60)
            how[a[0]][a[4] if len(a) > 4 else ''] += 1
for k, v in step.items():
    print('外来 行き先', k, len(v), '分 中央', round(st.median(v), 1), '最大', round(max(v)), '0分', sum(1 for x in v if x < 0.2), dict(how[k].most_common(4)))
print('科', C(p['dept'] for p in P if p['what'] == '外来の患者'))
print('トイレ', C((p['what'], p['toilet_want'], p['toilet']) for p in P).most_common(20))
for w in ('化学療法の患者', '救急の患者', '病棟の患者', '見舞いの人', 'ほかの階の職員'):
    for p in [p for p in P if p['what'] == w][:2]:
        print(w, p['kind'], p['spawn_s'], p['exit_s'], p['steps'][:300], p['from'], p['to'])

count_people155_out.txt(その出力)

07_sec02.txt3,092字・33行・text
人の種類×動き方 Counter({('外来の患者', '歩く患者・付き添い'): 375, ('付き添い', '歩く患者・付き添い'): 188, ('ほかの階の職員', 'スタッフ'): 180, ('見舞いの人', '歩く患者・付き添い'): 105, ('病棟の看護師', 'スタッフ'): 54, ('病棟の患者', '歩く患者・付き添い'): 28, ('病棟の患者', '車いす'): 26, ('化学療法の患者', '歩く患者・付き添い'): 20, ('救急の患者', '歩く患者・付き添い'): 18, ('外来の患者', '杖の人'): 11, ('付き添い', '杖の人'): 4, ('外来の患者', '車いす'): 4})
ほかの階の職員 180 滞在分 中央 3.5 最大 9 出なかった 1 from/to [(('エレベーター', 'エレベーター'), 180)]
付き添い 192 滞在分 中央 103.9 最大 213 出なかった 10 from/to [(('正面玄関', '正面玄関'), 192)]
化学療法の患者 20 滞在分 中央 188.2 最大 287 出なかった 3 from/to [(('正面玄関', '正面玄関'), 20)]
外来の患者 390 滞在分 中央 103.8 最大 224 出なかった 15 from/to [(('正面玄関', '正面玄関'), 390)]
救急の患者 18 滞在分 中央 84.7 最大 177 出なかった 4 from/to [(('正面玄関', '正面玄関'), 18)]
病棟の患者 54 滞在分 中央 30.2 最大 44 出なかった 2 from/to [(('エレベーター', 'エレベーター'), 54)]
病棟の看護師 54 滞在分 中央 30.1 最大 44 出なかった 2 from/to [(('エレベーター', 'エレベーター'), 54)]
別のタブで開く保存

職員は5つの役割とも、1時間に1回のくじ引きで科をまたいでいた

職員の動きの決まりは、依頼147 で入れたものでした。1人が1時間に約1回、行き先をくじ引きで選び、2〜4分いて戻ります。依頼155 で行き先を「同じ役割の持ち場がある所」に絞っても、くじ引きはそのままです。数えると、どの役割も1人あたり1時間に0.9〜1.06回動いていて、医師も事務も同じ動き方でした。

依頼155 の1日分の、医師19人(上・165回)と看護師35人(下・311回)のふだんの行き来。丸が持ち場、矢印が太いほど回数が多い。外来の診察室の医師が内視鏡室・救急・生理検査へ、看護師が科をまたいで行き来している
役割人数記録に出ていた動き実際と違いそうな所
医師19人
外来の診察室の医師が、内視鏡室へ28回・救急へ28回・生理検査へ23回
外来の時間に診察室を空けて別の科へ行く。1人しかいない化学療法の医師も持ち場を離れる
看護師35人
ふだんの行き来311回のほとんどが科をまたぐ
検体や薬を運ぶ用事が無い。ロボットが代わるはずの仕事が場面にいない
薬剤師20人
薬剤部からお薬の窓口へ173回
無菌調製室の4人も1時間に1回、窓口へ出る
検査技師29人X線室へ73回
X線室は診療放射線技師の持ち場なのに、臨床検査技師が行く。役割を1つにまとめていたため
事務38人
医事・事務の20人が中待合へ67回・正面玄関へ53回
受付や会計の人が窓口を離れて歩き回る

「実際と違いそう」は Claude の見立てで、現場で確かめたものではありません。

ロボットの問題の相手を数えると、走っている間の68件のうち約6割が職員(看護師14・事務13・検査技師11・医師3)で、台の前で待っている間の55件はほぼ全部が職員でした。 数えていた問題の大半は、この仮の動きとロボットが会った回数だったことになります。なお、Claude Code が依頼157 の報告で別の数え方(記録の相手の種類が「スタッフ」のもの。ほかの階の職員と病棟の看護師を含む)をすると、依頼155 は119件のうち113件(95%)でした。

患者の側にも、同じ形の問題がありました。外来の患者390人は全員が同じ順で動き、中待合に中央値40分・最大約2時間座ったきりです。生理検査の待ちは48人とも0分でした。化学療法の患者は受付0分ですぐ点滴に入り、救急の患者は全員が歩いて正面玄関から来ます。大廊下の人が少ないのは、患者が座ったきりで、職員が大廊下を通らなくなったためでした。

people_issues_155.md(役割ごとの問題点の洗い出しの全文)

# 病院の Unity:役割ごとの人の動きの問題点(依頼155 の記録から洗い出し)

2026-11-12。元の記録は KIOXIA の service_sim/unity/hospital/20261112_flow155/runs/check155a_v06_hall_s0/(people147.csv・staff147.csv・staff_moves147.csv・events.csv)と、サイトの条件 people_flow。
数は記録から数えたもの。「実際と違いそう」は Claude の見立てで、現場の根拠はまだ調べていない。

## 職員に共通(いちばん大きい)
- 5つの役割とも同じ決まりで動く:1人が1時間に約1回、同じ役割の持ち場からくじ引きで行き先を選び、2〜4分いて戻る。科も仕事の中身も関係がない
- ロボットの問題の相手は、走っている間 68件のうち職員が約6割(看護師14・事務13・検査技師11・医師3)。台の前で待っている間 55件はほぼ全部が職員(薬剤師22・検査技師18・看護師7)
- つまり、数えている問題の数の大半が、この仮の動きで決まっている

## 医師(19人・1日165回)
- 外来の診察室の医師が、外来の時間に内視鏡室へ28回・救急へ28回・生理検査へ23回・化学療法へ17回
- 救急の医師が外来の診察室へ12回。化学療法の医師(1人)も持ち場を離れる(施設基準は常時1人以上)
- 診察中の患者がいる間に席を立っているかは、まだ確かめていない

## 看護師(35人・1日311回。ほかに中待合へ呼びに出る386回・付き添い47回)
- 科をまたぐ行き来がほとんど(外来→化学療法、化学療法→内科の診察室、救急→ほかの外来 など)
- 実際にありそうな用事(検体を検査部へ・薬を薬剤部へ取りに行く・器材を取りに行く)が無い。ロボットが代わる仕事そのものが場面にいない
- 看護業務補助者(2人)も看護師と同じ動きで、物を運んでいない

## 薬剤師(20人・1日191回)
- 薬剤部からお薬の窓口へ173回。無菌調製室の4人も1時間に1回、窓口へ出る(36回)
- 化学療法室へ薬の説明に行く動きは無い

## 検査技師(29人・1日236回)
- 臨床検査技師がX線室へ73回(X線室は診療放射線技師の持ち場。役割を1つにまとめたため)
- 放射線技師(2人)がX線室を離れて採血の所へ9回。採血の技師も離れる
- 検体を受け取りに行く動きは無い

## 事務(38人・1日318回)
- 医事・事務の20人が、ほかの外来の中待合へ67回・受付と会計の内側へ65回・正面玄関へ53回
- 総合受付・会計・各科の受付の人が窓口を離れて正面玄関などへ行く

## ほかの階の職員(180人)
- 全員同じ形:エレベーターから来て、どこかの持ち場に2〜3分立ち、戻る。何をしに来たかが無い

## 外来の患者(390人。車いす4人・杖11人)
- 全員が同じ順(総合受付→中待合→診察→会計)。再来の受付機・予約の有無・科による違いが無い
- 中待合に中央値40分・最大約2時間座ったきり。席を立つのはトイレ1回(4割の人)だけ。大廊下の人が少ない原因の1つ
- 生理検査の待合の待ちが48人とも0分。処置・検査室の待ちも0分
- 採血は内科だけ。全員が正面玄関から出入りする

## 付き添い(192人)
- 患者にくっついて同じ動きをするだけ。受付や会計を代わりにする・子どもが歩き回る、といった別の動きが無い

## 化学療法の患者(20人)
- 受付・待合が0分で、すぐ点滴(2〜5時間)。採血・診察・薬の調製を待つ時間が無い
- 付き添いがいない。トイレは4割の人が1回だけ

## 救急の患者(18人)
- 全員が歩いて正面玄関から来る。救急車(ストレッチャー)で救急の入口から入る人がいない
- 待合と処置ベッドの時間が同じ長さ(半分ずつ)。付き添いがいない。X線へ行かない

## 病棟の患者(54人)と付き添いの看護師(54人)
- 車いすが半分。ストレッチャー・ベッドのままの人がいない。必ず看護師が1人付く
- X線室へ行く道が、救急の待合と処置の場所を通り抜ける形。車いすの患者が救急の待合で約11分動けず、別の回では検査の約27分をX線室の外で過ごした
- 1コマごとの人の位置の記録が無く、だれが道をふさいだかが分からない

## 見舞いの人(105人)
- 玄関とエレベーターの間を30秒で通り抜けるだけ。面会の手続きに寄らない

作業ログ ― 職員141人を、持ち場ごとの21行と4つの型に分ける

細かく作り込むのは15人で、110人は持ち場から出ないと決めるだけで足りた

洗い出しを見せたあとの指示は、職員の仮の動きを大きな問題として1つずつ潰していくこと、そのためにまず、どれくらい細かい分類が要るのかを表にすることでした。

まずは詳細な分類がどれくらい必要なのか整理して表にしてください。

役割(医師・看護師…)ではなく、持ち場と動き方の型で分けました。分ける基準は、ロボットの3つの道(緑=救急室→検査部、青=内科の処置室→検査部、赤=薬剤部→化学療法室)と関わるかどうかです。

型中身人数
1 持ち場の中だけ部屋から出ない110人
2 決まった相手先と行き来
検体を出す・薬を受け取るなど、用事と行き先が決まっている
15人
3 患者に付いて動く
中待合へ呼びに出る・検査へ付き添う(前からある動き)
14人
4 フロアを回る・通り抜ける案内、ほかの階との行き来2人

型2 の15人は、内科の処置室の看護師4人(青の道の積む所)、外来化学療法室の看護師5人(赤の道の届け先)、救急室の看護師4人(緑の道の積む所)、看護業務補助者2人(ロボットと同じ道を歩いて物を運ぶ)です。ロボットの道の両端にいて、ロボットが代わるはずの仕事をしている人たちなので、ここが場面にいないと比べる相手がいません。診療放射線技師は検査技師から切り離し、X線室の中だけにしました。

表は、iCloud の作業フォルダに台帳として置き、直した行から状況の列を書き換えていく形にしています。分け方はそのまま了承され、清掃と警備の人も入れることになりました。

staff_classification.md(職員の分け方の台帳の全文。依頼157 の結果を書き込んだ後の版)

08_15_110_staff_classification.md4,725字・102行・markdown
# 病院の Unity:職員の分け方の表(持ち場 × 動き方の型)

最終更新:2026-11-12(依頼157 で Unity に入った。残りは依頼158 で直している)
この表を、職員の動きを1つずつ直していくときの台帳にする。直したら「状況」の列を書き換える。

- 元の洗い出し:flow155/people_issues_155.md(依頼155 の記録から。職員は全員同じ決まりで動き、その仮の動きがロボットの問題の数の大半を作っていた)
- 型と作り込みの度合いは Claude の見立て。現場の根拠はまだ調べていない
別のタブで開く保存

用事の頻度は新しく決めず、試算の便と人が運ぶ回につないだ

型2 の人が、どこへ・何をしに・どのくらいの頻度で行くかを公開の資料で調べました。外来の看護師や補助者が1日に何回運ぶか、という数字は見つかりませんでした(厚生労働科学研究の看護業務効率化の調査にも、回数は載っていません)。そこで頻度は新しく決めず、試算が作る依頼と便にそのままつなぎました。積む看護師は便ごとに台へ行き、受け取る看護師は便が着くたびに台へ行きます。廊下を歩いて運ぶのは看護業務補助者で、試算の決まり(至急の依頼が出たとき、その出発地に空いているロボットがいなければ人が運ぶ)で人が運ぶと決まった回だけ歩きます。

調べたこと分かったこと元
ロボットを入れる前は、だれが運んでいたか
看護師と看護補助者。看護師は補助者に電話で頼んでいた。薬剤部から外来化学療法室は補助員
病院の清掃はいつするか
外来と通路は、外来の受付が始まる8:00 までに終える。廊下は1日1回、共用トイレは1日3〜8回(表が崩れていて回数は確かでない)
病院の警備の人はどこにいるか
立つ人は8〜11時が最多。院内の見回りの回数は書かれていない
見回りの間隔
診療時間の前後と診療時間内は1時間おき
看護師・補助者が1日に何回運ぶか
回数は見つからなかった

清掃の人は、7:30〜8:00 にカートを押して外来の大廊下と待合を回ります。ロボットの緑の便(7:30〜8:00)と同じ時間です。根拠のない仮置きは4つあり(ほかの階の職員を運ぶ人3・通り抜ける人5・用事で来る医師2に分ける割合、清掃2人・警備2人、トイレの清掃1日3回、見回り1時間に1回)、どれも仮置きと断ったうえで了承されました。

試算に人が運ぶ回を記録させて書き出すと、ロボット1台の日に人が歩いて運ぶ回は、種10個で 0・0・0・1・1・0・0・0・2・0 回でした。Unity で撮る種0 は0回なので、撮る回では補助者は廊下を歩きません。人が運ぶ様子を見るには、ロボット0台の日を別に回す必要があります(まだ決めていません)。

diff_cf58824.txt(p2m-site の commit cf58824 の差分。職員の動き方の表・ほかの階の職員の3つの分け・清掃と警備の人・人が運ぶ回の記録。書き出したファイルは除く)

09_sec03.txt11,126字・299行・diff
commit cf58824 病院:職員の動き方を持ち場ごとの型と用事の表にした・ほかの階の職員を3つに分けた・清掃と警備の人を足した(依頼157 の前)

diff --git a/tools/hospital_sim/README.md b/tools/hospital_sim/README.md
index ec540a5..7c26407 100644
--- a/tools/hospital_sim/README.md
+++ b/tools/hospital_sim/README.md
@@ -70,3 +70,11 @@ Unity 依頼134 で、外来の混む時間は裏口の道で廊下の問題が
 
別のタブで開く保存

作業ログ ― 職員の動きを替えて、病院の1日を撮り直す(依頼157)

依頼157 の依頼文と、確かめてもらったこと

依頼157 では、くじ引きの行き来を全部やめ、19行の表のとおりに職員を動かしてもらいました。確かめは、型1 の職員が持ち場の外にいた秒が0か、用事の回数が便の数と合うか、問題の相手がだれか、大廊下の人数、そして歩いている途中で60秒以上動けなかった人のまわりにだれがいたか、です。最後の1つは、依頼155 で車いすの患者が止まったとき、だれが道をふさいだのかが記録から分からなかったために足しました。

request157.md(依頼157 の依頼文の全文)

10_157_request157.md3,640字・62行・markdown
---
作業フォルダ: /Users/shimazueiichi/Robotics_UX/ServiceSim
上限時間: 480
---
# 依頼157:病院の職員の動き方を持ち場ごとの型に替え、清掃と警備の人を足して、1日を撮り直す

依頼155 の報告(claude_code_reports/20261112_hospital_155.txt)の「決めてほしいこと」に、エイイチと決めた答え(2026-11-12):
1 「持ち場の所だけ」の読み方:**役割で分ける形そのものをやめる**。依頼155 の記録を数えると、職員は5つの役割とも同じ決まり(1人が1時間に1回、同じ役割の持ち場からくじ引き)で科をまたいで動き、ロボットの問題の相手の約6割が職員だった。配膳と違い、病院は人によって動きがかなり違う。**持ち場ごとに動き方の型と用事を決めた表**(サイトの people_flow.staff_moves)に替える
別のタブで開く保存

走っている間の問題は68件から19件になり、職員141人が相手だったのは2件だった

  • ねらい:職員を、仮のくじ引きではなく、持ち場と用事で動かす。そのうえで、ロボットの問題がどこでだれと起きるかを見る
  • 変わったこと:走っている間の問題は68件から19件(廊下だけ)、104件から16件(時間で切替)。台の前で待っている間のひやりは47件から12件。型1 の13の番号とも、持ち場の外にいた時間は0秒。積む・受け取るの回数は便の数と全部合った。走っている間の相手に職員141人が出たのは2件だけ(総合受付の事務が持ち場に座っていた所)。同じ種の2回は記録26個がすべて一致
  • 見込める効果:残った問題が、ほかの階から物を運びに来る職員・病棟の看護師・患者・積みに来る看護師、という理由のある相手になった。速さや道を変えたときの問題の数を、人の動かし方の都合と分けて読める。確かめるのは、患者の動きも直す次の依頼158 の結果
依頼157 の静止画18枚。10時ごろと14時ごろの真上・引き・寄りと、化学療法のトイレの前、7時37分の外来の大廊下の清掃
7時37分48秒の外来の大廊下。清掃の人がカートを押して大廊下と待合を回っている。清掃の人とカートが相手の問題は、1日で0件だった

依頼155 で車いすの患者が救急の待合で約11分動けなかった件は、職員の仮の行き来が消えると起きなくなりました。病棟の患者17人が救急の待合にいた時間は、中央値18.4秒・最長20.3秒です(依頼155 は最長663.8秒)。X線室へ行く道が救急の待合を通り抜ける形そのものは変えていないので、救急室のまわりに仮の行き来で職員が集まっていたことが原因だったと読めます。

result157.md(依頼箱が書き戻した依頼157 の結果)

11_sec04.md3,040字・59行・markdown
# 結果:20261112_157_病院の職員の動き方を持ち場ごとの型に替え清掃と警備の人を足して1日を撮り直す

- 状態:完了
- 始めた時刻:2026-11-12 14:56
- 終わった時刻:2026-11-12 18:31(215分)
- 作業フォルダ:/Users/shimazueiichi/Robotics_UX/ServiceSim
- この続きを Claude Code で話すとき:作業フォルダで `claude --resume 5aab5444-f571-4853-acc5-b83618c61a05`
別のタブで開く保存

report157.txt(依頼157 の報告の全文)

12_sec04.txt22,030字・249行・text
依頼157 報告 2026-11-12
病院の職員の動き方を持ち場ごとの型に替え、清掃と警備の人を足して、1日を撮り直す

■ 0. 始める前の確かめ(進めた)
- 作業場所:cs:125 が頭、保留の変更 0
- 動いている物:Unity のエディタ・画面なしの Unity・回し係はなし(動いていたのは Unity Hub と依頼箱の回し係だけ)
- KIOXIA:マウント済み
- p2m-site main:cf58824fdcfb…(依頼の cf58824)
別のタブで開く保存

agg157_out.txt(依頼157 の確かめのまとめの出力)

13_sec04.txt50,743字・555行・text

== check157a_v06_hall_s0(廊下だけ)status completed/回の終わり 32400.0 秒(16:30)/最後の便が戻った 31629.3 秒/実時間 31.1 分
便 16(走った 16・途中 0・走れなかった 0)/移る 5(終えた 5)/出るのが遅れた 平均 0.0 秒・最大 0.0 秒
瞬間移動 ロボット 0(1コマ最大 0.030 m)・人 0(最大 0.118 m)/人の引き直し(180秒動けない)0/行き先の近くで止まって待った 10
立ち往生 0: 
助け 0: 
ロボットの入らない所に中心が入った時間 0.00 秒/どの所にも入っていない時間 0.00 秒
人が access で入れない所に入った時間(役割ごと): 外来の患者 0.00 秒・化学療法の患者 0.00 秒・救急の患者 0.00 秒・看護師 0.00 秒・医師 0.00 秒・薬剤師 0.00 秒・検査技師 0.00 秒・事務 0.00 秒
別のタブで開く保存

cmp157_out.txt(同じ種の回どうしで、記録の md5 を比べた出力)

== a vs b
同じ 26:access147.csv・build143.csv・chemo_way155.csv・crowd.csv・elevator149.csv・er_cross154.csv・errands157.csv・events.csv・extra157.csv・legs.csv・moves.csv・partners157.csv・people147.csv・points157.csv・rescues.csv・robot_track.csv・robot_zones.csv・seats147.csv・staff147.csv・staff157.csv・staff_moves147.csv・stall157.csv・stall_near157.csv・toilet149.csv・trips.csv・zones147.csv
違う 0:
summary.json の違う項目: run, wall_s
== a vs L
同じ 26:access147.csv・build143.csv・chemo_way155.csv・crowd.csv・elevator149.csv・er_cross154.csv・errands157.csv・events.csv・extra157.csv・legs.csv・moves.csv・partners157.csv・people147.csv・points157.csv・rescues.csv・robot_track.csv・robot_zones.csv・seats147.csv・staff147.csv・staff157.csv・staff_moves147.csv・stall157.csv・stall_near157.csv・toilet149.csv・trips.csv・zones147.csv
違う 0:
summary.json の違う項目: run, wall_s
== a vs 試しの実行ファイルの full0
同じ 26:access147.csv・build143.csv・chemo_way155.csv・crowd.csv・elevator149.csv・er_cross154.csv・errands157.csv・events.csv・extra157.csv・legs.csv・moves.csv・partners157.csv・people147.csv・points157.csv・rescues.csv・robot_track.csv・robot_zones.csv・seats147.csv・staff147.csv・staff157.csv・staff_moves147.csv・stall157.csv・stall_near157.csv・toilet149.csv・trips.csv・zones147.csv
違う 0:
summary.json の違う項目: run, unity_cs, wall_s
== s8 vs 試しの実行ファイルの full8
同じ 26:access147.csv・build143.csv・chemo_way155.csv・crowd.csv・elevator149.csv・er_cross154.csv・errands157.csv・events.csv・extra157.csv・legs.csv・moves.csv・partners157.csv・people147.csv・points157.csv・rescues.csv・robot_track.csv・robot_zones.csv・seats147.csv・staff147.csv・staff157.csv・staff_moves147.csv・stall157.csv・stall_near157.csv・toilet149.csv・trips.csv・zones147.csv
違う 0:
summary.json の違う項目: run, unity_cs, wall_s
== h143repro vs check143a
同じ 9:build143.csv・crowd.csv・events.csv・legs.csv・moves.csv・rescues.csv・robot_track.csv・robot_zones.csv・trips.csv
違う 0:
summary.json の違う項目: run, unity_cs, wall_s

agg157.py(依頼157 の確かめのまとめを作るスクリプト)

14_sec04.py.txt24,293字・416行・python
#!/usr/bin/env python3
"""依頼157:確かめの回のまとめ(依頼143・147・149・154・155 の check と並べる)。
  python3 agg157.py <回のフォルダ> [<回のフォルダ> ...]"""
import csv, json, os, sys, statistics
from collections import Counter, defaultdict

HOSP = "/Volumes/KIOXIA/r2r2r-data/service_sim/unity/hospital"
R143 = {"hall": HOSP + "/20261110_floor143/runs/check143a_v06_hall_s0", "switch": HOSP + "/20261110_floor143/runs/check143c_v06_switch_s0"}
別のタブで開く保存

cmp157.py(記録の md5 を比べるスクリプト)

#!/usr/bin/env python3
"""依頼157:2つの回のフォルダの記録(csv)の md5 と summary.json の違う項目を比べる。python3 cmp157.py <A> <B> [名前]"""
import hashlib, json, os, sys
a, b = sys.argv[1], sys.argv[2]
name = sys.argv[3] if len(sys.argv) > 3 else os.path.basename(a) + " vs " + os.path.basename(b)
fa = sorted(f for f in os.listdir(a) if f.endswith(".csv") and not f.startswith("._"))
fb = sorted(f for f in os.listdir(b) if f.endswith(".csv") and not f.startswith("._"))
md = lambda p: hashlib.md5(open(p, "rb").read()).hexdigest()
same = [f for f in fa if f in fb and md(os.path.join(a, f)) == md(os.path.join(b, f))]
diff = [f for f in fa if f in fb and f not in same]
only = sorted(set(fa) ^ set(fb))
sa = json.load(open(os.path.join(a, "summary.json"), encoding="utf-8")); sb = json.load(open(os.path.join(b, "summary.json"), encoding="utf-8"))
ks = sorted(k for k in set(sa) | set(sb) if sa.get(k) != sb.get(k))
print("== " + name)
print("同じ %d:%s" % (len(same), "・".join(same)))
print("違う %d:%s" % (len(diff), "・".join(diff)))
if only: print("片方だけ:", "・".join(only))
print("summary.json の違う項目:", ", ".join(ks))

run157.sh(確かめの回を回すスクリプト)

#!/bin/bash
# 依頼157:確かめの回(h1・人の動き flow・0.6m/秒)。廊下だけ 種0 を2回(check157a・b)、時間で切替 種0(check157c)、
# 見た目あり・カメラなしの廊下だけ 種0(check157L。見た目なしの check157a と同じ記録になるか)、
# -h147People hall(依頼143 の形)で廊下だけ(h143repro157。依頼143 の check143a と同じ記録になるか)、
# 廊下だけ 種8(check157s8。補助者が歩いて運ぶ回が2回ある種)
cd /Users/shimazueiichi/Robotics_UX/ServiceSim
O=/Volumes/KIOXIA/r2r2r-data/service_sim/unity/hospital/20261112_staff157
EXE=Builds/hospital157/HospitalSim.app/Contents/MacOS/ServiceSim
CS=$(python3 -c "import json;print(json.load(open('Builds/hospital157/build_info.json'))['unity_cs'])")
run() { L=$1; shift; $EXE -batchmode -nographics -h143Layout h1 -h127Speed 0.6 -h127Out $O/runs -h127Cs $CS -h136Mode day -h138Mode 138 -h127Label $L -h127MaxWallMin 200 "$@" -logFile $O/logs/$L.log; echo "$L exit $?" >> $O/logs/run157.exit; }
run check157a -h127Seed 0 -h147People flow -h136Plan hall &
run check157b -h127Seed 0 -h147People flow -h136Plan hall &
run check157c -h127Seed 0 -h147People flow -h136Plan switch &
run check157L -h127Seed 0 -h147People flow -h136Plan hall -h139Look on -h140Scheme A -h143Wheelchair on &
run h143repro157 -h127Seed 0 -h147People hall -h136Plan hall &
run check157s8 -h127Seed 8 -h147People flow -h136Plan hall &
wait
echo done >> $O/logs/run157.exit

test157.sh(試しの回を回すスクリプト)

#!/bin/bash
# 依頼157:試しの回(check-in の前の試しの実行ファイル)。見た目なし・0.6m/秒。引数:ラベル 実行ファイルの名前 そのほかの引数
cd /Users/shimazueiichi/Robotics_UX/ServiceSim
O=/Volumes/KIOXIA/r2r2r-data/service_sim/unity/hospital/20261112_staff157
L=$1; T=$2; shift; shift
EXE=$O/test/$T/HospitalSim.app/Contents/MacOS/ServiceSim
B="-batchmode -nographics -h143Layout h1 -h147People flow -h127Speed 0.6 -h127Out $O/test -h127Cs test -h136Mode day -h138Mode 138 -h127MaxWallMin 200"
$EXE $B -h127Label $L "$@" -logFile $O/logs/$L.log
echo "$L exit $?" >> $O/logs/test157.exit

paths157.py(1日の早回しの動画のカメラの道を作るスクリプト)

15_sec04.py.txt8,828字・163行・python
#!/usr/bin/env python3
"""依頼157(paths155.py の写し:カメラは cams157。寄り 外来の大廊下の清掃 は、7:30〜8:00 のうち清掃の人が寄りの枠(x26〜70)の中の大廊下の点で拭いている(1人でも)、7:40 にいちばん近い時刻(extra157.csv の「着いた:拭く1〜4」から、その点で止まる秒のあいだ))。もとの説明:依頼155(paths154.py の写し:カメラは cams155。寄り 化学療法のトイレの前 は、その日はじめに化学療法のトイレへ行く化学療法の患者が、トイレの前の通り道 x114〜115.5・z53〜60 に入って 1 秒後)。もとの説明:依頼154(paths149.py の写し:カメラは cams154。寄り 救急の待合・正面玄関から救急へ行く道 は、10:00 ごろ・14:00 ごろの窓の中で、救急の患者が正面玄関から救急の待合へ歩いている人数がいちばん多い分)。もとの説明:依頼149(paths147.py の写しを直した:静止画は cams149 の6つを 10:00 ごろ・14:00 ごろの2回)。もとの説明:依頼147(paths143.py の写しを直した):撮る回のカメラの道(-h141CamPath の CSV)を、確かめの回 check143a(同じ種・同じ実行ファイル)から作る。

flowday(1日の早回し。依頼141 の paths141.py と同じ作り):0.05 秒から、ふだん 1.2 秒ごと(30倍)で引き。
  ロボットが走っている間(legs の 行き・帰り・移る。続いている区間はつなぐ)は 0.2 秒ごと(5倍)で付いて行く寄り
  (左30°・75°見下ろし・距離 27.9 m・注視点=ロボットの位置を σ1.5 秒でならした点)。最初と最後の 25 コマで引き⇄寄り(smoothstep)。
  引きは、そのときロボットのいる側(x<60 は西半分、それ以外は東半分。cams143.py の w_west・w_east)。最後の便が戻ったところで終わる
静止画(cams143.py の8つ):1行だけの道(その時刻に1枚)。時刻は下の STILLS(ロボットが台の前に止まっている時刻など)
別のタブで開く保存

cams157.py(静止画のカメラの値を書き出すスクリプト)

#!/usr/bin/env python3
"""依頼157:カメラ(-h139Cam の値)。依頼155 の9つ(cams155.py)に、寄り1つを足す(左30°・75°見下ろし。距離と注視点は依頼139 の camfit139.py と同じ決め方):
  外来の大廊下の清掃(x26〜70・z17〜31.5:大廊下と、総合受付・会計の待合の北の側)。
静止画は依頼155 の17枚に、7:40 ごろの n_clean(清掃の人とカート)を足す。補助者が歩いて運ぶ回は、撮る回(廊下だけ・0.6m/秒・種0)の時刻表に無いので撮らない"""
import os, sys
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from camfit139 import fit
from cams155 import cams as cams155, still_cams as still155

NEAR = [("n_clean", "寄り・外来の大廊下の清掃", (26.0, 70.0, 17.0, 31.5))]


def cams():
    out = list(cams155())
    for key, ja, (x0, x1, z0, z1) in NEAR:
        tx, tz, d = fit(30.0, 75.0, x0, x1, z0, z1)
        out.append((key, 30.0, 75.0, tx, tz, d, ja, (x0, x1, z0, z1)))
    return out


def still_cams():
    C = {c[0]: c for c in cams()}
    return list(still155()) + [("n_clean", C["n_clean"], "clean")]


if __name__ == "__main__":
    for n, yaw, p, tx, tz, d, ja, rng in cams():
        if len(sys.argv) > 1 and sys.argv[1] == "table":
            print("%s\t%s\t方位%g 見下ろし%g\t範囲 x%g〜%g z%g〜%g\t注視点(%.2f, %.2f)\t距離 %.1f" % (n, ja, yaw, p, rng[0], rng[1], rng[2], rng[3], tx, tz, d))
        else:
            print("%s,%g,%g,%.2f,%.2f,%.1f,40,2720,2160" % (n, yaw, p, tx, tz, d))

sheet157.py(静止画を並べた図を作るスクリプト)

#!/usr/bin/env python3
"""依頼157:静止画18枚(依頼155 の17枚+5段目に 寄り 外来の大廊下の清掃)。もとの説明:依頼155:静止画17枚(依頼154 の16枚+5段目に 寄り 化学療法のトイレの前)。もとの説明:依頼154:静止画16枚(パネル付き)を1枚に並べる(上の2段=10:00 ごろ、下の2段=14:00 ごろ。各段4枚:真上の全体・引き 西半分・引き 東半分・寄り エレベーターホール/
寄り 中待合・総合受付と会計の待合・救急の待合・正面玄関から救急へ行く道)
  python3 sheet157.py <静止画のフォルダ> <camspath157_stills.csv> <出力.png>"""
import csv, os, sys
from PIL import Image, ImageDraw
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
import pan140 as P
from cams157 import cams, still_cams

src, stills, dst = sys.argv[1:4]
what = {r["cam"]: (float(r["t_s"]), r["what"]) for r in csv.DictReader(open(stills, encoding="utf-8"))}
ja = {c[0]: c[6] for c in cams()}
sc = [x for x in still_cams() if x[0] in what]
tw, th, cap = 960, 540, 64
sheet = Image.new("RGB", (tw * 4 + 50, (th + cap) * 5 + 90), (255, 255, 255))
d = ImageDraw.Draw(sheet)
d.text((10, 34), "依頼157 病院 h1・人の動き(職員は持ち場ごとの型と用事・清掃と警備の人)・廊下だけ・0.6m/秒・種0・色A 1〜2段=10時ごろ・3〜4段=14時ごろ・5段=化学療法のトイレの前・7:40 ごろの清掃",
       font=P.font(True, 30), fill=P.INK, anchor="lm")
mark = "①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱"
for k, (n, c, tk) in enumerate(sc):
    im = Image.open(os.path.join(src, "still157_%s.png" % n)).convert("RGB").resize((tw, th), Image.LANCZOS)
    x, y = 10 + (k % 4) * (tw + 10), 70 + (k // 4) * (th + cap)
    sheet.paste(im, (x, y))
    t, w = what[n]
    d.text((x + 4, y + th + 22), "%s %s" % (mark[k], ja[c[0]]), font=P.font(True, 24), fill=P.INK, anchor="lm")
    cap2 = "%s(%.2f 秒) %s" % (P.clock(t), t, w)
    fs = 20
    while fs > 12 and d.textlength(cap2, font=P.font(False, fs)) > tw - 8: fs -= 1     # 依頼157:枠の幅に収まるまで字を小さくする
    d.text((x + 4, y + th + 50), cap2, font=P.font(False, fs), fill=P.GRAY, anchor="lm")
sheet.save(dst)
print(dst, sheet.size)

受け取る人がロボットに会えない・大廊下の人が減ったなど、4つが残った

残ったこと中身決めた直し方
受け取る人がロボットに会えない
ロボットは届け先で待たずに戻り、受け取る職員が台に着く頃にはもういない。試算の決まり(受け取る人が来るまで待つ)と合っていない
届け先で、受け取る人が降ろし終わるまでロボットは動かない
大廊下の人が減った
混んでいる時間帯の平均が1.4人から0.9人(目安は2〜8人)。くじ引きの行き来が無くなった分を、清掃・警備・ほかの階の職員では埋められなかった
人を増やす動きは足さず、患者の動きの直しで増える分を見る
通り抜ける人が出ていない
ほかの階の職員の通り抜ける人90人のうち64人が出ていない。フロアの形で、正面玄関に入れる職員が事務だけだった
職員の全部の役割が正面玄関を通れるようにする
60秒以上動けなかった人が6件
総合受付の前や中待合の人の混みで、杖の人と車いすが75〜120秒。持ち場に立つ案内の人のそばの車いす117秒、救急室の台の前で待つロボットと看護師の間の医師112秒
立って待つ点を通り道から外す。車いすや杖の人が来たら、立っている人が半歩よける

作業ログ ― 動画を見て、呼ぶ場面と積む・受け取るが見えないと分かる

依頼155 の動画では、だれもロボットを呼ばず、積む人も受け取る人もいなかった

サイトの /series8 の搬送(病院)のタブに、1日の早回しと、問題の場面に寄る短い動画の両方を載せることになりました。載せる前に動画を確かめたい、という指示があり、依頼155 の32分の動画から、朝の緑の便・外来の山場の青の便・昼の赤の便の3場面を2分30秒に切り出して見せました。

依頼155 の動画の1コマ(11時07分、4便目の赤の便が薬剤部から化学療法室へ出た所)。白い丸がロボット、赤い箱が薬剤部の払い出し台。台のまわりに、積んだ人は見えない

ロボットが動く時はどこからか呼ばれて動いている? 人から荷物を受け取ったり、渡したりしていないように思うけど?

そのとおりでした。依頼は試算の中の数字で、場面の中にはありません。試算が、1時間あたり決まった数でばらばらに出る依頼(採血管の袋など)を作り、4室が満杯か、いちばん古い依頼が10分待つか、至急が出ると出発します。Unity はその出発時刻の表を読んで走らせていただけで、台の前では積む時間と降ろす時間だけ止まり、人は寄ってきませんでした。

依頼157 で、便ごとに職員が台へ来て積む・受け取る動きを入れました。積む側は出発前に職員が台へ来ています。ただし、ロボットが出るまでカメラが引きのままなので、動画では積む人を見分けられません。受け取る側は、上の表のとおり、職員が台に着く頃にはロボットがいませんでした。

依頼157 の動画の、3便目の青の便が内科の処置室を出る瞬間(9時57分)。左の赤い箱が台、白い輪がロボット。カメラが引きのままで、台の横に立つ積む人を見分けられない

見せ方は、次の3つを入れることに決まりました。

いつ画面に出すもの
依頼が出た時
頼んだ持ち場に印(至急は色を変える)。パネルに、待っている荷物の数と、いちばん古い依頼が待っている時間
積む時・渡す時
人がロボットの横に立っている間、パネルに「積んでいる」「受け取っている」。運んでいる荷物の数
受け取りを待つ時
届け先でロボットが受け取る人を待っている秒

ロボットの速さは0.6m/秒のまま、あとで替えられる作りにする

サイトのタブの試算は、ロボットの速さが0.6・0.9・1.2m/秒の3つで、最初の表示が0.9m/秒です。Unity は0.4・0.5・0.6・0.8m/秒の4つ(上限の0.8 は機体 KEENON の W3 の公表値)で、1日を通して撮る回はずっと0.6m/秒で回してきました。なぜ0.6 だったのかは、記録に残っていませんでした。タブは病院編を始める前に作った試作の版のままで、Unity は後から作った試算を読んでいるため、速さの選択肢そのものがずれています。

ロボットのスピードは今は0.6でいいです(将来的に可変にします。病院の混み具合やスタッフや医師の人数も可変できるようにします)

タブの試算には今は手を付けず、動画の下に撮った条件を書くことにしました。速さ・混み具合・人数は、Unity の中で決め打ちにせず、サイトの条件から読む形にそろえます。

次の依頼158 で直すことと、患者の動きの表

患者・付き添い・見舞いの人の動きを、種類ごとの表にした

職員と同じ形で、患者の側も表にしました。根拠があるのは採血と化学療法の流れで、ほかは仮置きです。救急車で来る人は、フロアの形に救急の入口が無いので今回は見送りました。

番号だれ前の動き直した動き
P1外来の患者の採血採血へ行くのは全体の15%
全部の科で5割が、診察の前に採血へ(待ち10〜40分)
P2外来の患者の待つ場所診察までずっと中待合
番が近づくまで外の待合、呼ばれたら中待合へ
P3検査の待ち待ち0分待合で5〜20分
P4化学療法の患者受付0分ですぐ点滴
採血・診察・待合で約1時間・点滴の順
P5救急の患者待合と処置が同じ長さ時間を分け、3割が X線室へ
P9見舞いの人通り抜けるだけ総合受付に1分寄る

採血の5割は、獨協医科大学埼玉医療センター(890床)の外来採血室の報告(外来1日約1,300人のうち採血約700人)から、化学療法の約1時間は、国立がん研究センター中央病院の通院治療センターの案内(席に案内されるまで通常1時間程度)から取りました。

patient_classification.md(患者・付き添い・見舞いの人の動きの台帳の全文)

# 病院の Unity:患者・付き添い・見舞いの人の動きの表

最終更新:2026-11-12(案。エイイチの了承待ち。まだサイトの条件には入れていない)
職員の表は staff_classification.md。元の洗い出しは flow155/people_issues_155.md。

| 番号 | だれ | 人数(1日) | 今の動き | 直す案 | 根拠 | 効き目 | 状況 |
|---|---|---|---|---|---|---|---|
| P1 | 外来の患者:採血 | 390 | 採血へ行くのは内科の半分だけ(全体の15%) | 全部の科で5割が、診察の前に採血へ行く。採血の待ちは10〜40分 | 獨協医科大学埼玉医療センター(890床):外来1日約1,300人のうち採血約700人。待ちは平均41分(仕組みを入れた後は10分) | 大。採血の所は青の道の積む所で、大廊下を歩く人も増える | 了承待ち |
| P2 | 外来の患者:待つ場所 | 390 | 診察までずっと中待合に座る(中央値40分・最大約2時間) | 番が近づくまで外の待合(総合受付・会計の待合)で待ち、呼ばれたら中待合へ移る(中待合は10〜15分) | 根拠なし(仮置き)。中待合は呼ばれた人が入る所、という一般的な使い方 | 大。大廊下を歩く回数が1人あたり1回増える | 了承待ち |
| P3 | 外来の患者:検査の待ち | 95 | 生理検査・処置の待ちが0分 | 待合で5〜20分待つ | 根拠なし(仮置き) | 小 | 了承待ち |
| P4 | 化学療法の患者 | 20 | 受付0分で、すぐ点滴 | 採血 → 診察(内科の診察室)→ 化学療法の待合で約1時間 → 点滴。付き添いは外来と同じ3割。点滴中のトイレは1〜2回 | 国立がん研究センター中央病院の案内:検査 → 診察 → 通院治療センター、席に案内されるまで通常1時間程度。付き添いとトイレの回数は仮置き | 中。薬の調製を待つ時間が、赤の便の待ちと同じ時間に重なる | 了承待ち |
| P5 | 救急の患者 | 18 | 全員が歩いて正面玄関から。待合と処置が同じ長さ | 待合10〜60分・処置60〜120分に分ける。3割がX線室へ行く。5割に付き添い | 根拠なし(仮置き)。歩いて来る人と救急車の割合の公開の数字は見つからなかった | 中。救急室は緑の道の積む所 | 了承待ち |
| P6 | 救急車で来る人 | 0 | いない | フロアの形に救急の入口が無いので、今回は入れない。入れるならフロアの形を先に直す | - | 中 | 見送り(相談) |
| P7 | 病棟の患者と看護師 | 各54 | X線室への道が救急の待合を通り抜ける | 依頼157 の記録(動けなかった人のまわり)を見てから決める | - | 中 | 依頼157 待ち |
| P8 | 付き添い | 192 | 患者と同じ動き | 今のまま | - | 小 | - |
| P9 | 見舞いの人 | 105 | 玄関とエレベーターの間を通り抜けるだけ | 総合受付に1分寄ってから行く(面会の手続き) | 根拠なし(仮置き) | 小 | 了承待ち |

## 根拠にした資料
- 獨協医科大学埼玉医療センターの外来採血室の報告(医学検査 73巻2号)https://www.jstage.jst.go.jp/article/jamt/73/2/73_23-100/_html/-char/ja
- 国立がん研究センター中央病院 通院治療センターの案内 https://www.ncc.go.jp/jp/ncch/division/outpatient_treatment_center/first_round/index.html

依頼158 に向けて、サイトの条件に3回に分けて入れたもの

依頼158 の前に、正であるサイト側を先に直しました。試算には、依頼が出た時刻・便ごとの荷物の数・届け先で受け取る人を待つ秒を記録させて書き出すようにしています(記録を足しただけで、便の時刻も結果も変わりません)。撮る回(種0)の依頼は1日29件で、赤20件・青6件・緑3件です。

diff_3c7927b.txt(commit 3c7927b の差分。呼ぶ場面と荷物の見せ方・依頼が出た時刻の書き出し)

16_sec06.txt6,291字・103行・diff
commit 3c7927b 病院:呼ぶ場面と荷物の見せ方(request_view)を足し、依頼が出た時刻・便の荷物の数・受け取りを待つ秒を書き出すようにした

diff --git a/tools/hospital_sim/README.md b/tools/hospital_sim/README.md
index 7c26407..5313cbf 100644
--- a/tools/hospital_sim/README.md
+++ b/tools/hospital_sim/README.md
@@ -78,3 +78,7 @@ Unity 依頼134 で、外来の混む時間は裏口の道で廊下の問題が
 - `people_flow.elevator_traffic` のほかの階の職員を、運ぶ人・通り抜ける人・用事で来る医師に分けた(3:5:2。仮置き)
別のタブで開く保存

diff_0463a35.txt(commit 0463a35 の差分。患者の動き)

17_sec06.txt7,462字・258行・diff
commit 0463a35 病院:患者の動きを直した(採血は全科で5割・外の待合から中待合へ・化学療法は採血と診察のあと約1時間待つ・救急の待合と処置を分ける・見舞いは受付に寄る)

diff --git a/tools/hospital_layouts/hospital_h1.json b/tools/hospital_layouts/hospital_h1.json
index 65dba9a..ff6df11 100644
--- a/tools/hospital_layouts/hospital_h1.json
+++ b/tools/hospital_layouts/hospital_h1.json
@@ -4596,6 +4596,7 @@
     ],
別のタブで開く保存

diff_23f2f65.txt(commit 23f2f65 の差分。正面玄関を職員も通れるように・台の前の決まり・立っている人がよける決まり)

18_sec06.txt4,294字・86行・diff
commit 23f2f65 病院:正面玄関を職員も通れるようにした・台の前の決まり(届け先で受け取りを待つ)と積む受け取るの秒を条件に入れた・立っている人がよける決まりを足した(依頼158 の前)

diff --git a/tools/hospital_layouts/hospital_h1.json b/tools/hospital_layouts/hospital_h1.json
index ff6df11..105146e 100644
--- a/tools/hospital_layouts/hospital_h1.json
+++ b/tools/hospital_layouts/hospital_h1.json
@@ -5098,9 +5098,13 @@
      "外来の患者": "入る",
別のタブで開く保存

依頼158 は、患者の動き・呼ぶ場面・台の前の決まりを1つにまとめて回している

依頼158 は2026年11月12日の18:43 に始まり、この記事を書いている時点ではまだ動いています。上限は10時間です。サイト用の素材として、依頼が出てから受け取るまでを1本で追う、1便の通しの短い動画を2本(青の便と赤の便)撮るように書きました。結果は次の記録に書きます。サイトの搬送のタブに動画を載せるのは、その結果で大廊下の人数と動けなくなる人を確かめてからです。

request158.md(依頼158 の依頼文の全文)

19_158_1_request158.md4,885字・83行・markdown
---
作業フォルダ: /Users/shimazueiichi/Robotics_UX/ServiceSim
上限時間: 600
---
# 依頼158:病院の患者の動きを直し、呼ぶ場面と積む・受け取るを見せて、1日を撮り直す

依頼157 の報告(claude_code_reports/20261112_hospital_157.txt)の「決めてほしいこと」1〜6 に、エイイチと決めた答え(2026-11-12):
1 通り抜ける人 64 人が出ない:**正面玄関を職員も通れるようにした**(フロアの形の access。看護師・医師・薬剤師・検査技師「入る」)。90 人とも出す
別のタブで開く保存