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.