做光学设计这一行,越做越会发现,变焦镜头是光学设计里最“磨人”的一类活。20倍超高清变焦镜头更是把变焦比、像质、公差、制造这几件事全拧在了一起——方案阶段一个参数拍错,后面优化三个月都救不回来。Zemax作为目前主流通用光学设计平台,恰好是把“架构选型—像质优化—公差分析—与制造端衔接”整条链串起来最顺手的工具。
这篇文章对着三类人写:带项目的镜头光学工程师、准备用变焦课题做毕业设计或竞赛的光学专业学生,以及需要和光学端做技术对接的结构、工艺工程师。我会按实际做过的20倍连续变焦项目套路来讲,不绕理论推导,重点讲每一步为什么这么做,以及在Zemax里具体怎么操作,顺带把宏脚本、自由曲面优化、非序列杂光分析上踩过的坑也交代清楚。等你看完,至少能自己搭出一个能优化的起步结构,并把它推到可以送交打样的状态。
1. 项目概述:20×超高清变焦镜头的第一性问题
1.1 “20倍”和“超高清”到底意味着什么
镜头设计一开始最容易犯的错,就是拿到需求直接开Zemax。实际上,在动手之前,得先把“20倍”和“超高清”这两件事翻译成光学设计参数。
“20倍”指的是变焦比,也就是长焦端焦距除以短焦端焦距。常见的监控类20倍镜头,焦距范围大约是8.5mm到170mm,配合1/1.8英寸或1/2.5英寸的CMOS。如果配1/1.8英寸探测器,短焦端要覆盖到广角视场,半像高大约4.4mm到5.6mm,短焦端焦距不能太长,否则水平视场角不够用;长焦端则受制于口径、入瞳直径和机械外径,F数在长焦端往往会被推到F/4.5左右。
“超高清”在工程上基本等于MTF要求。4K CMOS的像元尺寸通常在2.4µm到3.0µm之间,对应的奈奎斯特频率大概在160lp/mm到200lp/mm。做设计时,如果全视场在奈奎斯特频率处MTF还要高于0.3,这已经是相当苛刻的要求。实际项目中,我的经验是把设计目标定在“中心视场150lp/mm处MTF≥0.45,0.7视场≥0.35,全视场≥0.25”,留出公差和工艺的余量。毕竟设计做得再漂亮,只要公差分析一过,MTF掉个15%到20%是常态。
很多人会把“20倍”简单理解成“长焦端把短焦端放大20倍”,这没错,但设计难点在于:从8.5mm到170mm中间,每一条焦距曲线上都要保持像质。这不是单个透镜的问题,而是五个群组之间相对位置精确配合的问题。镜头在变焦时有一个群组往外走、另一个群组往里补的联动过程,如果两个群组的位移曲线设计得不平滑,像面会在中间焦段跑来跑去,这就是所谓“变焦像面漂移”。Zemax的多重结构(Multi-Configuration)功能,本质上就是在同时优化多个焦距下的系统状态。
1.2 需求拆解:像质、体积、成本三座山
拿到需求之后,不要急着做光学,先把三个约束条件摆在桌面上:像质目标、体积上限、成本敏感度。这三个东西相互撕扯,变焦比越大,撕扯越狠。
镜头总长是第一个大矛盾。对于8.5mm-170mm的20倍变焦镜头,如果你跟结构工程师说总长可以做到170mm,那光学设计会轻松不少;如果对方要求控制在130mm以内,你就必须在变倍组和补偿组的焦距分配上动脑子,甚至要上非球面来压镜片厚度。我的经验是,总长和长焦端焦距之比最好别大于1.6,一旦超过这个值,像差校正会非常吃力。
成本敏感度直接影响玻璃选型。监控类量产镜头对成本敏感,设计时会回避昂贵的高折射率镧系玻璃,尽量用常见的环保玻璃牌号,比如H-K9L、H-ZF52、H-LAK系列。如果是做高端广播级镜头,玻璃成本占比可以放宽,能上低色散玻璃就上,能上非球面就上,因为客户对分辨率的要求更刚性。这里送一句话:在项目启动会上把玻璃成本定下来,比优化阶段反复换玻璃要省太多时间。
还有一项经常被忽略的是后焦距和法兰距。如果是C接口,法兰距17.526mm,后焦还要留出滤光片和防护玻璃的位置;如果是定制的方形接口,也要和结构端商量好。Zemax里可以用后焦操作数(TTHI或者主面位置)来约束,但别等到优化后期才加入这个约束,否则会出现“像质极好但装不进相机”的悲剧。
2. 架构骨架:选型比优化更重要
2.1 机械补偿为什么是连续变焦的主流
变焦结构大体分两类:光学补偿和机械补偿。光学补偿靠若干个可移动的群组按固定比例移动,结构简单,但像面补偿不彻底,适合小变焦比;机械补偿则用凸轮驱动多个群组产生非线性位移,通过精确控制群组间隔来实现像面稳定,是20倍以上连续变焦镜头的主流。
机械补偿的标准形态是“四群组”或“五群组”结构:前固定组负责把大视场光线收拢,变倍组通过移动改变系统焦距,补偿组做非线性移动来稳定像面,后固定组负责中继成像并平衡像差。有些高倍率镜头还会加一片“对焦群组”,也就是所谓的浮动对焦,用来解决近距离对焦时像质劣化的问题。
在Zemax里建立机械补偿结构,并不是简单摆几片透镜就完事,而是要在高斯光学层先把每个群组的焦距定出来。我喜欢先用旁轴透镜或者直接用理想面(Paraxial)搭建一个高斯结构,验证变焦曲线平滑、像面位置稳定之后,再把理想面替换成真实透镜。这个过程看起来多了一步,实际能帮你在半小时内判断一套架构可行与否,而不是在真实镜片上苦调三天。
2.2 用Zemax镜头库和专利结构做初始起步
初始结构可以从三个地方来:公司过往相似项目的积累、Zemax自带的镜头库(Lens Catalog)、公开专利里的变焦结构。对新手来说,最稳妥的是从Zemax镜头库里找到一个“倍率接近、F数接近、波长接近”的变焦镜头作为起点,然后缩放。
缩放不是把焦距乘个系数那么简单。Zemax里有两个常用方向:一是保持F数不变,把焦距按比例缩放,所有空气间隔和曲率半径统一乘缩放因子;二是如果靶面尺寸变了,还要同步调整视场角设置。实际操作中,我会将整个系统的所有面曲率半径保存为一个缩放组(利用Zemax的“Scale Lens”功能或者自己写宏批量乘),然后把像高设置为目标值,再开始优化。
| 对比项 | 短焦端 | 长焦端 | 备注 |
|---|---|---|---|
| 焦距 | 8.5mm | 170mm | 20× |
| F数 | F/2.8 | F/4.5 | 长焦端受口径限制 |
| 视场角 | 约60° | 约3° | 按1/1.8英寸靶面估算 |
| MTF目标 | 150lp/mm≥0.4 | 150lp/mm≥0.35 | 全视场≥0.25 |
用专利结构起步时有个细节:旧的专利数据往往用波长为587.6nm的d光优化,现代CMOS的响应峰值在550nm附近,但波长权重还是要覆盖可见光波段。Zemax的波长设置可以直接用F,d,C光,或者按探测器量子效率曲线自定义波长和权重。我一般设三个波长(486nm、587nm、656nm),权重按0.5、1.0、0.5来,色差校正目标以d光为主。
3. Zemax里的系统搭建与第一轮优化
3.1 坐标系、波长与像面设置的一次到位
在Lens Data Editor里搭初始结构时,最先要检查的是系统孔径(System Aperture)。变焦镜头建议用“Image Space F/#”作为孔径类型,因为在变焦过程中,F数会随焦距变化,如果你设成“Entrance Pupil Diameter”,长焦端会自动换算出一个很大的入瞳直径,手动管理很麻烦。用像方F数配合多重结构里的F数控制,能保证长焦端不至于跑到F/1.8这种不现实的状态。
波长设置就用上一篇提到的F,d,C,对应Zemax波长序号是0.486、0.587、0.656。视场设置建议用“Object Height”或者“Image Height”,因为CMOS靶面是固定尺寸,用视场角表示在长焦端会变成一个很小的角度,操作上不方便。像面用1/1.8英寸,半像高4.4mm,典型视场点设为0、0.5、0.7、1.0,权重按1、0.8、0.6、0.5来。这个权重不是随便拍的,因为边缘视场天然难校正,如果权重给太高,优化器会牺牲中心视场去追边缘,最后两边都做不好。
玻璃材料在初始阶段先统一用模型玻璃(Model Glass),也就是先不管真实牌号,用折射率和阿贝数先凑合,等优化到局部收敛后再替换成真实玻璃。很多人一上来就用真实玻璃,结果系统在优化中因为玻璃库限制卡死,替换回去又发现像质反弹。先用模型玻璃跑通架构,再逐步替换,是更省力的做法。
3.2 多重结构编辑器:把“变焦”翻译成Zemax语言
变焦镜头在Zemax里不是单一系统,而是多个“结构”组成的集合。比如你要覆盖8.5mm到170mm,至少建立5到7个变焦位置:8.5mm、20mm、40mm、80mm、120mm、150mm、170mm。结构越多,优化越慢,但变焦曲线的控制越精准。我常用6个结构,兼顾速度和曲线上关键节点的检查。
在多重结构编辑器(Multi-Configuration Editor)里,每个结构要独立控制变倍组和补偿组的厚度。举例来说,如果第2片到第3片之间是变倍组间隔,第4片到第5片是补偿组间隔,那就在第一行添加THIC操作数,对应“厚度随结构变化”,然后逐结构填入不同的间距值。填完之后,用Zemax的“Update”按钮看看每个结构下像面位置是否还在,如果出现像面漂到天上,那就说明间距值设错了。
这里的核心技巧是用好“变量带”原则:在初始阶段,只把变倍组和补偿组的空气间隔设为变量,其他群组内部间隔暂时冻结。等系统整体趋向合理,再逐步放开其余间隔。如果一开始就全部放开,优化器会在无数个局部极小值里乱撞,最后出来的结构往往怪异,很难加工装配。
3.3 评价函数怎么搭,才不容易把自己绕进去
第一轮优化的评价函数不需要太复杂。我会用Zemax默认的RMS Wavefront作为优化目标,因为变焦系统的像差校正最终要保MTF,而波前差和MTF之间是傅里叶变换关系,用波前差作为中间指标更平滑,不容易出现局部极小。等系统收敛到一定水平,再切到RMS Spot Radius去做能量集中度优化,或者直接用FFT MTF操作数来针对特定频率做硬约束。
在优化操作数里,除了默认评价函数,必须加四个硬约束:
- EFFL操作数:把短焦端焦距锁定到8.5mm,长焦端锁定到170mm。变焦镜头的“变焦比”是靠群组移动实现的,焦距本身不是变量,但优化过程中焦距会跑偏,所以要显式控制。
- TTHI操作数:限制系统总长,比如小于150mm。
- 后焦约束:用MNCA或MXCA控制最后一面到像面的距离,保证法兰距和滤光片空间。
- 边缘约束:用MNCG和MXCG控制镜片中心厚度和边缘厚度的最小值,防止优化出中心厚度为负、边缘厚度为0.1mm这种根本没法加工的结构。
这一轮优化我习惯用阻尼最小二乘法(DLS)加锤击优化(Hammer Optimization)交替进行。Zemax的Optimize > Optimization里,先跑本地优化100到200次,看变化曲线是否收敛;如果收敛后像质还不错,再开锤击优化,让系统跳出局部极小。锤击优化是全局优化的一种,适合用来搜更大的解空间,但它不能替代本地优化的精修。实际项目中,我的节奏是“锤击半小时,本地精修两小时,再锤击半小时”。
4. 进阶阶段:扩展多项式、衍射仿真与像质守住
4.1 扩展多项式和自由曲面:该用还是不该用
20倍变焦镜头做到后面,往往会遇到“球差、场曲、像散同时压不住”的时刻。这时候有人会把眼光投向非球面,甚至自由曲面。Zemax里的扩展多项式(Extended Polynomial)表面是一种常用的自由曲面建模方式,它把面形描述为一系列x、y的多项式项,可以在近轴球面的基础上叠加高阶非球面偏差。
但我要说的第一句话是:自由曲面不是万能的,能不用就不要用。变焦系统本身已经是一个高复杂度系统,你再引入非球面,自由度暴增,优化时间变长、公差敏感度变高、加工成本上升。对于20倍变焦镜头,我的经验是优先在口径较小的后固定组引入偶次非球面,因为口径小,非球面加工和检测相对可控;前固定组和变倍组尽量保持球面,否则凸轮加工和装配时对偏心太敏感,很容易出现“设计MTF0.5、实测MTF0.2”的惨剧。
如果确实要上扩展多项式,建议做法是:先用偶次非球面(Even Asphere),只加4阶和6阶项;如果还不够,再尝试扩展多项式,但把高次项限制在10阶以内,并把变量控制在两个面上。第十二项以上的自由曲面项对像质的提升极其有限,但对制造工艺的杀伤力却是致命的。
4.2 衍射干涉仿真:从MTF到PSF的“最后一公里”
超高清镜头只看几何MTF是不够的,因为几何MTF在光学系统接近衍射极限时会失真,还需要用衍射MTF来验证。Zemax的分析计算里,FFT MTF是基于光瞳函数做傅里叶变换得到的,它能把衍射效应考虑进去。我在设计中期会同时打开几何MTF和衍射MTF,如果两条曲线偏离很大,说明系统还有明显的像差没有被校正;如果两者基本重合,说明系统已经接近衍射极限,再优化也没太大意义。
这里还涉及到一个很多新手会问的问题:Zemax怎么仿真衍射干涉?其实在序列模式下,用PSF(点扩散函数)分析就能看到衍射效应。PSF的截面形状能直观告诉你能量是怎么分布的,中心如果是规则的艾里斑,说明波前质量不错;如果旁边出现明显的旁瓣或者拖尾,那就可能是高阶像差或者渐晕导致的。干涉相关的分析,在Zemax里通常用波前图(Wavefront Map)或者条纹图(Interferogram)来看,Zemax的Interferogram分析能模拟出干涉仪的条纹,方便你把设计结果和实测干涉条纹做对应。
如果用衍射光学元件,那就再复杂一点。衍射面在Zemax里可以用Binary Optic 2表面建模,它的相位分布可以写成多项式。但我要提醒一点:变焦镜头里加衍射面要慎重,衍射效率随波长和入射角变化剧烈,很容易在广角端产生色散杂斑。如果客户没有明确要求,设计大部分时候用传统折射元件更稳。
5. 宏脚本实战:从报错到批量控制
5.1 “unknown symbol getthickness”到底错在哪
在Zemax里写宏脚本做批量操作,是提升变焦设计效率的最大捷径。但有相当多人第一步就卡在报错上,尤其是这句:unknown symbol getthickness。
这句话的字面意思是:脚本里出现了一个Zemax宏语言不认识的符号。很多从其他语言转过来的工程师,习惯性联想“获取厚度”应该叫 getthickness,但Zemax的ZPL(Zemax Programming Language)根本没有这个名字的内置函数。ZPL不是面向对象的语言,它是一套类似BASIC的脚本语言,所有函数都是固定命名的。
在ZPL里,获取某个面的厚度,正确的函数是 THIC()。比如:
! 获取第3面的厚度 t3 = THIC(3) PRINT "Thickness of surface 3: ", t3如果你想在很多个结构里批量读取,THIC()可以直接和当前多重结构关联,无论切换到哪个结构,它读出来的都是当前结构的厚度。这一点很关键,因为变焦镜头最常干的事情就是“在每个结构下提取间隔,用来画凸轮曲线”。
如果函数名敲对了还是报unknown symbol,那大概率是版本问题。Zemax的不同版本,ZPL函数名有细微差别,老版本里没有的函数在新版本才有。检查一下你写的函数在对应版本的Zemax手册里是否存在,或者干脆换用更通用的方式,比如通过优化操作数接口OPTRETURN来间接获取厚度数值。
5.2 用宏批量提取群组间隔和生成凸轮数据
变焦镜头的凸轮曲线设计,本质上是把变倍组和补偿组的位移随焦距的变化关系提取出来,再交给结构工程师做凸轮槽。这个过程用Zemax界面手动一个个读数据,既慢又容易错,写成宏就一劳永逸。
我经常用的宏逻辑是这样的:先定义一个数组,把6个结构的焦距值和关键群组间隔存下来,然后循环遍历每个结构,用THIC()读出变倍组间隔和补偿组间隔,最后把结果写入外部文本文件。
! 导出变倍组间隔与补偿组间隔 OUTPUT "zoom_curve.txt" count = 5 FOR i = 1 TO count SetCurrentConfig(i) ! 切换到第i个结构 PRINT "Config ", i PRINT "Variator gap: ", THIC(3) ! 第3面厚度是变倍组间隔 PRINT "Compensator gap: ", THIC(5) ! 第5面厚度是补偿组间隔 NEXT OUTPUT CLOSE这里要特别提醒,SetCurrentConfig这个函数在不同版本里的用法不完全一致。有些版本用“SETCONFIG”,有些版本用“SetCurrentConfig”,写之前先查一下帮助文档。还有,写完宏以后先用小规模数据测试,比如只读取前两个结构,确认输出正确再放开全部结构,免得脚本跑完才发现厚度读错了面,白费功夫。
宏脚本更进阶的玩法,是结合Zemax的优化操作数做自动约束控制。比如你希望变倍组的移动距离在每个相邻结构之间保持单调平滑,可以在宏里计算相邻结构的厚度差值,如果差值非正就输出报警。这样在设计阶段就能发现凸轮曲线有没有“回折”,而不用等结构端加工完才发现运动卡顿。
6. 公差、鬼像与制造落地
6.1 公差分配:设计再好看,工艺过不了就是零
很多项目死在最后一步:设计优化得风生水起,一到公差分析就崩。变焦镜头因为有多个可移动群组,公差敏感度比定焦镜头高得多,特别是变倍组的偏心、倾斜,会直接转化为像面漂移和MTF下降。
Zemax里的公差分析一般在Tolerance > Sensitivity或Tolerance > Inverse Limit里做。我习惯的流程是:先用灵敏度分析评估每个公差项的贡献量,找到前三名的敏感项;然后针对敏感项做反极限分析,算出允许的公差范围;最后做蒙特卡洛模拟,跑200到500个样本,看MTF分布直方图。
实际工程上,光圈半径公差通常给3到5个圈(λ/4到λ/8),厚度公差±0.03mm到±0.05mm,偏心公差0.02mm到0.05mm,倾斜公差0.02°到0.05°。如果某一片镜片的公差特别敏感,优先考虑换玻璃、改曲率半径、调整光焦度分配,而不是强行把公差紧到±0.005mm——那会造成加工良率骤降,成本成倍上升。
还有一个常用补偿器是后焦或最后一枚镜片的轴向位置。在公差分析里添加一个补偿器(Compensator),例如后焦距离,让装配时可以通过调焦环补偿一部分公差影响,可以显著提高良率。
6.2 非序列模式下的杂光分析:分光棱镜、鬼像通通拉出来
序列模式解决了成像光路的优化问题,但制造阶段最怕的其实是杂散光和鬼像。Zemax的非序列模式(Non-Sequential Mode)就是用来干这个的。
在变焦镜头设计里,最容易出现鬼像的位置是镜片表面的残余反射。短焦端视场大、入射角大,光线在透镜表面来回反射,会在像面上形成缓慢移动的亮斑或者光晕。要检查这些鬼像,可以把序列系统转换成非序列模式,给镜片表面赋予反射率,然后做光线追迹,查看哪些表面组合形成了二次反射路径。
分光棱镜在非序列模式里更是常客。比如激光雷达或者测量镜头里常需要把一部分光分出来,建模时用两个矩形体拼成一个分光棱镜,中间夹一层半透半反膜。要注意的是,非序列模式下光线和膜层的相互作用比较复杂,如果膜层设置不对,追迹结果会严重失真。我的建议是:分光膜用镀膜文件(Coating File)来定义,而不是简单的透过率/反射率参数,这样才能准确模拟偏振和角度依赖。
鬼像分析的另一个实用工具是Zemax的“Path Analysis”,它可以直接列出哪些光线路径从哪个表面反射后到达像面。做变焦镜头时,我通常会针对长焦端和短焦端各看一遍鬼像路径,重点排查镀膜反射率较高的球面镜片。发现鬼像能量过高的面,就通过优化曲率半径或者改变镜片空气间隔,让鬼像焦点落到像面之外。
6.3 制造图纸、样件测试与指标对齐
设计冻结之后,要输出一份能指导生产的“光学制造规格书”。这份文档至少包含:每片镜片的曲率半径、中心厚度、边缘厚度、口径、面形精度、光洁度,以及装配后的各群组间距公差、偏心要求、镀膜波段和反射率指标。Zemax里可以用“Lens Data Editor”导出完整数据,配合结构端的3D模型文件一起评审。
样件测试阶段,最常出现的问题是“设计MTF和实测MTF对不上”。不要慌,逐个排查:先看干涉仪测出的面形PV值和RMS值是否在公差范围内;再看装配完成后的FLIR或传函仪测试环境是否统一了光圈和视场;最后检查有没有杂散光把MTF低频拉低。这三点排查完,80%的对不上都能定位。
7. 常见问题与排查技巧速查表
下面这表格是这几年我在Zemax实战中被问过最多、自己也踩过最多的问题合集,直接抄作业就行。
| 问题现象 | 可能原因 | 处理方式 |
|---|---|---|
| ZPL报错 unknown symbol getthickness | 函数名不存在 | 改用THIC()或OPTRETURN()读取厚度 |
| 优化后MTF上不去 | 初始结构不合理,或权重分配失衡 | 回到高斯光学层调整光焦度分配,减少高阶非球面权重 |
| 变倍组移动时像面漂移 | 补偿组移动曲线不平滑 | 用宏检查相邻结构组间距,重新设计补偿位移曲线 |
| 公差敏感度极高 | 某个群组光焦度过大 | 将光焦度分散,或引入非球面降低敏感度 |
| 非序列模式分光棱镜光强不对 | 膜层参数太简单 | 用镀膜文件+偏振选项精确建模 |
| 衍射MTF明显低于几何MTF | 像差尚未校正到位 | 继续优化波前差,或检查有无大渐晕 |
| 软件许可证无法连接 | 环境配置或服务未启动 | 检查正版授权配置、网络端口和服务状态,按官方文档重新配置 |
| 镜头实测MTF和设计差很远 | 装配偏心或面形超差 | 用干涉仪复测面形,排查群组装配的倾斜偏心 |
这里再啰嗦一句:Zemax只是一个工具,真正决定成败的还是对系统架构的判断。20倍超高清变焦镜头不是靠某一个魔法优化参数做出来的,而是靠一次一次迭代、一步一步把公差和工艺的余量吃进去。
做变焦镜头设计这几年,我最明显的感受是:光学设计从来不是“画一条漂亮的MTF曲线”就完了,尤其是20倍这种高倍率变焦,每一步都要为后面的制造留后路。纸上谈兵的自由曲面、不计成本的玻璃组合,最后多半会在产线面前低头。用Zemax做项目,就要习惯“优化数据和公差数据一起看”,习惯把凸轮曲线导出来给结构工程师看,习惯拿非序列模式把鬼像一个个揪出来。这些功夫花在前面,后面打样和量产才能少踩坑。最后再分享一个小技巧:每做完一个变焦项目,把当时的初始结构、评价函数模板、宏脚本都归档好,下个项目的起步速度会快很多——光学这行,经验就是这么一点点攒下来的。