最优条纹频率怎么选:从误差公式到标定与推荐算法
增加条纹数量,相同的位置变化会产生更大的相位变化,按理说更容易测准。可条纹太密时,相机看到的明暗起伏又会变弱,甚至接近噪声。到底该选哪一个频率?
不能只挑画面最清楚的,也不能把别人的“最优 88 个周期”直接填进自己的设备。需要先测出系统在各个频率下的调制幅值,再把它与位置灵敏度放在同一个误差模型里比较。
这篇沿着“推导目标 → 采集标定数据 → 拟合 → 搜索 → 实测验收”展开。主线是扫描式条纹投影的窗口平滑模型;有关数据筛选、全局误差优化和近优集合的做法,会明确标为工程扩展。所有曲线都是本文公式计算的教学示意,不冒充硬件实验结果。
如果还不熟悉背景亮度 A、调制幅值 B、包裹相位和相位展开,可以先看条纹测量基础:相移、展开与深度学习。这里不再重复整套基础,重点回答频率怎样选。
先说清楚:选的是条纹数量,不是相移步数
| 量 | 本文记号 | 含义 |
|---|---|---|
| 条纹数量 | f | 规定投影范围内的完整周期数 |
| 空间频率 | ν | 单位空间长度内的周期数 |
| 条纹周期宽度 | T_f | 一次“亮→暗→亮”占据的长度 |
| 相移步数 | N | 一组相移图像的张数 |
| 投影帧率 | fps | 每秒投出多少幅图案 |
若投影范围宽度为 \(L\),则:
\[ \nu=\frac fL,\qquad T_f=\frac Lf. \]例如在 100 mm 的范围内投 80 个周期,空间频率是 0.8 周期/mm,一个周期宽 1.25 mm。用 6 步相移测量它,意味着拍 6 张相同密度、不同偏移的条纹图,不是只投 6 个周期。
讨论最优值时,范围定义必须一致。原模型按特定扫描角区间定义条纹数,不能把半幅与整幅扫描范围的数值直接比较。实际投影器还可能按投影坐标而不是毫米设置频率,需要通过几何关系换算。
对于多频展开,本文主要选择的是最后负责精细测量的最高频率。低频、中频怎样配合,以及总共需要多少帧,仍是另外的设计问题。
为什么推荐分数是 fλ(f)
更密的条纹,提高位置灵敏度
先用一维线性编码理解相位与位置的关系:
\[ \Phi(x)=\frac{2\pi f}{L}x+\Phi_0. \]其中 \(x\) 是编码方向的位置,\(\Phi_0\) 是相位基准。位置变化 \(\Delta x\) 产生:
\[ \Delta\Phi=\frac{2\pi f}{L}\Delta x. \]取 \(L=100\) mm,位置差为 0.1 mm。20 个周期产生约 0.126 rad 的相位变化,100 个周期则产生约 0.628 rad。后者放大了同一位置差的相位响应。
这说明高频编码更敏感,还不能单独证明它更准确。相位本身能读得多稳定,也要算进去。
调制幅值下降,相位噪声会变大
相移图像满足:
\[ I_n=A+B(f)\cos(\phi-\delta_n). \] \(A\) 是背景亮度,\(B(f)\) 是当前频率下的明暗起伏幅度。在线激光扫描系统中,有限宽度的光带会把邻近位置的光混合起来,高频起伏往往更容易衰减。在等步相移、小幅独立同方差亮度噪声条件下,常用近似为:
\[ \sigma_\phi\approx\sqrt{\frac2N}\frac{\sigma_I}{B(f)}. \] \(\sigma_I\) 是亮度噪声标准差,\(\sigma_\phi\) 是相位误差标准差。幅值越小,同样的亮度噪声就越容易影响角度估计。运动、饱和、谐波和整周期展开错误不在这个简化公式里。把相位误差换到共同的位置尺度
由编码关系反求位置:
\[ x=\frac{L}{2\pi f}(\Phi-\Phi_0). \]在展开正确、误差足够小时,误差传播给出:
\[ \begin{aligned} \sigma_x&\approx\frac{L}{2\pi f}\sigma_\Phi,\\ &\approx\frac{L}{2\pi f}\sqrt{\frac2N}\frac{\sigma_I}{B(f)}. \end{aligned} \]固定范围、步数和噪声条件后:
\[ \sigma_x\propto\frac1{fB(f)}. \]所以,不能拿高频和低频的原始相位误差直接比位置精度。高频相位数值即使更抖,换成相同空间尺度后仍可能更准。
这里的 \(x\) 是编码位置,不是任何装置都通用的深度公式。要预测三维坐标误差,还需经过实际标定映射的局部导数,也就是几何误差传播系数。
用衰减因子描述幅值变化
窗口平滑模型把调制幅值写成:
\[ B(f)=(A-\varepsilon)\lambda(f). \] \(\varepsilon\) 表示环境光贡献,\(\lambda(f)\) 是调制幅值的保留比例。若平均投影贡献 \(A-\varepsilon\) 不随频率明显改变: \[ \sigma_x\propto\frac1{f\lambda(f)}. \]于是推荐分数与最优选择就是:
\[ \begin{aligned} Q(f)&=f\lambda(f),\\ f_{\mathrm{opt}}&=\underset{f\in\mathcal F}{\arg\max}\ Q(f). \end{aligned} \] \(\mathcal F\) 是允许使用的频率集合,arg max 的意思是“找出让分数最大的那个频率”。这个乘积来自误差传播,不是随意给两个指标加权。一个算得出来的例子:条纹更清楚,不代表位置更准
先用高斯平滑做教学示例,它便于解析计算,但不是后文五段模型的拟合结果。设投影宽度为 100 mm,高斯空间权重的标准差为 0.2 mm。
这里用 \(s\) 表示高斯标准差,它不是直接等于光带的直径或半高全宽。没有统一线宽定义时,不能把设备标注的宽度直接填进来。
高斯权重对正弦的幅值响应是:
\[ \lambda(f)=\exp\left[-2\pi^2s^2\left(\frac fL\right)^2\right]. \]图 1:同一模型的三种观察方式。上图看幅值,中图看推荐分数,下图看相对位置误差。示例参数 L=100 mm、s=0.2 mm;不是实测数据。
| 条纹数 f | 幅值保留比例 λ | 分数 Q | 预测误差相对最优值 |
|---|---|---|---|
| 20 | 0.969 | 19.38 | 2.49 倍 |
| 40 | 0.881 | 35.25 | 1.37 倍 |
| 60 | 0.753 | 45.15 | 1.07 倍 |
| 80 | 0.603 | 48.26 | 1.00 倍 |
| 100 | 0.454 | 45.40 | 1.06 倍 |
| 120 | 0.321 | 38.49 | 1.25 倍 |
| 160 | 0.132 | 21.20 | 2.28 倍 |
20 个周期保留了很高的幅值,但位置灵敏度低;160 个周期虽然密,幅值已经损失太多。80 附近更合适。
还可以直接求导检查。将指数中的系数记为 \(c\):
\[ \begin{aligned} c&=\frac{2\pi^2s^2}{L^2},\\ Q(f)&=f\exp(-cf^2),\\ Q'(f)&=\exp(-cf^2)(1-2cf^2). \end{aligned} \]正频率上的最优点为:
\[ f_{\mathrm{opt}}=\frac{L}{2\pi s}\approx79.58. \]若候选值限定为 1 到 200 的整数,结果就是 80。在这个特定高斯模型中,连续最优点的幅值保留比例为 \(e^{-1/2}\approx0.607\)。这不意味着其他光束也应在“对比度降到六成”时选频率。
标定之前,要准备哪些数据
实际算法不能预先知道光束的响应曲线,要测量它。
图 2:主体是模型标定与搜索;有效像素筛选、保留频率验证和最终验收是本文补充的工程质量检查。
白板、工作距离和固定设置
选用稳定、近似漫反射的白色平面目标,避免强光泽、纹理、遮挡和饱和。它是帮助分离系统响应的标定目标,不限制以后只能测白色物体。
同一个距离位置上,比较不同频率时应固定曝光、增益、激光功率、相移步数和图案调制方式。关闭自动曝光与自动增益,保持相机在有效对焦范围内。频率变了,曝光也跟着变,测得的幅值就不再只反映频率响应。
沿工作深度移动白板,在多个距离重复。每次移动后等目标稳定再采集,记录距离、曝光、功率和相机设置。扫描式投影减少了某些投影端离焦问题,但相机的景深仍然有限。
频率点怎么安排
一种已报道的采样设置是:
1 | 1, 5, 20, 40, 60, 80, 100, 120, 140, 160, 180, 200 |
每个频率采集 6 步相移,单个距离需要 12×6=72 张基础图像。假设自行安排 5 个距离,就是 360 张,还不包括暗场和重复采集。这里的五个距离只是采集量示例,不是规定。
采样应覆盖衰减较小的低频、可能出现最优点的区域,以及衰减明显的较高频。可以先粗采,再在峰值附近加密。只测峰值左边几个点,却把模型一路外推到很高的频率,得到的“最优值”可能没有数据支持。
对实际实现,数据可组织为:
1 | images[distance, frequency, phase_step, y, x] |
这里强调坐标含义,不要求一次把全部图片装入内存。逐距离、逐图块处理同样可以完成标定。
从相移图计算 A、B 和衰减因子
对某个像素、某个距离和某个频率的一组相移图,使用与前文一致的减号约定,计算:
\[ \begin{aligned} \delta_n&=\frac{2\pi n}{N},\\ A&=\frac1N\sum_{n=0}^{N-1}I_n,\\ M&=\sum_{n=0}^{N-1}I_n\sin\delta_n,\\ D&=\sum_{n=0}^{N-1}I_n\cos\delta_n,\\ B&=\frac2N\sqrt{M^2+D^2}. \end{aligned} \]于是:
\[ \lambda=\frac{B}{A-\varepsilon}. \]暗环境下近似为 \(\lambda=B/A\)。例如 \(A=120\)、\(B=72\)、环境光可忽略,得到 0.6;更高频率下若 \(A\) 仍为 120、\(B\) 降到 36,就得到 0.3。
原始资料有一处正文把这个比例写成倒数。由幅值定义可知应为 B/A,复现时不能直接照抄。并且,这种归一化依赖投影调制和成像线性条件;若图案本来就没有采用完整的正弦调制,响应比例还会包含调制深度。
环境光与黑电平
在同样曝光、增益、环境条件下关闭投影光,可以估计环境背景。相机黑电平等电子偏置还需要按设备校正方式处理,不应算作有效的平均投影贡献。
分母接近零时不要继续相除。白板暗部、遮挡和低信号区域的比值容易剧烈波动,应该标记无效,而不是让异常值参与后面的拟合。
幅值估计在噪声底附近有偏
即使真实条纹幅值为零,噪声也会让 M、D 的平方和大于零。因此,用模长估计出来的 B 通常不会恰好为零。
如果高频端已经没有有效条纹,却把这些噪声幅值当作真实响应,拟合曲线就可能被抬高,进而错误推荐很高的频率。
工程上至少需要筛除:
- 达到饱和值或明显波峰截断的像素;
- 背景校正后过暗、调制幅值接近噪声底的像素;
- 坏点、遮挡、采集期间移动的区域;
- 相移波形残差异常,明显不符合正弦模型的区域。
阈值应由相机噪声与重复采集决定。后文代码中的阈值仅演示接口,不是所有相机通用的设定。
用五段光强模型拟合 λ(f)
分段是在描述什么
线激光不是没有厚度的一条数学直线。它在扫描方向上的空间光强分布,会影响每个位置积累到的光。
把光带总宽度记为 W,分成五段,每段宽度为 \(\ell=W/5\)。五段的相对光强分别为 \(c_{-2}\) 到 \(c_2\)。
图 3:用 1、2、4、2、1 作为教学权重。图中的数值不是对真实激光器的测量,也不是固定的最佳分布。
对于近似对称的分布,在模型适用的响应区间内,可以写成:
\[ \begin{aligned} G(f)&=a_2+a_3\cos(2a_1f)\\ &\quad+a_4\cos(4a_1f),\\ \lambda(f)&=\operatorname{sinc}(a_1f)G(f). \end{aligned} \]此处采用 \(\operatorname{sinc}(z)=\sin z/z\),在零点按极限取 1。NumPy 的 np.sinc 使用另一种常见定义:np.sinc(x)=sin(πx)/(πx),所以代码应写成 np.sinc(a1*f/np.pi) 才对应这里的表达式。
定义总权重 \(C=\sum_{k=-2}^{2}c_k\) 后:
\[ \begin{aligned} a_1&=\frac{\pi\ell}{L},\\ a_2&=\frac{c_0}{C},\\ a_3&=\frac{c_{-1}+c_1}{C},\\ a_4&=\frac{c_{-2}+c_2}{C}. \end{aligned} \] \(a_1\) 控制空间宽度相对投影范围的尺度,另外三项分别表示中央段、内侧两段和外侧两段的贡献。在严格归一化定义下,它们非负,且和为 1。如果额外加入投影调制深度等比例项,应明确把它与这些权重分开。同样是“线宽”,总宽度 W、单段宽度 ℓ、高斯标准差 s 都不同。混用会让最优频率差出一个常数倍,而程序可能仍然正常运行。
非线性最小二乘怎么用
每个像素得到若干实测点 \((f_i,\lambda_i)\),通过拟合寻找模型参数。为了让公式更好读,先把残差记为 \(r_i\):
\[ \begin{aligned} \boldsymbol a&=(a_1,a_2,a_3,a_4),\\ r_i(\boldsymbol a)&=\hat\lambda(f_i;\boldsymbol a)-\lambda_i,\\ \hat{\boldsymbol a}&=\arg\min_{\boldsymbol a}\sum_i w_i r_i^2(\boldsymbol a). \end{aligned} \]残差是预测值与实测值之差;最小二乘最小化残差平方和。参数进入 sinc 和余弦函数,因此这是非线性拟合。权重 \(w_i\) 可以全取 1,也可以根据重复测量的不确定度设置,降低不可靠数据的影响。
原方法使用最小二乘。以下是实现时的额外建议:
- 给参数合理的物理边界,不让负光强或不合理线宽拟合噪声。
- 尝试多个合理初值,避免只接受一次局部收敛结果。
- 记录逐像素残差和失效掩膜,不只报告整幅图平均误差。
- 预留部分频率或独立重复采集作验证,检查模型能否预测没参与拟合的数据。
- 只在经过采样支持的区间内推荐。最优点跑到搜索边界,应提示范围可能不足。
如果某些像素无法可靠拟合,应返回无效标志,而不是随手用周围均值填成“已标定”。邻域约束可以另做扩展,但会引入新的空间假设。
正负响应与不对称光束不能忽略
通过模长计算的 B 非负,但 sinc 与余弦组合的传递系数在部分频段可能为负。负响应会伴随相位翻转,不只是幅值数字换了符号。
因此,不应在任意频段直接拿有符号曲线拟合 B/A,更不能静默裁掉负值。初次实现可以限定在响应符号明确、幅值充足且经过验证的工作区间;若需要跨过零点,必须分别处理幅值和相位。
不对称光束还可能引入额外相位偏移。原模型也讨论了使相关正弦项抵消的频率关系,例如单段宽度与条纹周期之比接近半整数。但正弦项为零不自动保证幅值非零、相位分支正确,更不能把这个条件脱离信号强度单独用来选频率。
搜索时先定义允许使用的候选集合
得到模型以后,对每个像素 p、距离位置 j 计算:
\[ f^*_{p,j}=\underset{f\in\mathcal F}{\arg\max}\ f\lambda_{p,j}(f). \]如果只考虑 10 到 180 的整数,一共 171 个候选,逐个计算即可。响应曲线可能有多个局部峰值,这时有限集合枚举比依赖一个初值的局部优化更容易检查。
整数周期是常见图案设计选择,但不是所有设备在数学上只能用整数频率。候选集合应来自实际编码和硬件接口。
候选值进入评分前,需要同时满足:
| 约束 | 检查内容 |
|---|---|
| 模型有效性 | 在已验证的频率区间内,响应分支明确 |
| 有效信号 | 调制幅值高于噪声底,饱和和失效比例可接受 |
| 投影采样 | 每个周期有足够有效采样,波形可实现 |
| 相机采样 | 局部条纹没有严重混叠,倾斜表面也要检查 |
| 展开方案 | 低频到高频的级次恢复可靠 |
| 工作范围 | 覆盖目标距离与关键区域,不只在中心点有效 |
Nyquist 条件只是某些混叠问题的理论底线,不是高精度解相的验收标准。尤其在陡峭表面,局部成像条纹可能比白板标定时更密。
如果允许的候选频率本来就很少,也可以每个都实际采集,直接比较 \(f\lambda\),不一定要先拟合。模型的价值主要在物理解释、频率点之间的估计和数据降噪,不是增加步骤本身。
从每个像素的最优值,到设备的一个设置
原方法:先求局部最优,再汇总平均
扫描位置、光路和工作距离不同,参数也可能不同,所以会得到一张最优频率图,而不是一开始就得到一个数字。
原方法在每个距离求所有像素的最优频率,然后取均值,再对工作空间的多个位置取均值:
\[ \begin{aligned} \bar f_j&=\frac1{P_j}\sum_{p\in V_j}f^*_{p,j},\\ f_{\mathrm{final}}&=\frac1J\sum_{j=1}^{J}\bar f_j. \end{aligned} \] \(V_j\) 是第 j 个距离的有效像素集合,\(P_j\) 是其数量。实现时排除无效像素,是实际数据质量控制。最终均值若不属于允许集合,应映射到可用候选,并检查相邻选择。一个已报道的系统在约 220–280 mm 的工作空间汇总得到 88 个周期。这是该系统的标定结果,不是方法给所有设备规定的答案。
工程扩展:平均局部最优,不一定最小化全局误差
两个操作一般不等价:
\[ \operatorname{mean}(\arg\max Q_p) \ne \arg\max(\operatorname{mean}Q_p). \]更不用说,它们也未必等价于最小化重建坐标的平均误差。有些像素在峰值附近很平坦,另一些像素在稍高频率就迅速失去信号;简单平均各自的峰值位置,没有考虑这种差别。
若目标是全局平均方差,可以在明确噪声和几何系数后,直接对所有有效区域评价同一个候选频率:
\[ \begin{aligned} \sigma_{p,j}(f)&=\frac{C_{p,j}}{f\lambda_{p,j}(f)},\\ f^*&=\arg\min_{f\in\mathcal F}\sum_{j,p}w_{p,j}\sigma_{p,j}^2(f). \end{aligned} \] \(C_{p,j}\) 汇总噪声、平均亮度和必要的几何误差传播系数。它是否能视为与频率无关,也要验证。\(w_{p,j}\) 表示应用权重,可以优先照顾常用距离或关键测量区域。还有一种选择是优化误差的高分位数,而不是平均值。这样可以照顾表现较差的区域,但可能牺牲平均精度。这里没有唯一正确的权重,关键是声明“推荐”在优化什么。
无论采用哪种汇总,都不要让不同频率各自剔除一批困难像素后直接比平均值。应使用可比的公共评估区域,或显式加入有效覆盖率约束,否则“更准”可能只是删掉了更多坏点。
用近优集合替代一个过于精确的数字
如果 80 和 88 的预测误差差别很小,但 88 更容易加入现有展开链,就没有必要为了数学峰值强行更改整套编码。
设允许保留最优分数的比例为 \(\eta\),定义:
\[ \mathcal F_\eta= \{f\in\mathcal F:Q(f)\geq\eta Q_{\max}\}. \]若 \(\eta=0.95\),在同一误差模型下,集合中各频率的预测标准差不超过最佳值的 \(1/0.95\approx1.053\) 倍,也就是多约 5.3%。这是标准差的容差,不是方差的 5%。
图 4:浅色带表示分数至少达到最优值的 95%。灰色点演示一组设备可能允许的离散候选,不能把带内任意数值都视为硬件可用。
在前面的高斯示例中,1 到 200 的整数搜索给出最优 80,95% 近优集合为 63 到 98。这个例子只有一个连续峰,所以集合刚好是连续区间;真实响应有多个峰或硬件只允许部分值时,必须保留候选列表,不能只报告最小值和最大值。
还应区分“近优容差”和“统计置信区间”。95% 分数阈值是人为选择的工程容差,并不是说真实最优频率有 95% 概率落在这里。若要估计标定不确定性,可以对重复数据重新拟合、重新搜索,观察结果如何变化。
一段能运行的推荐代码
下面只用 Python 标准库,演示从已有衰减曲线到候选评分的过程。高斯曲线是教学输入,没有做白板采集或五段参数拟合,也没有替代真实的展开可靠性检查。
代码返回近优候选列表,而不是默认它们连续。模拟设备约束通过 allowed 参数传入,幅值下限通过 min_lambda 演示。
1 | import math |
保存为 recommend_frequency.py,运行 python recommend_frequency.py。预期输出:
1 | best: 80 |
受限候选中,72 的分数略高于 88,所以选择 72;两者都落在相应的近优集合里。这里完全来自教学参数与候选表,不能用于推断真实装置的最优值。
若把 attenuation 换成实测插值或拟合函数,搜索部分可以复用。但要先限定有效区间;有符号的五段传递系数不能直接交给这个“正幅值响应”接口,也不能随意取绝对值忽略相位分支。
推荐值出来后,还要过三道验收
相位展开:小误差模型不包含整周期误判
\(f\lambda(f)\) 评价的是展开正确条件下的局部误差。级次错一档,就是一个完整周期的错误,不是公式中的轻微噪声。高频要放进实际展开链验证,不能只把最后一个频率改掉。对层级展开,低频误差会按频率比放大,跨度过大可能把细频率级次推过取整边界。需要检查实际场景的展开失效率,而不只是白板上的包裹相位平不平滑。
噪声与曝光:不固定时,应改用更一般的评分
如果频率变化时,曝光、功率、背景或噪声也显著变化,不能再只用 \(f\lambda\)。在相同步数、小噪声假设下,更一般的分数是:
\[ S(f)=\frac{fB(f)}{\sigma_I(f)}. \]若相移步数 N 也变化,还要考虑 \(\sqrt N\) 与采集时间预算。真实噪声可能依赖亮度并具有不同来源,这时最好直接使用经验证的误差模型,而不是把固定噪声公式无限推广。
重建验证:重复性与绝对偏差分开报告
推荐频率及其邻近候选都应重建实际目标,分别检查重复性、参考尺寸偏差、有效覆盖率、边缘和台阶表现。相同物体反复得到一样的错误尺寸,说明重复性好,但准确度并不好。
还可以观察模型是否把最优值推到搜索边界。如果是,就补采样或报告“最优点尚未被当前范围包围”,而不是输出一个看似确定的数字。
一个推荐结果应该交代什么
| 字段 | 为什么需要 |
|---|---|
| 推荐周期数与范围定义 | 防止整幅、半幅或不同视场之间混用 |
| 对应空间频率和周期宽度 | 便于与线宽、采样尺度比较 |
| 工作距离、曝光、增益、功率、相移步数 | 说明标定结果在哪些条件下有效 |
| 允许集合与近优候选列表 | 给展开方案和硬件设计留出选择 |
| 拟合误差及有效像素比例 | 防止模型只适用于少数好像素 |
| 汇总目标与权重 | 说明优化的是平均误差、关键区域还是尾部风险 |
| 展开失效率 | 补上局部小噪声模型看不到的错误 |
| 重复性与参考误差 | 区分稳定和准确 |
光源、焦点、曝光策略或工作范围明显变化后,应重新检查模型,而不是永久沿用一次标定值。是否完整重标,可先通过少量验证频率判断原曲线是否仍然成立。
记住优化对象,而不是记住某个频率
这套方法做的是一件具体的事:在可靠的候选集合里,比较位置灵敏度提高与调制幅值损失,找到预测位置误差较小的选择。
首次实现不必马上追求复杂的全局优化。先在一个白板距离采集几组频率,画出实测 B、归一化 λ 与 fλ 三条曲线,再拿峰值附近的几个候选做重复重建。如果数据都没有覆盖峰值,或者展开已经出错,增加优化器复杂度并不能解决问题。
资料与延伸阅读
- 窗口平滑建模、逐像素标定及最优条纹数量方法:重点对应模型标定与频率选择部分。
- 相移算法、误差和相位展开基础。
- 本站基础教程:从条纹到三维。
本文的高斯曲线、五段示意、流程和封面均为自行绘制。原方法的局部最优均值策略,与本文建议的加权误差、有效覆盖率和近优集合应分开理解;示例代码只验证推荐计算,没有宣称完成硬件标定。