3D センサを選ぶとき・受け入れるときに現場が使う言葉 —— 探針の誤差(形状 PF・寸法 PS)、 球間距離の誤差 SD、平面度の誤差 F —— を数える層です。VDI/VDE 2634 Part 2/3 と ISO 10360-13 の 考え方に沿っていますが、規格の本文は有償の著作物なので写していません。評価量の定義は、規格を適用した 公開文献(Carfagni et al. 2017 / 2019、Eiríksson et al. 2016、Ramm et al. 2025)の記述から取り、 出典を各 op の docstring に書いています。「準拠」とは名乗りません。
8 op / 4 カテゴリ(numpy のみ。台帳は opsacceptance.py、実体は acceptance3d.py):
acceptance_layout: 測定体積の中に、探針の球 1 個・ダンベル 7 姿勢
(空間対角線 4 + 面の対角線 3)・平面 7 姿勢(正対 1 + 傾き 6)を置く。7 姿勢の向きは
Fullseye の約束で、規格の図の写しではありません。sphere_probing_error(PF・PS)/ sphere_spacing_error(SD)/
plane_flatness_error(F)/ acceptance_verdict(MPE と比べた合否と、合否を決めた量)。
実機の点群にもシミュレーションの点群にも同じ op を掛けます。acceptance_scan(1 つの試験体をシミュレーションのセンサで撮って点群に)/
virtual_acceptance_test(全配置を撮って全評価量と合否)。acceptance_error_budget: 誤差の要因を 1 つずつ入れて、どれが合否を決めるか。比較相手(HALCON・OpenCV・Open3D・PCL)は球や平面の当てはめを持っていても、受入試験の手順としては 束ねていません。この族はさらに、シミュレーションのセンサで「買う前に」受入試験を回します:
センサ(kind) |
中身 | 何で壊れるか |
|---|---|---|
ideal |
真の視線距離をそのまま | 壊れない(往復の検算) |
triangulation |
奥行きに σ_z = z²σ_d/(f·b)(z = f·b/d の誤差伝播) |
遠いほど・基線が短いほど |
itof |
既存の itof_capture → itof_phase_amplitude(4 位相の生信号) |
暗い試験体(ショット雑音)・縁の混合(フライングピクセル)・多重反射 |
校正の誤差(fx_rel_error・fy_rel_error・cx_error_px・cy_error_px・range_scale・
range_offset_mm)は逆投影に入ります。真値は場面の解析解(光線と球・平面の交点)なので、
雑音も誤差も無いセンサでは全評価量が 0 になり、距離の尺度 s は SD = (s − 1)·L で厳密に出ます。
flowchart TD
LAY["acceptance_layout<br/>球 1・ダンベル 7・平面 7"]
SEN["table: センサ<br/>kind・雑音・校正の誤差"]
LAY --> SCAN["acceptance_scan<br/>1 つの試験体を撮る"]
SEN --> SCAN
SCAN --> PTS["points (N,3)"]
REAL["実機の点群 (N,3)"] --> PE
PTS --> PE["sphere_probing_error / sphere_spacing_error /<br/>plane_flatness_error"]
PE --> RES["table: PF・PS・SD・F"]
RES --> VER["acceptance_verdict<br/>MPE と比べて合否"]
LAY --> VAT["virtual_acceptance_test<br/>全配置を一度に"]
SEN --> VAT
VAT --> VER
SEN --> BUD["acceptance_error_budget<br/>要因を 1 つずつ"]
BUD --> DEC["decisive: 単独で MPE を超えた要因"]
import fullseye as fs
layout = fs.ledger.acceptance_layout() # 400x300x300 mm、z = 800 mm、球 25 mm
mpe = {"pf": 3.0, "ps": 1.0, "sd": 0.5, "f": 3.0} # 仮の仕様(メーカーが決める値)
r = fs.ledger.virtual_acceptance_test({"kind": "itof", "sphere_reflectivity": 0.1}, layout, mpe)
print(r["verdict"]["passed"], r["verdict"]["decided_by"]) # False pf(黒い球で PF が MPE の約 2 倍)
supersample = 3・雑音なしで、既存の
itof_flying_pixel_mask を外すと PF は 43.7 mm(球の直径より大きい)、入れると 0.025 mm。
除外の上限 0.3 % では救えないので、前処理がそのまま受入の結果になります。ranking)は「どれを先に直すか」の材料で、合計ではありません。d2(25) = 3.931、d2(56,784) ≈ 8.5)。
MPE を比べるときは点の密度をそろえてください。くわしい数字は examples/poc_virtual_acceptance_3d.py
が出します(3 つの設計案の合否表と iToF 案の誤差の予算)。
fringe.py は 2.5D の高さ図向けで、球の全周を撮る場面に
そのままは使えない)。三角測量は雑音則だけで代表させています。Copyright (c) 2026 Kazufumi Furuse. Licensed under the Apache License, Version 2.0.