这期学习笔记聊聊柯克物镜(Cooke Triplet)的无限共轭距设计,这是我在Zemax里练手的第四个案例。为什么要专门把柯克物镜拎出来写一笔?因为它是光学设计史上少数几种只用三片镜片就能同时校正球差、彗差、像散、场曲和畸变的结构,吃透它的设计过程,再去碰双高斯、望远物镜这些经典结构就不慌。无限共轭距这个条件也很有意思,它意味着入射光是严格准直的平行光,使用的场景覆盖了相机镜头、望远镜物镜、激光聚焦系统等等,是入门阶段绕不开的一类设计任务。
这篇笔记会按照我实际操作的顺序来写:从最开始的系统参数怎么定,到Zemax里怎么建初始结构,再到评价函数怎么搭、优化策略怎么选,最后是像质分析和实战踩坑。所有操作我都按Zemax OpticStudio的界面来写,版本差异不太大,你对着找就能找到。如果你刚接触光学设计,建议先看完第一节的原理部分再上手软件;如果你已经开始用Zemax了,可以直接跳到第三节看建模细节。
1. 柯克物镜的前世今生:为什么这种结构能流传百年
1.1 从一个生活类比说起
柯克物镜的核心思想,用一句话概括就是:用两个正透镜夹一个负透镜,让它们各自承担一部分像差校正任务。你可以把它想成一个小团队:正透镜负责把光线汇聚起来,负透镜负责把汇聚过头的光线往回拉一拉,三者配合把各种像差控制在合理范围内。这个结构诞生于1893年,提出者是英国库克父子公司的丹尼斯·泰勒,算下来比很多镜头设计者爷爷的爷爷年纪还大,但直到今天,入门级相机镜头、廉价望远镜、条码扫描镜头里依然大量使用它的变体。
为什么一个一百多年前的结构能活到今天?核心原因是它的性价比。只用三片球面镜片,就能做到中等视场、中等孔径条件下的良好成像,这在玻璃材料和加工工艺都不算便宜的年代是巨大的优势。后来出现的天塞物镜、松纳物镜,本质上都是柯克结构的改良版本——多加一片镜片,把某个残留像差再压一压。所以学柯克物镜不是学一个孤立的案例,而是在学一整类"少量镜片平衡像差"的设计哲学。
1.2 柯克三片式的核心架构
从光焦度分配来看,柯克物镜是典型的"正—负—正"三片式结构,负透镜通常放在中间偏前的位置,离光阑不远。这个排布有几个讲究:第一,正负光焦度搭配可以让系统整体的场曲得到控制,因为场曲跟所有表面光焦度之和以及折射率分布有关,负透镜引入负的佩兹瓦尔项,能抵消正透镜带来的场曲累积;第二,中间负透镜的位置给彗差和像散的校正提供了自由度,前后两片正透镜分别承担不同的入射高度,可以在不同视场区域产生大小合适、方向相反的像差量。
我刚开始学的时候总有一个疑问:为啥不直接用两片呢?两片镜片理论上也能校正球差和彗差,但没了中间那片负透镜,场曲会大得离谱,稍微离开光轴一点像面就开始模糊。大视场场景下,场曲是最先暴露问题的像差之一。柯克的聪明之处在于,用元件数量最少的组合把五种初级像差全部纳入可控范围,这跟解方程组是一个道理——未知数够多,方程才解得开。
1.3 无限共轭距意味着什么
"无限共轭距"听起来高深,翻译成人话就是物平面距离系统无限远,进入系统的光线是平行光。在Zemax里的体现就是系统设置时把物方厚度设为无限大,光线的初始状态不再是发散或者汇聚,而是互相平行的。
这个条件对设计有两方面影响。第一,入瞳位置决定了平行光束怎么切进系统,F数直接决定了边缘光线的最大夹角,所以优化时的权重分布和渐晕判断都跟有限共轭距不同。第二,像面位置可以理解为焦点位置,后截距(从最后一片镜片到像面的距离)是个关键工程约束,太长结构不紧凑,太短则可能装不下机械结构或者跟后置元件打架。第三,无限共轭距下彗差跟视场的二次方相关、畸变跟视场三次方相关,做系统评估时需要重点看视场边缘的表现。后面优化时你会发现,评价函数里如果不加控制,后截距很容易被优化器推到很夸张的值,这就是没理解无限共轭距约束导致的。
2. 设计起步:先把镜片数目和光焦度分配算明白
2.1 初始参数设定
设计任务的第一步不是打开Zemax,而是先拿笔把这几个参数定了:焦距、F数、视场、波长范围。我这个案例的初始规格是有效焦距100mm,F/4,半视场角±14°,可见光波段。为什么选这几个数?柯克物镜的典型能力范围大约在F/3.5~F/8、半视场10°~25°之间,F/4、±14°属于它比较舒服的工作区间,既能展示像差校正能力,又不至于难到半天优化不出来。
换算一下,F/4、焦距100mm,入瞳直径就是25mm。这里有个容易搞混的概念:入瞳直径和第一片透镜口径不是一回事。入瞳是光阑被前面透镜系统成的像,如果光阑不在第一片上,透镜实际口径通常会比入瞳直径大一点,要给边缘光线留裕量。做工程时还要加机械夹持余量,但我这个学习案例就先不加了,免得干扰像质判断。波长选的是F、d、C三根线,也就是486.1nm、587.6nm、656.3nm,覆盖可见光范围,权重默认都是1。如果你后续要做消色差评估,这三根线就是最基础的配置。
2.2 光焦度分配:先算个大概再上软件
在打开Zemax之前,最好先算一算三片镜片各自承担多少光焦度。经典的柯克物镜分配经验是:前组正透镜光焦度约为系统总光焦度的1.5~2倍,中间负透镜约为-1到-1.5倍,后组正透镜再把总值拉回到1。我用的初始结构更具体一些:前片光焦度占比约1.5,中片约-1.2,后片约0.7,三者相加约等于系统总光焦度。
这里说的"光焦度"等于焦距的倒数,单位是屈光度(1/m)。100mm焦距的系统,总光焦度就是+10D,那么前片大约+15D,中片约-12D,后片约+7D。有了这个粗分配,选曲率半径时就心里有数了:薄透镜光焦度约等于(n-1)(C1-C2),n是折射率,C是表面曲率(半径的倒数)。比如前片选折射率1.62的玻璃,想让光焦度达到+15D,曲率差大约需要15/0.62≈24.2D,也就是半径差倒数接近0.0242/mm。当然这是薄透镜近似,实际厚透镜和空气间隔都会影响,但方向不会错——先把量级摸对,后面优化器才不会跑偏。
2.3 玻璃材料选择的门道
材料选择是整个设计里最容易被新手忽略、但实际影响最大的环节。柯克物镜典型的玻璃搭配是:前后两片用冕牌玻璃(低色散),中间用火石玻璃(高色散),目的是实现消色差。我采用的是SK16/F2/SK16这个经典组合,SK16对应阿贝数约59.3,F2对应阿贝数约36.9。正负透镜色散差异越大,消除轴向色差的效果越好,但也会带来更大的高级色差和二级光谱。
Zemax里做玻璃选型有两种思路。一种是把玻璃当成固定值,只优化曲率半径和厚度,好处是优化速度快、结果符合实际可采购的材料,坏处是可能会因为材料不合适而性能受限。另一种是把玻璃作为变量参与优化,用玻璃模型(Glass Model)或者玻璃替换(Glass Substitution)功能,让软件在玻璃库里搜索更好的组合。我的经验是:学习阶段先固定SK16/F2,把结构优化到接近极限,再考虑用玻璃替换做微调。一上来就放飞玻璃变量,容易让优化器跑到一个实验室根本买不到的材料组合上。
3. Zemax实操:从空白文件到第一版可优化模型
3.1 系统设置:孔径、视场、波长怎么填
打开Zemax OpticStudio,新建一个文件,先别急着在镜头数据编辑器里敲数字,把系统选项里的三个基本参数设置好,顺序不能乱。
第一是孔径设置,在System Explorer的Aperture选项卡里把Aperture Type选为"Entrance Pupil Diameter",数值填25。这里我想解释一下为什么要用入瞳直径而不是F数:入瞳直径在无限共轭距下可以直接决定边缘光线的入射高度,物理意义很直观,而且后续如果改动焦距,F数会自动跟着变,不容易产生矛盾。第二是视场设置,Field选项卡里选"Angle"类型,依次填入0°、10°、14°,权重默认即可。第三是波长,Wavelength选项卡里把波长单位设为μm,填入0.4861、0.5876、0.6563三条谱线,权重都设为1。如果你只关心单色像质,可以只留0.5876这一根,但我们做镜头肯定要关心色差,三根线是起步标配。
3.2 输入初始结构:先把骨架搭起来
接下来在镜头数据编辑器(Lens Data Editor)里把初始结构输进去。这个初始结构是我从经典教科书案例里抄来的起点,不是最优解,但保证优化器能跑得动。结构如下:
表面0(物面):厚度设为Infinite,表示无限共轭距 表面1(光阑面/第一片前表面):曲率20.995,厚度3.353,玻璃SK16 表面2(第一片后表面):曲率-119.082,厚度为空气间隔4.647 表面3(第二片前表面):曲率-72.013,厚度1.200,玻璃F2 表面4(第二片后表面):曲率26.766,厚度为空气间隔4.169 表面5(第三片前表面):曲率-128.265,厚度3.275,玻璃SK16 表面6(第三片后表面):曲率-36.680,厚度暂定95 表面7(像面):厚度无这里我把光阑放在第一片镜子的前表面上,也就是Stop面设为1。这么做的好处是初始结构简单,光线追迹计算量小,而且对称性相对容易保持,对控制彗差有天然优势。后续如果想优化光阑位置,可以把Stop面挪到空气间隔里,但新手阶段不建议上来就动光阑位置,等你把像差理论理解深了再折腾不迟。
入瞳直径填了25,而第一片表面的口径会由光线追迹自动撑起来。Zemax里表面半口径(Semi-Diameter)建议改成自动模式(右键选择"Automagic"),否则光线溢出你都不知道。我见过不少新手卡在这一步:成像乱七八糟,查了半天发现是表面口径锁死了,光线根本没通过全部镜片。
3.3 建立操作数与评价函数
初始结构建立后,按下快捷键Ctrl+Z或者点击优化选项卡里的"Optimization"。Zemax默认会让你选一个默认评价函数。我建议勾选"RMS + Spot Radius + Centroid",意思是最小化以质心为参考的点列图均方根半径。这个组合适合起步阶段,因为它对几何像差的响应最直观,优化速度也快。等结构收敛得差不多了,再切到"RMS + Wavefront + Centroid"按波前差做精细优化。
但是光靠默认评价函数不够,还得手动加几个关键操作数来约束系统行为。这里给出我常用的操作数组合:
- EFFL:控制系统有效焦距在100mm左右,目标值100,权重1。没有这个约束,优化器可能把焦距带到80mm或120mm,虽然像差很好,但不是你要的规格。
- AXCL:控制轴向色差,目标值0,权重0.01。轴向色差等于F光和C光在像面上的轴向距离差,对于消色差镜头这个值应当趋近于0。
- DIST:控制畸变,目标值0,权重0.01。柯克物镜的畸变本来就不难校正,加一个轻权重防止优化器放飞它就好。
- MNEG和MXEG:控制边缘厚度在一定范围内,通常下限0.3mm,上限根据总长定。不加这两个约束,优化器很容易把镜片边缘厚度压成负数或者变成非物理的"负镜片"。
在评价函数编辑器里把这些操作数加进去之后,第一版可以优化的模型就算搭好了。这里有个细节:EFFL的权重不要设成1那么高,我实际用0.5,给像差优化留点余地。焦距差个0.5mm完全可以通过后截距微调补回来,没必要在初始阶段卡死。
4. 优化实战:让评价函数告诉你哪里该动
4.1 变量设置与优化策略
评价函数搭好之后,接下来要做的不是直接点优化,而是先定义哪些参数可以作为变量。我的做法是把所有曲率半径设为变量,厚度也设为变量,但会给每个厚度设定合理的边界条件。打开变量栏(每个参数前面的V标志),把表面1到表面6的曲率半径全部设为变量,厚度2到厚度6(含空气间隔)也全部设为变量,还要注意玻璃数据栏不要设为变量,固定SK16和F2。
点击优化按钮后,Zemax默认用阻尼最小二乘法做局部优化。这个过程通常在几秒内就能到达局部极小点,评价函数值会从初始的几百降到个位数甚至更低。每次局部优化结束,我会看一眼后截距(表面6的厚度)是多少,如果它变得太离谱,比如超过200mm或者变成负数了,就得回退,然后给后截距加个目标值约束,比如100mm左右,权重设成0.1。
这里特别想说一个新手误区:很多人觉得优化器是万能的,随便点几下就完事。实际上局部优化只会在初始结构附近的山谷里找最低点,它不会跳出去探索远处更优的结构。初始结构如果给得太离谱,优化器只能给你一个"垃圾中的佼佼者"。所以初始结构的好坏直接决定了最终结果的品质,这也是为什么我前面花了那么大篇幅讲光焦度分配和经典起点结构。
4.2 锤形优化:跳出局部极小
局部优化收敛到平台期之后,就可以上锤形优化(Hammer Optimization)了。这个工具的思路是在局部最优解附近做随机扰动,然后对扰动后的结构重新做局部优化,通过大量的"随机探索+局部收敛"循环来寻找全局更优解。Zemax里点击锤形优化按钮,它会自动调用多线程,通常跑几万个循环。
我的经验是锤形优化不要一上来就做。先做局部优化,确认评价函数已经收敛,再看一眼结构是否合理,比如有没有镜片厚度异常、有没有光线出射角过大,都正常了才启动锤形优化。锤形优化的时间控制在5~10分钟,跑太久边际收益很低。跑完之后对比一下锤形前后的结构,你会发现曲率半径可能变化挺大,但后截距、总长这些工程参数如果加了约束,就不会跑飞。
还有一点值得注意:锤形优化对玻璃模型的改变有限。如果你把玻璃也设为锤形优化的变量,它会倾向于选中玻璃库里的极端折射率材料,这在后期加工时是比较被动的。所以我在锤形优化前把玻璃固定了,只让它动曲率和厚度,等到整个系统性能逼近极限、确实需要换玻璃才能继续提升时,我才考虑玻璃替换。
4.3 优化过程中的参数监控
优化不是点完按钮就等结果,你得学会看中间过程。我在实践中养成了一个习惯:每跑一轮优化,固定检查三个数据——评价函数值有没有明显下降、后截距是否落在合理区间、第一片和第三片透镜的边缘厚度是否为正。这三个里面任何一个出了问题,都要停下来回退,而不是继续往下跑。
回退操作也很简单,Zemax有撤销功能,Ctrl+Z可以直接回到优化前一步。另一个好用的工具是"History",它记录了优化过程中的结构序列,你可以拖回去看哪个节点的结构更合理。曾经我有一次锤形优化跑出了评价函数非常低的解,但一看光路,第二片透镜几乎变成了一个薄到0.05mm的镜片,这物理上根本没法加工,只好回退。后来我养成了"优化五分钟,人工检查两分钟"的节奏,结构合理性永远比评价函数绝对值更重要。
5. 像质评估:别只看光斑大小
5.1 点列图与RMS半径判断标准
优化完成之后,面对一堆数据和曲线图,怎么判断这个镜头到底行不行?我的习惯是先看点列图(Spot Diagram)。在Analyze选项卡里选择"Spot Diagram"就能生成。图中会显示三个视场(0°、10°、14°)在像面上的光斑分布,每个视场对应一组光斑。
判断标准不是光斑越小越好,而要结合艾里斑尺寸来看。艾里斑是衍射极限决定的中心亮斑大小,直径大约等于2.44×λ×F数。用我们这套参数算一下:λ取中心波长0.5876μm,F数为4,艾里斑直径约为2.44×0.5876×4≈5.7μm。如果点列图的RMS半径明显小于艾里斑半径的一半,说明系统已经是衍射极限主导;如果RMS半径是艾里斑的好几倍,意味着几何像差主导,还有优化空间。
我优化完的这个结构,在0°视场的RMS半径大约是2.5μm,14°视场大约5μm,相对艾里斑直径5.7μm来说,可以判断为中视场接近衍射极限、边缘视场受像差限制。这个结果对F/4的柯克物镜来说属于正常水平,不必追求所有视场都压进艾里斑——对于三片式结构,边缘视场有一点像差是物理规律决定的。
5.2 MTF曲线对照衍射极限
点列图看的是几何光线分布,MTF(调制传递函数)则能反映系统对不同空间频率的成像对比度。MTF曲线里有一条重要的参考线——衍射极限曲线,它代表了系统在没有任何像差时的理论最优MTF。实际MTF越贴近衍射极限曲线,说明镜头的像质越接近物理上限。
看MTF有两条经验法则。第一,在截止频率(由像素尺寸或使用需求决定)处,MTF值最好能保持在0.2以上,低于0.1对比度就很弱了。第二,如果各视场的MTF曲线靠得很近,说明像质均匀性好;如果边缘视场在低频段就明显掉下来,通常是场曲或者像散没校正好。我的这个设计在每毫米40线对处,中心视场MTF大约是0.55,边缘14°视场大约0.35,差距约20个百分点,在柯克物镜里算均衡的表现。
如果你要拿这个设计去做实际项目,一定要结合探测器的像元尺寸算截止频率。比如探测器像元5μm,对应奈奎斯特频率约100线对/mm,这会高于我们前面看过的40线对/mm,需要重新评估MTF。
5.3 场曲与畸变:广角结构的照妖镜
柯克物镜作为宽视场结构,场曲和畸变是评估的重点。场曲体现为像面不再是平面,中心对焦清晰时边缘模糊,或者反过来。畸变则是像的几何形状发生变形,比如直线变弯曲。在Zemax里,Field Curvature and Distortion图用两个子图同时展示这两项。
以我的案例为例,14°半视场下,子午场曲约0.1mm,弧矢场曲约0.05mm,两者之差(约0.05mm)就是像散。畸变约-1.5%,负值表示桶形畸变,意思是画面边缘的像比实际缩小了。对于一般的成像镜头,畸变小于2%~3%人眼就不太敏感,1.5%其实是可接受的范围。但要注意,如果你拿这个设计做计量用途,畸变就得压到0.1%以下,那就需要额外增加畸变校正的操作数权重。
检查场曲和畸变时还有个技巧:把像面位置稍微前后移动一下,看看哪个位置的MTF综合最优。因为场曲存在时,完全平面的像面不可能同时让中心和边缘都精确聚焦,实际使用中往往取一个折中位置,让整个视场的平均像质最好。Zemax里的"最佳像面"按钮可以帮你自动找这个位置。
6. 常见问题与排查技巧实录
6.1 光线溢出与孔径失调
我实际练手过程中遇到最多的问题就是光线溢出。表现是点列图出现大量离群点、MTF曲线异常低,或者光路图里看光线在某个表面突然乱飞。原因多半是表面半口径设置成了固定模式,或者光阑位置不当导致光线超出透镜实际通光口径。
排查步骤是:先看光路图,找到光斑开始发散的位置,再把该表面的半口径设为自动,让软件按实际光线重新计算口径。如果自动计算后半口径比镜片实际可加工尺寸大很多,比如厚度同样跑飞了,那就要检查是不是评价函数里缺了光线高度或透镜外径的约束条件。一个常用的操作数是MNCA,控制中心厚度下限,能有效防止镜片薄成纸片。
6.2 边缘厚度报警
第二个高发问题是镜片边缘厚度变成零甚至负数。Zemax里查看边缘厚度的方法是右键镜头数据编辑器,选择"Draw"并打开边缘厚度显示。边缘厚度一旦小于0.1mm,加工上就很危险了,要么透镜成型不好,要么装配时容易碎。
处理办法有两个:一是在评价函数编辑器里用MNEG/ MXEG操作数约束边缘厚度,具体数值根据你的加工能力来定,常规值下限0.3mm或0.5mm;二是检查空气间隔是否过小,两个透镜靠得太近可能在装配时碰在一起。我的习惯是空气间隔不要小于0.5mm,留出打胶和隔圈的位置。这里有个小细节:厚度约束要在锤形优化前就加好,否则锤形优化全力压评价函数的时候,很容易把厚度推到非物理区间。
6.3 优化陷入局部极小的自救
最后聊一个几乎所有光学设计者都会碰到的问题:局部极小。症状是无论怎么调权重、换评价函数,评价函数值的下限就卡在那里,结构似乎到了一个死胡同。遇到这种情况,千万别死磕优化器,试试这招:
先回去看初始结构。把当前结构导出,然后检查一下是不是某些半径参数符号反了,比如正透镜的曲率本来该是正数结果变成负的,整片透镜变成了负透镜。有几次我就是被一个曲率半径的正负号卡了半天。另外一个比较实用的方法是让光阑位置漂移。把Stop面改到厚度不为零的空气间隔里,设成变量,让优化器找光阑的最优位置。光阑位置对彗差和畸变有很强的调节作用,经常一挪就柳暗花明。
6.4 我整理的快速排查表
| 现象 | 可能原因 | 快速处理方式 |
|---|---|---|
| 点列图出现离群散点 | 表面口径锁死或光线溢出 | 将Semi-Diameter设为自动 |
| 后截距超长或为负 | 未约束EFFL或后截距 | 添加后截距目标值操作数 |
| 镜片边缘厚度为负 | 缺乏MNEG/MXEG约束 | 添加0.3~0.5mm下限约束 |
| MTF所有视场普遍低 | 中心偏焦严重 | 点击最佳像面再评估 |
| 边缘视场MTF塌陷 | 场曲或像散过大 | 增加场曲操作数FCGT机会 |
| 优化结果评价函数跳动 | 锤形优化过度随机 | 重置初始结构重新锤形 |
这个表格是我在好几个设计项目里反复用到的,遇到问题先对号入座,多数情况下能少走不少弯路。如果对不上号,再回到光路图里看光线走势,光线是诚实的,哪一步异常一眼就能看出来。
写在最后
这套柯克物镜从搭初始结构到优化完成,我前后跑了差不多两个小时,其中大部分时间花在调评价函数和检查结构合理性上。现在回头想,最大的收获不是那颗RMS半径2.5μm的光斑,而是培养了对评价函数和结构之间关系的直觉:知道哪个操作数对应什么像差,知道动哪个参数会有连锁反应,遇到问题能判断是该加约束还是该回退重来。
最后再分享一个小技巧。柯克物镜这种经典结构,最好的学习方式不是只做一次优化,而是刻意改变初始参数,比如把F数改到F/2.8、把视场改到±20°,然后重新设计一版。你会发现同样的三片结构在不同规格下会表现出完全不同的像差短板,这比反复调同一个设计长进快得多。后面我打算把天塞物镜和松纳物镜也各做一遍,把这几兄弟放一起对比一下,看看多出的那片镜片到底换来了什么,到时候再把这部分笔记补上来。