一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(一)

基本介绍

这里我将介绍一个连续变倍(300 ~ 50)F# = 4 的中波红外镜头的设计过程。
我这里并没有利用一个现成的红外镜头作为初始结构,用来设计的软件是zemax
可以注意到以上的镜片参数都是整数,材料仅仅只用了硅和锗,这里将探测器窗口和像面之间的距离定为20(1mm厚的窗口19mm厚的空气)———这个值是不固定的,根据具体的探测器来定,
这里用的环境是中文——也许英文更加高大上,但是在人工智能翻译软件横行的今天,语言早就不是软件性能高低的标志了。。。
所以没有必要纠结

第一步 分析和选取变倍补偿组的光焦度

我们需要的是一个运动组件路径限制在70左右的镜头。当然更小一些会更好这样前组连同变倍补偿可以控制在100左右。在绝大多数情况下光学组件都会被要求做的越小越好。
可以先假设一个模型,就是一个仅仅含有变倍补偿组的模型,这个模型含有一对永远不变的共轭点,用光学中的高斯公式一步步将光线从其中一个一直推到另一个,并且在变倍运动的过程中不断重复这一推导,就能得到相应一系列补偿组的位置。以前考试的时候只能用手算,而我非常懒,所以用python

import re

def structdata(word:str):    
	return re.split(r':',word)[1].strip()

files = open("zoomlensdata.txt")
data = files.readlines()

initobj= float(structdata(data[0]))
f2= float(structdata(data[1]))
f3= float(structdata(data[2]))
initf2position= float(structdata(data[3]))
initf3position= float(structdata(data[4]))
q = float(structdata(data[5]))route = [q*i/9 for i in range(1,10)]

files.close()

def getimg(p,f,pf):    
	l = p-pf    
	li = 1/(1/f+1/l)    
	beta = li/l    
	return pf+li,beta


def createp(initobj,f1,f2,pf1,pf2,step):
	p2,beta1 = getimg(initobj,f1,pf1)    
	p3,beta2 = getimg(p2,f2,pf2)    
	beta = beta1*beta2    
	dedatas = []
	for i in range(11):
		p2,beta1 = getimg(initobj,f1,pf1)        
		pf2_1 = (p3+p2+((p3-p2)**2+4*f2*(p2-p3))**0.5)/2        
		beta_1 = beta1*(p3-pf2_1)/(p2-pf2_1)        
		tao_1 = beta/beta_1        
		pf2_2 = (p3+p2-((p3-p2)**2+4*f2*(p2-p3))**0.5)/2        
		beta_2 = beta1*(p3-pf2_2)/(p2-pf2_2)        
		tao_2 = beta/beta_2        
		dataword = "orgin:"+str(pf1)+"||frist: "+str(pf2_1) + "|frist rate: " + str(tao_1) + "||second: " + str(pf2_2) + "||second rate: " + str(tao_2)+ "\n"
		dedatas.append(dataword)
		pf1 = pf1 - step
	return dedatas

result = datacreate(initobj,initf2position,initf3position,f2,f3,route)
file2 = open("zoomlensdataresult.txt","w")
for e in result:    
	file2.write(e)	        				
file2.close()		

当然用txt比较随意,但是如果你觉得这样不爽,用xlwt做一个excel表格也是推荐的。尤其是给领导汇报的时候会比较好用。经过反复的调整和计算
而且如果你对人工智能比较感兴趣,还可以根据这个程序进一步优化,比如说你可以利用各种基于梯度下降的方法,将你的输入定为一个初始值,然后设定一些目标值,比如可以把最大变倍比设为6,再设计一些算法防止方程得到复数解。然后利用梯度下降的方法比如sgd等等,得到一个最大变倍比为6,总行程为70的解。但是我这里实在比较懒,就不写了。
得到输入:
initobj:120 //表示前组的焦距
f1:-26 //变倍组焦距
f2:28 //补偿组焦距
initf1position:82 //变倍初始位置
initf2position:89 // 补偿初始位置
route:64 //变倍运动距离

当然以上 的参数都不是一定的,会在整个设计过程中不断的调整——或者主动,或者被动
一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(一)_第1张图片
一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(一)_第2张图片
注:第二幅图将route该为52.5

这里图片不全是因为不全的地方没有意义。
frist rate 就表示相应位置的变倍比。教科书上的那个求解过程我也编了一个小程序,不过总能得到一些奇怪的解,所以就算了
一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(一)_第3张图片
一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(一)_第4张图片

经过了一系列的调整,镜头参数基本符合了上述程序运行的结果,注意j3,j4即变倍/补偿组
注意,所有参数依然是整数,没有任何优化,求解的痕迹。
注:为啥不将所有的程序求解出来的结构都生成多重结构呢,因为电脑的算力是有限的
一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(一)_第5张图片
进一步调整,留出可以优化的空间
一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(一)_第6张图片
注意这里j2反常规(正常设计一般负透镜首轮优化不给厚度的)给了一个4的厚度,是因为如果这里没有一个预先的厚度,后期优化会很难——因为这里权重比较高,头片镜片的缺陷一般会给成像带来致命的影响。

第二步扩展视场角

终于第一次优化了(自动)
一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(一)_第7张图片
这里参数并不多,因此用最速下降法也是可以的,用这个阻尼最小二乘法也是可以的,————尽管我始终搞不明白为什么这种梯度下降方法再这里被叫做这个名字。
这里把“自动”改为5圈当然用10圈也是可以的。一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(一)_第8张图片
特别提醒,每次大的操作之后都应当保存,一旦出现失误可以及时反悔————《lens design》中的经验之谈
一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(一)_第9张图片

开始设置视场。提醒一下,现在这个阶段看各种分析图没有意义。
另外一定要将长焦头片镜口径固定,然后设置渐晕。只有这样你才能得到一个口径不那么大得头片,如果不设置渐晕,头片口径会大得出奇。
在优化过程中发现后组承担得相差矫正任务比较重,所以插入了一片caf2
等到视场增加的稍微大一点,你需要开始增加设置一个中间的0.7视场。并且要设置渐晕
一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(一)_第10张图片

提醒:光阑面设置在1mm厚度的窗口上
优化后:
一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(一)_第11张图片

一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(一)_第12张图片
增加一个视场,设置渐晕,然后逐渐增加视场,这里视场角用像高来设定,为什么,大家可以自己想一下,原因是比较简单的
接下来的优化过程中发现大视场的大视场角的光路比较难优化。色差大的离谱。尤其是边缘光线非常糟糕
一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(一)_第13张图片
确实很多光学公司对于非球面深恶痛绝,不过那仅仅限于可见光,对于波长比较长的红外光学来说,非球面加工的价钱比起材料来说还是少的可以的
比如说你的镜片材料只有1块钱,加工成非球面加工费10块,你估计很难接受,但是如果材料费要10000块,那么10块钱的加工费就显得不那么明显了。
当然有的土豪比较豪,“我宁可花10000块多加一片透镜”,————只能说他比较豪。
一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(一)_第14张图片
逐渐增加视场角,最终像高我们就设定为5,每增加一点,就优化一次,用阻尼最小二乘法优化5或者10圈,切记此时不要开太多的非球面系数,仅仅在第二透镜开了两个
在这里插入图片描述
有两个镜片达到12的厚度了,可以将v去掉
在优化的过程中会发现第14个面的赛德尔系数表现得比较抢眼,并且很多杂乱得光线是从这里出发得,所以稍微调动一下,(由于调动前将赛德尔像差表不小心关掉了,所以没有截图)
一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(一)_第15张图片
调整前
一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(一)_第16张图片
调整后 上图中有一片插入得caf2(主要时为了矫正高级色差,这个时候你也可以选用二元衍射面)
一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(一)_第17张图片
当然,每次调整焦距都会有变动,这个时候你需要考虑一下,是先扩展视场角还是焦距,这里优先扩展视场角
一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(一)_第18张图片
另外,注意到上述评价函数,变倍与补偿的约束进行了调整,这个调整的策略在于你是否在每一个conf上约束了effl(有效焦距)理论上你只需要约束3个结构就够了,并且这个光焦度的约束可以去掉。
一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(一)_第19张图片

最终视场角会到足够得位置

第三步 锤子锤子!

我们在观察一下上面得图,发现后截距非常大,这是不合理的然后一些间隔过大,显得很占体积。
然后直接(为什么这里的路径可以直接缩小,是因为这里的光路比较平滑,没有大的转折,因此对成像的影响也比较小————可见公差什么的都是相对的,很多设计师给公差的时候喜欢无脑给,将所有的公差给出一模一样的数值,他们很少考虑这些公差在工程上是否能够实现)

在这里插入图片描述
这一把用锤子优化,三分钟后
一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(一)_第20张图片

看细节
一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(一)_第21张图片
这个时候什么点列图,波前图,mtf都可以用了,当然这个时候点图依然不怎么样
一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(一)_第22张图片
一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(一)_第23张图片
另外很多人喜欢一上来就搞很多的非球面。
一般情况下非球面镜片由如下公式描述
以偶次非球面为例:
其公式后面会有一组关于孔径的多项式,如果研究过人工智能的多项式拟合就会对此感到熟悉,一般情况下在进行多项式拟合时如果项数设的比较多,就会存在过拟合的情况,也就是超过某一范围后就没有办法拟合的很好了,而如果项数比较少,则会出现欠拟合的情况,这样可能连现有的点都无法满足要求。
另外每一项参数的增加在提供更多的优化方向的同时也会变成系统的负担。所以添加参数一定要慎重。
然后又开始优化
经过了一个多小时的优化后:

一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(一)_第24张图片
点列图,注意途中衍射极限依次为1,2,3,4视场
一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(一)_第25张图片
一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(一)_第26张图片
一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(一)_第27张图片

一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(一)_第28张图片
可见在第3和4视场还有一些缺陷,不过总体问题已经不大,注意途中的黑圈时衍射极限
————一开始我还以为要用二元衍射面——可见光学设计总能给人带来惊喜。
一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(一)_第29张图片

另外,再次提醒,一定要保存。以上全都是这个镜头调整或者优化后保存的文件。
优化数个小时后的结果:

一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(一)_第30张图片以上是四个视场的最终优化结果。
设计工作基本上可以告一段落,而对于这个镜头工程来说,仅仅是刚刚开始。
最终数据:
一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(一)_第31张图片

你可能感兴趣的:(python,zemax)