Issue #97で2026-08-21に確認した、隣接耕を使う最初の基本経路パターンの現行仕様。
圃場幾何plannerの実装契約は、本仕様に合わせて実装前に変更する。
名称は「隣接耕基本経路パターン1」とする。
既存実装の技術IDはtextbook-basic-tillageである。技術IDの変更は保存データとproducer/consumerの移行判断を
伴うため、本仕様では変更しない。後続の契約変更・実装Trackで、表示名との対応とversionを確定する。
選択した1つの入口から圃場へ入り、運転者の判断で中央耕の開始anchor付近まで移動した後、中央の隣接耕と
仕上げ外周3列を一続きに走り、同じ入口から退出する完成経路を計画する。入口から中央耕の開始anchorまでの
開始前移動は計画経路に含めない。
本方式は次を優先する。
この順序以外の局所的な評価優先順位は設けない。第1項から第3項は完成候補になるための必須条件とする。
第4項と第5項は望ましい比較方針だが、初回実装では多重走行量や距離を厳密に最適化しなくてよい。
凹形状、中央列の分裂、複数WorkAreaであること自体を停止理由にしない。
対象外であることを、その圃場では耕耘できないという意味で表示しない。
筆が本パターンの対象かどうかは、Tabletの計画開始前判定とplanner内部(Stage 1のfield分類)の両方が同じ
共有処理へ委譲して決める。分類ロジックをTablet側とplanner側の2か所へコピーしない。TabletとPCで同じ筆が
同じ分類になる。共有判定は自由文から分類を推測せず、型付きの構造化停止原因を返す。
FIELD_SHAPE_OUT_OF_SCOPE)。FIELD_DATA_REQUIRES_REPAIR / FIELD_COORDINATE_NONFINITE)。線・点・頂点不足・修復が必要な自己交差などの壊れた筆は「初期方向を決められない筆」ではなく、経路計画の
対象となる有効な面として成立していない筆である。独立した「初期方向を決められない」製品状態・イベント・
画面・専用問い合わせコード・専用テストは設けない。壊れた筆は初期方向選択・入口確認・計算を開始せず、
上記の共通事前判定で「仕様上対象外」または「筆データ不良」として停止する。入口方向を代替方向として壊れた
筆の計画を続行しない。手動方向指定によるfallback、仮の方向値の捏造を行わない。
正常な対応筆については、既存の辺方向候補(centerTillageDirectionCandidates)が最低1件得られることを共有判定
または契約テストで保証する。対応筆なのに候補が0件になる場合は、新しいfallbackを追加せず、実装を停止して
具体的な形状と原因を報告する。
製品上の順序は次のとおり。
計画には次を使う。
作業機幅の既定値は150cm、基準重ね幅の既定値は10cm、既定作業pitchは140cmとする。作業機幅は0より大きく、
重ね幅は0以上かつ作業機幅未満でなければならない。不正値を黙って補正しない。Profileで指定された重ね幅は、
外周lap同士、中央lane同士、および外周3列と中央耕の境界へ適用する。
安全余白、追い詰め最大内角、中央耕の始終端側、列数の奇偶は入力にしない。
計画開始操作(WorkMenu「耕うん計画を作成」)が、筆決定〜入口確定フローの唯一の起点である。通常の
地図タップは筆選択として働かない。この操作を行った時点で、現在位置を包含する筆を検索する。
筆選択モード中かどうか、計画未開始か、入口候補提示中か、確定済みかは、UI表示用のBooleanの組合せで
推測せず、単一の状態機械上で排他的に表す。
計画作成を開始できるかは、選択済みの筆、確認済みの入口、有効な作業機設定、初期仮方向がそろっているか
だけで判断する。現在位置が筆の内側か外側か、運転者が停車中かどうかを開始条件にしない。GNSS速度、
移動履歴、現在位置から停車を推定する処理を、この計画workflowのために追加しない。圃場進入前に
予測入口を確認できた場合は圃場へ入る前に計画を作成でき、圃場進入後に確定した入口でも作成できる。
本節は、以前の「全筆を常時監視して圃場外→内の境界横断を検出する」方式、および直近2点だけから
進行方向を求めていた方式からの仕様変更を含む(旧方式はdocs/decisions/または旧Track記録を参照。
現行実装判断には使用しない)。2026-08-29改訂: 検出済み候補は軌跡の保持期間から独立して保持し、
取り消した横断は識別情報で記憶して再検出しても復活させない。破損した設定は候補2だけを無効化する。
2026-08-30改訂: 横断前の予測入口は過去の移動方向から推定せず、筆外の現在位置から筆境界への
幾何学的な最短経路で決める。入口producerは筆決定時のスナップショットとして1回だけ実行し、fix受信
ごとの候補更新は行わない。入口producerが持っていた反対側境界の参考用出口候補は廃止し、Pattern 1の
EXIT anchorは確認済み入口からplannerが導出する。
2026-08-30再改訂: 最近傍境界点の一意性判定は行わない。複数の境界点が同じ最短距離になる場合も、
幾何演算が返すいずれか1点を予測入口として採用し、同距離判定用の製品閾値は設けない。
選択中の筆には、現在使用する登録入口を1つ保持する。計画開始時の入口候補は次の順で得る。
候補2は、筆が決定した瞬間の現在位置と、その時点までの参照用軌跡から1回だけ生成する。
現在地が筆の内側で、筆決定時点までの測位履歴に境界横断が一件も無い場合、候補2から入口を生成しない
(候補3、または未確定のまま利用者の操作を待つ)。現在位置を通る任意の直線の後方交点を「実際に通った
入口」として捏造しない。
実横断から復元する候補2は、入口位置と進行方向を分離して求める。
実横断の進行方向の算出に使う連続点列は、レイヤー0の「入口横断判定の最大点間距離」(既定値、値はレイヤー0設定に
従う)を、隣接する2測位点を同じ移動系列として扱えるかどうかの上限として使う。隣接点間の距離がこの値を
超えた場合、それより古い点はその移動系列に接続しない(受信停止をまたいで離れた点を結ばない)。時刻差
そのものによる制限は設けない。各点は受信時点で品質を満たす必要がある。この最大点間距離はアプリ全体の
レイヤー0設定とし、入口producerだけが使用する。TillagePlanRequestや経路plannerの入力には含めない。
候補2は、筆決定前から全筆を常時監視する専用producerを前提としない。位置データ受信のたびに常時更新される
共通の参照用軌跡(地図表示と共通のsource of truth)を、筆決定時にだけ読み出す。参照用軌跡はHot(直近の
未圧縮点、fixId・品質付き)とCold(古いRDP圧縮済み点)を持ち、指定した累積走行距離の範囲を、保持中の
折れ線長に基づいて取得できる。Coldの距離は圧縮後geometryによる参照用の近似距離であり、外部記録の
原測位点に基づく厳密な走行距離ではない。実横断判定そのものには、fixId・品質を保持する未圧縮Hotだけを使う。
横断前予測・実横断復元とも筆決定時に1回だけ評価するため、利用者が候補を取り消した後、同じ計画フロー中の
fix受信で候補を復活させない。予測候補用のfix identity、抑止フラグ、時間経過による再評価を設けない。
候補3(利用者による明示的な方向指定)は、候補1・候補2のいずれも無い場合だけの手段であり、操作時点で
品質と鮮度を満たす現在地を要求する。
入口横断判定の最大点間距離が破損している場合、候補2(横断前予測・実横断復元の自動候補)だけを無効化する。
候補1(登録入口)・候補3(利用者による明示的な方向指定)は、
この破損の影響を受けない。
新しい候補は利用者の確認後に今回の入口と登録入口へ反映する。利用者は候補の有無にかかわらず入口を変更できる。
入口の由来を内部状態または診断記録に保持する場合は、登録入口、横断前予測、実横断復元、利用者方向指定を
実際の生成経路どおりに区別する。横断前予測を実横断として記録してはならない。ただし、由来は確定後の
Pattern 1計画入力・出力や利用者の操作判断には使用しないため、入口確定画面を含む利用者向けUIには表示しない。
入口producerは反対側境界の参考用出口候補を生成しない。Pattern 1の計画上の出口は、確認済み入口と同じ
境界点、進入方向と反対の退出方向としてStage 3以降のplannerが導出する。入口未確定のまま出口だけを
決めるfallbackや状態を持たない。
入口が筆境界の辺上にある場合は、入口位置から導入側の周回方向を一意に決める。入口が筆の頂点の許容誤差内に
あり、入口位置だけでは時計回り・反時計回りを一意に決められない場合は、利用者が入口確認時に導入側の周回方向を
明示する。進入方位だけで角上入口の周回方向を暗黙決定しない。確認した周回方向は今回の入口と登録入口のsnapshotに
保持し、計画requestの独立入力にはしない。仕上げ外周の周回方向は、この導入側の逆向きとする。
入口から中央耕の開始anchorまでの具体的な移動経路は生成しない。
利用者は中央耕を任意の角度へ回転できる。ここで指定する角度は中央laneを配置する基準軸であり、最初の
中央passの有向走行方向を直接指定する値ではない。各passは同じ軸の正方向または逆方向を走り、開始側、終了側、
先頭・最終passの有向方向、必要な偶奇は、各WorkAreaの連続往復候補(列順の向き × 最終passの向き)のうち、
中央耕終了地点から仕上げ外周3列目の開始位置までの空走(周回耕と同じ向き)が最短の候補を選び、そこから逆算
して決める。回転によって変更するのは中央耕だけとし、入口、外周3列、退出は変更しない。
代表的な筆polygonの辺に方向を合わせる操作は、方向値を作るUI補助である。plannerが代表辺を優先評価したり、
最適な辺を自動選択したりする規則にはしない。
初回の初期仮方向は、確認済み入口の進入方向に方向として最も近い既存の辺方向候補とする(2026-08-29改訂、
旧「最小外接矩形の長辺方位(defaultCenterTillageHeadingDeg)」規則を廃止)。決定規則は次のとおり。
centerTillageDirectionCandidates、1辺につき1候補、既存順・既存候補を並べ替えない。重複候補を除去しない。辺長による優先順位、新しい代表辺抽出規則、角度閾値・
ヒステリシスを追加しない。plannerに方向選択・最適化をさせない。初期仮方向は筆と入口が確定した時点で
1回だけ決定し、fix更新ごとに選び直さない。中央方向だけを確定する独立画面は挟まずに仮計画を作る。
初期仮方向として自動的に選ばれた候補を、利用者が辺を選択または自由回転した方向とは扱わない
(由来は初期仮方向のまま)。初期仮方向、辺選択、自由回転はCenterDirectionSelection内で由来を区別し、
plan requestの4要素は増やさない。plannerは由来を選択規則に使わず、渡されたheadingDegだけを消費する。
「辺方向へ回転」は、既存の代表辺候補(centerTillageDirectionCandidates、1辺につき1候補)を既存順のまま
巡回する。初期仮方向として選ばれた候補の次から、既存候補順で巡回する(末尾の次は先頭へ戻り、重複候補も
そのまま通過する)。0度と180度等の重複候補を除去せず、方位角順・辺長順等の新しい並べ替え規則や選択規則を
追加しない。自由回転では任意角度を指定でき、方向変更ごとに完成計画を再計算する。画面側が初期仮方向を
与えることは、plannerによる方向の自動選択・最適化には当たらない。
外周耕幅が標準pitchで3列を配置できる幅以上なら、1列目、2列目、3列目を標準位置へ置く。標準pitchで3列を
配置できる幅より狭く、作業機1列分以上である区間では、その利用可能な外周耕幅の中へ1列目、2列目、3列目を
等間隔に配置し、3列の作業幅を均等に重ね合わせる。
外周耕幅が作業機1列分より狭い区間を持つ圃場は、本パターンでは扱わない。
圃場全体を外周1周または2周で覆える狭小圃場では、必要な周回数だけを走ればよく、不要な3周を強制しない。
具体的な列配置と周回順は実例に基づいて別途定め、初回実装では未実装としてよい。未実装の場合は「対象外」や
「耕耘不可能」ではなく「本パターンで対応可能だが現在未実装」として停止する。
centerWorkRemainingRegionとする。基礎未耕範囲が空ならcenterWorkRemainingRegionは、中央耕の作業幅で覆うべき面積である。走行線を切る境界、利用者の操作地点、中央耕とcenterWorkRemainingRegionをすべて覆う。対象幅へlane間隔を均等配分して安全余白と、それを前提にした独立の安全中心線範囲は使わない。
中央列が複数区間へ分裂する場合は各区間をWorkAreaとして扱う。複数WorkAreaの訪問順は、中央耕終了地点を
持つ終端WorkAreaから逆算する。中央耕終了地点と仕上げ外周3列目の開始位置は同一点である必要がない
(トラクターの大きさ・旋回のため通常はずれ得る)。逆算された最初の中央列の開始点を、中央耕の開始anchorとする。
中央耕の開始側・終了側・必要な偶奇はこの逆算で決め、利用者やplan requestの独立入力にはしない。中央耕
終了地点と仕上げ外周3列目の開始位置の間には、ロータリーを上げた空走(周回耕と同じ向き、周回開始位置に
その走行方向と揃った向きで到着)を1本置く。この空走の跡は後続の外周耕(3→1→2)で覆う。耕したまま接続する
FinishingLapApproach(3)は作らない。両者の座標一致を完成条件にせず、座標差だけを理由に計画を失敗にしない。
利用者は入口から圃場へ進入した後、未耕の圃場内を現地判断で中央耕の開始anchor付近まで移動する。plannerは
この開始前移動の具体的な経路を生成せず、計画actionや計画済みcoverageへ算入しない。
中央列間・WorkArea間の接続geometryは、中央passの列順・始終端を確定した後に決める。その接続のうち、
時間的に後の耕耘で移動跡を覆える区間は耕さずに移動し、覆われない区間は接続時に耕す。1本の接続内で条件が
変わる場合は同じgeometryを区間分割する。ロータリー分類によって接続geometry、列順、中央passの始終端を
変更しない。
中央耕終了→仕上げ外周3列目の空走は、終端隅から仕上げ外周3列目の走行ラインへ短く寄り、そのラインを周回と
同じ向きにたどって開始位置へ至る経路とする。ライン上をたどるため常に後の外周耕で覆われ、丸ごと空走り
(耕さない移動)とする。寄せる経路を圃場内に引けない候補は採用せず、全候補が不可なら「中央耕の経路を
作れません」で停止する。
完成経路は次の順序とする。
各区間の終点と次区間の始点は、座標として連続しなければならない(中央耕終了→空走→外周3列目本体 の各境界を
含む)。中央耕終了地点と外周3列目の開始位置の座標一致は求めない(空走がその差を吸収する)。共有点で到達方向と
出発方向が異なる場合の具体的な旋回軌跡、操舵角、最小旋回半径は本仕様では計画しないため、方向の一致は
完成条件にしない。
入口から中央耕の開始anchorまでの開始前移動は、この完成経路に含めない。
入口境界より圃場外側の具体的な退出線は完成条件に含めない。
計画経路は次の2種類だけに分ける。
現地での細かな作業機操作手順は計画しない。中央列間・WorkArea間の接続は、時間的に後の耕耘で覆われる区間を
耕さない移動、覆われない区間を耕しながら移動する経路として表す。耕さない移動として残る全区間のタイヤ痕が
後続耕耘で覆われることを完成条件として検証する。
中央耕終了から仕上げ外周3列目へは、連続往復の終端隅からロータリーを上げた空走で移り、その直後に外周3列目
本体へ入る。空走は「終端隅から外周3列目の走行ラインへ短く寄る」+「そのラインを周回耕と同じ向きにたどって
開始位置(その走行方向と揃った向き)へ至る」経路とし、逆走・Uターンはしない。ライン上をたどるため常に後の
外周耕(3→1→2)でタイヤ痕を覆え、丸ごと空走り(耕さない移動)とする。両者の座標一致は求めない。
外周3列目から1列目、外周1列目から2列目へ移る区間は、現地で行う細かな操作をモデル化せず、
計画上は耕しながら移動する区間として扱う。この区間は耕さない接続移動ではないため、後続耕耘によるタイヤ痕
被覆条件の対象外とし、完成経路では外周本体と区別して表示する。
追い詰めは本パターンの計画とアプリ案内に含めず、運転者が現地判断で行う別工程とする。追い詰め最大内角設定、
対象抽出、計画action、専用の停止条件を持たない。
運転者は計画開始前または計画途中に追い詰めを行い、その後に計画経路へ戻って耕耘を続けられる。計画外で行った
追い詰めを、計画actionや計画済みcoverageへ自動算入しない。
基本計画のcoverageと、運転者が現地判断で仕上げる外周残存領域を区別して表示する。外周残存領域は、筆polygonから
計画された耕耘経路の作業幅unionを差し引いた未被覆部分のうち、筆polygonの境界に接する部分として機械的に求める。
凸角、凹角、くびれを区別せず、角度設定や大きさの上限を設けない。外周経路の結果として大きな外周残存領域が生じても、
現時点では完成判定を失敗させず、運転者が現地判断で仕上げる領域として扱う。
筆polygonの境界に接しない中央部の未被覆部分は外周残存領域に含めず、基本計画の耕し残しとして完成を認めない。
複数の完成候補には、第2章の優先順位以外の局所評価を追加しない。端の余り、重ね幅変更量、列数などを独立した
優先順位にしない。
初回実装では、終端WorkArea/構成の順位規則は「中央耕終了地点から仕上げ外周3列目開始位置までの空走
(周回耕と同じ向き)の経路長が最短」だけとし、同値時は決定的な規則で1件に絞る。多重走行量・全走行距離・
外周帯滞在長などの追加の比較指標は、実際に候補差が問題となる事例が現地試験で得られた時点で追加する。
次をすべて満たす場合だけ完成計画とする。
centerWorkRemainingRegionを覆う。全TILL coverageだけでこの重ね幅を代替検証しない。条件を満たさない場合は完成計画をTabletへ送らない。共通計算処理は、自由文解析を必要としない安定した
構造化原因(原因コード、発生段階、原因種別、起因入力)を返す。構造化原因は下位処理で判明した時点で型付きで
生成して上位へ伝達し、粗い停止理由や自由文detailから推測・再構成しない。生の診断detail、warning、診断図形は
分類情報と重複して保持せず、利用者向け表示へ直接出さない。
Tablet側workflowは構造化原因を、利用者向けの「条件を変更して再作成できる」「この経路計画を使用できない」
という2分類、安全な詳細文言、入口・角入口の外周方向・中央方向・作業機設定等の戻り先へ変換する。
「条件を変更して再作成できる」は成功保証ではない。共通計算結果へTabletの画面名や表示文言を埋め込まない。
途中まで安全に計画できた結果は診断用に保持してよいが、完成計画として実行させない。
代表辺への方向合わせは、経路選択ではなく中央耕方向を入力するUI補助として扱う。作業地図へ常設ボタンを増やさず、
経路計画の段階別パネルへ配置する。
Tabletの計画編集中は地図と仮計画を主役にし、方向操作は画面下部のコンパクトな段階別計画編集パネルへ置く。
大きなbottom sheetで地図を覆わない。段階別計画編集パネルは通常作業ドックと同じ高さ定数を共有し、
通常時・計画時とも固定104dpとする(可変高さを使わず、状態遷移で地図領域の高さも主操作の位置も動かさない。
強調する主操作は常に1つ以下、長い失敗詳細はダイアログへ逃がし固定領域を伸ばさない)。方向変更後の再計算中は、
変更前の古い経路と新しい方向ガイドの両方を地図から消す。計画を作成できない場合は第12章の2分類を示し、
内部の停止理由名をそのまま表示しない。
既存のWorkArea関連部品は、本仕様に適合するものだけを再利用する。既存実装であること自体を維持理由にせず、
規則に合わない処理は修正または削除する。診断表示までしか接続されていないものは完成扱いにしない。
次の変更は、2026-08-21承認済みの現行契約へ反映済みである。各実装Trackは同契約に従ってコードへ反映する。
2026-08-30 Issue #114では、Track #99で許容した中央耕終端と仕上げ3列目の間の「耕したまま接続する」独立
耕耘接続(FinishingLapApproach(3))と、その接続だけが失敗する専用分類を撤回した。
2026-08-30 Issue #115コメント #5772〜#5774では、「最後の中央pass終点=仕上げ3列目の開始位置 同一点」という
強制を撤回した。中央lane格子を開始位置のlateral offsetへ固定せず、最後の中央passを開始位置へ切り詰めない。
2026-08-30 Issue #119では、中央耕を各WorkArea内で単一の連続往復とし(真ん中の列で終わるwing分割を廃止)、
終端隅から仕上げ外周3列目開始位置まで、周回耕と同じ向きにロータリーを上げた空走(周回開始位置にその走行
方向と揃った向きで到着、逆走・Uターンなし)でつなぐ。この空走は正式なplan actionとして持ち(耕さない移動、
後続外周耕で被覆)、「耕したまま接続するTILL」のFinishingLapApproach(3)とは別に扱う。終端WorkArea/構成は
この空走が最短の候補として選ぶ(順位規則は空走経路長最短のみ)。中央耕終了→空走→外周3列目本体 の各境界を
含め、すべてのモデル化対象境界で座標連続とする(#115で設けた「1境界だけ連続条件から除外」は撤回)。
「中央耕から仕上げ3列目へ接続できない」独立失敗分類は持たず、中央lane・連続往復候補・全WorkArea経路の
構成不能、未耕、空走の後続被覆不能、完成actionの座標断絶、という実際の失敗原因で停止する。
2026-08-30 Issue #115事前検討では、Profileの重ね幅を外周3列と中央耕の境界にも適用すると明確化した。
外周後の基礎未耕範囲をProfile指定の重ね幅分だけ外周側へ拡張した領域を中央耕の被覆対象とし、中央laneは
Profileの固定pitchで配置する。最終的な実未耕範囲は、従来どおり全計画TILL coverageから算出する。
契約変更と各実装Trackは、圃場幾何パイプライン仕様適合規約の
Track開始gate、end-to-end fixture、可視化gateに従う。