サービスロボット導入シミュレーション Log#43 | 病院の通れない所を直すと、搬送ロボットの問題が増えた
この記事の素材(コード・ログ・データ 10ファイル・まとめてダウンロードあり)arrow_downwardAIで読む ChatGPT・Claude などで、この記事に質問できます expand_more
病院で検体や薬を運ぶ搬送ロボットを Unity で動かすシミュレーションで、それまで行き先へ歩いて行けなかった救急の患者・病棟から検査に来る患者・ほかの階の職員の41人を通すと、ロボットに起きる問題(急に止まった・ひやり・人がよけさせられたなど)は1日84件から132件に増えた。増えた48件のうち37件は、患者に付き添ったり通り抜けたりするために職員が入れるようにした所へ、職員がふだんの行き来でも行くようになり、大廊下の東の端でロボットと会った分だった。 同じ回で、待合の椅子と車いすの場所の色も、引きの絵で見分けられるように直した。
この回で良くなったこと、できるようになったことです。
- 病院のフロアで「行けない行き先」が0人になった。救急の患者18人・X線室へ行く病棟の患者17人・ほかの階の職員6人が、Unity の病院の中を歩くようになった。病棟の患者に付き添う看護師は、前は大廊下の端で1日74回立って待っていたが、91回とも検査の所の中で待つようになった
- 外来の大廊下に同時にいる人の数に、比べる相手の根拠ができた。これまで比べていた60人・20人は根拠のない仮置きで、この階の外来の人数から出し直すと、混む時間で2〜8人・午後で1〜3人だった。Unity の病院は混む時間で平均2.2人・午後で1.3人で、この幅に入った
- 待合の椅子(ベンチ)と車いすの場所が、引きの絵でも見分けられるようになった。椅子は薄いミントから濃いミント、車いすの場所は黄色の面から灰色の枠とバツにした。見た目だけの変更なので、見た目を出さない回の結果は前と1バイトも違わなかった
- 作業は依頼箱から Claude Code が回した。色の変更(依頼153)は38分、通れなかった人を通して1日を撮り直す回(依頼154)は197分。Unity を人が開いて手で直した所はない。前に同じことを手でやったことはないので、比べる時間はない
困っていたのは2つです。1つは、前の回(LOG485)で患者と職員を部屋に出入りさせたとき、だれがどこに入れるかの決まりが狭すぎて、救急の患者は玄関から救急の待合へ、病棟の患者は X線室へ歩いて行けず、Unity が7つの「決めてほしいこと」を出して止まっていたことです。もう1つは、立体の絵で待合の椅子と車いすの場所が見えにくかったことです。
立体図の色を変更したいので、いくつか提案してください(椅子の色と)車椅子のスペースが視認性良くない。
| 何を | なぜ | どうなったか |
|---|---|---|
椅子と車いすの場所の色を、案を並べて決めた | 薄いミントの椅子が床と同じ明るさで、車いすの場所の黄色が患者の黄色と同じだった | 椅子は濃いミント #4FAE8E、車いすの場所は灰色 #5F5E5A の枠とバツ(依頼153) |
大廊下の参考の人数を出し直した | 比べていた60人・20人に根拠がなかった | この階の外来の人数から、混む時間2〜8人・午後1〜3人 |
だれがどこに入れるかを直した(サイト側) | 救急の患者・病棟の患者・付き添いの看護師・ほかの階の職員が、行き先へ歩いて行けなかった | 通り抜けだけの所と、付き添いで入る所を足した |
通れなかった41人を出して1日を撮り直した | 依頼149 で7つの「決めてほしいこと」が出て止まっていた | 行けない行き先は0人。問題は1日84件から132件に増えた(依頼154) |
病院の搬送ロボットのほかに、配膳ロボットを自分の店に入れたらどうなるかは、このシリーズの試算をもとにした別のページで試せます。
作業ログ ― 待合の椅子と車いすの場所の色を、案を並べて決める(依頼153)
この記事のコード・ログ・データは、1ファイルずつ下に置いています。全文はリンク先にあります。
ファイルの一覧(10本)
01_1_report153.txt ― 依頼153:見た目だけを変え、結果が1バイト一致することを確かめた / report153.txt(依頼153 の報告の全文)・5,084字
02_sec01.py.txt ― 依頼153:見た目だけを変え、結果が1バイト一致することを確かめた / pan153.py(静止画に時刻と問題の数のパネルを付ける)・12,052字
03_sec02.txt ― フロアの形の「だれがどこに入れるか」に、通り抜けと付き添いの所を足した / c61174b の差分(make_hospital_h1.py・hospital-unity-params.json)・5,158字
04_sec02.py.txt ― フロアの形の「だれがどこに入れるか」に、通り抜けと付き添いの所を足した / make_hospital_h1.py(直したあとの全文)・30,817字
05_sec03.md ― 化学療法のトイレへの通り道は幅0.35m で、人が通れなかった / 依頼154 の依頼文・3,042字
06_0.35m_report154.txt ― 化学療法のトイレへの通り道は幅0.35m で、人が通れなかった / report154.txt(依頼154 の報告の全文)・15,809字
07_0.35m_agg154_out.txt ― 化学療法のトイレへの通り道は幅0.35m で、人が通れなかった / agg154_out.txt(依頼154 の確かめのまとめ)・12,908字
08_sec03.py.txt ― 化学療法のトイレへの通り道は幅0.35m で、人が通れなかった / agg154.py(確かめの回をまとめる)・13,931字
09_0.35m_paths154.py.txt ― 化学療法のトイレへの通り道は幅0.35m で、人が通れなかった / paths154.py(人の通った所と時間を数える)・6,690字
10_sec03.py.txt ― 化学療法のトイレへの通り道は幅0.35m で、人が通れなかった / pan154.py(静止画と動画に時刻と問題の数のパネルを付ける)・12,008字
依頼箱と Claude Code は、Unity の作業を自動で回す仕組み
この回の Unity の作業は、どれも「依頼箱」で回しました。依頼箱は、Claude(チャットの側)が書いた依頼文を Mac のフォルダに置くと、Mac の見張り係が Claude Code(Mac の上でコードを書いて動かす Claude)に1件ずつ渡し、報告をフォルダに書き戻す仕組みです。Unity を人が開いて操作することはなく、終わると Mac に通知が出ます。依頼文と報告は、どれもこの記事の下に全文で載せています。
| 言葉 | この記事での意味 |
|---|---|
| 依頼箱 | Claude が書いた依頼を、Mac の見張り係が Claude Code に渡す仕組み(iCloud の 依頼箱/ フォルダ) |
| 依頼153・依頼154 | 依頼箱に置いた依頼の番号 |
| 見た目なしの回 | Unity で人やロボットの見た目を作らずに回す回。問題の数はこの回を正とする |
check-in の番号(cs:123 など) | Unity の場面とコードを Unity Version Control に保存したときの番号 |
薄いミントの椅子と黄色の車いすの場所は、床と人に紛れていた
前の回(LOG485)で決めた色は「ミント×木目」です。待合の椅子は薄いミント(#9FD6CB)、車いすの場所は黄色(#F2C94C)の面でした。立体の絵にすると、椅子はクリーム色の床とほとんど同じ明るさで形が浮かず、車いすの場所は患者(黄色の丸)と同じ黄色で、人なのか場所なのかが分かりませんでした。
案は、チャットの中に小さな絵を描いて並べました(Unity で撮る前に方向を決めるため)。
| 案の組 | 中身 | 決めたこと |
|---|---|---|
椅子と車いすの場所だけ(3案) | A ミントを濃く・B 椅子を深緑で締める・C 車いすの場所を濃い青で主役に | A をもとにする |
| 床から見直す(4案) | 明るいグレー・木目に寄せる・ミントと木目を入れ替え・一段暗く | 床は今のクリームのまま |
| 車いすの場所の印(3案) | 淡い青の面+白のバツ・青の枠+青のバツ(面なし)・淡い青の面+濃い青のバツ | 面を塗らない枠とバツ |
| 枠とバツの線(7案) | 青・灰色・深緑 × 細・中、青の破線 | 灰色・中 |
車いすの場所を黄色から外したのは、患者の黄色と重ねないためです。青は車いすの国際シンボルの色ですが、職員の濃い青と近くなるので、灰色にしました。灰色は壁と同じ系統で「床の区画」として収まり、ロボットと人のじゃまをしません。線の太さは、四角の1辺の約7.5% にしました。
依頼153:見た目だけを変え、結果が1バイト一致することを確かめた
色は Unity の HospitalLook.cs の、色Aをまとめて書いた表で変えました。車いすの場所は、黄色の面1枚を、枠4本とバツ2本の線に置き換えています。線は床から5mm だけ浮かせ、当たり判定を付けていません。

- ねらい:引きの絵で、待合の椅子の並びと車いすの場所を、黄色の患者と混ぜずに見分けられるようにする
- 変わったこと:椅子 #9FD6CB → #4FAE8E、車いすの場所は黄色 #F2C94C の面 → 灰色 #5F5E5A の枠とバツ(線の太さ約11cm)。見た目なしの回の記録17個は、依頼149 と1バイト一致した
- 見込める効果:Unity の静止画と動画を、病院の人に見せたときに待合の形が一目で読める。数は変わらないので、前の回の結果とそのまま比べられる(見込み。見せた人の反応で確かめる)
Claude Code が目で見た結果は次のとおりです(直さずに書くだけ、と頼んだもの)。
| 見たこと | 結果 |
|---|---|
| 椅子が床から浮いて見えるか | 寄りでも引きでも浮いて見える |
バツが引きで途切れたり消えたりしないか | 真上では12か所とも見える。引きの遠い所は細く明るめだが、消えてはいない |
| 黄色の人と見分けられるか | 見分けられる。車いすの人が印の上にいると、車いすの台と線が近い灰色で重なる |
| 照明で色が外れていないか | 色合いは狙いどおり。どちらも明るく出る(椅子 約 #60C4A0・線 約 #747068) |
Claude Code からの「決めてほしいこと」5つ(線は1.5m 四方なので約11cm・待合の床が1cm低いので約15mm 浮く・照明で明るく出る・車いすの人と線が重なる・h0 の長いすも同じ色になる)は、どれもそのままにしました。照明に合わせて色の値を追うと、ほかの物との釣り合いが崩れるためです。
依頼153 の依頼文
---
作業フォルダ: /Users/shimazueiichi/Robotics_UX/ServiceSim
上限時間: 120
---
# 依頼153:病院の待合の椅子の色と車いすの場所の印を変え、寄りと引きで確かめる
依頼149 の静止画を見て、エイイチと決めたこと(2026-11-11):
- 待合の椅子(ベンチ)の薄いミントは、クリームの床とほとんど同じ明るさで見えにくい → **濃いミント #4FAE8E** にする
- 車いすの場所の黄色い四角は、黄色の人(患者)と区別がつかない → **黄色の面をやめ、灰色 #5F5E5A の枠とバツ(×)の線だけ**にする(面は塗らない。床の色が透ける)
- 線の太さは、四角の1辺の約 7.5%(1辺 1.2 m なら約 9 cm)。枠とバツは同じ太さ・同じ色
- 床から少しだけ浮かせて(5 mm ほど)ちらつかないようにする
**見た目だけの変更。** 床・壁・人・机・ベッド・ロボットの色、カメラ、人とロボットの動き、数える問題は変えない。
車いすの場所の印には当たり判定を付けず、NavMesh も変えない。
**配膳の場面・配膳の実行ファイル・配膳の台帳、配膳と共通の部品には触らない。** 変えるのは Assets/ServiceSim/Hospital/ の中だけ。
依頼149 の「決めてほしいこと」1〜7 はまだ決まっていないので、手を付けない。
**エイイチは見ていない。人に聞かないと進めない所に当たったら、その項目は止めて報告に書き、ほかは続ける。**
## 始める前に確かめること(違えば回さずに報告して終わる)
作業場所の保留 0(cs:122 のあと)・Unity と回し係が動いていない・KIOXIA がマウント済み
## 1. 変える
- 椅子(ベンチ)と車いすの場所を表す物を場面とコードから全部探し、一覧(名前・置き場所・数)を報告に書く。色Aの決め方がまとめて書かれている所があれば、そこで変える
- 黄色を使っている物がほかにもあれば(人の色を除く)、変えずに一覧に書くだけにする
- check-in(保留0)して、Builds/hospital153/ を作る。前の実行ファイルは残す
## 2. 確かめ(違えば 3 は撮らずに止める)
- 見た目なしの回を、依頼149 と同じ条件(廊下だけ・0.6m/秒・種0)で回し、結果が依頼149 と1バイト一致すること(見た目だけの変更なので)
- 印に当たり判定が付いていないこと、NavMesh が変わっていないこと
## 3. 撮る(依頼149 と同じカメラの値。cams149.txt)
- 10:00 ごろの時刻で:真上の全体(top_all_10)、引き 西半分(w_west_10)、寄り 総合受付と会計の待合(n_wait_10)、寄り 中待合(n_midwait_10)
- 並べた図:左に依頼149 の同じ静止画、右に今回のもの(4段)
- 寄りと引きのそれぞれで、次を目で見て報告に書く(直さずに書くだけ)
- 椅子が床から浮いて見えるか
- 車いすの場所のバツが、引きで途切れたり消えたりしていないか。黄色の人と見分けられるか
- 照明で色が狙い(#4FAE8E・#5F5E5A)から大きく外れて見えていないか
- 出力:/Volumes/KIOXIA/r2r2r-data/service_sim/unity/hospital/20261111_look153/。並べた図と静止画は iCloud の …/サービスロボット導入シミュレーション/hospital/look153/ にも写し、md5 を確かめる
## 報告
claude_code_reports/20261111_hospital_153.txt に:始める前の確かめ、1 の一覧と変えた所、2 の確かめ、3 の目で見た結果、出力の場所、check-in の番号、決めてほしいこと(直し方の候補は作らない)。
**報告の最後の1行は必ず次のどれか**:「判定:合格」/「判定:止めた(決めてほしいことあり)」/「判定:失敗」
依頼153 の結果(依頼箱の結果の全文)
# 結果:20261111_153_病院の待合の椅子の色と車いすの場所の印を変えて寄りと引きで確かめる
- 状態:完了
- 始めた時刻:2026-11-11 16:02
- 終わった時刻:2026-11-11 16:40(38分)
- 作業フォルダ:/Users/shimazueiichi/Robotics_UX/ServiceSim
- この続きを Claude Code で話すとき:作業フォルダで `claude --resume 1557d8d9-3660-4257-a6ac-372bd0b4dc77`
## Claude Code の報告
**やったこと**
- 始める前の確かめはすべて合っていました。作業場所の保留は 0(cs:122 のあと)、Unity と回し係は動いておらず、KIOXIA はマウント済みです。
- 椅子(ベンチ)と車いすの場所を、場面とコードから探しました。
- どちらも場面ファイルには置かれておらず、見た目ありのときにデータから作られます。
- ベンチは 63 個です(総合受付・会計・待合 20/ほかの外来 12/お薬の窓口 9/生理検査 8/内科外来 6/外来化学療法室 4/救急室 4)。
- 車いすの場所は 12 か所で、どれも約 1.5 m 四方です(総合受付の待合 4/外科・整形外科の中待合 3/ほかの5か所に 1 ずつ)。
- 色A の決め方がまとめて書かれている表(HospitalLook.cs)で変えました。
- 椅子:#9FD6CB → #4FAE8E。
- 車いすの場所:黄色の面をやめ、灰色 #5F5E5A の枠4本とバツ2本の線だけにしました。線の太さは短い辺の 7.5%、上の面は床から 5 mm 上で、当たり判定は付けていません。
- 人の色を除くと、本当の黄色はほかにありませんでした。黄色に近い物(いす・リクライニングチェア・杖・ロボットの前の印など)は変えずに報告に一覧で書きました。
- check-in は cs:123 で、そのあと保留 0 です。Builds/hospital153 を作り、前の実行ファイルは残しています。
- 確かめの2回(見た目なし・見た目あり)を回し、そのあと 10:00 ごろの静止画4枚と、依頼149 と並べた図(4段)を作りました。
**結果**
- 見た目なしの回は、依頼149 と記録 17 個が1バイト一致しました。見た目ありの回も同じく一致し、違うのは回の名前・番号・かかった時間だけです。
- 印に当たり判定は付いていません。NavMesh の焼き直しのログも依頼149 と同じで、動きの記録も一致したので、NavMesh は変わっていません。
- 撮る回は 8880 秒まで、流して書く記録が確かめの回と頭から一致しました。撮り終えたあと終わらずに止まったので強制終了しましたが、記録は書き終えていました。
- 目で見た結果(直していません):
- **椅子が浮いて見えるか**:寄りでも引きでも浮いて見えません。依頼149 と違い、床との差がはっきりしました。
- **バツが引きで途切れたり消えたりしないか**:真上では 12 か所とも見えます。引き(西半分)の遠い所は線が細く明るめに見えますが、消えてはいません。
- **黄色の人と見分けられるか**:見分けられます。ただし、車いすの人が印の上にいると、車いすの台と線が近い灰色で重なって見えます。
- **照明で色が外れていないか**:色合いは狙いどおりですが、どちらも明るく出ています。椅子は約 #60C4A0(狙い #4FAE8E)、線は約 #747068(狙い #5F5E5A)です。
- 出力は KIOXIA の …/hospital/20261111_look153/ にあります。並べた図と静止画4枚は iCloud の …/hospital/look153/ にも写し、5つとも md5 が一致しました。
- 報告は claude_code_reports/20261111_hospital_153.txt に書き、KIOXIA にも写しを置きました。最後の行は「判定:合格」です。
**変えたファイル**
- Assets/ServiceSim/Hospital/HospitalLook.cs
- Assets/ServiceSim/Hospital/Editor/HospitalSetup.cs(実行ファイルの置き場所を hospital153 に変えただけ)
**決めてほしいこと**
1. 線の太さ:依頼は「1辺 1.2 m なら約 9 cm」でしたが、データの車いすの場所は約 1.5 m 四方なので、7.5% の決まりに合わせて約 11 cm にしました。これでよいですか。
2. 床から 5 mm は、廊下の床から測りました。待合の床は廊下より 1 cm 低いので、待合では約 15 mm 上に見えます。これでよいですか。
3. 照明で、椅子も線も狙いより明るく見えます。この見え方でよいですか。
4. 線の灰色が車いすの台の色に近く、車いすの人が印の上にいると重なって見えます。このままでよいですか。
5. 色A の表を変えたので、依頼139・140 の形(h0)の長いすも同じ濃いミントになります。これでよいですか。
依頼149 の「決めてほしいこと」1〜7 には手を付けていません。
report153.txt(依頼153 の報告の全文)
依頼153:病院の待合の椅子の色と車いすの場所の印を変え、寄りと引きで確かめる(2026-11-11)
■ 始める前の確かめ(すべて合っていたので進めた)
- 作業場所の保留:0(cm status で変更なし。cs:122 - head)
- Unity(エディタ)・回し係(night_runner・rec_runner・HospitalSim):動いていない(動いていたのは Unity Hub だけ)
- KIOXIA:/Volumes/KIOXIA にマウント済み
■ 1. 変えた所colors153.txt(静止画から測った椅子と線の色)
top_all_10 緑み 多い順 [('#60C4A0', 7404), ('#60C8A0', 4760), ('#64C8A0', 4492)] /灰色み [('#646058', 2620647), ('#64605C', 16637), ('#70706C', 10162)] /床 [('#FCF4E0', 1762905)]
w_west_10 緑み 多い順 [('#64C4A0', 12616), ('#60C8A0', 11118), ('#60C4A0', 9401)] /灰色み [('#646058', 1212650), ('#6C6C6C', 8931), ('#64605C', 5925)] /床 [('#FCF4E0', 2469619)]
n_wait_10 緑み 多い順 [('#60C4A0', 31060), ('#60C8A0', 18792), ('#64C4A0', 18751)] /灰色み [('#646058', 173558), ('#686868', 55685), ('#6C6C6C', 17061)] /床 [('#FCF4E0', 3398075)]
n_midwait_10 緑み 多い順 [('#64C8A0', 66576), ('#60C4A0', 30403), ('#60C8A0', 15096)] /灰色み [('#686868', 59057), ('#6C6C6C', 11520), ('#747068', 6965)] /床 [('#FCF4E0', 3810783)]
寄り 中待合 n_midwait_10 (2480, 1500, 2720, 1830) 印の線(灰色の画素 多い順) [('#747068', 5016), ('#74706C', 2294), ('#747064', 1501)]
真上 top_all_10 (890, 1010, 975, 1050) 印の線(灰色の画素 多い順) [('#747064', 71), ('#747068', 62), ('#787064', 56)]
参考 依頼149 中待合 椅子(狙い #9FD6CB)多い順 ['#B8F4E0', '#B8F4E4', '#B8F0E0']
cmp153_out.txt(見た目なしの回を依頼149 と比べた結果)
== check153a vs check149a
同じ 17:access147.csv・build143.csv・crowd.csv・elevator149.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, unity_cs, wall_s
== check153L vs check149L
同じ 17:access147.csv・build143.csv・crowd.csv・elevator149.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, unity_cs, wall_s
== check153L vs check149a
同じ 17:access147.csv・build143.csv・crowd.csv・elevator149.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, unity_cs, wall_s
cmp153_rec.txt(撮る回の記録を確かめの回と比べた結果)
同じ 4:access147.csv・build143.csv・rescues.csv・staff147.csv
違う 13:crowd.csv(頭から 2552 / 2552・9259 バイト一致・短い方は全部一致)・elevator149.csv(頭から 12447 / 12447・59747 バイト一致・短い方は全部一致)・events.csv(頭から 3565 / 3565・20089 バイト一致・短い方は全部一致)・legs.csv(頭から 1152 / 1250・7010 バイト一致)・moves.csv(頭から 190 / 190・786 バイト一致・短い方は全部一致)・people147.csv(頭から 183 / 206017・271206 バイト一致)・robot_track.csv(頭から 512267 / 512267・1992149 バイト一致・短い方は全部一致)・robot_zones.csv(頭から 70 / 4561・4589 バイト一致)・seats147.csv(頭から 115 / 41025・41049 バイト一致)・staff_moves147.csv(頭から 43520 / 43520・155214 バイト一致・短い方は全部一致)・toilet149.csv(頭から 8121 / 8121・22906 バイト一致・短い方は全部一致)・trips.csv(頭から 476 / 2455・2499 バイト一致)・zones147.csv(頭から 192480 / 192480・716594 バイト一致・短い方は全部一致)
summary.json の違う項目: braking, crowd_max, flow_elevator, flow_escort_calls, flow_escorts, flow_exited, flow_inside_at_end, flow_near_stops, flow_not_spawned, flow_nurse_calls, flow_skip_notes, flow_skips, flow_spawn_waits, flow_spawned, flow_staff_moves, flow_toilet_extend_n, flow_toilet_extend_s, flow_toilet_not_due, flow_toilet_trips, flow_ward_nurse_hall_waits, frames, last_trip_end_s, legs_done, legs_total, moves, moves_done, n1_sudden_stop, n2_fast_near_miss, n2_near_miss, n2_near_robot_moving, n3_people_yield, n6_overlap_moving, near_min_m, person_max_step_m, run, run_corridor_n1, run_corridor_n2, run_corridor_n3, run_end_s, run_room_n1, run_room_n2, run_room_n3, run_room_n6, sim_s, status, stretchers, trips_done, trips_not_run_after_end, trips_unfinished_at_end, wait_n2_near_miss, wait_n2_near_robot_stopped, wait_n3_people_yield, wall_s
cams153.txt(静止画のカメラの値)
top_all_10,0,90,60.00,30.00,142.8,40,2720,2160
w_west_10,30,75,34.06,21.26,85.8,40,2720,2160
n_midwait_10,30,75,31.80,35.73,32.4,40,2720,2160
n_wait_10,30,75,46.58,20.95,54.6,40,2720,2160
run153.sh(確かめの回を回す)
#!/bin/bash
# 依頼153:確かめの回(依頼149 の check149a・check149L と同じ条件。h1・人の動き flow・廊下だけ・0.6m/秒・種0)
# check153a=見た目なし(check149a と1バイト一致か)、check153L=見た目あり・カメラなし・車いすの場所の印あり(check149a・check149L と一致か)
cd /Users/shimazueiichi/Robotics_UX/ServiceSim
O=/Volumes/KIOXIA/r2r2r-data/service_sim/unity/hospital/20261111_look153
EXE=Builds/hospital153/HospitalSim.app/Contents/MacOS/ServiceSim
CS=$(python3 -c "import json;print(json.load(open('Builds/hospital153/build_info.json'))['unity_cs'])")
run() { L=$1; shift; $EXE -batchmode -nographics -h143Layout h1 -h127Speed 0.6 -h127Seed 0 -h127Out $O/runs -h127Cs $CS -h136Mode day -h138Mode 138 -h127Label $L -h127MaxWallMin 200 "$@" -logFile $O/logs/$L.log; echo "$L exit $?" >> $O/logs/run153.exit; }
run check153a -h147People flow -h136Plan hall &
run check153L -h147People flow -h136Plan hall -h139Look on -h140Scheme A -h143Wheelchair on &
wait
echo done >> $O/logs/run153.exit
rec153.sh(撮る回を回す)
#!/bin/bash
# 依頼153:撮る回(依頼149 の rec149 と同じ条件:h1・人の動き flow・廊下だけ・0.6m/秒・種0・色A・車いすの場所の印あり)。
# カメラは cams149.txt の10時の4つ(top_all_10・w_west_10・n_midwait_10・n_wait_10)だけ。8880 秒で撮り終えたら止める
cd /Users/shimazueiichi/Robotics_UX/ServiceSim
O=/Volumes/KIOXIA/r2r2r-data/service_sim/unity/hospital/20261111_look153
EXE=Builds/hospital153/HospitalSim.app/Contents/MacOS/ServiceSim
CS=$(python3 -c "import json;print(json.load(open('Builds/hospital153/build_info.json'))['unity_cs'])")
CAMS=()
while read -r c; do CAMS+=(-h139Cam "$c"); done < $O/cams153.txt
$EXE -batchmode -h143Layout h1 -h147People flow -h143Wheelchair on -h127Speed 0.6 -h127Seed 0 -h127Out $O/runs -h127Cs $CS -h136Mode day -h136Plan hall -h138Mode 138 -h139Look on -h140Scheme A \
-h127Label rec153 "${CAMS[@]}" -h141CamPath $O/camspath153.csv -h139EndAfterShots on -h127MaxWallMin 200 -logFile $O/logs/rec153.log
echo "rec exit $?" > $O/logs/rec153.exit
pan153.py(静止画に時刻と問題の数のパネルを付ける)
#!/usr/bin/env python3
"""依頼153(pan149.py の写し:読む表を camspath153_*.csv に、静止画は still153_*.png で 10時の4つだけ)。もとの説明:依頼149(pan147.py の写しを直した:カメラは cams149、静止画は6つ×2つの時刻、エレベーター・トイレ)。もとの説明:依頼147(pan143.py の写しを直した:カメラは cams147、静止画7枚、題に人の動き)。もとの説明:依頼143:h1 の静止画(8枚)と1日の早回しの動画に、輪・パネル・凡例・上の帯を付ける(1920×1080)。依頼141 の pan141.py と同じ作り
(輪・凡例・パネルの形は依頼140 の pan140.py)。違うのは:病院 h1、ロボットの状態(台の前で待っている・積む所へ移る)、
行き先の名前を短く、道(緑・青(表)・青(裏口)・赤)、引きは西半分と東半分、問題を 廊下/部屋の中 に分けて帯に出す。
python3 pan143.py stills <回のフォルダ> <出力フォルダ>
python3 pan143.py video <回のフォルダ> flowday <出力.mp4> [並べる数]
python3 pan143.py frame <回のフォルダ> flowday <コマ番号> <出力.png>sheet153.py(依頼149 と依頼153 の静止画を並べる)
#!/usr/bin/env python3
"""依頼153:並べた図(4段。左=依頼149 の静止画、右=依頼153 の静止画。10時ごろの 真上の全体・引き 西半分・寄り 総合受付と会計の待合・寄り 中待合)
python3 sheet153.py <依頼149 の静止画のフォルダ> <依頼153 の静止画のフォルダ> <camspath153_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 cams149 import cams, still_cams
old, new, stills, dst = sys.argv[1:5]
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()}
base = {n: c[0] for n, c, tk in still_cams()}
order = ["top_all_10", "w_west_10", "n_wait_10", "n_midwait_10"]
tw, th, cap = 1280, 720, 64
sheet = Image.new("RGB", (tw * 2 + 30, (th + cap) * len(order) + 130), (255, 255, 255))
d = ImageDraw.Draw(sheet)
d.text((10, 34), "依頼153 待合の椅子の色と車いすの場所の印(病院 h1・人の動き・廊下だけ・0.6m/秒・種0・色A)",
font=P.font(True, 30), fill=P.INK, anchor="lm")
d.text((10 + tw // 2, 90), "左:依頼149(椅子 #9FD6CB・車いすの場所=黄色 #F2C94C の面)", font=P.font(True, 26), fill=P.INK, anchor="mm")
d.text((20 + tw + tw // 2, 90), "右:依頼153(椅子 #4FAE8E・車いすの場所=灰色 #5F5E5A の枠とバツ)", font=P.font(True, 26), fill=P.INK, anchor="mm")
mark = "①②③④"
for k, n in enumerate(order):
y = 110 + k * (th + cap)
for j, (folder, pre) in enumerate([(old, "still149_"), (new, "still153_")]):
im = Image.open(os.path.join(folder, pre + n + ".png")).convert("RGB").resize((tw, th), Image.LANCZOS)
sheet.paste(im, (10 + j * (tw + 10), y))
t, w = what[n]
d.text((14, y + th + 22), "%s %s" % (mark[k], ja[base[n]]), font=P.font(True, 24), fill=P.INK, anchor="lm")
d.text((14, y + th + 50), "%s(%.2f 秒) %s" % (P.clock(t), t, w), font=P.font(False, 20), fill=P.GRAY, anchor="lm")
sheet.save(dst)
print(dst, sheet.size)
作業ログ ― 依頼149 で止まった7つを決め、だれがどこに入れるかを直す(サイト側)
依頼149 の「決めてほしいこと」7つと、決めた答え
依頼149 は、エレベーターとトイレを足して人の行き来を増やす回でした。報告まで済みましたが、Unity が決めてはいけないことに当たり、7つを書いて止まっていました。答えは次のとおりです。
| 番号 | 依頼149 で止まったこと | 決めた答え |
|---|---|---|
| 1 | フロアの形に、依頼に書いていない違いが3つあった | このままでよい(形を直したときに一緒に変わった所で、md5 も一致) |
| 2 | 救急の患者が、正面玄関から救急の待合へ歩いて行けない | 正面玄関の前の職員の中廊下を横切ってよい |
| 3 | 病棟から検査に来る患者が X線室に入れない/付き添いの看護師が生理検査の待合に入れない | どちらも入れる。看護師は検査の所まで一緒に行く |
| 4 | ほかの階の職員が、X線室・生理検査の検査室・外来化学療法室へ行けない | 待合や処置の場所を通り抜けてよい |
| 5 | 化学療法の患者が、全員約85m先の西のトイレへ行く | 化学療法室のトイレを使う |
| 6 | 大廊下の人は平均1.6人で、参考の60人・20人と大きく違う | 動きを足す前に、参考の人数の出し方を見直す |
| 7 | Unity で決めた値(トイレに立つ時刻・付き添いの待ち方など) | このままでよい |
大廊下の参考の60人は、この階の人の流れからは出なかった
参考にしていた「混む時間60人・空いている時間20人」は、前の前提の表で「仮置き」と書かれていて、根拠がありませんでした。そこで、この階の外来の人数から、大廊下に同時にいる人の数を出し直しました。使ったのはリトルの法則です。リトルの法則は「ある場所に同時にいる人の数は、そこに入ってくる人の速さに、そこにいる時間を掛けたもの」という関係で、待ち行列の計算でよく使います。
| 前提 | 値 |
|---|---|
| この階の外来の患者・付き添い | 1日 390人+180人=570人 |
いちばん多い1時間に玄関から入る人 | その22%で約125人(午後は7%で約40人) |
1人が大廊下 x0〜70 を通る回数 | 2〜4回 |
| 1回に大廊下にいる時間 | 30〜60秒(30〜40m を秒速0.8〜1.0m) |
| 混む時間に同時にいる人 | 約2〜8人(真ん中は約5人) |
| 午後に同時にいる人 | 約1〜3人 |
エレベーターから来る職員や見舞いの人を足しても、1人ほど増えるだけです。60人は、この階の患者の数からは出てこない数で、Unity の病院の大廊下が空いているのは、計算と合っていました。 そのため、大廊下に人を増やすための動きは足さないことにしました。参考の値(value)は依頼143 の形を同じに回すためにそのまま残し、前提の表 assumptions.json に、流れからの目安を flow_estimate として書き足しました。
- ねらい:Unity の大廊下の人数を、根拠のある数と比べられるようにする
- 変わったこと:比べる相手を、根拠のない60人・20人から、流れからの目安(混む時間2〜8人・午後1〜3人)に替えた
- 見込める効果:大廊下が「空きすぎ」かどうかを、人の動きを足すかどうかの判断に使える。病院の廊下で人を数えた公開データは見つからなかったので、現場で数えられたら置き換える
estimate_hall_people.py(大廊下に同時にいる人の目安を出す)
"""外来の大廊下 x0〜70 に同時にいる人の数の目安を、この階の人の流れから出す(2026-11-11・LOG488)。
リトルの法則:同時にいる人 = 1秒あたりに大廊下を通る回数 × 1回に大廊下にいる秒数
前提は p2m-site の tools/hospital_sim/hospital-unity-params.json の people_flow(読むだけ)。"""
import json
p = json.load(open('hospital-unity-params.json'))['people_flow']
op = p['outpatients_per_day']['value'] # 科ごとの1日の外来患者数
cr = p['companion_ratio']['value'] # 付き添いが付く割合(小児科は1.0)
comp = sum(v * (1.0 if k == '小児科' else cr) for k, v in op.items())
tot = sum(op.values()) + comp
print('外来の患者', sum(op.values()), '付き添い', comp, '合計', tot)
for share, label in [(0.22, '山場(いちばん多い1時間)'), (0.07, '午後')]:
arr = tot * share # その1時間に玄関から入る人
for legs, sec in [(2, 30), (3, 45), (4, 60)]: # 大廊下を通る回数・1回に大廊下にいる秒数
print(label, round(arr), '人/時', legs, '回', sec, '秒 →', round(arr * legs / 3600 * sec, 1), '人')
estimate_hall_people.py の出力
外来の患者 390 付き添い 180.0 合計 570.0
山場(いちばん多い1時間) 125 人/時 2 回 30 秒 → 2.1 人
山場(いちばん多い1時間) 125 人/時 3 回 45 秒 → 4.7 人
山場(いちばん多い1時間) 125 人/時 4 回 60 秒 → 8.4 人
午後 40 人/時 2 回 30 秒 → 0.7 人
午後 40 人/時 3 回 45 秒 → 1.5 人
午後 40 人/時 4 回 60 秒 → 2.7 人
フロアの形の「だれがどこに入れるか」に、通り抜けと付き添いの所を足した
病院のフロアの形は、サイト(p2m-site)の hospital_h1.json が正で、Unity はこれを読んで建てます。この中の access は「だれがどこに入れるか」の表で、外来の患者・看護師・医師など9つの役割ごとに、所ごとに「座る」か「入る」を決めています。cross_only は「通り抜けるだけ」の所で、指定した範囲だけを通れます。2〜5 の答えに合わせて、次を足しました。
| 所 | 足した役割 | 理由(答えの番号) |
|---|---|---|
職員の中廊下(正面玄関の前 x44〜52) | 救急の患者(通り抜けだけ) | 2 |
| 救急の待合・救急の処置の場所 | 外来の患者(通り抜けだけ。病棟から X線室へ来た患者) | 3 |
| X線室 | 外来の患者・看護師(入る) | 3 |
| 生理検査の待合・検査室 | 看護師(入る)、待合には医師も | 3・4 |
| 救急の処置の場所 | 検査技師(入る) | 4 |
| 化学療法の受付・待合 | 医師(入る) | 4 |
| トイレの行き先(条件の表) | 化学療法の患者は化学療法のトイレ | 5 |
変えたのは access とトイレの行き先だけで、ほかの部屋・家具・道の長さは変わっていません(作り直したあとの確かめで「問題なし」)。
c61174b の差分(make_hospital_h1.py・hospital-unity-params.json)
commit c61174b241fb1e6b4049d6216c5a79760cd2a2c6
Author: Claude <noreply@anthropic.com>
Date: Wed Nov 11 18:57:40 2026 +0900
病院 h1:依頼149 の決めてほしいこと2〜6を反映(access:救急の患者の玄関からの通り抜け・病棟の患者のX線室・付き添いの看護師・職員の通り抜け/化学療法の患者は化学療法のトイレ/大廊下の人数の流れからの目安 flow_estimate)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LevEXTHwTViAABX66t78yDc61174b の差分(assumptions.json。大廊下の目安とトイレの行き先)
commit c61174b241fb1e6b4049d6216c5a79760cd2a2c6
Author: Claude <noreply@anthropic.com>
Date: Wed Nov 11 18:57:40 2026 +0900
病院 h1:依頼149 の決めてほしいこと2〜6を反映(access:救急の患者の玄関からの通り抜け・病棟の患者のX線室・付き添いの看護師・職員の通り抜け/化学療法の患者は化学療法のトイレ/大廊下の人数の流れからの目安 flow_estimate)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LevEXTHwTViAABX66t78yD
diff --git a/tools/hospital_sim/assumptions.json b/tools/hospital_sim/assumptions.json
index 9f5ee18..b9d78b7 100644
--- a/tools/hospital_sim/assumptions.json
+++ b/tools/hospital_sim/assumptions.json
@@ -498,7 +498,25 @@
"source": "エイイチと決めた(2026-11-09)",
"n": null,
"updated": "2026-11-09",
- "note": "2026-11-11:依頼147 から人は行き先の順で動くので、Unity はこの人数を置かない。大廊下の人数と比べる参考の値として残す"
+ "note": "2026-11-11:依頼147 から人は行き先の順で動くので、Unity はこの人数を置かない。大廊下の人数と比べる参考の値として残す。2026-11-11:仮置きの 20・60 は人の流れから出ない(flow_estimate)。依頼143 の hall の形を同じに回すため value は変えない",
+ "flow_estimate": {
+ "value": {
+ "空いている(午後)": [
+ 1,
+ 3
+ ],
+ "混んでいる(8〜11時)": [
+ 2,
+ 8
+ ]
+ },
+ "unit": "人",
+ "what": "外来の大廊下 x0〜70 に同時にいる人の数を、この階の人の流れから出した目安(リトルの法則:同時にいる人=1秒あたりに大廊下を通る回数×1回に大廊下にいる秒数)",
+ "basis": "推計",
+ "source": "この階の外来の患者 390人+付き添い 180人=1日 570人(people_flow の outpatients_per_day・companion_ratio)。いちばん多い1時間に入る人はその22%で約125人、午後は7%で約40人(arrival_by_hour)。1人が大廊下 x0〜70 を通るのは 2〜4回、1回に 30〜60秒(30〜40m を秒速 0.8〜1.0m)として、山場 約2〜8人(真ん中 約5人)・午後 約1〜3人。エレベーターから来る職員・見舞いの人を足しても1人ほど増えるだけ",
+ "updated": "2026-11-11",
+ "note": "依頼149 の Unity(見た目なし)は山場 平均1.7〜2.6人・午後 平均1.6〜2.1人で、この幅の中(山場は下の端)。60人・20人は根拠のない仮置きで、この流れからは出ない。病院の廊下で人を数えた公開データは見つからなかった。現場で数えられたら置き換える"
+ }
},
"people_mix": {
"value": {
@@ -1090,7 +1108,7 @@
3,
7
],
- "where": "近い方のトイレ(西・東)"
+ "where": "近い方のトイレ(西・東)。化学療法の患者は化学療法のトイレ(2026-11-11 依頼149 の5:西まで約85m歩いていたため)"
},
"what": "外来の患者・付き添い・化学療法の患者がトイレに行く割合(病院にいる間に1回)と、とどまる時間",
"basis": "仮置き",
make_hospital_h1.py(直したあとの全文)
# -*- coding: utf-8 -*-
"""仮の病院 h1:h0b の形に、全部の部屋の中(小部屋・扉・家具)と4つの道を足す。
2026-11-10 エイイチと決めた:病院のフロアと道を全部作る。部屋の中まで全部、道は 3ルート+裏口の道。
- 部屋・廊下・積む所と届け先の点は h0b と同じ(h0・h0b の JSON は変えない)
- 部屋の中の並びは、外来・検査部・薬剤部・外来化学療法室・救急室の典型をコードで起こした仮置き
- 道は 緑(救急室→検査部)・青 表(内科外来の処置室→検査部、大廊下を通る)・青 裏口(職員通路を通る)・赤(薬剤部→外来化学療法室)
- 高さは配膳のベースに合わせる:部屋・小部屋の壁 2.4m作業ログ ― 通れなかった41人を出し、病院の1日を撮り直す(依頼154)
行けない行き先は0人になり、看護師は検査の所の中で待つようになった
依頼154 では、直したフロアの形を Unity に読ませ、依頼149 で出せなかった人を出しました。救急の患者18人は正面玄関から職員の中廊下を横切って救急の待合へ、病棟の患者のうち17人は X線室へ、ほかの階の職員6人はそれぞれの持ち場へ歩きます。病棟の患者に付き添う看護師は、患者と同じ速さで一緒に歩き、検査の所の中で患者のそば(0.7m)に立って待ちます。

| 確かめたこと | 結果 |
|---|---|
| 同じ条件で2回回した記録 | 18ファイルとも md5 が同じ |
| 瞬間移動・便・立ち往生 | 瞬間移動0・便16/16・立ち往生と助け0 |
| 入れない所にいた時間 | ロボット・人とも、役割ごとに0秒 |
行けない行き先・出さなかった人 | 種類ごとに全部0人 |
| 病棟の看護師が待った所 | 検査の所の中91回・大廊下の端0回(依頼149 は大廊下の端74回) |
救急の待合・処置の場所を通り抜けた人 | X線室へ行き来する病棟の患者17人だけ。1人あたり中央値 待合18.4秒・処置の場所36.8秒 |
大廊下 x70〜120(看護師が待っていた所)の人 | 1日の平均 2.48人 → 0.69人 |
大廊下 x0〜70 の人は、混む時間(8〜11時)で平均2.2人、午後で1.3人で、どちらも流れからの目安の中でした。30分ごとに見ると、混む時間に目安の下の端(2人)を少し下回る時間帯が3つ(1.8〜1.9人)、午後に1人を下回る時間帯が2つ(0.7・0.8人)あります。
ロボットの問題は1日84件から132件に増え、37件は大廊下の東の端で起きた
問題の数は、走っている間の「1 急に止まった/2 ひやり/3 人がよけさせられた/4 立ち往生/5 横切り/止まりきれなかった」です(1日・秒速0.6m・種0。見た目なしの回が正)。
| 廊下だけの道・走っている間 | 依頼154 | 依頼149 | 依頼147 | 依頼143 |
|---|---|---|---|---|
| 全部 | 17/54/51/0/0/10(132件) | 9/37/37/0/0/1(84件) | 8/42/35/0/0/3(88件) | 23/49/31/2/1/5(111件) |
| 外来の大廊下 | 5/12/7/0/0/2 | 1/5/4/0/0/0 | 1/7/2/0/0/0 | 21/48/28/2/1/5 |
| 職員の廊下 | 4/27/33/0/0/3 | 5/24/28/0/0/0 | 5/30/28/0/0/2 | 2/1/2/0/0/0 |
| 部屋の中 | 8/15/11/0/0/5 | 3/8/5/0/0/1 | 2/5/5/0/0/1 | 0/0/1/0/0/0 |
増えた48件のうち37件は、大廊下の東の端(化学療法の受付の台と、東の縦廊下の口のまわり)で起きました。依頼149 では、ここは1件でした。相手はほとんどが職員で、ひやり54件のうち46件、人がよけさせられた51件のうち48件、止まりきれなかった10件は全部が職員でした。救急の患者・病棟の患者が相手の問題は少なく、患者と付き添いが相手のひやりは7件です。

増えた原因は、通り抜けのために足した所が、職員のふだんの行き先にもなったこと
Unity の決まりでは、職員が持ち場から動くとき、行き先を「その職員が入れる所」から選びます(依頼147 からの決まり)。付き添いと通り抜けのために「入る」を足したので、職員はその所へふだんの行き来でも行くようになりました。1日の行き来は、検査技師→救急の処置の場所が0回から46回、検査技師→X線室が0回から36回、医師→化学療法の受付・待合が0回から14回、看護師→X線室が0回から14回などです。その行き来が、化学療法の受付の前と東の縦廊下の口で、ロボットと会っていました。
今回の目的は「通り抜けられるようにする」ことで、職員のふだんの行き先を増やすことではありませんでした。 そのため次の回で、ふだんの行き先はもとの持ち場の所だけにし、足した所は付き添いと通り抜けのときだけ入る形に分けます。
化学療法のトイレへの通り道は幅0.35m で、人が通れなかった
化学療法の患者を化学療法室のトイレへ行かせようとしたところ、トイレの入口の前が、準備室とトイレのあいだの幅0.5m の細い長方形だけで、壁の厚みを引くと0.35m しかなく、歩いて行けませんでした。サイト側でフロアの形を作ったときの間違いです。Claude Code はこの項目を止め、前と同じく近い方のトイレ(西。点滴の場所から約85m)へ行かせて数えています(1日8人)。次の回で、通り道を点滴の台を押して通れる幅(約0.9m 以上)に直します。

依頼154 の依頼文
---
作業フォルダ: /Users/shimazueiichi/Robotics_UX/ServiceSim
上限時間: 480
---
# 依頼154:病院の行けない所を直し、救急・病棟の患者と職員を通して、1日を撮り直す
依頼149 の報告(claude_code_reports/20261111_hospital_149.txt)の「決めてほしいこと」1〜7 に、エイイチと決めた答え(2026-11-11):
1 h1 の書かれていなかった違い3つ(点滴の場所の 0.5 m の長方形・車いすの場所の 0.1 m・血圧脈波の検査室の家具が無い):**このままでよい**依頼154 の結果(依頼箱の結果の全文)
# 結果:20261111_154_病院の行けない所を直し救急と病棟の患者を通して1日を撮り直す
- 状態:完了
- 始めた時刻:2026-11-11 18:58
- 終わった時刻:2026-11-11 22:16(197分)
- 作業フォルダ:/Users/shimazueiichi/Robotics_UX/ServiceSim
- この続きを Claude Code で話すとき:作業フォルダで `claude --resume 2a856e44-4991-42d8-b7cb-61a14438b33f`
## Claude Code の報告
**やったこと**
- 始める前の確かめ:作業場所は cs:123 で保留 0、Unity も回し係も動いていませんでした。KIOXIA はマウント済みです。サイト(c61174b)の h1 と params は md5 が一致し、前の写しとの違いも依頼に書かれたとおりでした(h1 は access だけ、params は md5 2つとトイレの行き先だけ)。
- 新しい引数は作らず、-h147People flow の中身を直しました。
- 救急の患者 18 人を正面玄関から出し、職員の中廊下 x44〜52 を横切らせました。
- X線室へ行く病棟の患者 17 人と、ほかの階の職員 6 人も出しました。
- 付き添いの看護師は大廊下の端で待たず、患者と同じ速さで一緒に歩き、検査の所の中で患者のそばに立って待つ形にしました。
- 化学療法の患者のトイレは、化学療法のトイレへ行く形にしました(ただし下のとおり行けませんでした)。
- cs:124 に check-in し、Builds/hospital154 を作りました(保留 0)。前の実行ファイルは残しています。
- 確かめの回を 5 本回し、撮る回、静止画 16 枚、並べた図、1日の早回しの動画まで作りました。
**結果**
- 依頼149 と同じ確かめは、すべて通りました。
- 廊下だけの 2 回は、記録 18 ファイルの md5 がすべて同じでした。見た目ありの回も同じでした。hall の回は依頼143 と 9 ファイルとも同じでした。
- 瞬間移動は 0、便は 16/16、立ち往生と助けは 0 でした。ロボット・人とも、入れない所にいた時間は役割ごとに 0 秒でした。時間で切替の回も同じです。
- 飛ばした行き先と出さなかった人は、種類ごとに全部 0 人になりました。病棟の看護師が待った所は、検査の所の中が 91 回、大廊下の端が 0 回です(依頼149 は大廊下の端で 74 回)。
- 救急の待合と救急の処置の場所を通り抜けたのは、X線室へ行き来する病棟の患者 17 人だけでした。いた時間は 1 人あたり中央値で待合 18.4 秒、処置の場所 36.8 秒です。外来の患者・付き添い・見舞いの人は 0 人でした。
- 外来の大廊下 x0〜70 の人数は次のとおりです(目安は flow_estimate)。
- 混んでいる時間帯は平均 2.2 人で、目安 2〜8 の中です(依頼149 は 1.8 人)。
- 午後は平均 1.3 人で、目安 1〜3 の中です(依頼149 は 1.6 人)。
- 1日の平均は 1.64 人です(依頼149 は 1.58 人)。
- 30分ごとに見ると、目安の下の端を少し下回る時間帯が混んでいる時間帯に 3 つ(1.8〜1.9 人)、午後に 2 つ(0.7・0.8 人)あります。
- 看護師が待っていた大廊下 x70〜120 は、1日の平均 2.48 人から 0.69 人に減りました。
- 問題の数(廊下だけ、走っている間)は 9/37/37 から 17/54/51 に増えました。増えた 48 件のうち 37 件は、大廊下の東の端(化学療法の受付の台と東の縦廊下の口のまわり)です。
- 撮る回は、見た目ありの確かめの回と頭からバイト一致しました(実時間 112.8 分)。
- 動画は 48,281 コマ、32 分 11 秒です。
- 新しく足した寄り 2 つのうち、正面玄関から救急へ行く道は道が x42〜121 に広がるため、距離が 99.7 m になりました。引きとほぼ同じ大きさで、歩いている救急の患者は小さく写ります。
- iCloud の hospital/flow154/ に写した 18 ファイルは、すべて md5 が一致しました。
- 依頼149 の報告は iCloud の報告の所に見当たらなかったので、KIOXIA にある写しを読みました。
- 報告は claude_code_reports/20261111_hospital_154.txt に書き、KIOXIA の 20261111_flow154/ にも写しを置きました。最後の行は「判定:止めた(決めてほしいことあり)」です。
**変えたファイル**(すべて Assets/ServiceSim/Hospital/ の中)
- 直したもの:HospitalRun.cs、HospitalRun147.cs、HospitalRun149.cs、Editor/HospitalSetup.cs、Hospital.unity
- 場面を作り直したときに書き直されたもの:Materials/H127_*.mat の 7 つ
- 足したもの:HospitalRun154.cs、Data/hospital_h1-154.json、Data/hospital-unity-params-154.json(それぞれ .meta も)
**決めてほしいこと**
1. 化学療法のトイレへは歩いて行けません。入口の前が幅 0.5 m の長方形だけで、壁の厚みを引くと 0.35 m しかなく、人の通れる幅がありません。この項目は止めました。今は依頼149 と同じく近い方のトイレへ行かせて、その数を数えています(1日 8 人とも西)。どうするか。
2. 職員がふだん持ち場から動く行き先は、その職員が「入る」所から選ぶ決まりです。そのため、付き添いや通り抜けのために足した「入る」の所(化学療法・生理検査・救急の処置の場所・X線室)にも、ふだんの行き来で行くようになりました。問題の数が増えたのはこのためです。これでよいか。
3. Unity で決めた値でよいか。
- 看護師が待つ点:患者の行き先の所の中で、患者のそば 0.7 m の 4 方向。無ければその所の中の点。
- 看護師は患者と同じ速さ(遅い方)で歩く。
- X線室には座る家具が無いので、患者は立って待つ。
- 化学療法のトイレへ行けないときは、近い方のトイレへ行く。
report154.txt(依頼154 の報告の全文)
依頼154 報告 2026-11-11
病院の行けない所を直し、救急・病棟の患者と職員を通して、1日を撮り直す
■ 0. 始める前の確かめ(進めた)
- 作業場所:cs:123 が頭、保留の変更 0
- 動いている物:Unity のエディタ・画面なしの Unity・回し係はなし(動いていたのは Unity Hub だけ)
- KIOXIA:マウント済み
- p2m-site main:c61174b241fb…(依頼の c61174b)agg154_out.txt(依頼154 の確かめのまとめ)
== check154a_v06_hall_s0(廊下だけ)status completed/回の終わり 32400.0 秒(16:30)/最後の便が戻った 31630.9 秒/実時間 31.6 分
便 16(走った 16・途中 0・走れなかった 0)/移る 5(終えた 5)/出るのが遅れた 平均 0.0 秒・最大 0.0 秒
瞬間移動 ロボット 0(1コマ最大 0.030 m)・人 0(最大 0.084 m)/人の引き直し(180秒動けない)0/行き先の近くで止まって待った 9
立ち往生 0:
助け 0:
ロボットの入らない所に中心が入った時間 0.00 秒/どの所にも入っていない時間 0.00 秒
人が access で入れない所に入った時間(役割ごと): 外来の患者 0.00 秒・化学療法の患者 0.00 秒・救急の患者 0.00 秒・看護師 0.00 秒・医師 0.00 秒・薬剤師 0.00 秒・検査技師 0.00 秒・事務 0.00 秒cams154.txt(静止画のカメラの値)
flowday,30,75,82.5595,21.2606,85.8475,40,2720,2160
top_all_10,0,90,60.00,30.00,142.8,40,2720,2160
w_west_10,30,75,34.06,21.26,85.8,40,2720,2160
w_east_10,30,75,82.56,21.26,85.8,40,2720,2160
n_elev_10,30,75,24.33,22.51,34.0,40,2720,2160
n_midwait_10,30,75,31.80,35.73,32.4,40,2720,2160
n_wait_10,30,75,46.58,20.95,54.6,40,2720,2160
n_er_10,30,75,109.48,16.64,51.9,40,2720,2160
n_erway_10,30,75,79.76,13.80,99.7,40,2720,2160
top_all_14,0,90,60.00,30.00,142.8,40,2720,2160
w_west_14,30,75,34.06,21.26,85.8,40,2720,2160
w_east_14,30,75,82.56,21.26,85.8,40,2720,2160
n_elev_14,30,75,24.33,22.51,34.0,40,2720,2160
n_midwait_14,30,75,31.80,35.73,32.4,40,2720,2160
n_wait_14,30,75,46.58,20.95,54.6,40,2720,2160
n_er_14,30,75,109.48,16.64,51.9,40,2720,2160
n_erway_14,30,75,79.76,13.80,99.7,40,2720,2160
run154.sh(確かめの回を回す)
#!/bin/bash
# 依頼154:確かめの回(h1・人の動き flow・0.6m/秒・種0)。廊下だけ 2回(check154a・b)、時間で切替 1回(check154c)、
# 見た目あり・カメラなしの廊下だけ 1回(check154L。見た目なしの check154a と同じ記録になるか)、
# -h147People hall(依頼143 の形)で廊下だけ 1回(h143repro154。依頼143 の check143a と同じ記録になるか)
cd /Users/shimazueiichi/Robotics_UX/ServiceSim
O=/Volumes/KIOXIA/r2r2r-data/service_sim/unity/hospital/20261111_flow154
EXE=Builds/hospital154/HospitalSim.app/Contents/MacOS/ServiceSim
CS=$(python3 -c "import json;print(json.load(open('Builds/hospital154/build_info.json'))['unity_cs'])")
run() { L=$1; shift; $EXE -batchmode -nographics -h143Layout h1 -h127Speed 0.6 -h127Seed 0 -h127Out $O/runs -h127Cs $CS -h136Mode day -h138Mode 138 -h127Label $L -h127MaxWallMin 200 "$@" -logFile $O/logs/$L.log; echo "$L exit $?" >> $O/logs/run154.exit; }
run check154a -h147People flow -h136Plan hall &
run check154b -h147People flow -h136Plan hall &
run check154c -h147People flow -h136Plan switch &
run check154L -h147People flow -h136Plan hall -h139Look on -h140Scheme A -h143Wheelchair on &
run h143repro154 -h147People hall -h136Plan hall &
wait
echo done >> $O/logs/run154.exit
test154.sh(試しの実行ファイルで回す)
#!/bin/bash
# 依頼154:試しの回(試しの実行ファイル)。smoke=90分、full=1日(見た目なし・廊下だけ・0.6m/秒・種0)
cd /Users/shimazueiichi/Robotics_UX/ServiceSim
O=/Volumes/KIOXIA/r2r2r-data/service_sim/unity/hospital/20261111_flow154
EXE=Builds/hospital154/HospitalSim.app/Contents/MacOS/ServiceSim
L=$1; shift
B="-batchmode -nographics -h143Layout h1 -h147People flow -h127Speed 0.6 -h127Seed 0 -h127Out $O/test -h127Cs test -h136Mode day -h136Plan hall -h138Mode 138"
$EXE $B -h127Label $L "$@" -logFile $O/logs/$L.log
echo "$L exit $?" >> $O/logs/test154.exit
rec154.sh(撮る回を回す)
#!/bin/bash
# 依頼154:撮る回(h1・人の動き flow・廊下だけ・0.6m/秒・種0・色A・車いすの場所の印あり)。flowday=1日の早回し、ほか16=静止画16(1行だけの道)
cd /Users/shimazueiichi/Robotics_UX/ServiceSim
O=/Volumes/KIOXIA/r2r2r-data/service_sim/unity/hospital/20261111_flow154
EXE=Builds/hospital154/HospitalSim.app/Contents/MacOS/ServiceSim
CS=$(python3 -c "import json;print(json.load(open('Builds/hospital154/build_info.json'))['unity_cs'])")
CAMS=()
while read -r c; do CAMS+=(-h139Cam "$c"); done < $O/cams154.txt
$EXE -batchmode -h143Layout h1 -h147People flow -h143Wheelchair on -h127Speed 0.6 -h127Seed 0 -h127Out $O/runs -h127Cs $CS -h136Mode day -h136Plan hall -h138Mode 138 -h139Look on -h140Scheme A \
-h127Label rec154 "${CAMS[@]}" -h141CamPath $O/camspath154.csv -h139EndAfterShots on -h127MaxWallMin 400 -logFile $O/logs/rec154.log
echo "rec exit $?" > $O/logs/rec154.exit
vid154.sh(1日の早回しの動画を作る)
#!/bin/bash
O=/Volumes/KIOXIA/r2r2r-data/service_sim/unity/hospital/20261111_flow154
cd $O
export PATH=/opt/homebrew/Caskroom/miniforge/base/envs/ros_env/bin:$PATH
python3 tools/pan154.py video runs/rec154_v06_hall_s0 flowday videos/hospital154_1日_早回し_30x.mp4 8 > logs/vid154.out 2>&1
echo "vid exit $?" > logs/vid154.exit
agg154.py(確かめの回をまとめる)
#!/usr/bin/env python3
"""依頼154:確かめの回のまとめ(依頼143・147・149 の check と並べる)。
python3 agg154.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"}cmp154.py(記録を依頼149 と比べる)
#!/usr/bin/env python3
"""依頼149:2つの回の記録を比べる(同じ名前の CSV の md5・summary.json の違う項目)。
python3 cmp149.py <回A> <回B> [prefix] prefix を付けると、短い方の長さまでのバイト列の一致も見る"""
import hashlib, json, os, sys
a, b = sys.argv[1], sys.argv[2]
prefix = len(sys.argv) > 3
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, diff = [], []
for f in sorted(set(fa) | set(fb)):
if f not in fa or f not in fb: diff.append(f + "(片方だけ)"); continue
x, y = open(os.path.join(a, f), "rb").read(), open(os.path.join(b, f), "rb").read()
if x == y: same.append(f)
elif prefix:
n = min(len(x), len(y))
k = next((i for i in range(n) if x[i] != y[i]), n)
diff.append("%s(頭から %d / %d・%d バイト一致%s)" % (f, k, len(x), len(y), "・短い方は全部一致" if k == n else ""))
else: diff.append(f)
print("同じ %d:%s" % (len(same), "・".join(same)))
print("違う %d:%s" % (len(diff), "・".join(diff)))
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 = [k for k in sorted(set(sa) | set(sb)) if sa.get(k) != sb.get(k)]
print("summary.json の違う項目:", ", ".join(ks))
paths154.py(人の通った所と時間を数える)
#!/usr/bin/env python3
"""依頼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(ロボットが台の前に止まっている時刻など)cams154.py(静止画のカメラを決める)
#!/usr/bin/env python3
"""依頼154:カメラ(-h139Cam の値)。依頼149 の6つ(cams149.py。真上の全体・引き 西・東・寄り エレベーターホール・中待合・総合受付と会計の待合)に、
寄り2つを足す(左30°・75°見下ろし。距離と注視点は依頼139 の camfit139.py と同じ決め方):
救急の待合(x98〜121・z4〜31.5:救急の待合・救急の処置の場所・その前の大廊下)、
正面玄関から救急へ行く道(x42〜121・z−0.5〜31.5:正面玄関・職員の中廊下 x44〜52・玄関の通り・大廊下の東・救急の待合)。
静止画は 10:00 ごろと 14:00 ごろの2つの時刻に8つとも撮る(名前の後ろに _10・_14)"""
import os, sys
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from camfit139 import fit
from cams149 import cams as cams149
NEAR = [("n_er", "寄り・救急の待合", (98.0, 121.0, 4.0, 31.5)),
("n_erway", "寄り・正面玄関から救急へ行く道", (42.0, 121.0, -0.5, 31.5))]
BASE = ["top_all", "w_west", "w_east", "n_elev", "n_midwait", "n_wait", "n_er", "n_erway"]
TIMES = ["10", "14"]
def cams():
out = list(cams149())
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 [(b + "_" + t, C[b], t) for t in TIMES for b in BASE]
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))
pan154.py(静止画と動画に時刻と問題の数のパネルを付ける)
#!/usr/bin/env python3
"""依頼154(pan149.py の写し:カメラは cams154(寄り 救急の待合・正面玄関から救急へ行く道を足す)、静止画は8つ×2つの時刻)。もとの説明:依頼149(pan147.py の写しを直した:カメラは cams149、静止画は6つ×2つの時刻、エレベーター・トイレ)。もとの説明:依頼147(pan143.py の写しを直した:カメラは cams147、静止画7枚、題に人の動き)。もとの説明:依頼143:h1 の静止画(8枚)と1日の早回しの動画に、輪・パネル・凡例・上の帯を付ける(1920×1080)。依頼141 の pan141.py と同じ作り
(輪・凡例・パネルの形は依頼140 の pan140.py)。違うのは:病院 h1、ロボットの状態(台の前で待っている・積む所へ移る)、
行き先の名前を短く、道(緑・青(表)・青(裏口)・赤)、引きは西半分と東半分、問題を 廊下/部屋の中 に分けて帯に出す。
python3 pan143.py stills <回のフォルダ> <出力フォルダ>
python3 pan143.py video <回のフォルダ> flowday <出力.mp4> [並べる数]
python3 pan143.py frame <回のフォルダ> flowday <コマ番号> <出力.png>sheet154.py(静止画16枚を並べる)
#!/usr/bin/env python3
"""依頼154:静止画16枚(パネル付き)を1枚に並べる(上の2段=10:00 ごろ、下の2段=14:00 ごろ。各段4枚:真上の全体・引き 西半分・引き 東半分・寄り エレベーターホール/
寄り 中待合・総合受付と会計の待合・救急の待合・正面玄関から救急へ行く道)
python3 sheet154.py <静止画のフォルダ> <camspath154_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 cams154 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 = still_cams()
tw, th, cap = 960, 540, 64
sheet = Image.new("RGB", (tw * 4 + 50, (th + cap) * 4 + 90), (255, 255, 255))
d = ImageDraw.Draw(sheet)
d.text((10, 34), "依頼154 病院 h1・人の動き(救急の患者・X線室へ行く病棟の患者・ほかの階の職員を通した)・廊下だけ・0.6m/秒・種0・色A 上2段=10時ごろ・下2段=14時ごろ",
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, "still154_%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")
d.text((x + 4, y + th + 50), "%s(%.2f 秒) %s" % (P.clock(t), t, w), font=P.font(False, 18 if len(w) > 40 else 20), fill=P.GRAY, anchor="lm")
sheet.save(dst)
print(dst, sheet.size)
残したことと、次の依頼155 で直すこと
依頼154 の「決めてほしいこと」3つは、次のように決めました。
| 番号 | 依頼154 で止まったこと | 決めた答え |
|---|---|---|
| 1 | 化学療法のトイレへの通り道が幅0.35m で通れない | サイト側でフロアの形を直し、約0.9m 以上にする |
| 2 | 職員が、通り抜けのために足した所へふだんも行き、問題が増えた | ふだんの行き先はもとの持ち場の所だけにする。足した所は付き添いと通り抜けのときだけ |
| 3 | Unity で決めた値(看護師は患者のそば0.7m で待つ・患者の速さに合わせて歩く・X線室では立って待つ) | このままでよい |
1 と 2 はフロアの形の書き方(どの「入る」が通り抜け・付き添いだけなのか)から直すので、サイト側を先に直してから、依頼155 として依頼箱に置きます。問題の数が依頼149 の84件の近くに戻るか、東の端の37件が消えるかで、原因が合っていたかを確かめます。