kendama op• 데이터 종류: table → table
• 호출: import fullseye as fs; fs.ledger.kendama_combo_simulate(kp: 'dict', sequence=('ozara', 'chuzara'), *, n_catch: 'int' = 10, hand0=(0.0, 0.0, 1.0), hand_v0=(0.0, 0.0, 0.0), z_home: 'float' = None, apex_above_cup: 'float' = 0.2, k_match: 'float' = 0.8, v_max: 'float' = 2.5, a_max: 'float' = 20.0, a_toss: 'float' = 20.0, omega_max: 'float' = 30.0, rot_clear: 'float' = 0.15, v_rel_max: 'float' = 1.0, dt: 'float' = 0.001, perceive=None, contact=None, contact_tol: 'float' = 0.0005, controller: 'str' = 'pos_vel', t_max: 'float' = None, g: 'float' = None) -> 'dict'(구현을 직접 호출하려면 import kendama; kendama.kendama_combo_simulate(kp: 'dict', sequence=('ozara', 'chuzara'), *, n_catch: 'int' = 10, hand0=(0.0, 0.0, 1.0), hand_v0=(0.0, 0.0, 0.0), z_home: 'float' = None, apex_above_cup: 'float' = 0.2, k_match: 'float' = 0.8, v_max: 'float' = 2.5, a_max: 'float' = 20.0, a_toss: 'float' = 20.0, omega_max: 'float' = 30.0, rot_clear: 'float' = 0.15, v_rel_max: 'float' = 1.0, dt: 'float' = 0.001, perceive=None, contact=None, contact_tol: 'float' = 0.0005, controller: 'str' = 'pos_vel', t_max: 'float' = None, g: 'float' = None) -> 'dict', 원장에서 가져오려면 opsdrive.get("kendama_combo_simulate"))
연속 기술: 공이 sequence[0]의 접시에 올라간 상태에서 "놓기 → 나는 동안 바꿔 쥐기 → 다음 접시를 착지점 바로 아래로 옮겨 속도를 맞춰 받기"를 n_catch회 또는 첫 실패까지 반복합니다(모시카메 = ("ozara", "chuzara"), 3접시 = ("ozara", "kozara", "chuzara")). 손잡이 hand0 = 사라도의 중심(바꿔 쥐기는 손목으로 방향만 바꾸고 다시 쥐지 않음: 가정). 첫 접시는 kendama_simulate의 스윙업으로 받고, 그 손잡이의 위치·속도를 hand0 / hand_v0로 넘깁니다.
> 아래 상세 설명은 원문입니다 —— 요약과 제목은 번역되어 있습니다.
段階(毎回): absorb(受けた皿を上限つきで止める: 玉は皿と一緒)→ toss(皿を a_toss で上へ加速し、速さ v_toss に達したら a_max(> g)で止める: 止め始めた歩で皿の抗力が負になり玉が離れる。離れた瞬間の玉の速度 = 皿の速度 → 頂点 = 離れた高さ + v²/2g)→ flight(知覚した放物線から着地の時刻 τ と点を出し、手元を「位置 = 着地点の真下(高さ z_home)、速度 = k_match × 玉の着地の速度」へ _move_pos_vel で運ぶ。持ち替えは玉が皿胴の中心から rot_clear(0.15 m: 皿胴の中心から中皿の縁まで 0.12 m + 玉の半径)以上離れてから(知覚で。離れないまま着地に間に合う最後の時刻が来たらそこで始める = 3 皿の大皿 → 小皿の 180° はこちらになることがある)、角速度の上限 omega_max の三角形の角速度で次の姿勢へ回す。回し終わる前には受けない)→ 受けたら absorb に戻る。
物理: 玉は皿の上では皿と一緒に動く(皿の抗力 ∝ (a_皿 + g ẑ)·軸 ≥ 0 の間。負になったら離れる)、飛んでいる間は重力(+ 抗力)と糸の張力(片側拘束、kendama_simulate と同じ射影法)だけ。けんは玉を押さない(contact(hand, p, R) → 隙間 が −contact_tol を下回ったら "hit_ken": kendamaworld.kendama_clearance の R_ken)。受ける判定は kendama_catch_check(着地の窓 kp["catch_window"]、相対速さ ≤ v_rel_max: 仮定 1 m/s)。窓に入ったのに速すぎたら "too_fast"。受けた瞬間に玉を縁に乗る位置へ置き、速度を皿の速度にする(非弾性・跳ねない: 仮定。置き直す距離 ≤ 窓の 3 mm)。
放つ高さ(閉形式): 次の着地で玉の中心が乗る高さ z_r の apex_above_cup 上を頂点にする。今の玉の高さ z₀ から a_toss で加速すると離れる高さは z₀ + v²/(2 a_toss) なので v_toss² = 2g (z_r + A − z₀) / (1 + g / a_toss)(抗力は入れない)。controller="position": 飛んでいる間の手元を旧来の _move_bounded(位置だけを目標に止まる)で運ぶ対照。知覚 perceive: None = 真値。kendamaworld.camera_perceiver(flight_from="cup")なら毎 step perceive(t, p, v, scene)(scene = 手元の自己受容で分かる量 + 描画用の姿勢 R_ken)を呼び、(p̂, v̂) か None を受ける。受けたことは手の感覚で分かる(仮定: 触覚)として perceive.reset() があれば受けた歩で呼ぶ(前の飛翔の放物線を捨てる)。
仮定(公表値なし): 手首の角速度 ≤ 30 rad/s、手元の速さ ≤ 2.5 m/s・加速度 ≤ 20 m/s²、k_match = 0.8(人の「膝で速さを合わせる」の程度)。返り値 {"count" (最初の失敗までに受けた回数), "catches" [{"t", "trick", "rel_speed", "lateral", "apex", "z_catch" (受けた瞬間の玉の中心の高さ), "z_release", "v_release", "apex_closed", "rose_then_fell", "energy_drift"}], "end_reason" ("done" | "too_fast" | "hit_ken" | "missed" | "timeout"), "t", "p", "v", "hand", "hand_v", "hand_a", "R", "on_cup", "taut", "stage", "min_gap", "grade" (もしかめの級相当), "max_omega"}。
• 샘플 데이터 카탈로그(DL URL / 라이선스) —— 2-D 는 skimage.data(BSD/public)+ 합성, 3-D 는 실데이터 소스(Stanford/PDS 등)의 DL URL.
• 연산자의 내력·참고문헌 —— 이 연산자 족의 바탕이 된 연구/기법의 출처.
• 알고리즘의 정전(저자·연도)과 용도는 위의 패밀리 사용 가이드에 적혀 있습니다.
• poc_kendama — py -3.11 examples/poc_kendama.py
table 를 입력으로 받는 것)course_layout · course_occupancy · course_contains · world_build · world_camera · world_move · lidar_scan · rss_longitudinal_same
kendama)kendama_params · elliptic_k_agm · pendulum_period_exact · pendulum_launch_speed · pendulum_rod_simulate · tether_tension_fixed · tether_slack_angle · swing_up_plan
*Provenance: kendama.py — DRIVE 연산자 레지스트리. 이 op 노트는 tools/opdocs.py md 가 자동 생성합니다(직접 편집하지 마세요).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.