footstep_plan — DRIVE locomotion op

• 데이터 종류: mask → table

• 호출: import fullseye as fs; fs.ledger.footstep_plan(mask, cell, start, goal_col, step_max, width_min, width_max, deviation_weight: 'float' = 0.1, extent=None) -> 'dict'(구현을 직접 호출하려면 import locomotion; locomotion.footstep_plan(mask, cell, start, goal_col, step_max, width_min, width_max, deviation_weight: 'float' = 0.1, extent=None) -> 'dict', 원장에서 가져오려면 opsdrive.get("footstep_plan"))

• GPU: 없음(CPU 참조 구현만)

사용법

발 디딤 마스크 위의 좌우 교대 발걸음 순서(정확한 최단 경로).

> 아래 상세 설명은 원문입니다 —— 요약과 제목은 번역되어 있습니다.

足場の候補の mask と、歩幅・歩隔の制約から、左右交互の着地点の列を出す。

格子の約束は terrain.elevation_map と同じ(行 i = y、列 j = x、セル辺 cell [m])。進行方向は +x(列が増える向き)、左足は y が大きい側(行が大きい)。

• 状態 = (いま立っている足のセル, その足が左か右か, 反対の足がゴールを越えているか)。次の一歩は反対の足を、mask が True のセル c に置く:

歩幅 0 ≤ (x_c − x_stance) ≤ step_max [m]、歩隔

width_min ≤ (y_left − y_right) ≤ width_max [m] (左右が入れ替わる交差を許さない)。

• 一歩の費用 = 1 + deviation_weight·[((x_c − x_s − step_max)/step_max)² + ((w − w_mid)/w_half)²](w_mid・w_half は歩隔の幅の中央と半幅、半幅が 0 のときは 2 項目を 0)。第 1 項 1 が歩数を数え、残りは最大の歩幅・中央の歩隔へ寄せる(平地では規則的に交互に並ぶ)。

• ゴール = 最後の 2 歩(左右 1 歩ずつ)の両方が列 goal_col 以上。

• 解法: 状態の上の Dijkstra(費用は非負)= 厳密な最小費用。小さな格子では総当たりの最小と一致する(tests の門)。

start は ((行, 列) の左足, (行, 列) の右足)。どちらの足から踏み出すかも探索が決める。返り値 {"reached", "steps": [{"side": "L"/"R", "cell": (i, j), "xy"(extent があるとき)}], "cost", "n_steps", "expanded"}。届かないときは reached = False・ steps 空・cost = inf(risk_aware_path と同じ約束)。

★roverslip.risk_aware_path は再利用しなかった: あちらの状態は 1 セル、辺は 8 近傍の(8, H, W) の費用で、左右交互・歩幅の窓・歩隔の窓(反対の足との相対位置)を持てない。空の入力(mask が 0 要素)は ValueError で拒否する。

English: exact Dijkstra over (stance cell, side, other-foot-past-goal) states; a step puts the other foot on a True cell within the step-length window [0, step_max] and the step-width window [width_min, width_max] (left foot on the larger-y side). Unreachable goals return reached = False and cost = inf.

참고(샘플 데이터·문헌)

• 샘플 데이터 카탈로그(DL URL / 라이선스) —— 2-D 는 skimage.data(BSD/public)+ 합성, 3-D 는 실데이터 소스(Stanford/PDS 등)의 DL URL.

• 연산자의 내력·참고문헌 —— 이 연산자 족의 바탕이 된 연구/기법의 출처.

• 알고리즘의 정전(저자·연도)과 용도는 위의 패밀리 사용 가이드에 적혀 있습니다.

실행 가능한 예제(이 연산자를 실제로 호출하는 검증된 샘플)

• walking_ops_tour — py -3.11 examples/walking_ops_tour.py

타입이 이어지는 다음 연산자(table 를 입력으로 받는 것)

course_layout · course_occupancy · course_contains · world_build · world_camera · world_move · lidar_scan · rss_longitudinal_same

같은 카테고리(locomotion)

contact_points · com_from_silhouette · support_polygon · com_support_margin · gait_phase · support_line_margin · lipm_capture_point · capture_margin


*Provenance: locomotion.py — DRIVE 연산자 레지스트리. 이 op 노트는 tools/opdocs.py md 가 자동 생성합니다(직접 편집하지 마세요).*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.