camera_perceiver — DRIVE kendamaworld op

• Data kinds: table → any

• Call: 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) (implementation को सीधे call करना हो तो 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), registry से लेना हो तो opsdrive.get("camera_perceiver"))

उपयोग

केवल images से गेंद का (p̂, v̂) निकालने वाला perception perceive(t, p, v, scene) → (p̂, v̂) | None (kendama.kendama_simulate के लिए; attribute observe_all = True के साथ हर step पर बुलाया जाता है)। ground truth (p, v) का उपयोग केवल world render करने के लिए होता है, और v को कभी नहीं पढ़ा जाता।

प्रत्येक फ़्रेम-समय k / fps पर: (1) kendama_pose से विश्व (ken = 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 खिड़की के अनुसार रखा dict दिया जाता है। holes=True: गेंद की खिड़की में kendama.hole_detect से छिद्र खोजा जाता है (शोर जोड़ने से पहले के पिक्सेलों में), और जिन फ़्रेमों में 2 कैमरों में दिखे उनमें छिद्र के केंद्रक का त्रिकोणमितीकरण करके गेंद के केंद्र से दिशा hole_dir (विश्व का इकाई सदिश) दर्ज की जाती है (कप वाली तकनीकों में केवल रिपोर्ट होती है, योजना में उपयोग नहीं)। flight_from="cup" (19वाँ दौर, लगातार तकनीकें): "उड़ान का आरंभ" धागे के ढीलेपन से नहीं, बल्कि इससे तय होता है कि त्रिकोणमित गेंद और कप पर रखी गेंद की स्थिति (scene["rest"] = पकड़ने वाले कप के किनारे का केंद्र + h_c·अक्ष: हाथ की स्व-अनुभूति से ज्ञात) की दूरी flight_margin से अधिक हो, ऐसे फ़्रेम slack_frames बार लगातार आएँ (कप पर रहने के दौरान के फ़्रेम फ़िटिंग में शामिल नहीं होते)। scene["R_ken"] हो तो ken को उसी मुद्रा में रेंडर किया जाता है (पकड़ बदलना)। perceive.reset() से वर्तमान परवलय छोड़कर अगले उड़ान-आरंभ की प्रतीक्षा की जाती है (रिकॉर्ड flights = उड़ान-आरंभ फ़्रेमों के सूचकांकों का क्रम)। डिफ़ॉल्ट "tie" पहले जैसा ही है।

fail-closed: fps ≤ 0, pixel_noise < 0, min_frames < 2, window < 32, 2 से कम कैमरे, kendama रहित विश्व पर ValueError।

संदर्भ (sample data, साहित्य)

• 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 में दिए गए हैं।

चलाए जा सकने वाले उदाहरण (verified samples जो सच में यह op call करते हैं)

• poc_kendama — py -3.11 examples/poc_kendama.py

वे अगले ops जिनसे type जुड़ता है (any को input के रूप में लेते हैं)

course_crank · course_s_curve · course_turnaround · course_slope · course_intersection · course_parallel_parking · course_crossing · course_road

इसी category के (kendamaworld)

ken_mesh · add_ken · ken_set_pose · string_mesh · add_string · string_set · kendama_world · kendama_rig


*Provenance: kendamaworld.py — DRIVE operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*

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