camera_perceiver — DRIVE 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。

參考(範例資料、文獻)

• 範例資料目錄(下載 URL / 授權) —— 2-D 用 skimage.data(BSD/公有領域)加合成圖,3-D 給出真實資料源(Stanford/PDS 等)的下載 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 運算子登記表。本條目由 tools/opdocs.py md 自動產生(請勿手動編輯)。*

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