# -*- coding: utf-8 -*- """病院の搬送ロボットの Unity が読む条件 hospital-unity-params.json を、前提の表(assumptions.json)とフロアの形から書き出す。 Unity は値を自分で決めず、このファイルを読む(配膳の serving-robot-params.json と同じ考え方。正はサイト側)。 使い方:python3 export_unity_params.py """ import hashlib import json from pathlib import Path HERE = Path(__file__).resolve().parent def day_schedule(A): """1日を通して回すときの、青のロボットの便の時刻表(試算 hospital_sim.py の1台から書き出す)。 Unity はこの時刻に積む所を出る(依頼の出方・まとめ方・ほかのルートへ行っている間は試算が決める)""" import hospital_sim as H A2, L = H.load_inputs() day0 = H.hm(A2["rules"]["day"]["value"][0]) out = {"what": "青のロボットの便の時刻表。plan × 速さ × 種。depart は 7:30 からの秒、from は積む所(表=内科外来の処置室/裏口)", "model": A2["model"], "day_start": A2["rules"]["day"]["value"][0], "plans": {}} for plan in ("廊下だけ", "時間で切替", "裏口だけ"): out["plans"][plan] = {} for sp in (0.5, 0.6, 0.8): p = H.params(A2, {"route_plan": plan, "robot_speed": sp}) out["plans"][plan][str(sp)] = [] for seed in range(A2["rules"]["seeds"]["value"]): d = H.Day(A2, L, p, 1, seed) d.run() out["plans"][plan][str(sp)].append([{"depart": t["depart_s"], "from": t["from"]} for t in d.trip_log if t["route"] == "blue"]) return out def main(): A = json.loads((HERE / "assumptions.json").read_text(encoding="utf-8")) lay_path = (HERE / A["layout"]).resolve() L = json.loads(lay_path.read_text(encoding="utf-8")) U = A["unity"] lb = (HERE / "../hospital_layouts/hospital_h0b.json").resolve() LB = json.loads(lb.read_text(encoding="utf-8")) c = {k: v["value"] for k, v in A["common"].items()} route = U["route"]["value"] out = { "about": "病院の搬送ロボットの Unity(ServiceSim の病院の場面)が読む条件。export_unity_params.py が assumptions.json から書き出す。直すときは assumptions.json を直して書き出し直す", "model": A["model"], "layout": {"file": "tools/hospital_layouts/hospital_h0.json", "md5": hashlib.md5(lay_path.read_bytes()).hexdigest(), "name": L["meta"]["name"]}, "route": {"key": route, **{k: A["routes"][route][k] for k in ("from_point", "to_point")}, "path": L["routes"][route]["path"], "distance_m": L["routes"][route]["distance_m"], "what": U["route"]["what"]}, "robot": {"speeds_mps": U["speeds"]["value"], "speed_max_mps": c["robot_speed_max"], "min_passage_m": c["min_passage_m"], "size_m": {"w": 0.459, "d": 0.549, "h": 1.081}, "size_source": "KEENON 公式 BUTLERBOT W3"}, "people": {"crowd": U["crowd_people"]["value"], "mix": U["people_mix"]["value"], "stretcher_per_h": U["stretcher_per_h"]["value"]}, "count_rules": {k: {"value": v["value"], "unit": v["unit"], "what": v["what"]} for k, v in U["count_rules"].items()}, "braking": {k: (v["value"] if isinstance(v, dict) else v) for k, v in U["braking"].items()}, "loading_point": U["loading_point"]["value"], "loading_point_what": U["loading_point"]["what"], "count_shape": U["count_shape"]["value"], "near_miss_speed_mps": U["near_miss_speed_mps"]["value"], "near_miss_speed_basis": U["near_miss_speed_basis"]["value"], "sensor_width_m": U["sensor_width_m"]["value"], "wheelchair_avoid_stopped_robot": U["wheelchair_avoid_stopped_robot"]["value"], "near_miss_split_by_robot_moving": U["near_miss_split_by_robot_moving"]["value"], "east_hall_people_ratio": U["east_hall_people_ratio"]["value"], "layout_back_door": {"file": "tools/hospital_layouts/hospital_h0b.json", "md5": hashlib.md5(lb.read_bytes()).hexdigest(), "name": LB["meta"]["name"], "blue_path": LB["routes"]["blue"]["path"], "blue_distance_m": LB["routes"]["blue"]["distance_m"]}, "staff_corridor_interval_s": U["staff_corridor_interval_s"]["value"], "stretcher_yield": U["stretcher_yield"]["value"], "crowd_by_time": U["crowd_by_time"]["value"], "back_door_hours": A["rules"]["back_door_hours"]["value"], "day_schedule": day_schedule(A), "waiting_near_miss": U["waiting_near_miss"]["value"], "day_end_rule": U["day_end_rule"]["value"], "switch_move": U["switch_move"]["value"], "seeds": U["seeds"]["value"], "basis": {k: U[k]["basis"] for k in ("speeds", "crowd_people", "people_mix", "stretcher_per_h")}, } (HERE / "hospital-unity-params.json").write_text(json.dumps(out, ensure_ascii=False, indent=1), encoding="utf-8") print("wrote hospital-unity-params.json") if __name__ == "__main__": main()