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 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 में दिए गए हैं।
• poc_kendama — py -3.11 examples/poc_kendama.py
any को input के रूप में लेते हैं)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 operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.