⑦で 21 卓が「経路がつながらない」になった件。原因しらべと、コストをやめて手順に直した分です。 Unity は押していません(Editor が開いたままのため)。 ──────────────────────────────────────────────────────── 1. 原因しらべ(私の側でできたところまで) ──────────────────────────────────────────────────────── (1) 区画の箱の位置は、通路の区画どおりでした ← 原因ではない AddNarrowAisleAreas が作る箱を、JSON の数字から計算して突き合わせました。 A01 JSON rect [1.2, 4.6, 2.0, 12.2] → 箱 x 1.20..2.00 / z 4.60..12.20(中心 y=0.5・高さ 2.0) A02 JSON rect [4.5, 4.8, 5.3, 14.05] → 箱 x 4.50..5.30 / z 4.80..14.05 A03 JSON rect [7.8, 4.8, 8.6, 14.05] → 箱 x 7.80..8.60 / z 4.80..14.05 3 本とも、JSON の通路の区画と小数点以下までぴったりです(ずれ 0)。 (2) 判定の厳しさは、段階1 と同じでした ← 原因ではない 段階1 で使っていた NavMeshBaker.PathLength も、PathComplete でなければ -1 を返す作りです (「経路が途中まで」もエラー扱い)。段階1 は 42/42 が ok だったので、 判定が厳しくなったのではなく、**道探しの結果そのものが変わっています**。 変えたのは「区画 4 を焼いたこと」と「コスト 20」の 2 つだけです。 (3) いちばん疑わしいのは、コストの入れ方です(仮説。まだ確かめていません) エイイチの見立て(道探しが上限に当たって PathPartial)も考えましたが、 落ちた卓の並びが合いません。 落ちた: A02 の 9 卓・A03 の 9 卓・通路の外の T27〜T30(受け渡し口にいちばん近い側) 通った: A01 の 8 卓(受け渡し口からいちばん遠い) 探索の上限なら「遠いものから落ちる」はずで、逆になっています。 また ⑦ のロボット用の面は三角形 148 枚しかないので、上限には当たりにくいはずです。 疑っているのは NavMeshQueryFilter.SetAreaCost の使い方です。 この構造体は agentTypeID を入れた時点で全区画のコストが入りますが、 そこへ SetAreaCost を混ぜると、ほかの区画のコストが思ったとおりにならないことがあります (0 のまま、など)。そうなると A* の見積もり(直線距離)と実際のコストが合わなくなり、 近い行き先でも途中で打ち切られて PathPartial になります。 T27〜T30(狭い通路をまったく通らない卓)まで落ちたのは、これで説明が付きます。 **確かめは、次の実行で自動的に出ます。** CSV に 2 列足しました。 wide_status … 狭い通路を外して探したときの結果 all_status … 狭い通路も入れて、**コストを使わずに**探したときの結果 all_status が全卓 ok なら、「コストを使わなければ段階1 と同じに戻る」=コストが原因、と確定します。 ──────────────────────────────────────────────────────── 2. 直した内容(コストをやめて、サイトの決まりをそのまま手順に) ──────────────────────────────────────────────────────── RobotSpec narrowAisleCost(20)を削除 → avoidNarrowAisles(true/false)に ServingRobotController ・SetAreaCost をやめた(agent の区画コストは触らない) ・SetDestination を 2 段にした ① 狭い通路の区画を外して探す(RobotFilterWithoutNarrow) → 完全につながればそれを使って終わり ② つながらない行き先だけ、狭い通路も入れて(コストはそのまま 1) いちばん短い道を使う どちらも引けないときは、今までどおり「途中までの道」で進みます (あきらめる道の仕組みは変えていません) ・UsedNarrowAisle(その道が ② だったか)を記録用に出せるようにした ServiceSimJsonStore 確かめも **まったく同じ 2 段** にした。via_narrow は ② のときだけ 1 agent.areaMask は変えていません。狭い通路の中に立っているときに足もとの面を外すと、 その場で動けなくなるためです(道を引くときだけ外します)。 あわせて、走るときと確かめで「止まる位置を面へ寄せる半径」がずれていたのをそろえました。 走行 spec.Radius * 4 = 1.0 m(前からこの値) 確かめ 0.5 m(段階1 のまま)→ **1.0 m にそろえた** 寄せた距離は CSV の snap_m に出します(0.3 m 以上動いた卓は報告にも並べます)。 寄せる先は「いちばん近い面の点」なので、半径を広げても測る場所は変わりません。 届くかどうかの判定だけが、走行と同じになります。 ──────────────────────────────────────────────────────── 3. こうなるはず(JSON の寸法から計算した予測) ──────────────────────────────────────────────────────── 止まる位置から、障害物(卓・ベンチ・椅子・壁・通れない部屋)に 0.25 m 以上空けて 「狭い通路の区画の外」に出られるかを、0.02 m 刻みで調べました。 via_narrow = 0(狭い通路を使わずに届く): **24 卓** via_narrow = 1(狭い通路でしか届かない): **18 卓** A01: T02 T03 T04 T06 T07 T08 A02: T10 T11 T12 T14 T15 T16 A03: T19 T20 T21 T24 T25 T26 **T17 と T22 は via_narrow = 0 の側に入ります**(ご依頼の期待どおり)。 T17 止まる位置 [4.812, 13.888] … A02 の北の口まで 0.16 m。口の外へ 0.18 m で出られる T22 止まる位置 [8.588, 12.688] … A03 の東のふちまで 0.012 m。 T22 の東(z 12.2 以上)は卓が無く空き床なので、0.02 m 外へ出れば広い床 サイトの「narrow(ロボットが行けない)24 卓」との差は 6 卓(T01・T05・T09・T13・T18・T23)。 この 6 卓は止まる位置が通路の口から 0.16〜0.38 m しかなく、Unity では **口の外に立ったまま届く**ので、狭い通路に入らずに済みます。 サイトは「通路の真ん中に 50 cm の余裕がある道のり」で見ているので、ここは食い違います。 どちらに寄せるかは段階2 の前に決めたいです(Unity 側では埋めていません)。 ──────────────────────────────────────────────────────── 4. お願い ──────────────────────────────────────────────────────── ServiceSim/JSON Store/⑦ p5_crammed を建てて確かめる を押して、{日付}_p5_crammed_table_dist.csv と _json_check.txt を送ってください。見たいのは 1. all_status が全卓 ok か(=コストが原因だったかの確定) 2. via_narrow が 1 になった卓が、上の 18 卓と合っているか 3. T17・T22 が via_narrow = 0 で、道のりが JSON の dist(17.05 / 12.0 m)に近いか 4. snap_m が大きい卓(0.3 m 以上)がどれか ③ も一度押していただけると、via_narrow が全卓 0 のままか(1.2 m なので区画を付けていない)が 確かめられます。 触ったファイル Robot/RobotSpec.cs narrowAisleCost → avoidNarrowAisles Robot/ServingRobotController.cs SetAreaCost をやめ、SetDestination を 2 段に(SolvePath) Editor/ServiceSimJsonStore.cs 確かめも 2 段に。wide_status / all_status / snap_m を追加 NavMeshBaker(区画 4 を焼くところ)と JsonStoreLayout(normal_width で印を付けるところ)は そのままです。区画を焼くこと自体は、2 段の手順でもそのまま使います。