locomotion op• Data kinds: mask → table
• Call: 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' (implementation को सीधे call करना हो तो import locomotion; locomotion.footstep_plan(mask, cell, start, goal_col, step_max, width_min, width_max, deviation_weight: 'float' = 0.1, extent=None) -> 'dict', registry से लेना हो तो opsdrive.get("footstep_plan"))
• GPU: नहीं (केवल CPU reference implementation)
Foothold mask पर बाएँ/दाएँ बारी-बारी कदमों का क्रम (सटीक shortest path)।
> नीचे का विस्तृत विवरण मूल text में है — सारांश और headings का अनुवाद हो चुका है।
足場の候補の 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.
• Sample data catalog (DL URL / license) — 2-D के लिए skimage.data (BSD/public) + synthetic, 3-D के लिए real data sources (Stanford/PDS आदि) के DL URL।
• Operators का स्रोत और संदर्भ — इस op family के मूल research/methods के स्रोत।
• Algorithm का मानक स्रोत (लेखक, वर्ष) और उपयोग ऊपर की family usage guide में दिए गए हैं।
• walking_ops_tour — py -3.11 examples/walking_ops_tour.py
table को input के रूप में लेते हैं)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 operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.