kendamaworld op• 데이터 종류: table → any
• 호출: import fullseye as fs; fs.ledger.camera_perceiver(world: 'dict', rig: 'list', *, fps: 'float' = 100.0, pixel_noise: 'float' = 0.0, rng=None, slack_margin: 'float' = 0.005, min_frames: 'int' = 3, window: 'int' = 128, color_tol: 'float' = 0.12, g: 'float' = 9.81, keep_frames: 'bool' = False, slack_frames: 'int' = 2, min_fill: 'float' = 0.6, reject: 'float' = 0.004, render_fn=None, holes: 'bool' = True, flight_from: 'str' = 'tie', flight_margin: 'float' = 0.012)(구현을 직접 호출하려면 import kendamaworld; kendamaworld.camera_perceiver(world: 'dict', rig: 'list', *, fps: 'float' = 100.0, pixel_noise: 'float' = 0.0, rng=None, slack_margin: 'float' = 0.005, min_frames: 'int' = 3, window: 'int' = 128, color_tol: 'float' = 0.12, g: 'float' = 9.81, keep_frames: 'bool' = False, slack_frames: 'int' = 2, min_fill: 'float' = 0.6, reject: 'float' = 0.004, render_fn=None, holes: 'bool' = True, flight_from: 'str' = 'tie', flight_margin: 'float' = 0.012), 원장에서 가져오려면 opsdrive.get("camera_perceiver"))
영상만으로 공의 (p̂, v̂)를 구하는 지각 perceive(t, p, v, scene) → (p̂, v̂) | None(kendama.kendama_simulate용, 속성 observe_all = True이면 매 step 호출됨). 참값 (p, v)는 월드를 그리는 데에만 쓰고, v는 읽지 않습니다.
프레임 시각 k / fps 마다: (1) kendama_pose 로 세계(켄 = scene["hand"], 공 = p, 실)를 배치하고, 각 카메라로 그린다(공 주변 window 화소의 창만 그린다: 창은 이전 프레임의 검출(포물선이 맞춰져 있으면 그 예측)로부터 정하며, 검출이 없거나 창의 가장자리에걸리면 전체 화면을 다시 그린다 —— 창의 화소는 전체 화면의 잘라내기와 같다), (2) balltrack.ball_detect(chroma, 주황)로 공을 검출하고화소에 σ = pixel_noise 의 가우스 잡음을 더한다, (3) 2 대 이상에서 보이면 balltrack.triangulate_dlt 로 3-D 로 되돌린다,
(4) "느슨해졌다" = 삼각측량한 공과 접시 몸통의 실 구멍(scene["tie"]: 손의 고유 감각으로 안다)의 거리가 끈의 유효 길이보다 slack_margin
이상 짧은 프레임이 slack_frames 회 연속되면(1 회이면 화소 잡음 2 px 로 팽팽한 동안에 오검출했다 —— 측정하여 기각했다), 그 첫 프레임 이후의 점에 중력 g 기지의 포물선(kendama.parabola_fit_g 와 같은 식, 미지수 6)을 최소제곱으로 맞춘다(min_frames 점 이상). 반환값 = 맞춘 포물선을 t 로 외삽한 (p̂, v̂). 포물선이 아직 없으면 None(계획은 움직이지 않는다).
세계의 공의 자세(묘화의 약속, 참값): scene["taut"] 동안은 실 구멍이 접시 몸통의 실 구멍을 향하고, 느슨해지면 마지막 자세 그대로(R_ball 에 기록). 기록(속성): frames = [{"t", "p_hat" (3,) or NaN, "uv" [(col,row)…], "full" [bool…], "tie", "hole_uv", "hole_dir"}], R_ball = 각 프레임의 공의 참 자세(구멍의 참 방향 = R_ball @ HOLE_AXIS_LOCAL: 게이트의 참값), slack_frame(느슨함을검출한 프레임의 인덱스 or None), fits = [(t_frame, n_used, p_ref, v_ref, t_ref)], render_s(묘화 + 검출의 합계 초), n_render(그린 창의 수), images(keep_frames=True 일 때 각 카메라의 전체 화면 …… 무거우므로 그림용일 때만). render_fn(world, cam) → (H, W, 3) float: 묘화를 교체하는 입구(기본값 = driveworld.world_camera 의 메시 묘화. 3DGS 등). 창만 그릴 때는 cam 의 K(주점을 옮긴)·width·height 를 창에 맞춘 사전을 넘긴다. holes=True: 공의 창 안에서 kendama.hole_detect 로 구멍을 찾고(잡음을 더하기 전의 화소로), 2 대에서 보인 프레임은 구멍의 무게중심을삼각측량하여 공 중심으로부터의 방향 hole_dir(세계의 단위 벡터)을 기록한다(접시 기술에서는 보고만 하고, 계획에는 사용하지 않는다). flight_from="cup"(19 회차, 연속 기술): "비행 시작"을 실의 느슨함이 아니라, 삼각측량한 공과 접시에 올라간 공의 위치(scene["rest"] = 받고 있는 접시의가장자리 중심 + h_c·축: 손의 고유 감각으로 안다)의 거리가 flight_margin 을 넘은 프레임이 slack_frames 회 연속된 것으로 정한다(접시에 올라가 있는동안의 프레임은 맞춤에 넣지 않는다). scene["R_ken"] 이 있으면 켄을 그 자세로 그린다(바꿔 쥐기). perceive.reset() 으로 현재 포물선을 버리고, 다음비행 시작을 기다린다(기록 flights = 비행 시작 프레임의 인덱스 열). 기본값 "tie" 는 지금까지와 같다.
fail-closed: fps ≤ 0, pixel_noise < 0, min_frames < 2, window < 32, 카메라 2 대 미만, kendama 가 없는 세계는 ValueError.
• 샘플 데이터 카탈로그(DL URL / 라이선스) —— 2-D 는 skimage.data(BSD/public)+ 합성, 3-D 는 실데이터 소스(Stanford/PDS 등)의 DL URL.
• 연산자의 내력·참고문헌 —— 이 연산자 족의 바탕이 된 연구/기법의 출처.
• 알고리즘의 정전(저자·연도)과 용도는 위의 패밀리 사용 가이드에 적혀 있습니다.
• poc_kendama — py -3.11 examples/poc_kendama.py
any 를 입력으로 받는 것)course_crank · course_s_curve · course_turnaround · course_slope · course_intersection · course_parallel_parking · course_crossing · course_road
kendamaworld)ken_mesh · add_ken · ken_set_pose · string_mesh · add_string · string_set · kendama_world · kendama_rig
*Provenance: kendamaworld.py — DRIVE 연산자 레지스트리. 이 op 노트는 tools/opdocs.py md 가 자동 생성합니다(직접 편집하지 마세요).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.